X-Git-Url: http://git.harvie.cz/?a=blobdiff_plain;f=prometheus.c;h=814da9e4cb0fe9de6527fb98ad4e216d357961ba;hb=05a9080997b372eb6003e407fc20b8ec80b8c085;hp=717971410549b1ce35de9bc6eadc77ce1ae55fe3;hpb=a1204fc9fd3dab261b08e0d1491ec4099a762c5a;p=svn%2FPrometheus-QoS%2F.git
diff --git a/prometheus.c b/prometheus.c
index 7179714..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,112 +182,18 @@ struct Index
list(Index);
} *idxs=NULL, *idx, *metaindex;
-
-
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;
-
- duplicate(inip,ip);
- /* debug printf("(%s,%d) -> ",ip,bitmask); */
-
- 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 *index_id(char *ip, int bitmask);
+/* function implemented in ipv4subnets.c */
-char *subnet_id(char *ip,int bitmask)
-{
- return very_ugly_ipv4_code(ip,bitmask,0);
-}
+char *subnet_id(char *ip, int bitmask);
+/* function implemented in ipv4subnets.c */
-/* ================= Let's parse configuration file here =================== */
+/* ================= Let's parse configuration file here ================ */
void reject_config_and_exit(char *filename)
{
@@ -373,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);
@@ -890,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++;
@@ -916,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++;
@@ -1181,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");
@@ -1630,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_");