diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d6e512d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/src/*.o +/src/vnstat diff --git a/src/cfg.c b/src/cfg.c index b36e1e7..12afbce 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -2,6 +2,7 @@ #include "cfg.h" void printcfgfile(void) { + int i; ibwnode *p = ifacebw; @@ -60,6 +61,19 @@ void printcfgfile(void) { printf("# how much the boot time can variate between updates (seconds)\n"); printf("BootVariation %d\n", cfg.bvar); + for (i=0;i<24;i++) { + if (cfg.peak[i]) { + printf ("# peak hours (e.g. 6pm-midnight: Peak 6 7 8 9 10 11)\n"); + printf ("Peak"); + for (i=0;i<24;i++) { + if (cfg.peak[i]) { + printf (" %d",i); + } + } + printf ("\n"); + break; + } + } } int loadcfg(char *cfgfile) { @@ -70,11 +84,11 @@ int loadcfg(char *cfgfile) { char value[512], cfgline[512]; - char *cfgname[] = { "DatabaseDir", "Locale", "MonthRotate", "DayFormat", "MonthFormat", "TopFormat", "RXCharacter", "TXCharacter", "RXHourCharacter", "TXHourCharacter", "Interface", "MaxBandwidth", "Sampletime", "QueryMode", "UseFileLocking", "BootVariation", 0 }; - char *cfglocc[] = { cfg.dbdir, cfg.locale, 0, cfg.dformat, cfg.mformat, cfg.tformat, cfg.rxchar, cfg.txchar, cfg.rxhourchar, cfg.txhourchar, cfg.iface, 0, 0, 0, 0, 0 }; - int *cfgloci[] = { 0, 0, &cfg.monthrotate, 0, 0, 0, 0, 0, 0, 0, 0, &cfg.maxbw, &cfg.sampletime, &cfg.qmode, &cfg.flock, &cfg.bvar }; - int cfgnamelen[] = { 512, 32, 0, 64, 64, 64, 1, 1, 1, 1, 32, 0, 0, 0, 0, 0 }; - int cfgfound[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + char *cfgname[] = { "DatabaseDir", "Locale", "MonthRotate", "DayFormat", "MonthFormat", "TopFormat", "RXCharacter", "TXCharacter", "RXHourCharacter", "TXHourCharacter", "Interface", "MaxBandwidth", "Sampletime", "QueryMode", "UseFileLocking", "BootVariation", "Peak", 0 }; + char *cfglocc[] = { cfg.dbdir, cfg.locale, 0, cfg.dformat, cfg.mformat, cfg.tformat, cfg.rxchar, cfg.txchar, cfg.rxhourchar, cfg.txhourchar, cfg.iface, 0, 0, 0, 0, 0, 0 }; + int *cfgloci[] = { 0, 0, &cfg.monthrotate, 0, 0, 0, 0, 0, 0, 0, 0, &cfg.maxbw, &cfg.sampletime, &cfg.qmode, &cfg.flock, &cfg.bvar, 0 }; + int cfgnamelen[] = { 512, 32, 0, 64, 64, 64, 1, 1, 1, 1, 32, 0, 0, 0, 0, 0, 0 }; + int cfgfound[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; ifacebw = NULL; @@ -168,8 +182,20 @@ int loadcfg(char *cfgfile) { /* set value and get new line if valid value was found */ if (strlen(value)!=0) { - - if (cfgnamelen[i]>0) { + if (!strcmp(cfgname[i], "Peak")) { + int h; + char *v=value; + while (*v) { + while (*v && !isdigit(*v)) + v++; + if (*v == '\0') + break; + h=atoi(v); + cfg.peak[h]=1; + while (*v && isdigit(*v)) + v++; + } + } else if (cfgnamelen[i]>0) { strncpy(cfglocc[i], value, cfgnamelen[i]); } else if (isdigit(value[0])) { *cfgloci[i] = atoi(value); @@ -222,7 +248,7 @@ void defaultcfg(void) { strncpy(cfg.txchar, TXCHAR, 1); strncpy(cfg.rxhourchar, RXHOURCHAR, 1); strncpy(cfg.txhourchar, TXHOURCHAR, 1); - + memset (cfg.peak, 0, sizeof (cfg.peak)); } int ibwadd(char *iface, int limit) diff --git a/src/db.c b/src/db.c index 126f425..c1645a0 100644 --- a/src/db.c +++ b/src/db.c @@ -218,6 +218,15 @@ void showdb(int qmode) printf("\n"); used++; } + + if (data.monthpeak[i].used) { + printf(" %8s %s", " (peak)", getvalue(data.monthpeak[i].rx, data.monthpeak[i].rxk, 8)); + printf(" | %s", getvalue(data.monthpeak[i].tx, data.monthpeak[i].txk, 8)); + printf(" | %s", getvalue(data.monthpeak[i].rx+data.monthpeak[i].tx, data.monthpeak[i].rxk+data.monthpeak[i].txk, 8)); + showbar(data.monthpeak[i].rx, data.monthpeak[i].rxk, data.monthpeak[i].tx, data.monthpeak[i].txk, max, 22); + printf("\n"); + used++; + } } if (used==0) printf(" no data available\n"); @@ -234,6 +243,19 @@ void showdb(int qmode) printf(" | %s", getvalue(e_tx, 0, -8)); printf(" | %s", getvalue(e_rx+e_tx, 0, -8)); printf("\n"); + + if (data.monthpeak[0].used) { + if ( data.monthpeak[0].rx==0 || data.monthpeak[0].tx==0 || ((d->tm_mday-1)*24+d->tm_hour)==0 ) { + e_rx=e_tx=0; + } else { + e_rx=((data.monthpeak[0].rx)/(float)((d->tm_mday-1)*24+d->tm_hour))*(dmonth[d->tm_mon]*24); + e_tx=((data.monthpeak[0].tx)/(float)((d->tm_mday-1)*24+d->tm_hour))*(dmonth[d->tm_mon]*24); + } + printf(" (peak) %s", getvalue(e_rx, 0, -8)); + printf(" | %s", getvalue(e_tx, 0, -8)); + printf(" | %s", getvalue(e_rx+e_tx, 0, -8)); + printf("\n"); + } } /* top10 */ @@ -325,6 +347,9 @@ void showdb(int qmode) for (i=0;i<=23;i++) { printf("h;%d;%d;%Lu;%Lu\n",i,(int)data.hour[i].date, data.hour[i].rx, data.hour[i].tx); } + for (i=0;i<12;i++) { + printf("mp;%d;%d;%Lu;%Lu;%d;%d;%d\n",i, (int)data.monthpeak[i].month, data.monthpeak[i].rx, data.monthpeak[i].tx, data.monthpeak[i].rxk, data.monthpeak[i].txk, data.monthpeak[i].used); + } /* multiple dbs in one print */ } else if (qmode==5) { @@ -714,6 +739,13 @@ void rotatemonths(void) data.month[i].txk=data.month[i-1].txk; data.month[i].month=data.month[i-1].month; data.month[i].used=data.month[i-1].used; + + data.monthpeak[i].rx=data.monthpeak[i-1].rx; + data.monthpeak[i].tx=data.monthpeak[i-1].tx; + data.monthpeak[i].rxk=data.monthpeak[i-1].rxk; + data.monthpeak[i].txk=data.monthpeak[i-1].txk; + data.monthpeak[i].month=data.monthpeak[i-1].month; + data.monthpeak[i].used=data.monthpeak[i-1].used; } current=time(NULL); @@ -724,6 +756,12 @@ void rotatemonths(void) data.month[0].txk=0; data.month[0].month=current; + data.monthpeak[0].rx=0; + data.monthpeak[0].tx=0; + data.monthpeak[0].rxk=0; + data.monthpeak[0].txk=0; + data.monthpeak[0].month=current; + if (debug) { d=localtime(&data.month[0].month); printf("Months rotated. Current month: \"%d\".\n",d->tm_mon+1); diff --git a/src/dbaccess.c b/src/dbaccess.c index 61ed937..c40260e 100644 --- a/src/dbaccess.c +++ b/src/dbaccess.c @@ -114,6 +114,13 @@ int readdb(char iface[32], char dirname[512]) data.hour[i].tx=0; data.hour[i].date=0; } + memset (data.monthpeak, 0, sizeof(data.monthpeak)); + for (i=0;i<24;i++) { + if (cfg.peak[i]) { + data.monthpeak[0].used=1; + break; + } + } data.day[0].used=data.month[0].used=1; data.day[0].date=data.month[0].month=time(NULL); data.btime=FP32; @@ -384,6 +391,19 @@ int convertdb(FILE *db) data.hour[i].date=0; } + converted=1; + } + + if (data.version==3 || converted==1) { + printf("Converting to db v4...\n"); + data.version=4; + memset (data.monthpeak, 0, sizeof(data.monthpeak)); + for (i=0;i<24;i++) { + if (cfg.peak[i]) { + data.monthpeak[0].used=1; + break; + } + } } /* corrupted or unknown version handling */ diff --git a/src/ifinfo.c b/src/ifinfo.c index 52f0d2b..8889534 100644 --- a/src/ifinfo.c +++ b/src/ifinfo.c @@ -253,6 +253,13 @@ void parseifinfo(int newdb) data.hour[hour].rx+=krxchange; data.hour[hour].tx+=ktxchange; + if (cfg.peak[hour]) { + addtraffic(&data.monthpeak[0].rx, &data.monthpeak[0].rxk, + rxchange, rxkchange); + addtraffic(&data.monthpeak[0].tx, &data.monthpeak[0].txk, + txchange, txkchange); + } + /* rotate days in database if needed */ d=localtime(&data.day[0].date); if ((d->tm_mday!=day) || (d->tm_mon!=month) || (d->tm_year!=year)) diff --git a/src/vnstat.h b/src/vnstat.h index 6c576ce..0aaf1c3 100644 --- a/src/vnstat.h +++ b/src/vnstat.h @@ -74,8 +74,8 @@ and most can be changed later from the config file. #define LOCKTRYLIMIT 5 /* database version */ -/* 1 = 1.0, 2 = 1.1-1.2, 3 = 1.3- */ -#define DBVERSION 3 +/* 1 = 1.0, 2 = 1.1-1.2, 3 = 1.3-, 4 = devel */ +#define DBVERSION 4 /* version string */ #define VNSTATVERSION "1.6" @@ -101,6 +101,7 @@ typedef struct { char locale[32]; char dbdir[512]; char rxchar[2], txchar[2], rxhourchar[2], txhourchar[2]; + int peak[24]; } CFG; /* internal interface information structure */ @@ -146,6 +147,9 @@ typedef struct { DAY top10[10]; HOUR hour[24]; uint64_t btime; + + /* Added in version 4: */ + MONTH monthpeak[12]; } DATA; typedef struct ibw {