]> granicus.if.org Git - vnstat/commitdiff
add MonthRotateAffectsYears configuration option and tests
authorTeemu Toivola <git@humdi.net>
Mon, 3 Sep 2018 19:29:32 +0000 (22:29 +0300)
committerTeemu Toivola <git@humdi.net>
Mon, 3 Sep 2018 19:29:32 +0000 (22:29 +0300)
cfg/vnstat.conf
man/vnstat.conf.5
src/cfg.c
src/cfgoutput.c
src/common.h
src/dbsql.c
tests/dbsql_tests.c

index c33265e0cffd64eeeaf4b4b5e1431953f8ccf48f..2c2b57701715edab978a2f99ff275a967f533251 100644 (file)
@@ -108,6 +108,7 @@ OfflineSaveInterval 30
 
 # on which day should months change
 MonthRotate 1
+MonthRotateAffectsYears 0
 
 # filesystem disk space check (1 = enabled, 0 = disabled)
 CheckDiskSpace 1
index 5857089dbf3dfedf1a3bd344f5fb15bb2e79d50a..b8bc30d6f1c793ed23c4176b3eabf5c58a56ebc1 100644 (file)
@@ -242,6 +242,14 @@ the first day. For example, if set to 7, days of February up to and
 including the 6th will count for January. Changing this option will
 not cause existing data to be recalculated. Value range: 1..28
 
+.TP
+.B MonthRotateAffectsYears
+Enable or disable
+.B MonthRotate
+also affecting yearly data. Applicable only when
+.B MonthRotate
+has a value greater than one. 1 = enabled, 0 = disabled.
+
 .TP
 .B OfflineSaveInterval
 How often in minutes cached interface data is saved to file when all monitored
index 821b6d5996cec29a9ff2ad72f1b74a21a6f1c4aa..dd67988c843433ff551d129b6f5dff17913ecbbc 100644 (file)
--- a/src/cfg.c
+++ b/src/cfg.c
@@ -15,6 +15,7 @@ int loadcfg(const char *cfgfile)
                { "DatabaseDir", cfg.dbdir, 0, 512, 0 },
                { "Locale", cfg.locale, 0, 32, 0 },
                { "MonthRotate", 0, &cfg.monthrotate, 0, 0 },
+               { "MonthRotateAffectsYears", 0, &cfg.monthrotateyears, 0, 0 },
                { "DayFormat", cfg.dformat, 0, 64, 0 },
                { "MonthFormat", cfg.mformat, 0, 64, 0 },
                { "TopFormat", cfg.tformat, 0, 64, 0 },
@@ -203,6 +204,12 @@ void validatecfg(void)
                printe(PT_Config);
        }
 
+       if (cfg.monthrotateyears<0 || cfg.monthrotateyears>1) {
+               cfg.monthrotateyears = MONTHROTATEYEARS;
+               snprintf(errorstring, 1024, "%s MonthRotateAffectsYears, %s \"%d\".", invalidvalue, resettingto, cfg.monthrotateyears);
+               printe(PT_Config);
+       }
+
        if (cfg.maxbw<0 || cfg.maxbw>BWMAX) {
                cfg.maxbw = DEFMAXBW;
                snprintf(errorstring, 1024, "%s MaxBandwidth, %s \"%d\".", invalidvalue, resettingto, cfg.maxbw);
@@ -416,6 +423,7 @@ void defaultcfg(void)
        cfg.qmode = DEFQMODE;
        cfg.sampletime = DEFSAMPTIME;
        cfg.monthrotate = MONTHROTATE;
+       cfg.monthrotateyears = MONTHROTATEYEARS;
        cfg.unitmode = UNITMODE;
        cfg.rateunitmode = RATEUNITMODE;
        cfg.ostyle = OSTYLE;
index 8670d3364e0d468e390db4db97ee23f8f1aacd34..e4545656e01a6a19e9c7c8f33d8298ce9d8cbf67 100644 (file)
@@ -122,7 +122,8 @@ void printcfgfile(void)
        printf("OfflineSaveInterval %d\n\n", cfg.offsaveinterval);
 
        printf("# on which day should months change\n");
-       printf("MonthRotate %d\n\n", cfg.monthrotate);
+       printf("MonthRotate %d\n", cfg.monthrotate);
+       printf("MonthRotateAffectsYears %d\n\n", cfg.monthrotateyears);
 
        printf("# filesystem disk space check (1 = enabled, 0 = disabled)\n");
        printf("CheckDiskSpace %d\n\n", cfg.spacecheck);
index 3550c8745eadf36982772da2a35ca50fe6851b69..79cd01156ee57257ee93de77f27706e2cbe019c7 100644 (file)
@@ -72,6 +72,7 @@ and most can be changed later from the config file.
 
 /* on which day should months change */
 #define MONTHROTATE 1
+#define MONTHROTATEYEARS 0
 
 /* date output formats for -d, -m, -t and image header*/
 /* see 'man date' for control codes      1.x values     <1.8 values */
@@ -269,7 +270,7 @@ typedef struct {
        char cbg[8], cedge[8], cheader[8], cheadertitle[8], cheaderdate[8], ctext[8];
        char cline[8], clinel[8], cvnstat[8], crx[8], crxd[8], ctx[8], ctxd[8];
        int32_t unitmode, rateunitmode, rateunit, bvar, qmode, sampletime, hourlyrate, summaryrate;
-       int32_t monthrotate, maxbw, spacecheck, traflessday, transbg, ostyle;
+       int32_t monthrotate, monthrotateyears, maxbw, spacecheck, traflessday, transbg, ostyle;
        int32_t defaultdecimals, hourlydecimals, hourlystyle;
        char cfgfile[512], logfile[512], pidfile[512];
        char daemonuser[33], daemongroup[33];
index 00001d45f16500bc92cff8dc9bbfc4f446051650..beabb8fc221454e8e7d28bbb27d8d92320ec0dc8 100644 (file)
@@ -638,10 +638,9 @@ char *db_get_date_generator(const int range, const short direct, const char *now
                        }
                        break;
                case 4: /* year */
-                       if (direct || cfg.monthrotate == 1) {
+                       if (direct || cfg.monthrotate == 1 || cfg.monthrotateyears == 0) {
                                snprintf(dgen, 512, "strftime('%%Y-01-01', %s, 'localtime')", nowdate);
                        } else {
-                               /* TODO: add option to select if MonthRotate affects also years */
                                snprintf(dgen, 512, "strftime('%%Y-01-01', datetime(%s, '-%d days'), 'localtime')", nowdate, cfg.monthrotate-1);
                        }
                        break;
index d64ebe6413e956e88a2aa137ca57c584474bc097..46b074dabfd58f2640b68759b0bc111cc2221a4e 100644 (file)
@@ -1790,6 +1790,66 @@ START_TEST(db_addtraffic_with_monthrotate)
 }
 END_TEST
 
+START_TEST(db_get_date_generator_can_generate_dates)
+{
+       defaultcfg();
+
+       ck_assert_ptr_ne(strstr(db_get_date_generator(0, 0, "foo"), "minutes"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(1, 0, "foo"), "strftime('%Y-%m-%d %H:00:00', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(2, 0, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(5, 0, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(3, 0, "foo"), "strftime('%Y-%m-01', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(4, 0, "foo"), "strftime('%Y-01-01', foo, 'localtime')"), NULL);
+
+       ck_assert_ptr_ne(strstr(db_get_date_generator(0, 1, "foo"), "minutes"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(1, 1, "foo"), "strftime('%Y-%m-%d %H:00:00', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(2, 1, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(5, 1, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(3, 1, "foo"), "strftime('%Y-%m-01', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(4, 1, "foo"), "strftime('%Y-01-01', foo, 'localtime')"), NULL);
+}
+END_TEST
+
+START_TEST(db_get_date_generator_can_generate_dates_with_monthrotate)
+{
+       defaultcfg();
+
+       cfg.monthrotate = 10;
+       cfg.monthrotateyears = 0;
+
+       ck_assert_ptr_ne(strstr(db_get_date_generator(0, 0, "foo"), "minutes"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(1, 0, "foo"), "strftime('%Y-%m-%d %H:00:00', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(2, 0, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(5, 0, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(3, 0, "foo"), "strftime('%Y-%m-01', datetime(foo, '-9 days'), 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(4, 0, "foo"), "strftime('%Y-01-01', foo, 'localtime')"), NULL);
+
+       ck_assert_ptr_ne(strstr(db_get_date_generator(0, 1, "foo"), "minutes"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(1, 1, "foo"), "strftime('%Y-%m-%d %H:00:00', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(2, 1, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(5, 1, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(3, 1, "foo"), "strftime('%Y-%m-01', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(4, 1, "foo"), "strftime('%Y-01-01', foo, 'localtime')"), NULL);
+
+       cfg.monthrotate = 8;
+       cfg.monthrotateyears = 1;
+
+       ck_assert_ptr_ne(strstr(db_get_date_generator(0, 0, "foo"), "minutes"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(1, 0, "foo"), "strftime('%Y-%m-%d %H:00:00', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(2, 0, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(5, 0, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(3, 0, "foo"), "strftime('%Y-%m-01', datetime(foo, '-7 days'), 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(4, 0, "foo"), "strftime('%Y-01-01', datetime(foo, '-7 days'), 'localtime')"), NULL);
+
+       ck_assert_ptr_ne(strstr(db_get_date_generator(0, 1, "foo"), "minutes"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(1, 1, "foo"), "strftime('%Y-%m-%d %H:00:00', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(2, 1, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(5, 1, "foo"), "date(foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(3, 1, "foo"), "strftime('%Y-%m-01', foo, 'localtime')"), NULL);
+       ck_assert_ptr_ne(strstr(db_get_date_generator(4, 1, "foo"), "strftime('%Y-01-01', foo, 'localtime')"), NULL);
+}
+END_TEST
+
 void add_dbsql_tests(Suite *s)
 {
        TCase *tc_dbsql = tcase_create("DB SQL");
@@ -1855,5 +1915,7 @@ void add_dbsql_tests(Suite *s)
        tcase_add_test(tc_dbsql, db_getdata_range_can_get_hours_with_range_on_same_hour);
        tcase_add_test(tc_dbsql, db_addtraffic_without_monthrotate);
        tcase_add_test(tc_dbsql, db_addtraffic_with_monthrotate);
+       tcase_add_test(tc_dbsql, db_get_date_generator_can_generate_dates);
+       tcase_add_test(tc_dbsql, db_get_date_generator_can_generate_dates_with_monthrotate);
        suite_add_tcase(s, tc_dbsql);
 }