]> granicus.if.org Git - vnstat/commitdiff
add option to limit the length of --json and --xml outputs
authorTeemu Toivola <git@humdi.net>
Wed, 21 Mar 2018 22:58:29 +0000 (00:58 +0200)
committerTeemu Toivola <git@humdi.net>
Wed, 21 Mar 2018 22:58:29 +0000 (00:58 +0200)
CHANGES
man/vnstat.1
src/cfg.c
src/common.h
src/dbjson.c
src/dbxml.c
src/vnstat.c
tests/database_tests.c

diff --git a/CHANGES b/CHANGES
index 9b39a3369e1bb4600b29b5a84b0bd7d134e1a542..784d5a2ccab256d39f2449ef7b85c2fc8e389b39 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -8,6 +8,7 @@
  - Add yearly and 5 minute resolution statistics
  - Add pebibyte and exbibyte support
  - Add options the configure the length of each list output
+ - Add option to limit the length of --json and --xml outputs
  - Add hourly list output as alternative
  - Remove weekly output
  - Remove merge of data from multiple interfaces to one output
index 17ddf48be990240dba914dc3b2eb97ad4118d105..a4a68b5b1941ec9660d871e5f3bbc80eb96ddeb0 100644 (file)
@@ -44,7 +44,7 @@ vnstat \- a console-based network traffic monitor
 .B \-\-iflist
 ] [
 .B \-\-json
-.I mode
+.I "mode limit"
 ] [
 .B \-\-live
 .I mode
@@ -90,7 +90,7 @@ vnstat \- a console-based network traffic monitor
 .B \-\-version
 ] [
 .B \-\-xml
-.I mode
+.I "mode limit"
 ]
 
 .SH DESCRIPTION
@@ -178,15 +178,20 @@ syntax.
 Show list of currently available interfaces.
 
 .TP
-.BI "--json " mode
+.BI "--json " "mode limit"
 Show database content for selected interface or all interfaces in json format. All
 traffic values in the output are in bytes. An optional
 .I mode
 parameter can be used for limiting the output to only selected information.
 Everything is shown by default. Setting
 .I mode
-to '5' will output only 5 minute resolution entries, 'h' hours, 'd' days, 'm' months,
-'y' years and 't' the top days. This option can also be used in combination with
+to 'f' will output only 5 minute resolution entries, 'h' hours, 'd' days, 'm' months, 'y'
+years and 't' the top days. An optional
+.I limit
+parameter can be used to limit the number results to a given number of most recent
+entries. The
+.BI "--json"
+option can be used in combination with
 .B "-l, --live"
 and
 .B "-tr"
@@ -313,15 +318,18 @@ option. However, in that case, the countdown before results isn't shown.
 Show current version.
 
 .TP
-.BI "--xml " mode
+.BI "--xml " "mode limit"
 Show database content for selected interface or all interfaces in xml format. All
 traffic values in the output are in bytes. An optional
 .I mode
 parameter can be used for limiting the output to only selected information.
 Everything is shown by default. Setting
 .I mode
-to '5' will output only 5 minute resolution entries, 'h' hours, 'd' days, 'm' months,
-'y' years and 't' the top days.
+to 'f' will output only 5 minute resolution entries, 'h' hours, 'd' days, 'm' months, 'y'
+years and 't' the top days. An optional
+.I limit
+parameter can be used to limit the number results to a given number of most recent
+entries.
 
 .TP
 .B "-?, --help"
index c89ffbf78bc3b720af9718b36ff6099bea56fc70..c0eaad74c317d97ff997424ab2725def8e44a37b 100644 (file)
--- a/src/cfg.c
+++ b/src/cfg.c
@@ -637,6 +637,7 @@ void defaultcfg(void)
        cfg.listmonths = LISTMONTHS;
        cfg.listyears = LISTYEARS;
        cfg.listtop = LISTTOP;
+       cfg.listjsonxml = LISTJSONXML;
 
        cfg.fiveminutehours = FIVEMINUTEHOURS;
        cfg.hourlydays = HOURLYDAYS;
index 6c903e1f5be70f2d3ce957eb90c3903be7cc6942..d5e69658736b557038083678d19ac9ccd26c7ca9 100644 (file)
@@ -173,6 +173,7 @@ and most can be changed later from the config file.
 #define LISTMONTHS 12
 #define LISTYEARS 0
 #define LISTTOP 10
+#define LISTJSONXML 0
 
 /* data retention defaults */
 #define FIVEMINUTEHOURS 48
@@ -279,7 +280,7 @@ typedef struct {
        int32_t timesyncwait, updateinterval, pollinterval, saveinterval, offsaveinterval, savestatus;
        int32_t uselogging, createdirs, updatefileowner, bwdetection, bwdetectioninterval, utflocale;
        int32_t fiveminutehours, hourlydays, dailydays, monthlymonths, yearlyyears, topdayentries;
-       int32_t listfivemins, listhours, listdays, listmonths, listyears, listtop;
+       int32_t listfivemins, listhours, listdays, listmonths, listyears, listtop, listjsonxml;
 } CFG;
 
 /* internal interface information structure */
index 40bf686906617ca6106f363f84ca02bab1768950..e1dbfaec73d22262502145268db49453f9f5d699 100644 (file)
@@ -49,7 +49,7 @@ void showjson(const char *interface, const int dbcount, const char mode)
                case 'y':
                        jsondump(&info, "year", 4);
                        break;
-               case '5':
+               case 'f':
                        jsondump(&info, "fiveminute", 2);
                        break;
                case 'a':
@@ -79,7 +79,7 @@ void jsondump(const interfaceinfo *interface, const char *tablename, const int d
        dbdatalist *datalist = NULL, *datalist_i = NULL;
        dbdatalistinfo datainfo;
 
-       if (!db_getdata(&datalist, &datainfo, interface->name, tablename, 0)) {
+       if (!db_getdata(&datalist, &datainfo, interface->name, tablename, (uint32_t)cfg.listjsonxml)) {
                printf("Error: Failed to fetch %s data.\n", tablename);
                return;
        }
index b51d0080eafeffe1de4b7898fccd670397710aa6..40979665b62bc5b3a0c6f741badb6dc2f8e79981 100644 (file)
@@ -47,7 +47,7 @@ void showxml(const char *interface, const char mode)
                case 'y':
                        xmldump(&info, "year", 4);
                        break;
-               case '5':
+               case 'f':
                        xmldump(&info, "fiveminute", 2);
                        break;
                case 'a':
@@ -72,7 +72,7 @@ void xmldump(const interfaceinfo *interface, const char *tablename, const int da
        dbdatalist *datalist = NULL, *datalist_i = NULL;
        dbdatalistinfo datainfo;
 
-       if (!db_getdata(&datalist, &datainfo, interface->name, tablename, 0)) {
+       if (!db_getdata(&datalist, &datainfo, interface->name, tablename, (uint32_t)cfg.listjsonxml)) {
                printf("Error: Failed to fetch %s data.\n", tablename);
                return;
        }
index acee5c83fa3e7e753b821779608ee973a4f9e672..71d7fcc9f6d8129a8c05609cfdc2f09b98884bc3 100644 (file)
@@ -252,36 +252,52 @@ int main(int argc, char *argv[]) {
                                }
                        }
                } else if (strcmp(argv[currentarg],"--xml")==0) {
-                       if (currentarg+1<argc && argv[currentarg+1][0]!='-') {
+                       if (currentarg+1<argc && argv[currentarg+1][0]!='-' && !isdigit(argv[currentarg+1][0])) {
                                p.xmlmode = argv[currentarg+1][0];
-                               if (strlen(argv[currentarg+1])!=1 || strchr("a5hdmyt", p.xmlmode)==NULL) {
+                               if (strlen(argv[currentarg+1])!=1 || strchr("afhdmyt", p.xmlmode)==NULL) {
                                        printf("Error: Invalid mode parameter \"%s\" for --xml.\n", argv[currentarg+1]);
                                        printf(" Valid parameters:\n");
                                        printf("    a - all (default)\n");
-                                       printf("    5 - only 5 minutes\n");
+                                       printf("    f - only 5 minutes\n");
                                        printf("    h - only hours\n");
                                        printf("    d - only days\n");
                                        printf("    m - only months\n");
                                        printf("    y - only years\n");
-                                       printf("    t - only top 10\n");
+                                       printf("    t - only top\n");
+                                       return 1;
+                               }
+                               currentarg++;
+                       }
+                       if (currentarg+1<argc && isdigit(argv[currentarg+1][0])) {
+                               cfg.listjsonxml = atoi(argv[currentarg+1]);
+                               if (cfg.listjsonxml < 0) {
+                                       printf("Error: Invalid limit parameter \"%s\" for %s. Only a zero and positive numbers are allowed.\n", argv[currentarg+1], argv[currentarg]);
                                        return 1;
                                }
                                currentarg++;
                        }
                        cfg.qmode=8;
                } else if (strcmp(argv[currentarg],"--json")==0) {
-                       if (currentarg+1<argc && argv[currentarg+1][0]!='-') {
+                       if (currentarg+1<argc && argv[currentarg+1][0]!='-' && !isdigit(argv[currentarg+1][0])) {
                                p.jsonmode = argv[currentarg+1][0];
-                               if (strlen(argv[currentarg+1])!=1 || strchr("a5hdmyt", p.jsonmode)==NULL) {
+                               if (strlen(argv[currentarg+1])!=1 || strchr("afhdmyt", p.jsonmode)==NULL) {
                                        printf("Error: Invalid mode parameter \"%s\" for --json.\n", argv[currentarg+1]);
                                        printf(" Valid parameters:\n");
                                        printf("    a - all (default)\n");
-                                       printf("    5 - only 5 minutes\n");
+                                       printf("    f - only 5 minutes\n");
                                        printf("    h - only hours\n");
                                        printf("    d - only days\n");
                                        printf("    m - only months\n");
                                        printf("    y - only years\n");
-                                       printf("    t - only top 10\n");
+                                       printf("    t - only top\n");
+                                       return 1;
+                               }
+                               currentarg++;
+                       }
+                       if (currentarg+1<argc && isdigit(argv[currentarg+1][0])) {
+                               cfg.listjsonxml = atoi(argv[currentarg+1]);
+                               if (cfg.listjsonxml < 0) {
+                                       printf("Error: Invalid limit parameter \"%s\" for %s. Only a zero and positive numbers are allowed.\n", argv[currentarg+1], argv[currentarg]);
                                        return 1;
                                }
                                currentarg++;
index c1213ae209fd554f7be89245a19bff568b63fbbd..e8fab6a8843be4289acb47e828347b867258b005 100644 (file)
@@ -245,7 +245,7 @@ START_TEST(database_outputs_do_not_crash)
        showxml("something", 't');
        showxml("something", 'h');
        showxml("something", 'y');
-       showxml("something", '5');
+       showxml("something", 'f');
        showxml("something", 'a');
        showxml("nothing", 'a');
        xmlfooter();
@@ -256,7 +256,7 @@ START_TEST(database_outputs_do_not_crash)
        showjson("something", 0, 't');
        showjson("something", 0, 'h');
        showjson("something", 0, 'y');
-       showjson("something", 0, '5');
+       showjson("something", 0, 'f');
        showjson("something", 1, 'a');
        showjson("nothing", 0, 'a');
        jsonfooter();
@@ -306,7 +306,7 @@ START_TEST(database_outputs_do_not_crash_without_data)
        showxml("something", 't');
        showxml("something", 'h');
        showxml("something", 'y');
-       showxml("something", '5');
+       showxml("something", 'f');
        showxml("something", 'a');
 
        xmlfooter();
@@ -317,7 +317,7 @@ START_TEST(database_outputs_do_not_crash_without_data)
        showjson("something", 0, 't');
        showjson("something", 0, 'h');
        showjson("something", 0, 'y');
-       showjson("something", 0, '5');
+       showjson("something", 0, 'f');
        showjson("something", 1, 'a');
        showjson("nothing", 0, 'a');
        jsonfooter();