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

Comparing projects/libstatgrab/src/statgrab/statgrab.c (file contents):
Revision 1.12 by ats, Mon Oct 20 22:18:21 2003 UTC vs.
Revision 1.24 by ats, Mon Apr 5 15:40:17 2004 UTC

# Line 1 | Line 1
1   /*
2   * i-scream central monitoring system
3   * http://www.i-scream.org
4 < * Copyright (C) 2000-2003 i-scream
4 > * Copyright (C) 2000-2004 i-scream
5   *
6   * This program is free software; you can redistribute it and/or
7   * modify it under the terms of the GNU General Public License
# Line 16 | Line 16
16   * You should have received a copy of the GNU General Public License
17   * along with this program; if not, write to the Free Software
18   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 + *
20 + * $Id$
21   */
22  
23   #ifdef HAVE_CONFIG_H
# Line 35 | Line 37 | typedef enum {
37          FLOAT,
38          DOUBLE,
39          STRING,
40 <        INT
40 >        INT,
41 >        BOOL,
42 >        DUPLEX
43   } stat_type;
44  
45   typedef enum {
# Line 162 | Line 166 | void populate_const() {
166  
167   void populate_cpu() {
168          if (use_cpu_percent) {
169 <                cpu_percent_t *cpu_p = cpu_percent_usage();
169 >                sg_cpu_percents *cpu_p = sg_get_cpu_percents();
170  
171                  if (cpu_p != NULL) {
172                          add_stat(FLOAT, &cpu_p->user,
# Line 181 | Line 185 | void populate_cpu() {
185                                   "cpu", "time_taken", NULL);
186                  }
187          } else {
188 <                cpu_states_t *cpu_s;
188 >                sg_cpu_stats *cpu_s;
189  
190 <                cpu_s = use_diffs ? get_cpu_diff() : get_cpu_totals();
190 >                cpu_s = use_diffs ? sg_get_cpu_stats_diff()
191 >                                  : sg_get_cpu_stats();
192                  if (cpu_s != NULL) {
193                          add_stat(LONG_LONG, &cpu_s->user,
194                                   "cpu", "user", NULL);
# Line 206 | Line 211 | void populate_cpu() {
211   }
212  
213   void populate_mem() {
214 <        mem_stat_t *mem = get_memory_stats();
214 >        sg_mem_stats *mem = sg_get_mem_stats();
215  
216          if (mem != NULL) {
217                  add_stat(LONG_LONG, &mem->total, "mem", "total", NULL);
# Line 217 | Line 222 | void populate_mem() {
222   }
223  
224   void populate_load() {
225 <        load_stat_t *load = get_load_stats();
225 >        sg_load_stats *load = sg_get_load_stats();
226  
227          if (load != NULL) {
228                  add_stat(DOUBLE, &load->min1, "load", "min1", NULL);
# Line 227 | Line 232 | void populate_load() {
232   }
233  
234   void populate_user() {
235 <        user_stat_t *user = get_user_stats();
235 >        sg_user_stats *user = sg_get_user_stats();
236  
237          if (user != NULL) {
238                  add_stat(INT, &user->num_entries, "user", "num", NULL);
# Line 236 | Line 241 | void populate_user() {
241   }
242  
243   void populate_swap() {
244 <        swap_stat_t *swap = get_swap_stats();
244 >        sg_swap_stats *swap = sg_get_swap_stats();
245  
246          if (swap != NULL) {
247                  add_stat(LONG_LONG, &swap->total, "swap", "total", NULL);
# Line 246 | Line 251 | void populate_swap() {
251   }
252  
253   void populate_general() {
254 <        general_stat_t *gen = get_general_stats();
254 >        /* FIXME this should be renamed to host. */
255 >        sg_host_info *host = sg_get_host_info();
256  
257 <        if (gen != NULL) {
258 <                add_stat(STRING, &gen->os_name,
257 >        if (host != NULL) {
258 >                add_stat(STRING, &host->os_name,
259                           "general", "os_name", NULL);
260 <                add_stat(STRING, &gen->os_release,
260 >                add_stat(STRING, &host->os_release,
261                           "general", "os_release", NULL);
262 <                add_stat(STRING, &gen->os_version,
262 >                add_stat(STRING, &host->os_version,
263                           "general", "os_version", NULL);
264 <                add_stat(STRING, &gen->platform, "general", "platform", NULL);
265 <                add_stat(STRING, &gen->hostname, "general", "hostname", NULL);
266 <                add_stat(TIME_T, &gen->uptime, "general", "uptime", NULL);
264 >                add_stat(STRING, &host->platform, "general", "platform", NULL);
265 >                add_stat(STRING, &host->hostname, "general", "hostname", NULL);
266 >                add_stat(TIME_T, &host->uptime, "general", "uptime", NULL);
267          }
268   }
269  
270   void populate_fs() {
271          int n, i;
272 <        disk_stat_t *disk = get_disk_stats(&n);
272 >        sg_fs_stats *disk = sg_get_fs_stats(&n);
273  
274          if (disk != NULL) {
275                  for (i = 0; i < n; i++) {
# Line 279 | Line 285 | void populate_fs() {
285                                  die("out of memory");
286  
287                          name = buf;
288 +                        if (strlen(name) == 2 && name[1] == ':')
289 +                                name[1] = '\0';
290                          if (strncmp(name, "/dev/", 5) == 0)
291                                  name += 5;
292                          while ((p = strchr(name, '/')) != NULL)
# Line 310 | Line 318 | void populate_fs() {
318  
319   void populate_disk() {
320          int n, i;
321 <        diskio_stat_t *diskio;
321 >        sg_disk_io_stats *diskio;
322  
323 <        diskio = use_diffs ? get_diskio_stats_diff(&n) : get_diskio_stats(&n);
323 >        diskio = use_diffs ? sg_get_disk_io_stats_diff(&n)
324 >                           : sg_get_disk_io_stats(&n);
325          if (diskio != NULL) {
326                  for (i = 0; i < n; i++) {
327                          const char *name = diskio[i].disk_name;
# Line 330 | Line 339 | void populate_disk() {
339   }
340  
341   void populate_proc() {
342 <        process_stat_t *proc = get_process_stats();
342 >        /* FIXME expose individual process info too */
343 >        sg_process_count *proc = sg_get_process_count();
344  
345          if (proc != NULL) {
346                  add_stat(INT, &proc->total, "proc", "total", NULL);
# Line 343 | Line 353 | void populate_proc() {
353  
354   void populate_net() {
355          int n, i;
356 <        network_stat_t *net;
356 >        sg_network_io_stats *io;
357 >        sg_network_iface_stats *iface;
358  
359 <        net = use_diffs ? get_network_stats_diff(&n) : get_network_stats(&n);
360 <        if (net != NULL) {
359 >        io = use_diffs ? sg_get_network_io_stats_diff(&n)
360 >                       : sg_get_network_io_stats(&n);
361 >        if (io != NULL) {
362                  for (i = 0; i < n; i++) {
363 <                        const char *name = net[i].interface_name;
363 >                        const char *name = io[i].interface_name;
364          
365 <                        add_stat(STRING, &net[i].interface_name,
365 >                        add_stat(STRING, &io[i].interface_name,
366                                   "net", name, "interface_name", NULL);
367 <                        add_stat(LONG_LONG, &net[i].tx,
367 >                        add_stat(LONG_LONG, &io[i].tx,
368                                   "net", name, "tx", NULL);
369 <                        add_stat(LONG_LONG, &net[i].rx,
369 >                        add_stat(LONG_LONG, &io[i].rx,
370                                   "net", name, "rx", NULL);
371 <                        add_stat(TIME_T, &net[i].systime,
371 >                        add_stat(LONG_LONG, &io[i].ipackets,
372 >                                 "net", name, "ipackets", NULL);
373 >                        add_stat(LONG_LONG, &io[i].opackets,
374 >                                 "net", name, "opackets", NULL);
375 >                        add_stat(LONG_LONG, &io[i].ierrors,
376 >                                 "net", name, "ierrors", NULL);
377 >                        add_stat(LONG_LONG, &io[i].oerrors,
378 >                                 "net", name, "oerrors", NULL);
379 >                        add_stat(LONG_LONG, &io[i].collisions,
380 >                                 "net", name, "collisions", NULL);
381 >                        add_stat(TIME_T, &io[i].systime,
382                                   "net", name, "systime", NULL);
383                  }
384          }
385 +
386 +        iface = sg_get_network_iface_stats(&n);
387 +        if (iface != NULL) {
388 +                for (i = 0; i < n; i++) {
389 +                        const char *name = iface[i].interface_name;
390 +
391 +                        add_stat(INT, &iface[i].speed,
392 +                                 "net", name, "speed", NULL);
393 +                        add_stat(BOOL, &iface[i].up,
394 +                                 "net", name, "up", NULL);
395 +                        add_stat(DUPLEX, &iface[i].dup,
396 +                                 "net", name, "duplex", NULL);
397 +                }
398 +        }
399   }
400  
401   void populate_page() {
402 <        page_stat_t *page;
402 >        sg_page_stats *page;
403  
404 <        page = use_diffs ? get_page_stats_diff() : get_page_stats();
404 >        page = use_diffs ? sg_get_page_stats_diff() : sg_get_page_stats();
405          if (page != NULL) {
406                  add_stat(LONG_LONG, &page->pages_pagein, "page", "in", NULL);
407                  add_stat(LONG_LONG, &page->pages_pageout, "page", "out", NULL);
# Line 428 | Line 464 | void get_stats() {
464                          t->populate();
465          }
466  
467 <        qsort(stats, num_stats, sizeof *stats, stats_compare);
467 >        if (stats != NULL)
468 >                qsort(stats, num_stats, sizeof *stats, stats_compare);
469   }
470  
471   /* Print the value of a stat. */
472   void print_stat_value(const stat *s) {
473          void *v = s->stat;
474 +        long l;
475  
476          switch (s->type) {
477          case LONG_LONG:
# Line 441 | Line 479 | void print_stat_value(const stat *s) {
479                  break;
480          case TIME_T:
481                  /* FIXME option for formatted time? */
482 <                printf("%ld", *(time_t *)v);
482 >                l = *(time_t *)v;
483 >                printf("%ld", l);
484                  break;
485          case FLOAT:
486                  printf("%f", *(float *)v);
# Line 456 | Line 495 | void print_stat_value(const stat *s) {
495          case INT:
496                  printf("%d", *(int *)v);
497                  break;
498 +        case BOOL:
499 +                printf("%s", *(int *)v ? "true" : "false");
500 +                break;
501 +        case DUPLEX:
502 +                switch (*(sg_iface_duplex *) v) {
503 +                case SG_IFACE_DUPLEX_FULL:
504 +                        printf("full");
505 +                        break;
506 +                case SG_IFACE_DUPLEX_HALF:
507 +                        printf("half");
508 +                        break;
509 +                default:
510 +                        printf("unknown");
511 +                        break;
512 +                }
513 +                break;
514          }
515   }
516  
# Line 498 | Line 553 | void print_stats(int argc, char **argv) {
553                          else
554                                  compare = stats_compare;
555  
556 <                        s = (const stat *)bsearch(&key, stats, num_stats,
557 <                                                  sizeof *stats, compare);
556 >                        if (stats == NULL) {
557 >                                s = NULL;
558 >                        } else {
559 >                                s = (const stat *)bsearch(&key, stats,
560 >                                                          num_stats,
561 >                                                          sizeof *stats,
562 >                                                          compare);
563 >                        }
564 >
565                          if (s == NULL) {
566                                  printf("Unknown stat %s\n", name);
567                                  continue;
# Line 605 | Line 667 | int main(int argc, char **argv) {
667  
668          /* We don't care if statgrab_init fails, because we can just display
669             the statistics that can be read as non-root. */
670 <        statgrab_init();
671 < #ifdef ALLBSD
672 <        if (setegid(getgid()) != 0)
611 <                die("Failed to lose effective group");
612 < #endif
670 >        sg_init();
671 >        if (sg_drop_privileges() != 0)
672 >                die("Failed to drop setuid/setgid privileges");
673  
674          switch (repeat_mode) {
675          case REPEAT_NONE:

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines