extern struct IP *ips, *ip, *sharedip, *networks;\r
extern struct Group *groups, *group;\r
extern struct Keyword *keyword, *defaultkeyword, *keywords;\r
+extern struct Macro *macro, *macros;\r
extern int class_count;\r
extern int ip_count;\r
extern int found_lmsid;\r
\r
parse(hosts)\r
{\r
- str=_;\r
+ str = _;\r
\r
if(*str < '0' or *str > '9')\r
{\r
continue;\r
}\r
\r
+ /* first, expand (rewrite) any predefined macros, if found*/\r
+ for_each(macro, macros)\r
+ {\r
+ substring = strstr(str, macro->rewrite_from);\r
+ if(substring);\r
+ {\r
+ int l1, l3;\r
+ *substring = 0;\r
+ substring += strlen(macro->rewrite_from);\r
+ l1 = strlen(str);\r
+ l3 = strlen(substring);\r
+ string(ptr, l1 + strlen(macro->rewrite_to) + l3);\r
+ strcpy(ptr, str);\r
+ strcat(ptr, macro->rewrite_to);\r
+ strcat(ptr, substring);\r
+ str = ptr;\r
+ }\r
+ }\r
+\r
/* Does this IP share QoS class with some other ? */\r
substring = strstr(str, "sharing-");\r
if(substring)\r
#include "cll1-0.6.2.h"\r
#include "ipstruct.h"\r
\r
-const char *version = "0.8.3-j";\r
+const char *version = "0.8.5-a";\r
\r
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */\r
/* Versions: 0.8.3 is development release, 0.8.4 will be "stable" */\r
\r
char *config = "/etc/prometheus/prometheus.conf"; /* main configuration file */\r
char *hosts = "/etc/prometheus/hosts"; /* per-IP bandwidth definition file */\r
+char *macrosfile = "/etc/prometheus/prometheus.macros"; /* rewrite rules for most common tariffs */\r
char *iptablesfile = "/var/spool/prometheus.iptables"; /* temporary file for iptables-restore*/\r
char *ip6tablesfile = "/var/spool/prometheus.ip6tables"; /* temporary file for ip6tables-restore*/\r
char *credit = "/var/lib/misc/prometheus.credit"; /* credit log file */\r
\r
struct IP *ips = NULL, *networks = NULL, *ip, *sharedip;\r
struct Group *groups = NULL, *group;\r
-struct Keyword *keyword, *defaultkeyword=NULL, *keywords=NULL;\r
+struct Keyword *keyword, *defaultkeyword=NULL, *keywords = NULL;\r
+struct Macro *macro, *macros = NULL;\r
\r
#define FREE_CLASS 3\r
#define OVERLIMIT_CLASS 4\r
keyword->leaf_discipline = "";\r
keyword->allowed_avgmtu = 0;\r
\r
- push(keyword,keywords);\r
+ push(keyword, keywords);\r
if(!defaultkeyword)\r
{\r
defaultkeyword = keyword;\r
\r
char *parse_datafile_line(char *str)\r
{\r
- char *ptr=strchr(str,' ');\r
+ char *ptr = strchr(str,' ');\r
+ if(!ptr)\r
+ {\r
+ ptr = strchr(str,'\t');\r
+ }\r
\r
if(ptr)\r
{\r
- *ptr=0;\r
+ *ptr = 0;\r
ptr++;\r
+ while(*ptr == ' ' || *ptr == '\t')\r
+ {\r
+ ptr++;\r
+ }\r
return ptr;\r
} \r
else \r
/*-----------------------------------------------------------------*/\r
parse(credit)\r
{\r
- ptr=parse_datafile_line(_);\r
+ ptr = parse_datafile_line(_);\r
if(ptr)\r
{\r
if_exists(ip,ips,eq(ip->addr,_))\r
done; /* ugly macro end */\r
}\r
\r
+ if(enable_credit && just_flush<9)\r
+ {\r
+ /*-----------------------------------------------------------------*/\r
+ printf("Parsing macro definition file %s ...\n", macrosfile);\r
+ /*-----------------------------------------------------------------*/\r
+ parse(macrosfile)\r
+ {\r
+ ptr = parse_datafile_line(_);\r
+ if(ptr)\r
+ {\r
+ create(macro, Macro);\r
+ macro->rewrite_from = _;\r
+ macro->rewrite_to = ptr;\r
+ push(macro, macros);\r
+ printf("%s -> %s\n", macro->rewrite_from, macro->rewrite_to);\r
+ }\r
+ }\r
+ done; /* ugly macro end */\r
+ }\r
+\r
if(!just_preview)\r
{\r
/*-----------------------------------------------------------------*/\r