--- projects/cms/source/idar/idar.c 2003/03/28 15:37:05 1.1 +++ projects/cms/source/idar/idar.c 2003/03/29 19:27:36 1.3 @@ -1,3 +1,27 @@ +/* + * i-scream central monitoring system + * http://www.i-scream.org.uk + * Copyright (C) 2000-2002 i-scream + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include #include #include @@ -153,6 +177,21 @@ typedef struct{ GENERIC_MERGE_SORT(static, sort_machine_stats, machine_data_list_t, next) +#define MKCMP(x) int cmp_##x(machine_data_list_t *a, machine_data_list_t *b){return ((a->x) == (b->x)? 0 : (((a->x) > (b->x))? -1 : 1));} + + +int (*sortby_ptr)(machine_data_list_t *a, machine_data_list_t *b); + +MKCMP(cpu_used) +MKCMP(load_1) +MKCMP(network_io_total_tx) +MKCMP(network_io_total_rx) +MKCMP(disk_io_total_write) +MKCMP(disk_io_total_read) +MKCMP(memory_used_pecent) +MKCMP(swap_used_pecent) + +/* int cmp_cpu(machine_data_list_t *a, machine_data_list_t *b){ if(a->cpu_used == b->cpu_used){ @@ -170,6 +209,7 @@ int cmp_cpu(machine_data_list_t *a, machine_data_list_ return 1; } } +*/ FILE *create_tcp_connection(char *hostname, int port){ int sock; @@ -535,27 +575,90 @@ int parse_xml(char *xml, machine_data_list_t **md){ } -void display(machine_data_list_t *machine_data_list, int num_lines){ +void display(machine_data_list_t *machine_data_list, display_config_t *display_config, int num_lines, int *title){ int line_num=4; + int x=1; + if(*title){ + printf("\033[2J"); + // printf("\033[1;1HHostname CPU Load Page Page Mem Swap Net Net Disk Disk"); + // printf("\033[2;1H used%% (1m) ins outs used used rx tx read write"); + printf("\033[1;1H%-11s", "Hostname"); + x=x+11+1; + if(display_config->cpu_used){ + printf("\033[1;%dH%5s", x, "CPU"); + printf("\033[2;%dH%5s", x, "used%"); + x+=6; + } + if(display_config->load_1){ + printf("\033[1;%dH%5s", x, "Load"); + printf("\033[2;%dH%5s", x, "(1m)"); + x+=6; + } + if(display_config->pages_in){ + printf("\033[1;%dH%5s", x, "Page"); + printf("\033[2;%dH%5s", x, "ins"); + x+=6; + } + if(display_config->pages_out){ + printf("\033[1;%dH%5s", x, "Page"); + printf("\033[2;%dH%5s", x, "outs"); + x+=6; + } + if(display_config->memory_used_pecent){ + printf("\033[1;%dH%5s", x, "Mem"); + printf("\033[2;%dH%5s", x, "used"); + x+=6; + } + if(display_config->swap_used_pecent){ + printf("\033[1;%dH%5s", x, "Swap"); + printf("\033[2;%dH%5s", x, "used"); + x+=6; + } + if(display_config->network_io_total_rx){ + printf("\033[1;%dH%8s", x, "Net"); + printf("\033[2;%dH%8s", x, "rx"); + x+=9; + } + if(display_config->network_io_total_tx){ + printf("\033[1;%dH%8s", x, "Net"); + printf("\033[2;%dH%8s", x, "tx"); + x+=9; + } + if(display_config->disk_io_total_read){ + printf("\033[1;%dH%9s", x, "Disk"); + printf("\033[2;%dH%9s", x, "read"); + x+=10; + } + if(display_config->disk_io_total_read){ + printf("\033[1;%dH%9s", x, "Disk"); + printf("\033[2;%dH%9s", x, "write"); + x+=10; + } + + *title=0; + } + for(;num_lines;num_lines--){ if(machine_data_list==NULL) break; - printf("\033[%d;%dH%-11s %5.1f %5.1f %5d %5d %5.1f %5.1f %8lld %8lld %9lld %9lld", \ - line_num++, 1, \ - machine_data_list->sysname, - machine_data_list->cpu_used, - machine_data_list->load_1, - machine_data_list->pages_in, - machine_data_list->pages_out, - machine_data_list->memory_used_pecent, - machine_data_list->swap_used_pecent, - machine_data_list->network_io_total_rx, - machine_data_list->network_io_total_tx, - machine_data_list->disk_io_total_read, - machine_data_list->disk_io_total_write); + + printf("\033[%d;%dH%-11s", line_num++, 1, machine_data_list->sysname); + + if(display_config->cpu_used) printf(" %5.1f", machine_data_list->cpu_used); + if(display_config->load_1) printf(" %5.1f", machine_data_list->load_1); + if(display_config->pages_in) printf(" %5d", machine_data_list->pages_in); + if(display_config->pages_out) printf(" %5d", machine_data_list->pages_out); + if(display_config->memory_used_pecent) printf(" %5.1f", machine_data_list->memory_used_pecent); + if(display_config->swap_used_pecent) printf(" %5.1f", machine_data_list->swap_used_pecent); + if(display_config->network_io_total_rx) printf(" %8lld", machine_data_list->network_io_total_rx); + if(display_config->network_io_total_tx) printf(" %8lld", machine_data_list->network_io_total_tx); + if(display_config->disk_io_total_read) printf(" %9lld", machine_data_list->disk_io_total_read); + if(display_config->disk_io_total_write) printf(" %9lld", machine_data_list->disk_io_total_write); + machine_data_list=machine_data_list->next; } + fflush(stdout); } @@ -575,10 +678,12 @@ int main(int argc, char **argv){ int num_hosts; int max_display=0; + int title; int cmdopt; extern int optind; extern char *optarg; + sortby_ptr=NULL; display_config_t display_config; @@ -613,25 +718,42 @@ int main(int argc, char **argv){ display_config.processes_zombie=0; display_config.processes_stopped=0; - display_config.network_io_total_tx=0; - display_config.network_io_total_rx=0; + display_config.network_io_total_tx=1; + display_config.network_io_total_rx=1; display_config.network_all_stats=1; - display_config.disk_io_total_write=0; - display_config.disk_io_total_read=0; - display_config.disk_io_all_stats=1; + display_config.disk_io_total_write=1; + display_config.disk_io_total_read=1; + display_config.disk_io_all_stats=0; display_config.disk_total_used=0; display_config.disk_all_stats=0; - while((cmdopt=getopt(argc, argv, "d:")) != -1){ + + while((cmdopt=getopt(argc, argv, "d:s:")) != -1){ switch(cmdopt){ case 'd': max_display=atoi(optarg); break; + case 's': + if(!strcmp(optarg, "cpu")){ + sortby_ptr=cmp_cpu_used; + } + if(!strcmp(optarg, "load")){ + sortby_ptr=cmp_load_1; + } + if(!strcmp(optarg, "mem")){ + sortby_ptr=cmp_memory_used_pecent; + } + if(sortby_ptr==NULL){ + errf("Invalid sort type"); + exit(1); + } + break; } } + if(sortby_ptr==NULL) sortby_ptr=cmp_cpu_used; if(argc<(optind+2)){ printf("Usage is %s <-d lines> hostname port \n", argv[0]); @@ -689,10 +811,11 @@ int main(int argc, char **argv){ errf("Failed to connect to host %s on port %d (%m)",servername, server_data_port); } - + /* printf("\033[2J"); printf("\033[1;1HHostname CPU Load Page Page Mem Swap Net Net Disk Disk"); printf("\033[2;1H used%% (1m) ins outs used used rx tx read write"); + */ fflush(stdout); for(;;){ response=fpgetline(data); @@ -703,11 +826,11 @@ int main(int argc, char **argv){ num_hosts=parse_xml(response, &machine_data_list); if(num_hosts==-1) continue; - machine_data_list=sort_machine_stats(machine_data_list, num_hosts, cmp_cpu); + machine_data_list=sort_machine_stats(machine_data_list, num_hosts, sortby_ptr); if(max_display==0){ - display(machine_data_list, num_hosts); + display(machine_data_list, &display_config, num_hosts, &title); }else{ - display(machine_data_list, max_display); + display(machine_data_list, &display_config, max_display, &title); } }