END_TEST START_TEST(getifinfo_not_found) { linuxonly; suppress_output(); ck_assert_int_eq(remove_directory(TESTDIR), 1); fake_proc_net_dev("w", "ethwrong", 10, 20, 30, 40); ck_assert_int_eq(getifinfo("ethunusual"), 0); }
END_TEST START_TEST(getifinfo_success) { linuxonly; suppress_output(); ck_assert_int_eq(remove_directory(TESTDIR), 1); fake_proc_net_dev("w", "ethwrong", 10, 20, 30, 40); fake_proc_net_dev("a", "ethunusual", 1, 2, 3, 4); ck_assert_int_eq(getifinfo("ethunusual"), 1); ck_assert_str_eq(ifinfo.name, "ethunusual"); ck_assert_int_eq(ifinfo.filled, 1); ck_assert_int_eq(ifinfo.rx, 1); ck_assert_int_eq(ifinfo.tx, 2); ck_assert_int_eq(ifinfo.rxp, 3); ck_assert_int_eq(ifinfo.txp, 4); }
void datalist_getifinfo(DSTATE *s) { if (!data.active) { if (debug) printf("d: interface is disabled\n"); return; } if (!getifinfo(data.interface)) { /* disable interface since we can't access its data */ data.active = 0; snprintf(errorstring, 512, "Interface \"%s\" not available, disabling.", data.interface); printe(PT_Info); return; } if (s->datalist->sync) { /* if --sync was used during startup */ data.currx = ifinfo.rx; data.curtx = ifinfo.tx; s->datalist->sync = 0; } else { parseifinfo(0); } }
int addinterfaces(const char *dirname) { char *ifacelist, interface[32]; int index = 0, count = 0, bwlimit = 0; /* get list of currently visible interfaces */ if (getiflist(&ifacelist)==0) { free(ifacelist); return 0; } if (strlen(ifacelist)<2) { free(ifacelist); return 0; } if (debug) printf("Interface list: \"%s\"\n", ifacelist); while (sscanf(ifacelist+index, "%31s", interface)!=EOF) { if (debug) printf("Processing: \"%s\"\n", interface); index += strlen(interface)+1; /* skip local interfaces */ if ((strcmp(interface,"lo")==0) || (strcmp(interface,"lo0")==0) || (strcmp(interface,"sit0")==0)) { if (debug) printf("skip\n"); continue; } /* create database for interface */ initdb(); strncpy_nt(data.interface, interface, 32); strncpy_nt(data.nick, data.interface, 32); if (!getifinfo(interface)) { if (debug) printf("getifinfo failed, skip\n"); continue; } parseifinfo(1); if (!writedb(interface, dirname, 1)) { continue; } count++; bwlimit = ibwget(interface); if (bwlimit > 0) { printf("\"%s\" added with %d Mbit bandwidth limit.\n", interface, bwlimit); } else { printf("\"%s\" added. Warning: no bandwidth limit has been set.\n", interface); } } if (count==1) { printf("-> %d interface added.", count); } else { printf("-> %d interfaces added.", count); } if (count) { printf("\nLimits can be modified using the configuration file. See \"man vnstat.conf\".\n"); printf("Unwanted interfaces can be removed from monitoring with \"vnstat --delete\"."); } printf("\n"); free(ifacelist); return count; }
int main(int argc, char *argv[]) { XEvent event; char buf[16]; int d=0; int pifno=-1; int lastbytes=0; struct timeval tv; fd_set fds; int x; int prev_exec_busy=0; exec_up = exec_dflt; exec_down = exec_dflt; parse_cmdline(argc, argv); initXwindow(argc, argv); if(mode == MODE_LED) { openXwindow(argc, argv, wmifinfo_led_xpm, wmifinfo_led_bits, wmifinfo_led_width, wmifinfo_led_height, BackColor, LabelColor, WindGustColor, DataColor, StationTimeColor); } else { openXwindow(argc, argv, wmifinfo_lcd_xpm, wmifinfo_lcd_bits, wmifinfo_lcd_width, wmifinfo_lcd_height, BackColor, LabelColor, WindGustColor, DataColor, StationTimeColor); } // Initialize global variables fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); ifc.ifc_len = sizeof(struct ifreq) * 10; ifc.ifc_buf = malloc(ifc.ifc_len); while(1) { while (XPending(display)) { XNextEvent(display, &event); switch (event.type) { case Expose: RedrawWindow(); break; case ButtonPress: ButtonPressEvent(&event.xbutton); break; case ButtonRelease: break; } } if ((d++ == 3) || (ifno != pifno) || (exec_busy != prev_exec_busy)) { d=0; copyXPMArea(64, 0, 64, 64, 0, 0); getifnames(); if(ifaces>0) { ifno = ifno % ifaces; getifinfo(ifname[ifno], &ifinfo); if(ifno != pifno) lastbytes = ifinfo.bytes; sprintf(buf, "%-7s", ifinfo.id); strupper(buf); drawtext(buf, &font2, 6, 4); if(memcmp(ifinfo.hw, "\x00\x00\x00\x00\x00\x00", 6) != 0) { drawhwaddr(ifinfo.hw); } if(ifinfo.ip) drawipaddr(ifinfo.ip, 0); if(ifinfo.nm) drawipaddr(ifinfo.nm, 1); if(ifinfo.gw) drawipaddr(ifinfo.gw, 2); // WLAN signal level #ifdef linux x = ifinfo.sl/4; #elif defined(__OpenBSD__) x = ifinfo.sl/7; #endif if(x>13) x=13; copyXPMArea(4, 82, x*4, 4, 6, 53); // LED x=0; if(exec_busy) { x=0; } else { if(ifinfo.state) x += 8; if(lastbytes == ifinfo.bytes) x+= 16; } copyXPMArea(64 + x, 81, 8, 8, 50, 4); lastbytes = ifinfo.bytes; } RedrawWindow(); prev_exec_busy = exec_busy; pifno = ifno; } #ifdef linux tv.tv_sec = 0; tv.tv_usec = DELAY; FD_ZERO(&fds); FD_SET(ConnectionNumber(display), &fds); select(ConnectionNumber(display)+1, &fds, NULL, NULL, &tv); #elif defined(__OpenBSD__) usleep(DELAY); #endif } }
void livetrafficmeter(char iface[32], int mode) { /* received bytes packets errs drop fifo frame compressed multicast */ /* transmitted bytes packets errs drop fifo colls carrier compressed */ uint64_t rx, tx, rxp, txp, timespent, timeslept; uint64_t rxtotal, txtotal, rxptotal, txptotal; uint64_t rxpmin, txpmin, rxpmax, txpmax; uint64_t rxmin, txmin, rxmax, txmax; uint64_t index = 1; int ratewidth, ppswidth, paddingwidth, json = 0; char buffer[256], buffer2[256]; IFINFO previnfo; if (cfg.qmode == 10) { json = 1; } if (!json) { printf("Monitoring %s... (press CTRL-C to stop)\n\n", iface); if (cfg.ostyle != 4) { printf(" getting traffic..."); fflush(stdout); } } /* enable signal trap */ intsignal = 0; if (signal(SIGINT, sighandler) == SIG_ERR) { perror("signal"); exit(EXIT_FAILURE); } /* set some defaults */ rxtotal = txtotal = rxptotal = txptotal = rxpmax = txpmax = 0; rxpmin = txpmin = rxmin = txmin = MAX64; rxmax = txmax = 0; timeslept = 0; timespent = (uint64_t)time(NULL); /* read /proc/net/dev and get values to the first list */ if (!getifinfo(iface)) { printf("Error: Interface \"%s\" not available, exiting.\n", iface); exit(EXIT_FAILURE); } ratewidth = 15; ppswidth = 5; paddingwidth = 8; /* narrow output mode */ if (cfg.ostyle == 0) { ratewidth = 12; ppswidth = 3; paddingwidth = 4; } if (!json) { cursorhide(); } else { printf("{\"jsonversion\":\"%d\",", JSONVERSION_LIVE); printf("\"vnstatversion\":\"%s\",", getversion()); printf("\"interface\":\"%s\",", iface); printf("\"sampletime\":%d}\n", LIVETIME); } /* loop until user gets bored */ while (intsignal == 0) { timeslept = (uint64_t)time(NULL); /* wait 2 seconds for more traffic */ sleep(LIVETIME); timeslept = (uint64_t)time(NULL) - timeslept; /* break loop without calculations because sleep was probably interrupted */ if (intsignal) { break; } /* use values from previous loop if this isn't the first time */ previnfo.rx = ifinfo.rx; previnfo.tx = ifinfo.tx; previnfo.rxp = ifinfo.rxp; previnfo.txp = ifinfo.txp; /* read those values again... */ if (!getifinfo(iface)) { cursorshow(); printf("Error: Interface \"%s\" not available, exiting.\n", iface); exit(EXIT_FAILURE); } /* calculate traffic and packets seen between updates */ rx = countercalc(&previnfo.rx, &ifinfo.rx, ifinfo.is64bit); tx = countercalc(&previnfo.tx, &ifinfo.tx, ifinfo.is64bit); rxp = countercalc(&previnfo.rxp, &ifinfo.rxp, ifinfo.is64bit); txp = countercalc(&previnfo.txp, &ifinfo.txp, ifinfo.is64bit); /* update totals */ rxtotal += rx; txtotal += tx; rxptotal += rxp; txptotal += txp; /* update min & max */ if (rxmin > rx) { rxmin = rx; } if (txmin > tx) { txmin = tx; } if (rxmax < rx) { rxmax = rx; } if (txmax < tx) { txmax = tx; } if (rxpmin > rxp) { rxpmin = rxp; } if (txpmin > txp) { txpmin = txp; } if (rxpmax < rxp) { rxpmax = rxp; } if (txpmax < txp) { txpmax = txp; } /* show the difference in a readable format or json */ if (!json) { if (mode == 0) { /* packets per second visible */ snprintf(buffer, 128, " rx: %s %*" PRIu64 " p/s", gettrafficrate(rx, LIVETIME, ratewidth), ppswidth, (uint64_t)rxp / LIVETIME); snprintf(buffer2, 128, " %*s tx: %s %*" PRIu64 " p/s", paddingwidth, " ", gettrafficrate(tx, LIVETIME, ratewidth), ppswidth, (uint64_t)txp / LIVETIME); } else { /* total transfer amount visible */ snprintf(buffer, 128, " rx: %s %s", gettrafficrate(rx, LIVETIME, ratewidth), getvalue(rxtotal, 1, RT_Normal)); snprintf(buffer2, 128, " %*s tx: %s %s", paddingwidth, " ", gettrafficrate(tx, LIVETIME, ratewidth), getvalue(txtotal, 1, RT_Normal)); } strcat(buffer, buffer2); if (cfg.ostyle != 4 || !debug) { cursortocolumn(1); eraseline(); } if (cfg.ostyle != 4) { printf("%s", buffer); fflush(stdout); } else { printf("%s\n", buffer); } } else { printf("{\"index\":%" PRIu64 ",", index); printf("\"seconds\":%" PRIu64 ",", (uint64_t)time(NULL) - timespent); printf("\"rx\":{"); printf("\"ratestring\":\"%s\",", gettrafficrate(rx, LIVETIME, 0)); printf("\"bytespersecond\":%" PRIu64 ",", (uint64_t)(rx / LIVETIME)); printf("\"packetspersecond\":%" PRIu64 ",", (uint64_t)(rxp / LIVETIME)); printf("\"bytes\":%" PRIu64 ",", rx); printf("\"packets\":%" PRIu64 ",", rxp); printf("\"totalbytes\":%" PRIu64 ",", rxtotal); printf("\"totalpackets\":%" PRIu64 "", rxptotal); printf("},"); printf("\"tx\":{"); printf("\"ratestring\":\"%s\",", gettrafficrate(tx, LIVETIME, 0)); printf("\"bytespersecond\":%" PRIu64 ",", (uint64_t)(tx / LIVETIME)); printf("\"packetspersecond\":%" PRIu64 ",", (uint64_t)(txp / LIVETIME)); printf("\"bytes\":%" PRIu64 ",", tx); printf("\"packets\":%" PRIu64 ",", txp); printf("\"totalbytes\":%" PRIu64 ",", txtotal); printf("\"totalpackets\":%" PRIu64 "", txptotal); printf("}}\n"); index++; } } timespent = (uint64_t)time(NULL) - timespent - timeslept; if (!json) { cursorshow(); printf("\n\n"); } /* print some statistics if enough time did pass */ if (!json && timespent >= 10) { printf("\n %s / traffic statistics\n\n", iface); printf(" rx | tx\n"); printf("--------------------------------------+------------------\n"); printf(" bytes %s", getvalue(rxtotal, 15, RT_Normal)); printf(" | %s", getvalue(txtotal, 15, RT_Normal)); printf("\n"); printf("--------------------------------------+------------------\n"); printf(" max %s", gettrafficrate(rxmax, LIVETIME, 15)); printf(" | %s\n", gettrafficrate(txmax, LIVETIME, 15)); printf(" average %s", gettrafficrate(rxtotal, (time_t)timespent, 15)); printf(" | %s\n", gettrafficrate(txtotal, (time_t)timespent, 15)); printf(" min %s", gettrafficrate(rxmin, LIVETIME, 15)); printf(" | %s\n", gettrafficrate(txmin, LIVETIME, 15)); printf("--------------------------------------+------------------\n"); printf(" packets %12" PRIu64 " | %12" PRIu64 "\n", rxptotal, txptotal); printf("--------------------------------------+------------------\n"); printf(" max %9" PRIu64 " p/s | %9" PRIu64 " p/s\n", rxpmax / LIVETIME, txpmax / LIVETIME); printf(" average %9" PRIu64 " p/s | %9" PRIu64 " p/s\n", rxptotal / timespent, txptotal / timespent); printf(" min %9" PRIu64 " p/s | %9" PRIu64 " p/s\n", rxpmin / LIVETIME, txpmin / LIVETIME); printf("--------------------------------------+------------------\n"); if (timespent <= 60) { printf(" time %9" PRIu64 " seconds\n", timespent); } else { printf(" time %7.2f minutes\n", timespent / (double)60); } printf("\n"); } else if (json) { printf("{\"seconds\":%" PRIu64 ",", timespent); printf("\"rx\":{"); printf("\"maxratestring\":\"%s\",", gettrafficrate(rxmax, LIVETIME, 0)); printf("\"averageratestring\":\"%s\",", gettrafficrate(rxtotal, (time_t)timespent, 0)); printf("\"minratestring\":\"%s\",", gettrafficrate(rxmin, LIVETIME, 0)); printf("\"totalbytes\":%" PRIu64 ",", rxtotal); printf("\"maxbytes\":%" PRIu64 ",", rxmax); printf("\"minbytes\":%" PRIu64 ",", rxmin); printf("\"totalpackets\":%" PRIu64 ",", rxptotal); printf("\"maxpackets\":%" PRIu64 ",", rxpmax); printf("\"minpackets\":%" PRIu64 "", rxpmin); printf("},"); printf("\"tx\":{"); printf("\"maxratestring\":\"%s\",", gettrafficrate(txmax, LIVETIME, 0)); printf("\"averageratestring\":\"%s\",", gettrafficrate(txtotal, (time_t)timespent, 0)); printf("\"minratestring\":\"%s\",", gettrafficrate(txmin, LIVETIME, 0)); printf("\"totalbytes\":%" PRIu64 ",", txtotal); printf("\"maxbytes\":%" PRIu64 ",", txmax); printf("\"minbytes\":%" PRIu64 ",", txmin); printf("\"totalpackets\":%" PRIu64 ",", txptotal); printf("\"maxpackets\":%" PRIu64 ",", txpmax); printf("\"minpackets\":%" PRIu64 "", txpmin); printf("}}\n"); } }
void trafficmeter(char iface[], unsigned int sampletime) { /* received bytes packets errs drop fifo frame compressed multicast */ /* transmitted bytes packets errs drop fifo colls carrier compressed */ uint64_t rx, tx, rxp, txp; int json = 0; IFINFO firstinfo; char buffer[256]; if (cfg.qmode == 10) { json = 1; } /* less than 2 seconds doesn't produce good results */ if (sampletime < 2) { printf("Error: Time for sampling too short.\n"); exit(EXIT_FAILURE); } /* read interface info and get values to the first list */ if (!getifinfo(iface)) { printf("Error: Interface \"%s\" not available, exiting.\n", iface); exit(EXIT_FAILURE); } firstinfo.rx = ifinfo.rx; firstinfo.tx = ifinfo.tx; firstinfo.rxp = ifinfo.rxp; firstinfo.txp = ifinfo.txp; /* wait sampletime and print some nice dots so that the user thinks something is done :) */ if (!json) { snprintf(buffer, 256, "Sampling %s (%u seconds average)", iface, sampletime); printf("%s", buffer); fflush(stdout); sleep(sampletime / 3); printf("."); fflush(stdout); sleep(sampletime / 3); printf("."); fflush(stdout); sleep(sampletime / 3); printf("."); fflush(stdout); if ((sampletime / 3) * 3 != sampletime) { sleep(sampletime - ((sampletime / 3) * 3)); } cursortocolumn(1); eraseline(); } else { sleep(sampletime); } /* read those values again... */ if (!getifinfo(iface)) { printf("Error: Interface \"%s\" not available, exiting.\n", iface); exit(EXIT_FAILURE); } /* calculate traffic and packets seen between updates */ rx = countercalc(&firstinfo.rx, &ifinfo.rx, ifinfo.is64bit); tx = countercalc(&firstinfo.tx, &ifinfo.tx, ifinfo.is64bit); rxp = countercalc(&firstinfo.rxp, &ifinfo.rxp, ifinfo.is64bit); txp = countercalc(&firstinfo.txp, &ifinfo.txp, ifinfo.is64bit); /* show the difference in a readable format or json */ if (!json) { printf("%" PRIu64 " packets sampled in %d seconds\n", rxp + txp, sampletime); printf("Traffic average for %s\n", iface); printf("\n rx %s %5" PRIu64 " packets/s\n", gettrafficrate(rx, sampletime, 15), (uint64_t)(rxp / sampletime)); printf(" tx %s %5" PRIu64 " packets/s\n\n", gettrafficrate(tx, sampletime, 15), (uint64_t)(txp / sampletime)); } else { printf("{\"jsonversion\":\"%d\",", JSONVERSION_TR); printf("\"vnstatversion\":\"%s\",", getversion()); printf("\"interface\":\"%s\",", iface); printf("\"sampletime\":%u,", sampletime); printf("\"rx\":{"); printf("\"ratestring\":\"%s\",", gettrafficrate(rx, sampletime, 0)); printf("\"bytespersecond\":%" PRIu64 ",", (uint64_t)(rx / sampletime)); printf("\"packetspersecond\":%" PRIu64 ",", (uint64_t)(rxp / sampletime)); printf("\"bytes\":%" PRIu64 ",", rx); printf("\"packets\":%" PRIu64 "", rxp); printf("},"); printf("\"tx\":{"); printf("\"ratestring\":\"%s\",", gettrafficrate(tx, sampletime, 0)); printf("\"bytespersecond\":%" PRIu64 ",", (uint64_t)(tx / sampletime)); printf("\"packetspersecond\":%" PRIu64 ",", (uint64_t)(txp / sampletime)); printf("\"bytes\":%" PRIu64 ",", tx); printf("\"packets\":%" PRIu64 "", txp); printf("}}\n"); } }