void netstats(void) { if (getuid() == 0) firemon_drop_privs(); pid_read(0); // include all processes printf("Displaying network statistics only for sandboxes using a new network namespace.\n"); // print processes while (1) { // set pid table int i; int itv = 5; // 5 second interval pid_read(0); // todo: preserve the last calculation if any, so we don't have to do get_stats() // start rx/tx measurements for (i = 0; i < MAX_PIDS; i++) { if (pids[i].level == 1) get_stats(i); } // wait 5 seconds firemon_sleep(itv); // grab screen size struct winsize sz; int row = 24; int col = 80; if (!ioctl(0, TIOCGWINSZ, &sz)) { col = sz.ws_col; row = sz.ws_row; } // start printing firemon_clrscr(); char *header = get_header(); if (strlen(header) > col) header[col] = '\0'; printf("%s\n", header); if (row > 0) row--; free(header); // start rx/tx measurements for (i = 0; i < MAX_PIDS; i++) { if (pids[i].level == 1) { get_stats(i); print_proc(i, itv, col); } } } }
void tree(void) { if (getuid() == 0) firemon_drop_privs(); pid_read(0); // include all processes // print processes int i; for (i = 0; i < MAX_PIDS; i++) { if (pids[i].level == 1) pid_print_tree(i, 0, 0); } }
void list(void) { if (getuid() == 0) firemon_drop_privs(); pid_read(0); // include all processes // print processes int i; for (i = 0; i < max_pids; i++) { if (pids[i].level == 1) pid_print_list(i, 0); } }
void cpu(void) { if (getuid() == 0) firemon_drop_privs(); pid_read(0); // include all processes // print processes int i; for (i = 0; i < MAX_PIDS; i++) { if (pids[i].level == 1) { pid_print_list(i, 0); int child = find_child(i); if (child != -1) print_cpu(child); } } }
void cpu(pid_t pid) { if (getuid() == 0) firemon_drop_privs(); pid_read(pid); // print processes int i; for (i = 0; i < max_pids; i++) { if (pids[i].level == 1) { pid_print_list(i, 0); int child = find_child(i); if (child != -1) print_cpu(child); } } }
void seccomp(pid_t pid) { if (getuid() == 0) firemon_drop_privs(); pid_read(pid); // include all processes // print processes int i; for (i = 0; i < max_pids; i++) { if (pids[i].level == 1) { pid_print_list(i, 0); int child = find_child(i); if (child != -1) print_seccomp(child); } } printf("\n"); }
void arp(pid_t pid) { if (getuid() == 0) firemon_drop_privs(); pid_read(pid); // print processes int i; for (i = 0; i < MAX_PIDS; i++) { if (pids[i].level == 1) { pid_print_list(i, 0); int child = find_child(i); if (child != -1) { char *fname; if (!asprintf(&fname, "/proc/%d/net/arp", child) == -1) errExit("asprintf"); print_arp(fname); free(fname); printf("\n"); } } } }
void top(void) { if (getuid() == 0) firemon_drop_privs(); while (1) { // clear linked list head_clear(); // set pid table int i; int itv = 5; // 5 second interval pid_read(0); // start cpu measurements unsigned utime; unsigned stime; for (i = 0; i < MAX_PIDS; i++) { if (pids[i].level == 1) pid_store_cpu(i, 0, &utime, &stime); } // wait 5 seconds firemon_sleep(itv); // grab screen size struct winsize sz; int row = 24; int col = 80; if (!ioctl(0, TIOCGWINSZ, &sz)) { col = sz.ws_col; row = sz.ws_row; } // start printing firemon_clrscr(); char *header = get_header(); if (strlen(header) > col) header[col] = '\0'; printf("%s\n", header); if (row > 0) row--; free(header); // find system uptime FILE *fp = fopen("/proc/uptime", "r"); if (fp) { float f; int rv = fscanf(fp, "%f", &f); (void) rv; sysuptime = (unsigned long long) f; fclose(fp); } // print processes for (i = 0; i < MAX_PIDS; i++) { if (pids[i].level == 1) { float cpu = 0; int cnt = 0; // process count char *line = print_top(i, 0, &utime, &stime, itv, &cpu, &cnt); if (line) head_add(cpu, line); } } head_print(col, row); } }