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