more modularization
[svn/Prometheus-QoS/.git] / prometheus.c
index 717971410549b1ce35de9bc6eadc77ce1ae55fe3..814da9e4cb0fe9de6527fb98ad4e216d357961ba 100644 (file)
@@ -7,7 +7,7 @@
 /*  Credit: CZFree.Net,Martin Devera,Netdave,Aquarius,Gandalf  */\r
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */\r
 \r
-/* Modified by: xChaos, 20121007\r
+/* Modified by: xChaos, 20121011\r
                  ludva, 20080415\r
  \r
    Prometheus QoS is free software; you can redistribute it and/or\r
@@ -41,6 +41,29 @@ const char *version = "0.8.3-g";
 \r
 const char *stats_html_signature = "<span class=\"small\">Statistics generated by Prometheus QoS version %s<br />GPL+Copyright(C)2005-2012 Michael Polak, <a target=\"_blank\" href=\"http://www.arachne.cz/\">Arachne Labs</a></span>\n";\r
 \r
+/* ======= Help screen is hopefuly self-documenting part of code :-) ======= */\r
+\r
+void help(void)\r
+{\r
+ puts("Command line switches:\n\\r
+\n\\r
+-d   Dry run (preview tc and iptables commands on stdout)\n\\r
+-r   Run (reset all statistics and start shaping - daily usage)\n\\r
+-p   just generate Preview of data transfer statistics and exit (after -r)\n\\r
+-s   start Shaping FUP limits (keeps data transfer stat like -p) (after -r)\n\\r
+-n   run Now (like -r delay - overrides qos-free-delay keyword, after boot)\n\\r
+-f   just Flush iptables and tc classes and exit (stop shaping, no QiS)\n\\r
+-9   emergency iptables flush (like -f, but dumps data transfer statistics)\n\\r
+\n\\r
+-c filename  force alternative /etc/prometheus/prometheus.conf filename\n\\r
+-h filename  force alternative /etc/hosts filename (overrides hosts keyword)\n\\r
+-l Mmm YYYY  generate HTML summary of Logged traffic (Mmm=Jan-Dec) (and exit)\n\\r
+-m           generate HTML summary of traffic for yesterday's Month (and exit)\n\\r
+-y           generate HTML summary of traffic for yesterday's Year (and exit)\n\\r
+-? --help    show this help scree (and exit)\n\\r
+-v --version show Version number of this utility (and exit)\n");\r
+}\r
+\r
 /* ======= All path names are defined here (for RPM patch) =======  */\r
 \r
 const char        *tc = "/sbin/tc"; /* requires tc with HTB support */\r
@@ -57,7 +80,7 @@ char          *credit = "/var/lib/misc/prometheus.credit"; /* credit log file */
 char        *classmap = "/var/lib/misc/prometheus.classes"; /* credit log file */\r
 char            *html = "/var/www/traffic.html"; /* hall of fame - html version */\r
 char         *preview = "/var/www/preview.html"; /* hall of fame preview - html version */\r
-char            *json = "/var/www/logs/traffic.json"; /* hall of fame - json version */\r
+char    *json_traffic = "/var/www/logs/traffic.json"; /* hall of fame - json version */\r
 char    *json_preview = "/var/www/logs/preview.json"; /* hall of fame preview - json version */\r
 char          *cmdlog = "/var/log/prometheuslog"; /* command log filename */\r
 char         *log_dir = "/var/www/logs/"; /* log directory pathname, ended with slash */\r
@@ -68,50 +91,7 @@ char      *jquery_url = "http://code.jquery.com/jquery-latest.js";
 char         *lms_url = "/lms/?m=customerinfo&amp;id=";\r
 int use_jquery_popups = 1;\r
 int      row_odd_even = 0; /*<tr class="odd/even"> */\r
-\r
-\r
-void parse_ip_log(int argc, char **argv);\r
-/* implementid in parselog.c */\r
-\r
-void parse_hosts(char *hosts);\r
-/* implementid in parsehosts.c */\r
-\r
-const char *tr_odd_even(void)\r
-{\r
- row_odd_even = 1 - row_odd_even;\r
- if(row_odd_even)\r
- {\r
-  return "<tr class=\"even\">\n";\r
- }\r
- else\r
- {\r
-  return "<tr class=\"odd\">\n";\r
- }\r
-}\r
-\r
-/* ======= Help screen is hopefuly self-documenting part of code :-) ======= */\r
-\r
-void help(void)\r
-{\r
- puts("Command line switches:\n\\r
-\n\\r
--d   Dry run (preview tc and iptables commands on stdout)\n\\r
--r   Run (reset all statistics and start shaping - daily usage)\n\\r
--p   just generate Preview of data transfer statistics and exit (after -r)\n\\r
--s   start Shaping FUP limits (keeps data transfer stat like -p) (after -r)\n\\r
--n   run Now (like -r delay - overrides qos-free-delay keyword, after boot)\n\\r
--f   just Flush iptables and tc classes and exit (stop shaping, no QiS)\n\\r
--9   emergency iptables flush (like -f, but dumps data transfer statistics)\n\\r
-\n\\r
--c filename  force alternative /etc/prometheus/prometheus.conf filename\n\\r
--h filename  force alternative /etc/hosts filename (overrides hosts keyword)\n\\r
--l Mmm YYYY  generate HTML summary of Logged traffic (Mmm=Jan-Dec) (and exit)\n\\r
--m           generate HTML summary of traffic for yesterday's Month (and exit)\n\\r
--y           generate HTML summary of traffic for yesterday's Year (and exit)\n\\r
--? --help    show this help scree (and exit)\n\\r
--v --version show Version number of this utility (and exit)\n");\r
-}\r
-\r
\r
 /* === Configuraration file values defaults - stored in global variables ==== */\r
 \r
 int        filter_type = 1; /*1 mark, 2 classify*/\r
@@ -168,6 +148,28 @@ struct IP *ips = NULL, *ip, *sharedip;
 struct Group *groups = NULL, *group;\r
 struct Keyword *keyword, *defaultkeyword=NULL, *keywords=NULL;\r
 \r
+void parse_ip_log(int argc, char **argv);\r
+/* implemented in parselog.c */\r
+\r
+void parse_hosts(char *hosts);\r
+/* implemented in parsehosts.c */\r
+\r
+void write_json_traffic(char *json);\r
+/* implemented in json.c */\r
+\r
+const char *tr_odd_even(void)\r
+{\r
+ row_odd_even = 1 - row_odd_even;\r
+ if(row_odd_even)\r
+ {\r
+  return "<tr class=\"even\">\n";\r
+ }\r
+ else\r
+ {\r
+  return "<tr class=\"odd\">\n";\r
+ }\r
+}\r
+\r
 /* ==== This is C<<1 stuff - learn C<<1 first! https://dev.arachne.cz/svn/cll1h ==== */\r
 \r
 struct Index\r
@@ -180,112 +182,18 @@ struct Index
  list(Index);\r
 } *idxs=NULL, *idx, *metaindex;\r
 \r
-\r
-\r
 void TheIP(void);\r
 /* function implemented in parsehosts.c */\r
 \r
 /* ====== iptables indexes are used to reduce complexity to log8(N) ===== */\r
 \r
-char *very_ugly_ipv4_code(char *inip,int bitmask,int format_as_chainname)\r
-{\r
- /* warning: this function was debugged only for bitmask values 20,24,28 !!!*/\r
- int dot=0, n;\r
- char *ip,*outip,*outptr,*fmt;\r
-\r
- duplicate(inip,ip);\r
- /* debug printf("(%s,%d) -> ",ip,bitmask); */\r
-\r
- if(ip && *ip && bitmask>=0 && bitmask<=32)\r
- {\r
-  string(outip,strlen(ip)+10); /*fuck unicode? assertion: 10>strlen("_%d_%d") */\r
- }\r
- else \r
- {\r
-  /* should never exit here */\r
-  return "undefined";\r
- }\r
- outptr=outip;\r
- while(ip && *ip)\r
- {\r
-  if(*ip=='.')\r
-  {\r
-   if(dot<(bitmask/8-1)) \r
-   {\r
-    if(format_as_chainname)\r
-    {\r
-     *outptr='_';\r
-    }\r
-    else\r
-    {\r
-     *outptr='.';\r
-    }\r
-    outptr++;\r
-    dot++;\r
-   }\r
-   else\r
-   {\r
-    char *cutdot=strchr(ip+1,'.'); /*for bitmask<24*/    \r
-    if(cutdot)\r
-    {\r
-     *cutdot = '\0';\r
-    }\r
-    \r
-    if(format_as_chainname)\r
-    {\r
-     fmt = "_%d_%d";\r
-    }\r
-    else\r
-    {\r
-     fmt = ".%d";\r
-    }\r
-    \r
-    if(bitmask%8)\r
-    {\r
-     n = atoi(ip+1)-atoi(ip+1)%(1<<(8-bitmask%8));\r
-    }\r
-    else\r
-    {\r
-     n = 0;\r
-    }\r
-\r
-    /*debug  printf("%d/%d => [_%d_%d]\n",atoi(ip+1),bitmask,n,bitmask); */\r
-    sprintf(outptr,fmt,n,bitmask);\r
-    if(!format_as_chainname)\r
-    {\r
-     while(bitmask<24)\r
-     {\r
-      strcat(outip,".0");\r
-      bitmask+=8;\r
-     }\r
-    }\r
-    /* debug printf("[%s]\n",outip); */\r
-    return outip;\r
-   }\r
-  }\r
-  else \r
-  {\r
-   *outptr=*ip;\r
-   outptr++;\r
-  }\r
-  ip++;\r
- }\r
- /*should never exit here*/\r
- *outptr='\0';\r
- return outip;\r
-}\r
-\r
-char *hash_id(char *ip,int bitmask)\r
-{ \r
- return very_ugly_ipv4_code(ip,bitmask,1);\r
-}\r
+char *index_id(char *ip, int bitmask);\r
+/* function implemented in ipv4subnets.c */\r
 \r
-char *subnet_id(char *ip,int bitmask)\r
-{\r
- return very_ugly_ipv4_code(ip,bitmask,0);\r
-}\r
+char *subnet_id(char *ip, int bitmask);\r
+/* function implemented in ipv4subnets.c */\r
 \r
-/* ================= Let's parse configuration file here =================== */\r
+/* ================= Let's parse configuration file here ================ */\r
 \r
 void reject_config_and_exit(char *filename)\r
 {\r
@@ -373,7 +281,7 @@ void get_config(char *config_filename)
   ioption("hall-of-fame-enable",hall_of_fame);\r
   option("hall-of-fame-title",title);\r
   option("hall-of-fame-filename",html);\r
-  option("json-filename",json);\r
+  option("json-filename",json_traffic);\r
   option("hall-of-fame-preview",preview);\r
   option("json-preview",json_preview);\r
   option("log-filename",cmdlog);\r
@@ -890,7 +798,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
 \r
    for_each(ip,ips) if(ip->addr && *(ip->addr) && !eq(ip->addr,"0.0.0.0/0"))\r
    {\r
-    buf=hash_id(ip->addr,bitmask);\r
+    buf=index_id(ip->addr,bitmask);\r
     if_exists(idx,idxs,eq(idx->id,buf))\r
     {\r
      idx->children++;\r
@@ -916,7 +824,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
 \r
     for_each(idx,idxs) if(idx->parent == NULL)\r
     {\r
-     buf=hash_id(idx->addr,bitmask);\r
+     buf=index_id(idx->addr,bitmask);\r
      if_exists(metaindex,idxs,eq(metaindex->id,buf))\r
      {\r
       metaindex->children++;\r
@@ -1181,41 +1089,15 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
    done; /* ugly macro end */\r
   }\r
   html=preview;\r
-  json=json_preview;\r
+  json_traffic=json_preview;\r
  }\r
 \r
  if(!dry_run && !just_flush)\r
  {\r
   /*-----------------------------------------------------------------*/\r
-  printf("Writing json overview  %s ... ", json);\r
+  printf("Writing json traffic overview  %s ... ", json_traffic);\r
   /*-----------------------------------------------------------------*/\r
-  f=fopen(json, "w");\r
-  if(f > 0)\r
-  {\r
-   int jsoncount=0;\r
-   fprintf(f, "{\n");\r
-   for_each(ip, ips)\r
-   {\r
-    if(     ip->lmsid > 0 \r
-        && (ip->traffic || ip->direct || ip->proxy || ip->upload))\r
-    {\r
-     if(jsoncount)\r
-     {\r
-      fprintf(f, ",\n");\r
-     }\r
-     fprintf(f, " \"%s\":{ \"lms\": %d, \"ip\":\"%s\", \"total\":%Lu, \"down\":%Lu, \"proxy\":%Lu, \"up\":%Lu, \"min\":%d, \"max\":%d, \"limit\":%d }",\r
-                ip->name, ip->lmsid, ip->addr, ip->traffic, ip->direct, ip->proxy, ip->upload, ip->min, ip->desired, ip->max);\r
-     jsoncount++;\r
-    }\r
-   }\r
-   fprintf(f, "}\n");\r
-   fclose(f);\r
-   puts("done.");\r
-  }\r
-  else\r
-  {\r
-   perror(json);\r
-  }\r
+  write_json_traffic(json_traffic);\r
  }\r
 \r
  f=fopen(html,"w");\r
@@ -1630,7 +1512,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
   {\r
    char *buf;\r
    duplicate(ip->addr,buf);\r
-   buf=hash_id(ip->addr,32-idxtable_bitmask1); \r
+   buf=index_id(ip->addr,32-idxtable_bitmask1); \r
    \r
    string(chain_forward,6+strlen(buf));\r
    strcpy(chain_forward,"forw_");\r
This page took 0.167569 seconds and 4 git commands to generate.