--- projects/cms/source/idar/idar.c 2003/04/09 21:55:10 1.14 +++ projects/cms/source/idar/idar.c 2004/06/02 16:06:48 1.22 @@ -1,6 +1,6 @@ /* * i-scream central monitoring system - * http://www.i-scream.org.uk + * http://www.i-scream.org * Copyright (C) 2000-2002 i-scream * * This program is free software; you can redistribute it and/or @@ -26,12 +26,15 @@ #include #include #include +#include #include #include #include #include #include #include +#include +#include #include #include @@ -174,11 +177,7 @@ typedef struct{ int pages_in; int pages_out; - int processes_total; - int processes_sleeping; - int processes_cpu; - int processes_zombie; - int processes_stopped; + int processes; int network_io_total_tx; int network_io_total_rx; @@ -223,27 +222,8 @@ MKCMP(swap_used_pecent) #define DISKIOW "DiskIO writes" #define DISKIO "Total DiskIO (reads+writes)" +int sig_winch=0; -/* -int cmp_cpu(machine_data_list_t *a, machine_data_list_t *b){ - - if(a->cpu_used == b->cpu_used){ - if(a->load_1 == b->load_1) return 0; - if(a->load_1 > b->load_1){ - return -1; - }else{ - return 1; - } - } - - if((a->cpu_used) > (b->cpu_used)){ - return -1; - }else{ - return 1; - } -} -*/ - #ifndef HAVE_ATOLL long long int atoll (const char *nptr){ return strtoll (nptr, (char **) NULL, 10); @@ -434,6 +414,8 @@ int parse_xml(char *xml, machine_data_list_t **md){ machine_data_list->diskio_data_list=NULL; *md=machine_data_list; num_hosts++; + } else { + xmlFree(hostname); } /* Now we want to pull out the data */ @@ -718,6 +700,7 @@ void display(machine_data_list_t *machine_data_list, d printw("%5s", "(1m)"); x+=6; } + if(display_config->pages_in && (display_config->maxx > x+6)){ move(1,x); printw("%5s", "Page"); @@ -725,6 +708,7 @@ void display(machine_data_list_t *machine_data_list, d printw("%5s", "ins"); x+=6; } + if(display_config->pages_out && (display_config->maxx > x+6)){ move(1,x); printw("%5s", "Page"); @@ -732,6 +716,7 @@ void display(machine_data_list_t *machine_data_list, d printw("%5s", "outs"); x+=6; } + if(display_config->memory_used_pecent && (display_config->maxx > x+6)){ move(1,x); printw("%5s", "Mem"); @@ -739,6 +724,7 @@ void display(machine_data_list_t *machine_data_list, d printw("%5s", "used"); x+=6; } + if(display_config->swap_used_pecent && (display_config->maxx > x+6)){ move(1,x); printw("%5s", "Swap"); @@ -746,6 +732,7 @@ void display(machine_data_list_t *machine_data_list, d printw("%5s", "used"); x+=6; } + if(display_config->network_io_total_rx){ if(display_config->units=='b' && (display_config->maxx > x+9)){ move(1,x); @@ -754,6 +741,7 @@ void display(machine_data_list_t *machine_data_list, d printw("%8s", "rx"); x+=9; } + if(display_config->units=='k' && (display_config->maxx > x+6)){ move(1,x); printw("%5s", "Net"); @@ -761,14 +749,17 @@ void display(machine_data_list_t *machine_data_list, d printw("%5s", "rx"); x+=6; } - if(display_config->units=='m' && (display_config->maxx > x+5)){ + + if(display_config->units=='m' && (display_config->maxx > x+6)){ move(1,x); - printw("%4s", "Net"); + printw("%5s", "Net"); move(2,x); - printw("%4s", "rx"); - x+=5; + printw("%5s", "rx"); + x+=6; } + } + if(display_config->network_io_total_tx){ if(display_config->units=='b' && (display_config->maxx > x+9)){ move(1,x); @@ -777,6 +768,7 @@ void display(machine_data_list_t *machine_data_list, d printw("%8s", "tx"); x+=9; } + if(display_config->units=='k' && (display_config->maxx > x+6)){ move(1,x); printw("%5s", "Net"); @@ -784,13 +776,15 @@ void display(machine_data_list_t *machine_data_list, d printw("%5s", "tx"); x+=6; } - if(display_config->units=='m' && (display_config->maxx > x+5)){ + + if(display_config->units=='m' && (display_config->maxx > x+6)){ move(1,x); - printw("%4s", "Net"); + printw("%5s", "Net"); move(2,x); - printw("%4s", "tx"); - x+=5; + printw("%5s", "tx"); + x+=6; } + } if(display_config->disk_io_total_read){ @@ -801,6 +795,7 @@ void display(machine_data_list_t *machine_data_list, d printw("%9s", "read"); x+=10; } + if(display_config->units=='k' && (display_config->maxx > x+7)){ move(1,x); printw("%6s", "Disk"); @@ -808,13 +803,15 @@ void display(machine_data_list_t *machine_data_list, d printw("%6s", "read"); x+=7; } - if(display_config->units=='m' && (display_config->maxx > x+6)){ + + if(display_config->units=='m' && (display_config->maxx > x+7)){ move(1,x); - printw("%5s", "Disk"); + printw("%6s", "Disk"); move(2,x); - printw("%5s", "read"); - x+=6; + printw("%6s", "read"); + x+=7; } + } if(display_config->disk_io_total_read){ @@ -825,6 +822,7 @@ void display(machine_data_list_t *machine_data_list, d printw("%9s", "write"); x+=10; } + if(display_config->units=='k' && (display_config->maxx > x+7)){ move(1,x); printw("%6s", "Disk"); @@ -832,15 +830,25 @@ void display(machine_data_list_t *machine_data_list, d printw("%6s", "write"); x+=7; } - if(display_config->units=='m' && (display_config->maxx > x+6)){ + + if(display_config->units=='m' && (display_config->maxx > x+7)){ move(1,x); - printw("%5s", "Disk"); + printw("%6s", "Disk"); move(2,x); - printw("%5s", "write"); - x+=6; + printw("%6s", "write"); + x+=7; } + } - + + if(display_config->processes && (display_config->maxx > x+25)){ + move(1,x); + printw("%-24s", " Number of Process"); + move(2,x); + printw("%-24s", " Run Slep Zomb Stop Tot"); + x+=25; + } + *title=0; } @@ -885,9 +893,9 @@ void display(machine_data_list_t *machine_data_list, d printw(" %5lld", machine_data_list->network_io_total_rx/1024); x+=6; } - if(display_config->units=='m' && (display_config->maxx > x+5)){ - printw(" %4.1f", (double)(machine_data_list->network_io_total_rx/(1024.00*1024.00))); - x+=5; + if(display_config->units=='m' && (display_config->maxx > x+6)){ + printw(" %5.2f", (double)(machine_data_list->network_io_total_rx/(1024.00*1024.00))); + x+=6; } } @@ -900,9 +908,9 @@ void display(machine_data_list_t *machine_data_list, d printw(" %5lld", machine_data_list->network_io_total_tx/1024); x+=6; } - if(display_config->units=='m' && (display_config->maxx > x+5)){ - printw(" %4.1f", (double)(machine_data_list->network_io_total_tx/(1024.00*1024.00))); - x+=5; + if(display_config->units=='m' && (display_config->maxx > x+6)){ + printw(" %5.2f", (double)(machine_data_list->network_io_total_tx/(1024.00*1024.00))); + x+=6; } } @@ -915,9 +923,9 @@ void display(machine_data_list_t *machine_data_list, d printw(" %6lld", machine_data_list->disk_io_total_read/1024); x+=7; } - if(display_config->units=='m' && (display_config->maxx > x+6)){ - printw(" %5.1f", (double)(machine_data_list->disk_io_total_read/(1024.00*1024.00))); - x+=6; + if(display_config->units=='m' && (display_config->maxx > x+7)){ + printw(" %6.2f", (double)(machine_data_list->disk_io_total_read/(1024.00*1024.00))); + x+=7; } } @@ -930,11 +938,19 @@ void display(machine_data_list_t *machine_data_list, d printw(" %6lld", machine_data_list->disk_io_total_write/1024); x+=7; } - if(display_config->units=='m' && (display_config->maxx > x+6)){ - printw(" %5.1f", (double)(machine_data_list->disk_io_total_write/(1024.00*1024.00))); - x+=6; + if(display_config->units=='m' && (display_config->maxx > x+7)){ + printw(" %6.2f", (double)(machine_data_list->disk_io_total_write/(1024.00*1024.00))); + x+=7; } } + if(display_config->processes && display_config->maxx > x+25){ + printw(" %4d %4d %4d %4d %4d", machine_data_list->processes_cpu, \ + machine_data_list->processes_sleeping, \ + machine_data_list->processes_zombie, \ + machine_data_list->processes_stopped, \ + machine_data_list->processes_total); + x+=25; + } machine_data_list=machine_data_list->next; } @@ -944,6 +960,26 @@ void display(machine_data_list_t *machine_data_list, d } +void sig_winch_handler(int sig){ + + sig_winch=1; + signal(SIGWINCH, sig_winch_handler); +} + +void usage() { + printf("Usage: idar [-o order] [-s server] [-p port] [-l list] [-h]\n\n"); + printf(" -o Sets the initial sort order. Accepted arguments are one of:\n"); + printf(" cpu load mem swap net disk\n"); + printf(" -s Specifies the i-scream server to connect to.\n"); + printf(" default: %s\n", DEF_SERVER_NAME); + printf(" -p Specifies the i-scream server port.\n"); + printf(" default: %d\n", DEF_SERVER_PORT); + printf(" -l Sets the list of hosts to monitor in a semi-colon separated list.\n"); + printf(" -h Displays this help information.\n"); + printf("\nReport bugs to <%s>.\n", PACKAGE_BUGREPORT); + exit(1); +} + int main(int argc, char **argv){ WINDOW *window; fd_set infds; @@ -955,7 +991,7 @@ int main(int argc, char **argv){ char *machine_list=NULL; char *response=NULL; - char *servername; + char *server_name; int server_control_port; int server_data_port; @@ -967,6 +1003,8 @@ int main(int argc, char **argv){ int cmdopt; extern int optind; extern char *optarg; + + extern int errno; display_config_t display_config; char ch; @@ -1002,11 +1040,7 @@ int main(int argc, char **argv){ display_config.pages_in=1; display_config.pages_out=1; - display_config.processes_total=0; - display_config.processes_sleeping=0; - display_config.processes_cpu=0; - display_config.processes_zombie=0; - display_config.processes_stopped=0; + display_config.processes=1; display_config.network_io_total_tx=1; display_config.network_io_total_rx=1; @@ -1017,11 +1051,16 @@ int main(int argc, char **argv){ display_config.disk_io_all_stats=0; display_config.disk_total_used=0; - display_config.disk_all_stats=0; + display_config.disk_all_stats=0; - while((cmdopt=getopt(argc, argv, "s:")) != -1){ + signal(SIGWINCH, sig_winch_handler); + + server_name=DEF_SERVER_NAME; + server_control_port=DEF_SERVER_PORT; + + while((cmdopt=getopt(argc, argv, "o:s:p:l:h")) != -1){ switch(cmdopt){ - case 's': + case 'o': if(!strcmp(optarg, "cpu")){ sortby_ptr=cmp_cpu_used; strlcpy(display_config.sortby, CPU_USED, SORTBYMAXNAME); @@ -1035,42 +1074,56 @@ int main(int argc, char **argv){ strlcpy(display_config.sortby, MEM, SORTBYMAXNAME); } if(!strcmp(optarg, "swap")){ - sortby_ptr=cmp_swap_used_pecent; - strlcpy(display_config.sortby, SWAP, SORTBYMAXNAME); - } + sortby_ptr=cmp_swap_used_pecent; + strlcpy(display_config.sortby, SWAP, SORTBYMAXNAME); + } + if(!strcmp(optarg, "net")){ + sortby_ptr=cmp_network_io_total; + strlcpy(display_config.sortby, NETIO, SORTBYMAXNAME); + } + if(!strcmp(optarg, "disk")){ + sortby_ptr=cmp_disk_io_total; + strlcpy(display_config.sortby, DISKIO, SORTBYMAXNAME); + } if(sortby_ptr==NULL){ - errf("Invalid sort type"); - exit(1); + errf("Invalid order given."); + usage(); } - break; + break; + case 's': + server_name=optarg; + break; + case 'p': + server_control_port=atoi(optarg); + break; + case 'l': + /* We've been passed a machine list */ + /* list currently needs to be ; seperated */ + machine_list=strdup(optarg); + break; + case 'h': + default: + usage(); + break; } } + /* Don't take any other arguments */ + if(argc>optind){ + usage(); + } + if(sortby_ptr==NULL){ sortby_ptr=cmp_cpu_used; strlcpy(display_config.sortby, "CPU Used", SORTBYMAXNAME); } - if(argc<(optind+2)){ - printf("Usage is %s <-d lines> hostname port \n", argv[0]); - exit(1); - } - - servername=argv[optind]; - server_control_port=atoi(argv[optind+1]); - - control=create_tcp_connection(servername, server_control_port); + control=create_tcp_connection(server_name, server_control_port); if(control==NULL){ errf("Failed to connect (%m)"); exit(1); } - if(argc==4){ - /* We've been passed a machine list */ - /* list currently needs to be ; seperated */ - machine_list=strdup(argv[3]); - } - if((tcp_comm(control, NULL, &response, "PROTOCOL 1.1"))!=0){ errf("Incorrect version number (%s)", response); exit(1); @@ -1103,22 +1156,16 @@ int main(int argc, char **argv){ exit(1); } - data=create_tcp_connection(servername, server_data_port); + data=create_tcp_connection(server_name, server_data_port); if(data==NULL){ - errf("Failed to connect to host %s on port %d (%m)",servername, server_data_port); + errf("Failed to connect to host %s on port %d (%m)",server_name, server_data_port); exit(1); } - /* - 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"); - */ - initscr(); nonl(); cbreak(); - echo(); + noecho(); window=newwin(0, 0, 0, 0); getmaxyx(window, display_config.maxy, display_config.maxx); @@ -1131,6 +1178,13 @@ int main(int argc, char **argv){ FD_SET(stdin_fileno, &infds); FD_SET(data_fileno, &infds); if((select(biggest_fileno, &infds, NULL, NULL, NULL))==-1){ + if(errno!=EINTR){ + errf("select failed with (%m)"); + exit(1); + } + } + + if(sig_winch){ if (ioctl(fileno(stdout), TIOCGWINSZ, &size) == 0) { resizeterm(size.ws_row, size.ws_col); wrefresh(curscr); @@ -1139,13 +1193,17 @@ int main(int argc, char **argv){ title=1; display(machine_data_list, &display_config, &title); refresh(); + sig_winch=0; continue; } if(FD_ISSET(stdin_fileno, &infds)){ - ch=getc(stdin); + ch=getch(); switch(ch){ + case KEY_RESIZE: + sig_winch=1; + break; /* Quit */ case 'Q': @@ -1269,13 +1327,16 @@ int main(int argc, char **argv){ display_config.cpu_used=1; } break; + case 'r': + if(display_config.processes){ + display_config.processes=0; + }else{ + display_config.processes=1; + } + break; default: - /* Invalid key.. Ignore.. Set Title to -1, as the - * title++ will then make that "0" (false) so a - * screen redraw will not happen */ - title=-1; - break; + continue; } /* Increment title so it becomes true (and making the screen update */