some more cleanup
[svn/Prometheus-QoS/.git] / prometheus.c
index 64012559235dc72987d087318984737e747a92bf..40b886528d77a3d72fe97684faf1df1f7bdf9e2c 100644 (file)
@@ -7,7 +7,7 @@
 /*  Credit: CZFree.Net,Martin Devera,Netdave,Aquarius,Gandalf  */\r
 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */\r
 \r
-/* Modified by: xChaos, 20120612\r
+/* Modified by: xChaos, 20121011\r
                  ludva, 20080415\r
  \r
    Prometheus QoS is free software; you can redistribute it and/or\r
    GNU General Public License is located in file COPYING */\r
 \r
 #define STRLEN 512\r
-#define FIRSTGROUPID 1024\r
-#define FIRSTIPCLASS 2048\r
 #undef DEBUG\r
 \r
 #include "cll1-0.6.2.h"\r
+#include "ipstruct.h"\r
 \r
-const char *version = "0.8.3-f";\r
+const char *version = "0.8.3-g";\r
 \r
 /* Version numbers: 0.8.3 is development releases ("beta"), 0.8.4 will be "stable" */\r
 /* Debian(RPM) package versions/patchlevels: 0.7.9-2, 0.8.0-1, 0.8.0-2, etc. */\r
@@ -42,6 +41,29 @@ const char *version = "0.8.3-f";
 \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
@@ -69,47 +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
-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
@@ -146,6 +128,8 @@ int         burst_main = 64;
 int        burst_group = 32;\r
 int     magic_treshold = 8; /* reduce ceil by X*magic_treshhold kbps (hard shaping) */\r
 int       keywordcount = 0;\r
+int class_count        = 0;\r
+int ip_count           = 0;\r
 /* not yet implemented:\r
 int      fixed_packets = 0; maximum number of pps per IP address (not class!) \r
 int       packet_limit = 5; maximum number of pps to htn CEIL, not rate !!! \r
@@ -160,40 +144,30 @@ const int idxtable_treshold2 = 12;      /* this is no longer configurable */
 const int idxtable_bitmask1  = 3;        /* this is no longer configurable */\r
 const int idxtable_bitmask2  = 3;        /* this is no longer configurable */\r
 \r
-/* ==== This is C<<1 stuff - learn C<<1 first! https://dev.arachne.cz/svn/cll1h ==== */\r
+struct IP *ips = NULL, *ip, *sharedip;\r
+struct Group *groups = NULL, *group;\r
+struct Keyword *keyword, *defaultkeyword=NULL, *keywords=NULL;\r
 \r
-struct IP\r
-{\r
- char *addr;\r
- char *name;\r
- char *sharing;\r
- int min;\r
- int desired;\r
- int max;\r
- int mark;\r
- int prio;\r
- int fixedprio;\r
- int group;\r
- int lmsid;\r
- unsigned long long direct;\r
- unsigned long long proxy;\r
- unsigned long long upload;\r
- unsigned long long traffic;\r
- unsigned long long credit;\r
- unsigned long pktsup;\r
- unsigned long pktsdown;\r
- struct Keyword *keyword;\r
- list(IP);\r
-} *ips=NULL, *ip, *sharedip;\r
-\r
-struct Group\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
- int min;\r
- int count;\r
- int desired;\r
- int id;\r
- list(Group);\r
-} *groups=NULL, *group;\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
 {\r
@@ -205,57 +179,13 @@ struct Index
  list(Index);\r
 } *idxs=NULL, *idx, *metaindex;\r
 \r
-struct Keyword\r
-{\r
- char *key;\r
\r
- int asymetry_ratio;        /* ratio for ADSL-like upload */\r
- int asymetry_fixed;        /* fixed treshold for ADSL-like upload */\r
- int data_limit;            /* hard shaping: apply magic_treshold if max*data_limit MB exceeded */\r
- int data_prio;             /* soft shaping (qos): reduce HTB prio if max*data_prio MB exceeded */\r
- long fixed_limit;          /* fixed data limit for setting lower HTB ceil */\r
- long fixed_prio;           /* fixed data lmit for setting lower HTB prio */\r
- int reserve_min;          /* bonus for nominal HTB rate bandwidth (in kbps) */\r
- int reserve_max;          /* malus for nominal HTB ceil (in kbps) */\r
-// int divide_max;         /* relative malus: new_ceil=rate+(old_ceil-rate)/divide_max */\r
-// int htb_ceil_bonus_divide; /* relative bonus: new_ceil=old_ceil+old_ceil/htb_ceil_bonus_divide */\r
- int default_prio;         /* default HTB priority for this keyword */\r
- char *html_color;\r
- int ip_count;\r
- char *leaf_discipline;\r
\r
- list(Keyword);\r
-} *keyword,*defaultkeyword=NULL,*keywords=NULL;\r
 \r
-/* Damned, this must be object oriented! This looks almost like constructor ;-) */\r
-\r
-void TheIP(void)\r
-{\r
- create(ip,IP);\r
- ip->name        = "";\r
- ip->addr        = "";\r
- ip->sharing     = NULL;\r
- ip->prio        = highest_priority+1;\r
- ip->lmsid       = -1;\r
- ip->fixedprio   = \\r
- ip->mark        = \\r
- ip->min         = \\r
- ip->max         = \\r
- ip->desired     = \\r
- ip->credit      = \\r
- ip->upload      = \\r
- ip->proxy       = \\r
- ip->direct      = \\r
- ip->traffic     = \\r
- ip->pktsup      = \\r
- ip->pktsdown    = 0;\r
- ip->keyword     = keywords;\r
- push(ip,ips);\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
+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
@@ -343,7 +273,7 @@ char *very_ugly_ipv4_code(char *inip,int bitmask,int format_as_chainname)
  return outip;\r
 }\r
 \r
-char *hash_id(char *ip,int bitmask)\r
+char *index_id(char *ip,int bitmask)\r
 { \r
  return very_ugly_ipv4_code(ip,bitmask,1);\r
 }\r
@@ -712,57 +642,6 @@ void run_restore(void)
  free(restor);\r
 }\r
 \r
-/* == This function strips extra characters after IP address and stores it = */\r
-\r
-void parse_ip(char *str)\r
-{\r
- char *ptr,*ipaddr=NULL,*ipname=NULL,*lmsid=NULL;\r
-\r
- ptr=strchr(str,'{');\r
- if(ptr)\r
- {\r
-  lmsid=++ptr;\r
-  while(*ptr && *ptr!='}')\r
-  {\r
-   ptr++;\r
-  }\r
-  *ptr=0;\r
- }\r
\r
- ptr=str;\r
- while(*ptr && *ptr!=' ' && *ptr!=9)\r
- {\r
-  ptr++;\r
- }\r
\r
- *ptr=0;\r
- ipaddr=str;\r
- ptr++;\r
- while(*ptr && (*ptr==' ' || *ptr==9))\r
- {\r
-  ptr++;\r
- }\r
- ipname=ptr; \r
- while(*ptr && *ptr!=' ' && *ptr!=9)\r
- {\r
-  ptr++;\r
- }\r
- *ptr=0;\r
-\r
- if_exists(ip,ips,eq(ip->addr,ipaddr));\r
- else\r
- {\r
-  TheIP();\r
- }\r
- ip->addr=ipaddr;\r
- ip->name=ipname;\r
- if(lmsid)\r
- {\r
-  ip->lmsid=atoi(lmsid);\r
-  found_lmsid=1;\r
- }\r
-}\r
-\r
 char *parse_datafile_line(char *str)\r
 {\r
  char *ptr=strchr(str,' ');\r
@@ -779,9 +658,6 @@ char *parse_datafile_line(char *str)
  }\r
 }\r
 \r
-\r
-\r
-\r
 void append_log(struct IP *self) /*using global variables*/\r
 {\r
  char *d, *str;\r
@@ -804,7 +680,6 @@ void append_log(struct IP *self) /*using global variables*/
  }\r
 }\r
 \r
-\r
 /*-----------------------------------------------------------------*/\r
 /* Are you looking for int main(int argc, char **argv) ? :-))      */\r
 /*-----------------------------------------------------------------*/\r
@@ -815,7 +690,7 @@ program
  FILE *f=NULL;               /* everything is just stream of bytes... */\r
  char *str, *ptr, *d;        /* LET A$=B$ :-) */\r
  char *substring;\r
- int class_count=0,ip_count=0;\r
+\r
  int parent=1;\r
  int just_flush=FALSE;       /* deactivates all previous actions */\r
  int nodelay=FALSE;\r
@@ -894,107 +769,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
  /*-----------------------------------------------------------------*/\r
  printf("Parsing class defintion file %s ...\n", hosts);\r
  /*-----------------------------------------------------------------*/\r
- int groupidx = FIRSTGROUPID;\r
- parse(hosts)\r
- {\r
-  str=_;\r
-\r
-  if(*str<'0' || *str>'9')\r
-  {\r
-   /* any line starting with non-number is comment ...*/\r
-   continue;\r
-  }\r
-  \r
-  //Does this IP share QoS class with some other ?\r
-  substring=strstr(str,"sharing-");\r
-  if(substring)\r
-  { \r
-   substring+=8; //"sharing-"\r
-   parse_ip(str);\r
-   ip_count++;\r
-   ip->sharing=substring;\r
-   ip->keyword=defaultkeyword; /* settings for default keyword */\r
-   while(*substring && *substring!='\n')\r
-   {\r
-    substring++;\r
-   }\r
-   *substring=0; \r
-  }\r
-  else\r
-  {\r
-   //Do we have to create new QoS class for this IP ?\r
-\r
-   if_exists(keyword,keywords,(substring=strstr(str,keyword->key)))\r
-   {\r
-    parse_ip(str);\r
-    ip_count++;\r
-    ip->keyword=keyword;\r
-    keyword->ip_count++;\r
-    ip->prio=keyword->default_prio;\r
-    substring+=strlen(keyword->key)+1;\r
-    ptr=substring;\r
-    while(*ptr && *ptr!='-')\r
-    {\r
-     ptr++;\r
-    }\r
-    if(*ptr=='-')\r
-    {\r
-     *ptr=0;\r
-     ip->max = ip->desired=atoi(ptr+1);\r
-    }\r
-    ip->min = atoi(substring);\r
-    if(ip->min <= 0)\r
-    {\r
-     printf(" %s: Illegal value of minimum bandwidth 0 kbps, using %d kb/s\n",\r
-            str, free_min);\r
-     ip->min = free_min;\r
-    }\r
-    if(ip->max <= ip->min)\r
-    {\r
-     ip->fixedprio = 1;\r
-     ip->max = ip->min+ip->keyword->reserve_min;\r
-    }\r
-    else \r
-    {\r
-     ip->max -= ip->keyword->reserve_max;\r
-     if(ip->max<ip->min)\r
-     {\r
-      ip->max=ip->min;\r
-     }\r
-    }\r
-    ip->mark=FIRSTIPCLASS+1+class_count++;\r
-\r
-    if_exists(group,groups,group->min==ip->min) \r
-    { \r
-     group->count++;      \r
-     group->desired += ip->min;\r
-     ip->group = group->id;   \r
-    }\r
-    else\r
-    {\r
-     create(group,Group);\r
-     group->min = ip->min;\r
-     group->id = groupidx++;\r
-     ip->group = group->id;\r
-\r
-     if(group->min<8) group->min=8;\r
-     /* Warning - this is maybe because of primitive tc namespace, can be fixed */\r
-     /* it is because class IDs are derived from min. bandwidth. - xCh */\r
-     //if(group->min>MAX_GUARANTED_KBPS) group->min=MAX_GUARANTED_KBPS;\r
-     \r
-     group->count=1;\r
-     group->desired=ip->min;   \r
-     insert(group,groups,desc_order_by,min);\r
-    }\r
-   }//endif keyword-\r
-  }//endif sharing-\r
- }\r
- fail\r
- {\r
-  perror(hosts);\r
-  exit(-1);\r
- }\r
- done; /* ugly macro end */\r
+ parse_hosts(hosts);\r
 \r
  /*-----------------------------------------------------------------*/\r
  /* cll1.h - let's allocate brand new character buffer...           */\r
@@ -1014,7 +789,7 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
    ip->lmsid=sharedip->lmsid;\r
    break;\r
   }\r
-  if(!sharedip)\r
+  if(not sharedip)\r
   {\r
    printf("Unresolved shared connection: %s %s sharing-%s\n",\r
           ip->addr, ip->name, ip->sharing);\r
@@ -1082,11 +857,11 @@ Credit: CZFree.Net, Martin Devera, Netdave, Aquarius, Gandalf\n\n",version);
    if(qos_proxy)\r
    {\r
     save_line(":post_noproxy - [0:0]");\r
-    sprintf(str,"-A POSTROUTING -p ! tcp -o %s -j post_noproxy", lan);\r
+    sprintf(str,"-A POSTROUTING ! -p tcp -o %s -j post_noproxy", lan);\r
     save_line(str);   \r
-    sprintf(str,"-A POSTROUTING -s ! %s -o %s -j post_noproxy", proxy_ip, lan);\r
+    sprintf(str,"-A POSTROUTING ! -s %s -o %s -j post_noproxy", proxy_ip, lan);\r
     save_line(str);   \r
-    sprintf(str,"-A POSTROUTING -s %s -p tcp --sport ! %d -o %s -j post_noproxy", proxy_ip, proxy_port, lan);\r
+    sprintf(str,"-A POSTROUTING -s %s -p tcp ! --sport %d -o %s -j post_noproxy", proxy_ip, proxy_port, lan);\r
     save_line(str);   \r
 \r
     chain="post_noproxy";    \r
@@ -1113,7 +888,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
@@ -1139,7 +914,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
@@ -1853,7 +1628,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.202761 seconds and 4 git commands to generate.