ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/saidar/saidar.c
(Generate patch)

Comparing projects/libstatgrab/src/saidar/saidar.c (file contents):
Revision 1.27 by ats, Mon Apr 5 15:40:17 2004 UTC vs.
Revision 1.41 by tdb, Fri Jan 5 13:30:36 2007 UTC

# Line 1 | Line 1
1   /*
2 < * i-scream central monitoring system
2 > * i-scream libstatgrab
3   * http://www.i-scream.org
4   * Copyright (C) 2000-2004 i-scream
5   *
# Line 36 | Line 36
36   #include <sys/times.h>
37   #include <limits.h>
38   #include <time.h>
39 + #include <math.h>
40  
41   #ifdef HAVE_NCURSES_H
42 < #include <ncurses.h>
42 < #else
43 < #include <curses.h>
42 > #define COLOR_SUPPORT
43   #endif
44 + #include CURSES_HEADER_FILE
45  
46 + #define THRESHOLD_LOAD 1.0
47 +
48 + #define THRESHOLD_WARN_ZMB 0
49 +
50 + #define THRESHOLD_WARN_CPU 60.0
51 + #define THRESHOLD_ALERT_CPU 90.0
52 +
53 + #define THRESHOLD_WARN_SWAP 75.0
54 + #define THRESHOLD_ALERT_SWAP 90.0
55 +
56 + #define THRESHOLD_WARN_MEM 75.0
57 + #define THRESHOLD_ALERT_MEM 90.0
58 +
59 + #define THRESHOLD_WARN_DISK 75.0
60 + #define THRESHOLD_ALERT_DISK 90.0
61 +
62 + int sig_winch_flag = 0;
63 +
64   typedef struct{
65          sg_cpu_percents *cpu_percents;
66          sg_mem_stats *mem_stats;
# Line 63 | Line 81 | typedef struct{
81          sg_host_info *host_info;
82          sg_user_stats *user_stats;
83   }stats_t;
84 <        
84 >
85   stats_t stats;
86  
87   char *size_conv(long long number){
88          char type[] = {'B', 'K', 'M', 'G', 'T'};
89          int x=0;
90 +        int sign=1;
91          static char string[10];
92  
93 +        if(number < 0){
94 +                sign=-1;
95 +                number=-number;
96 +        }
97 +
98          for(;x<5;x++){
99                  if( (number/1024) < (100)) {
100                          break;
# Line 78 | Line 102 | char *size_conv(long long number){
102                  number = (number/1024);
103          }
104  
105 <        snprintf(string, 10, "%lld%c", number, type[x]);        
105 >        number = number*sign;
106 >
107 >        snprintf(string, 10, "%lld%c", number, type[x]);
108          return string;
109 <        
109 >
110   }
111  
112   char *hr_uptime(time_t time){
113          int day = 0, hour = 0, min = 0;
114          static char uptime_str[25];
115          int sec = (int) time;
116 <        
116 >
117          day = sec / (24*60*60);
118          sec = sec % (24*60*60);
119          hour = sec / (60*60);
# Line 152 | Line 178 | void display_headings(){
178          printw("Mem Free  :");
179  
180          /* Swap */
181 <        move(6, 21);
182 <        printw("Swap Total:");
183 <        move(7, 21);
184 <        printw("Swap Used :");
185 <        move(8, 21);
186 <        printw("Swap Free :");
181 >        move(6, 21);
182 >        printw("Swap Total:");
183 >        move(7, 21);
184 >        printw("Swap Used :");
185 >        move(8, 21);
186 >        printw("Swap Free :");
187  
188          /* VM */
189          move(6, 42);
# Line 179 | Line 205 | void display_headings(){
205          move(10,15);
206          printw("Read");
207          move(10,28);
208 <        printw("Write");        
208 >        printw("Write");
209  
210          line = 10;
211          if (stats.network_io_stats != NULL) {
# Line 203 | Line 229 | void display_headings(){
229          refresh();
230   }
231  
232 < void display_data(){
232 > void display_data(int colors){
233          char cur_time[20];
234          struct tm *tm_time;
235          time_t epoc_time;
# Line 228 | Line 254 | void display_data(){
254                   */
255                  if (ptr != NULL){
256                          *ptr = '\0';
257 <                }      
257 >                }
258 >                if (colors) {
259 >                        attron(COLOR_PAIR(1));
260 >                }
261                  printw("%s", hostname);
262                  move(0,36);
263                  printw("%s", hr_uptime(stats.host_info->uptime));
# Line 237 | Line 266 | void display_data(){
266                  strftime(cur_time, 20, "%Y-%m-%d %T", tm_time);
267                  move(0,61);
268                  printw("%s", cur_time);
269 +                if (colors) {
270 +                        attroff(COLOR_PAIR(1));
271 +                }
272          }
273  
274          if (stats.load_stats != NULL) {
275                  /* Load */
276 +                if (colors) {
277 +                        attron(COLOR_PAIR(6));
278 +                }
279                  move(2,12);
280 +                if (colors && fabs(stats.load_stats->min1 - stats.load_stats->min5) > THRESHOLD_LOAD) {
281 +                        attron(A_BOLD);
282 +                }
283                  printw("%6.2f", stats.load_stats->min1);
284 +                if (colors) {
285 +                        attroff(A_BOLD);
286 +                }
287                  move(3,12);
288 +                if (colors && fabs(stats.load_stats->min5 - stats.load_stats->min15) > THRESHOLD_LOAD) {
289 +                        attron(A_BOLD);
290 +                }
291                  printw("%6.2f", stats.load_stats->min5);
292 +                if (colors) {
293 +                        attroff(A_BOLD);
294 +                }
295                  move(4,12);
296 +                if (colors && fabs(stats.load_stats->min1 - stats.load_stats->min15) > THRESHOLD_LOAD) {
297 +                        attron(A_BOLD);
298 +                }
299                  printw("%6.2f", stats.load_stats->min15);
300 +                if (colors) {
301 +                        attroff(A_BOLD);
302 +                }
303          }
304  
305          if (stats.cpu_percents != NULL) {
# Line 256 | Line 309 | void display_data(){
309                  move(3,33);
310                  printw("%6.2f%%", (stats.cpu_percents->kernel + stats.cpu_percents->iowait + stats.cpu_percents->swap));
311                  move(4,33);
312 +                if (colors && stats.cpu_percents->user + stats.cpu_percents->nice > THRESHOLD_ALERT_CPU) {
313 +                        attron(A_STANDOUT);
314 +                        attron(A_BOLD);
315 +                }
316 +                else if (colors && stats.cpu_percents->user + stats.cpu_percents->nice > THRESHOLD_WARN_CPU) {
317 +                        attron(A_BOLD);
318 +                }
319                  printw("%6.2f%%", (stats.cpu_percents->user + stats.cpu_percents->nice));
320 +                if(colors) {
321 +                        attroff(A_BOLD);
322 +                        attroff(A_STANDOUT);
323 +                        attron(COLOR_PAIR(6));
324 +                }
325          }
326  
327          if (stats.process_count != NULL) {
# Line 264 | Line 329 | void display_data(){
329                  move(2, 54);
330                  printw("%5d", stats.process_count->running);
331                  move(2,74);
332 +                if (colors && stats.process_count->zombie > THRESHOLD_WARN_ZMB) {
333 +                        attron(A_STANDOUT);
334 +                        attron(A_BOLD);
335 +                }
336                  printw("%5d", stats.process_count->zombie);
337 +                if(colors) {
338 +                        attroff(A_STANDOUT);
339 +                        attroff(A_BOLD);
340 +                }
341                  move(3, 54);
342                  printw("%5d", stats.process_count->sleeping);
343                  move(3, 74);
# Line 277 | Line 350 | void display_data(){
350                  printw("%5d", stats.user_stats->num_entries);
351          }
352  
353 +        if(colors) {
354 +                attroff(COLOR_PAIR(6));
355 +                attron(COLOR_PAIR(5));
356 +        }
357          if (stats.mem_stats != NULL) {
358                  /* Mem */
359                  move(6, 12);
360 <                printw("%7s", size_conv(stats.mem_stats->total));      
360 >                printw("%7s", size_conv(stats.mem_stats->total));
361                  move(7, 12);
362 <                printw("%7s", size_conv(stats.mem_stats->used));        
362 >                printw("%7s", size_conv(stats.mem_stats->used));
363                  move(8, 12);
364                  printw("%7s", size_conv(stats.mem_stats->free));
365          }
366 <        
367 <        if (stats.swap_stats != NULL) {
366 >
367 >        if (stats.swap_stats != NULL) {
368                  /* Swap */
369                  move(6, 32);
370                  printw("%8s", size_conv(stats.swap_stats->total));
# Line 298 | Line 375 | void display_data(){
375          }
376  
377          /* VM */
378 <        if (stats.mem_stats != NULL && stats.mem_stats->total != 0) {  
378 >        if (stats.mem_stats != NULL && stats.mem_stats->total != 0) {
379 >                float f = 100.00 * (float)(stats.mem_stats->used)/stats.mem_stats->total;
380 >                if (colors && f > THRESHOLD_ALERT_MEM) {
381 >                        attron(A_STANDOUT);
382 >                        attron(A_BOLD);
383 >                }
384 >                else if (colors && f > THRESHOLD_WARN_MEM) {
385 >                        attron(A_BOLD);
386 >                }
387                  move(6, 54);
388 <                printw("%5.2f%%", (100.00 * (float)(stats.mem_stats->used)/stats.mem_stats->total));
388 >                printw("%5.2f%%", f);
389 >                if (colors) {
390 >                        attroff(A_STANDOUT);
391 >                        attroff(A_BOLD);
392 >                        attron(COLOR_PAIR(5));
393 >                }
394          }
395 <        if (stats.swap_stats != NULL && stats.swap_stats->total != 0) {
395 >        if (stats.swap_stats != NULL && stats.swap_stats->total != 0) {
396 >                float f = 100.00 * (float)(stats.swap_stats->used)/stats.swap_stats->total;
397 >                if (colors && f > THRESHOLD_ALERT_SWAP) {
398 >                        attron(A_STANDOUT);
399 >                        attron(A_BOLD);
400 >                }
401 >                else if (colors && f > THRESHOLD_WARN_SWAP) {
402 >                        attron(A_BOLD);
403 >                }
404                  move(7, 54);
405 <                printw("%5.2f%%", (100.00 * (float)(stats.swap_stats->used)/stats.swap_stats->total));
405 >                printw("%5.2f%%", f);
406 >                if (colors) {
407 >                        attroff(A_STANDOUT);
408 >                        attroff(A_BOLD);
409 >                        attron(COLOR_PAIR(5));
410 >                }
411          }
412          if (stats.mem_stats != NULL && stats.swap_stats != NULL &&
413 <            stats.mem_stats->total != 0 && stats.swap_stats->total != 0) {      
413 >            stats.mem_stats->total != 0 && stats.swap_stats->total != 0) {
414                  move(8, 54);
415                  printw("%5.2f%%", (100.00 * (float)(stats.mem_stats->used+stats.swap_stats->used)/(stats.mem_stats->total+stats.swap_stats->total)));
416          }
417  
418 <        if (stats.page_stats != NULL) {
418 >        if (stats.page_stats != NULL) {
419                  /* Paging */
420                  move(6, 74);
421                  printw("%5d", (stats.page_stats->systime)? (stats.page_stats->pages_pagein / stats.page_stats->systime): stats.page_stats->pages_pagein);
422                  move(7, 74);
423                  printw("%5d", (stats.page_stats->systime)? (stats.page_stats->pages_pageout / stats.page_stats->systime) : stats.page_stats->pages_pageout);
424          }
425 +        if (colors) {
426 +                attroff(COLOR_PAIR(5));
427 +        }
428  
429          line = 11;
430 <        if (stats.disk_io_stats != NULL) {      
430 >        if (stats.disk_io_stats != NULL) {
431                  /* Disk IO */
432                  disk_io_stat_ptr = stats.disk_io_stats;
433                  r=0;
434                  w=0;
435                  for(counter=0;counter<stats.disk_io_entries;counter++){
436 +                        char name[12];
437 +                        strncpy(name, disk_io_stat_ptr->disk_name, sizeof(name));
438 +                        name[sizeof(name)-1] = '\0'; /* strncpy doesn't terminate longer strings */
439                          move(line, 0);
440 <                        printw("%s", disk_io_stat_ptr->disk_name);
440 >                        printw("%s", name);
441                          move(line, 12);
442                          rt = (disk_io_stat_ptr->systime)? (disk_io_stat_ptr->read_bytes/disk_io_stat_ptr->systime): disk_io_stat_ptr->read_bytes;
443 +                        if(colors) {
444 +                                attron(COLOR_PAIR(4));
445 +                        }
446                          printw("%7s", size_conv(rt));
447                          r+=rt;
448                          move(line, 26);
# Line 339 | Line 451 | void display_data(){
451                          w+=wt;
452                          disk_io_stat_ptr++;
453                          line++;
454 +                        if(colors) {
455 +                                attroff(COLOR_PAIR(4));
456 +                        }
457                  }
458                  line++;
459                  move(line, 0);
460                  printw("Total");
461                  move(line, 12);
462 +                if(colors) {
463 +                        attron(COLOR_PAIR(4));
464 +                }
465                  printw("%7s", size_conv(r));
466                  move(line, 26);
467                  printw("%7s", size_conv(w));
468 +                if(colors) {
469 +                        attroff(COLOR_PAIR(4));
470 +                }
471          }
472  
473          line = 11;
474 <        if (stats.network_io_stats != NULL) {  
474 >        if (stats.network_io_stats != NULL) {
475                  /* Network */
476                  network_stat_ptr = stats.network_io_stats;
477                  for(counter=0;counter<stats.network_io_entries;counter++){
478 <                        move(line, 42);
479 <                        printw("%s", network_stat_ptr->interface_name);
478 >                        char name[20];
479 >                        strncpy(name, network_stat_ptr->interface_name, sizeof(name));
480 >                        name[sizeof(name)-1] = '\0'; /* strncpy doesn't terminate longer strings */
481 >                        move(line, 42);
482 >                        printw("%s", name);
483                          move(line, 62);
484                          rt = (network_stat_ptr->systime)? (network_stat_ptr->rx / network_stat_ptr->systime): network_stat_ptr->rx;
485 +                        if(colors) {
486 +                                attron(COLOR_PAIR(4));
487 +                        }
488                          printw("%7s", size_conv(rt));
489                          move(line, 72);
490 <                        wt = (network_stat_ptr->systime)? (network_stat_ptr->tx / network_stat_ptr->systime): network_stat_ptr->tx;
490 >                        wt = (network_stat_ptr->systime)? (network_stat_ptr->tx / network_stat_ptr->systime): network_stat_ptr->tx;
491                          printw("%7s", size_conv(wt));
492                          network_stat_ptr++;
493                          line++;
494 +                        if(colors) {
495 +                                attroff(COLOR_PAIR(4));
496 +                        }
497                  }
498                  line += 2;
499          }
500  
501 <        if (stats.fs_stats != NULL) {  
501 >        if (stats.fs_stats != NULL) {
502                  /* Disk */
503                  disk_stat_ptr = stats.fs_stats;
504                  for(counter=0;counter<stats.fs_entries;counter++){
505 +                        char name[20];
506 +                        strncpy(name, disk_stat_ptr->mnt_point, sizeof(name));
507 +                        name[sizeof(name)-1] = '\0'; /* strncpy doesn't terminate longer strings */
508                          move(line, 42);
509 <                        printw("%s", disk_stat_ptr->mnt_point);
509 >                        printw("%s", name);
510                          move(line, 62);
511 +                        if(colors) {
512 +                                attron(COLOR_PAIR(2));
513 +                        }
514                          printw("%7s", size_conv(disk_stat_ptr->avail));
515                          move(line, 73);
516 <                        printw("%5.2f%%", 100.00 * ((float) disk_stat_ptr->used / (float) (disk_stat_ptr->used + disk_stat_ptr->avail)));
516 >                        if(colors && 100.00 * ((float) disk_stat_ptr->used / (float) (disk_stat_ptr->used + disk_stat_ptr->avail)) > THRESHOLD_ALERT_DISK) {
517 >                                attron(A_STANDOUT);
518 >                                attron(A_BOLD);
519 >                        } else if (colors && 100.00 * ((float) disk_stat_ptr->used / (float) (disk_stat_ptr->used + disk_stat_ptr->avail)) > THRESHOLD_WARN_DISK) {
520 >                                attron(A_BOLD);
521 >                        }
522 >                        printw("%6.2f%%", 100.00 * ((float) disk_stat_ptr->used / (float) (disk_stat_ptr->used + disk_stat_ptr->avail)));
523                          disk_stat_ptr++;
524                          line++;
525 +                        if(colors) {
526 +                                attroff(COLOR_PAIR(2));
527 +                                attroff(A_STANDOUT);
528 +                                attroff(A_BOLD);
529 +                        }
530                  }
531          }
532  
533          refresh();
534   }
535  
536 < void sig_winch_handler(int sig){
537 <        clear();
538 <        display_headings();
392 <        display_data();
393 <        signal(SIGWINCH, sig_winch_handler);
536 > void sig_winch_handler(int dummy){
537 >        sig_winch_flag = 1;
538 >        signal(SIGWINCH, sig_winch_handler);
539   }
540  
541   int get_stats(){
# Line 416 | Line 561 | void version_num(char *progname){
561   }
562  
563   void usage(char *progname){
564 <        fprintf(stderr, "Usage: %s [-d delay] [-v] [-h]\n\n", progname);
565 <        fprintf(stderr, "  -d    Sets the update time in seconds\n");
564 > #ifdef COLOR_SUPPORT
565 >        fprintf(stderr, "Usage: %s [-d delay] [-c] [-v] [-h]\n\n", progname);
566 > #else
567 >        fprintf(stderr, "Usage: %s [-d delay] [-v] [-h]\n\n", progname);
568 > #endif
569 >        fprintf(stderr, "  -d    Sets the update time in seconds\n");
570 > #ifdef COLOR_SUPPORT
571 >        fprintf(stderr, "  -c    Enables coloured output\n");
572 > #endif
573          fprintf(stderr, "  -v    Prints version number\n");
574 <        fprintf(stderr, "  -h    Displays this help information.\n");
575 <        fprintf(stderr, "\nReport bugs to <%s>.\n", PACKAGE_BUGREPORT);
576 <        exit(1);
574 >        fprintf(stderr, "  -h    Displays this help information.\n");
575 >        fprintf(stderr, "\nReport bugs to <%s>.\n", PACKAGE_BUGREPORT);
576 >        exit(1);
577   }
578  
579   int main(int argc, char **argv){
580 +        extern char *optarg;
581 +        int c;
582 +        int colouron = 0;
583  
429        extern char *optarg;
430        int c;
431
584          time_t last_update = 0;
585  
586          WINDOW *window;
# Line 442 | Line 594 | int main(int argc, char **argv){
594                  fprintf(stderr, "Failed to drop setuid/setgid privileges\n");
595                  return 1;
596          }
597 <                
598 <        while ((c = getopt(argc, argv, "vhd:")) != -1){
599 <                switch (c){
600 <                        case 'd':
601 <                                delay = atoi(optarg);
597 >
598 > #ifdef COLOR_SUPPORT
599 >        while ((c = getopt(argc, argv, "d:cvh")) != -1){
600 > #else
601 >        while ((c = getopt(argc, argv, "d:vh")) != -1){
602 > #endif
603 >                switch (c){
604 >                        case 'd':
605 >                                delay = atoi(optarg);
606                                  if (delay < 1){
607                                          fprintf(stderr, "Time must be 1 second or greater\n");
608                                          exit(1);
609                                  }
610 <                                break;
610 >                                break;
611 > #ifdef COLOR_SUPPORT
612 >                        case 'c':
613 >                                colouron = 1;
614 >                                break;
615 > #endif
616                          case 'v':
617 <                                version_num(argv[0]);  
617 >                                version_num(argv[0]);
618                                  break;
619                          case 'h':
620                          default:
621                                  usage(argv[0]);
622                                  return 1;
623                                  break;
624 <                }
625 <        }
624 >                }
625 >        }
626  
627          signal(SIGWINCH, sig_winch_handler);
628 <        initscr();
629 <        nonl();
630 <        cbreak();
631 <        noecho();
628 >        initscr();
629 > #ifdef COLOR_SUPPORT
630 >        /* turn on colour */
631 >        if (colouron) {
632 >                if (has_colors()) {
633 >                        start_color();
634 >                        use_default_colors();
635 >                        init_pair(1,COLOR_RED,-1);
636 >                        init_pair(2,COLOR_GREEN,-1);
637 >                        init_pair(3,COLOR_YELLOW,-1);
638 >                        init_pair(4,COLOR_BLUE,-1);
639 >                        init_pair(5,COLOR_MAGENTA,-1);
640 >                        init_pair(6,COLOR_CYAN,-1);
641 >                } else {
642 >                        fprintf(stderr, "Colour support disabled: your terminal does not support colour.");
643 >                        colouron = 0;
644 >                }
645 >        }
646 > #endif
647 >        nonl();
648 >        curs_set(0);
649 >        cbreak();
650 >        noecho();
651          timeout(delay * 1000);
652 <        window=newwin(0, 0, 0, 0);
652 >        window=newwin(0, 0, 0, 0);
653          clear();
654  
655          if(!get_stats()){
# Line 497 | Line 677 | int main(int argc, char **argv){
677                  }
678                  last_update = now;
679  
680 <                display_data();
681 <        }      
680 >                if(sig_winch_flag) {
681 >                        clear();
682 >                        display_headings();
683 >                        sig_winch_flag = 0;
684 >                }
685  
686 +                display_data(colouron);
687 +        }
688 +
689          endwin();
690          return 0;
691 < }      
691 > }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines