jablonka.czprosek.czf

sedlo

Subversion Repositories:
[/] [trunk/] [sedlo] - Blame information for rev 23

 

Line No. Rev Author Line
17simandl#!/bin/bash
2# author : Petr Simandl www.simandl.cz
321simandl# release date : 03/06/2007
47simandl# name : sedlo
5# description : dynamic side routing tables tool
6# license : GPL
7 
822simandlsl_version="0.0.4pre10"
97simandl 
10PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
11 
12sl_nmcnf="sedlo.conf"
13sl_sedlocnf="/etc/$sl_nmcnf"
14sl_sedlocache="/var/cache/sedlo"
15 
16sl_rttab="/etc/iproute2/rt_tables"
17sl_rtnmin=110
18sl_rtnmax=200
1916simandl#all traffic that is handled as internal (CZF traffic)
207simandlsl_ipnodef="10.0.0.0/8"
2122simandl#this will specify base priority in rule table
22sl_priobase=10000
23#this will specify base priority in rule table select mask
24sl_priorulesmask="100.."
2516simandl#no default traffic will have rule at higher priority
2622simandlsl_prionodef=$(($sl_priobase - 1))
277simandl 
28slm_unknown="Nezname parametry : "
29 
30sl_ipcmd=`which ip`
31sl_trcmd=`which tr`
32sl_wgetcmd=`which wget`
33sl_hnmcmd=`which hostname`
34sl_awkcmd=`which awk`
35sl_catcmd=`which cat`
36sl_grepcmd=`which grep`
3710simandlsl_diffcmd=`which diff`
387simandl 
39if [ -e $sl_sedlocnf ]
40 then
41 sl_nop=1
42 else
43 echo "$sl_sedlocnf not found"
44 exit 1
45fi
46 
47if [ -e $sl_rttab ]
48 then
49 sl_nop=1
50 else
51 echo "$sl_rttab not found"
52 exit 1
53fi
54 
559simandlsl_murlcfg=`cat $sl_sedlocnf | grep "^mcnf" | uniq | awk '{print $2" "$3" "$4}'`
567simandl 
57######################################################################
5822simandl#this will delete all rules at sl_prionodef and sl_priorulesmask priorities
5916simandls_flruall()
60{
61if [ $scm_info -gt 0 ]; then echo "Flushing all rules" ; fi
62 
63sl_rules=`$sl_ipcmd ru ls | $sl_grepcmd "^"$sl_prionodef":" | $sl_trcmd '[:blank:]' '*'`
64for sl_rule in $sl_rules
65do
66 sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
67 $sl_ipcmd ru del $sl_ipgws
68 #this should make faster applying of new routing tables
69 $sl_ipcmd ro flush cache
70done
71 
7222simandlsl_rules=`$sl_ipcmd ru ls | $sl_grepcmd "^"$sl_priorulesmask":" | $sl_trcmd '[:blank:]' '*'`
7316simandlfor sl_rule in $sl_rules
74do
75 sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
76 $sl_ipcmd ru del $sl_ipgws
77 #this should make faster applying of new routing tables
78 $sl_ipcmd ro flush cache
79done
80 
81} # s_flruall
82 
83######################################################################
84s_checknodefru()
85{
86#checking if we have present nodef rule and if not we create it
87sl_nodefrule=`$sl_ipcmd ru ls | $sl_grepcmd "^"$sl_prionodef":" | $sl_trcmd '[:blank:]' '*'`
88#echo $sl_nodefrule
89if [ "$sl_nodefrule x" == " x" ]
90 then
91 if [ $scm_info -gt 0 ]; then echo "Creating rule for nodef route" ; fi
92 $sl_ipcmd ru add from $sl_ipnodef to $sl_ipnodef lookup main prio $sl_prionodef
93fi
94}
95 
96######################################################################
9710simandl# here we get each ip and we create a rule to send this ip to a
98# certain table
99# this routine can be skipped when the number of ips and ip directions
100# are still the same = old and new configs are the same
1017simandls_fillrules()
102{
1038simandl 
10416simandl#this will check no default rule if exists and if not it will be created
105s_checknodefru
106 
10717simandlif [ $scm_info -gt 0 ]; then echo "Checking rules for ips" ; fi
1087simandl 
109sl_ips=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd "^ip" | $sl_awkcmd '{print $2"*"$4"*"$5"*"$6}'`
11022simandlsl_rules=`$sl_ipcmd ru ls | $sl_grepcmd ^$sl_priorulesmask":" | $sl_trcmd '[:blank:]' '*'`
1117simandl 
11217simandl#for all IPs we check and leave, change or create rule
1137simandlfor sl_ip in $sl_ips
114do
115 sl_ipn=`echo $sl_ip | $sl_awkcmd -F '*' '{print $1}'`
116 sl_ipgws=`echo $sl_ip | $sl_awkcmd -F '*' '{print $2,$3,$4}'`
117 sl_ok="no"
11817simandl #for all GWs we check rules
1197simandl for sl_ipgw in $sl_ipgws
120 do
121 sl_tbl=`$sl_ipcmd ro ls ta $sl_ipgw`
12217simandl #check if table exists
1237simandl if [ "$sl_tbl x" != " x" ] && [ "$sl_ok" = "no" ]
124 then
12517simandl #we have IP and GW table
126 #check if the rule alredady exists
127 sl_oldrule=`echo $sl_rules | $sl_trcmd " " "\n" | $sl_grepcmd "\*"$sl_ipn"\*"`
128 sl_exactrule=`echo $sl_oldrule | $sl_trcmd " " "\n" | $sl_grepcmd "\*"$sl_ipgw"\*"`
129 if [ "$sl_exactrule x" == " x" ]
130 then
131 #exact rule doesn't exist so we check if an old rule for this IP is present
132 if [ "$sl_oldrule x" != " x" ]
133 then
134 #some old rule(s) for IP is present so we delete it
135 for sl_rule in $sl_oldrule
136 do
137 sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
138 if [ $scm_info -gt 0 ]; then echo "Deleting old rule $sl_ipgws" ; fi
139 $sl_ipcmd ru del $sl_ipgws
140 #this should make faster applying of new routing tables
141 $sl_ipcmd ro flush cache
142 done
143 fi
14422simandl #getting subnet mask if exists
145 sl_subnet=`echo $sl_ip | $sl_awkcmd -F '/' '{print $2}' | $sl_awkcmd -F '*' '{print $1}' `
146 if [ "$sl_subnet x" == " x" ]
147 then
148 #if subnet was not found we set subnet to 32
149 sl_subnet=32
150 else
151 #this is just to be sure to have subnet between 1 and 32
152 if [ $sl_subnet -gt 32 ]; then sl_subnet=32 ; fi
153 if [ $sl_subnet -lt 1 ]; then sl_subnet=1 ; fi
154 fi
155 #bigger subnets have lower priority
156 sl_priorule=$(($sl_priobase + 32))
157 sl_priorule=$(($sl_priorule - $sl_subnet))
158 
15917simandl if [ $scm_info -gt 0 ]; then echo "Creating new rule to send $sl_ipn to table $sl_ipgw" ; fi
16022simandl $sl_ipcmd ru add from $sl_ipn lookup $sl_ipgw prio $sl_priorule
16117simandl 
162 else
163 if [ $scm_info -gt 1 ]; then echo "Rule to send $sl_ipn to table $sl_ipgw already exists" ; fi
164 fi
1657simandl sl_ok="yes"
166 else
16717simandl #we have no table
1687simandl if [ "$sl_ok" = "no" ]
169 then
170 if [ $scm_info -gt 1 ]; then echo "For $sl_ipn table $sl_ipgw not used because it is empty" ; fi
171 else
17216simandl if [ $scm_info -gt 1 ]; then echo "For $sl_ipn table $sl_ipgw not used because it has lower priority" ; fi
1737simandl fi
174 fi
175 done
176done
177 
17817simandl#finally we check all rules and if there is a rule without IP from config we delete it
179for sl_rule in $sl_rules
180do
181 sl_iprule=`echo $sl_rule | $sl_awkcmd -F '*' '{print $3}'`
182 sl_ipconf=`echo $sl_ips | $sl_trcmd " " "\n" | $sl_grepcmd "^"$sl_iprule"\*"`
1837simandl 
18417simandl if [ "$sl_ipconf x" == " x" ]
185 then
186 #we have a rule without an IP in config so we delete this rule
187 sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
188 if [ $scm_info -gt 0 ]; then echo "Deleting non config rule $sl_ipgws" ; fi
189 $sl_ipcmd ru del $sl_ipgws
190 #this should make faster applying of new routing tables
191 $sl_ipcmd ro flush cache
192 fi
193done
194 
1957simandl} # s_fillrules
1968simandl 
1977simandl######################################################################
19810simandl# here we look into the main routing table for path to our iGWs
199# and we fill these tables with two halves default nets that
200# point to appropriate direction
201# this routine can be skipped when the routing table is the same
2027simandls_filltables()
203{
20410simandlif [ $scm_info -gt 0 ]; then echo "Checking main routing table" ; fi
205 
2067simandlif [ $scm_info -gt 0 ]; then echo "Filling tables" ; fi
207 
2089simandlsl_igws=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd -E "^igw|^myigw" | $sl_awkcmd '{print $3"*"$2"*"$1}'`
2097simandl 
210for sl_igw in $sl_igws
211 do
212 sl_igwn=`echo $sl_igw | $sl_awkcmd -F '*' '{print $1}'`
213 sl_igwip=`echo $sl_igw | $sl_awkcmd -F '*' '{print $2}'`
2149simandl sl_igwtype=`echo $sl_igw | $sl_awkcmd -F '*' '{print $3}'`
21515simandl 
21614simandl#oprava falesneho routovani na lokalni iface - pokud jsme lokalni igw tak se nema najit ip
217#protoze cesta dal neni - jsme totiz uz na lokalnim iface
21815simandl#head je tam proto ze se pro prespolni(a bgp) muze objevit vice rout s ruznou metrikou tak vezmem jen prvni (head)
219#s nejmensi metrikou (sort)
220 sl_igwgt=`$sl_ipcmd ro ls | $sl_grepcmd -v "proto kernel" | $sl_grepcmd "^$sl_igwip " | sort | $sl_awkcmd '{print $3}' | head -n 1`
2217simandl 
2229simandl # equal cost multipath detection - just first IP is taken as way to igw
2237simandl if [ "$sl_igwgt x" = "zebra x" ]
224 then
225 sl_igwgt=`$sl_ipcmd ro ls | $sl_grepcmd -A 1 "^$sl_igwip " | $sl_grepcmd "nexthop" | $sl_awkcmd '{print $3}'`
226 fi
227 
2289simandl #if myigw then fill table for local gateway with single ip from config
229 if [ "$sl_igwtype x" = "myigw x" ]
230 then
231 sl_igwgt=$sl_igwip
232 fi
23311simandl #testing if the igw has not a route in global routing table
2347simandl if [ "$sl_igwgt x" = " x" ]
235 then
23611simandl if [ $scm_info -gt 1 ]; then echo "Route not found for igw $sl_igwn" ; fi
237 sl_myigw=`cat $sl_sedlocnf | $sl_grepcmd "^myigw" | $sl_grepcmd $sl_igwn | $sl_awkcmd '{print $3}'`
238 #testing if the igw without route is in local config
239 #if not we go to flush its table and set flag to redo rules
240 if [ "$sl_myigw x" = " x" ]
241 then
242 #getting num of routes of igw
24313simandl sl_igwnr=`$sl_ipcmd ro ls ta all | $sl_grepcmd -c "table ${sl_igwn} "`
24411simandl if [ "$sl_igwnr x" = "0 x" ]
245 then
24612simandl if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn is already empty - no action taken" ; fi
24711simandl else
24812simandl if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn will be flushed and rules rearranged" ; fi
24911simandl $sl_ipcmd ro fl ta $sl_igwn
250 #because this igw dissapeared we set a flag for rules recreation
251 sl_diffigw=1
252 fi
253 else
25413simandl if [ $scm_info -gt 1 ]; then echo "Igw $sl_igwn found in local config - leaving table as is" ; fi
25511simandl fi
2567simandl else
257 sl_tbl=`$sl_ipcmd ro ls ta $sl_igwn`
25812simandl #if the table is empty we fill it and we set flag for rules recreation
259 if [ "$sl_tbl x" = " x" ]
2607simandl then
26112simandl sl_diffigw=1
262 $sl_ipcmd ro add 0.0.0.0/1 via $sl_igwgt ta $sl_igwn
263 $sl_ipcmd ro add 128.0.0.0/1 via $sl_igwgt ta $sl_igwn
264 if [ "$sl_igwtype x" = "myigw x" ]
265 then
266 if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn filled with default myigw $sl_igwgt" ; fi
267 else
268 if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn filled with default gw $sl_igwgt" ; fi
269 fi
270 #the table is not empty so we check if routes are the same
2719simandl else
27212simandl #picking default gateway from the table
273 sl_igwogt=`$sl_ipcmd ro ls ta $sl_igwn | $sl_awkcmd '{print $3}' | uniq`
274 #checking if the old default is same as the new one
275 if [ "$sl_igwogt x" = "$sl_igwgt x" ]
276 then
277 if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn will not be changed and default is $sl_igwgt" ; fi
278 else
279 #the new default is different so we will flush the table, fill new default
28015simandl if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn will be rewritten to default $sl_igwgt" ; fi
28112simandl #flushing old default route in the table
282 $sl_ipcmd ro fl ta $sl_igwn
283 #filling new default
284 $sl_ipcmd ro add 0.0.0.0/1 via $sl_igwgt ta $sl_igwn
285 $sl_ipcmd ro add 128.0.0.0/1 via $sl_igwgt ta $sl_igwn
286 fi
2879simandl fi
2887simandl fi
289 done
290 
291} # s_filltables
2928simandl 
2937simandl######################################################################
29410simandl# filling rttab with tables from config
295# only new tables are created with a new uniq number that is not important because
296# usually we handle tables just by their names
297# this routine acts only when a new iGW appears - only adding a table is supported
298# no deleting is implemented because it seems to be not necessary to delete an old table
299# because there is space enough and after reboot table will not be created
3007simandls_mktables()
301{
30210simandlif [ $scm_info -gt 0 ]; then echo "Checking tables" ; fi
303 
3049simandlsl_igws=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd -E "^igw|^myigw" | $sl_awkcmd '{print $3}'`
3057simandlfor sl_igw in $sl_igws
306 do
307 sl_igwrttb=`$sl_catcmd $sl_rttab | $sl_awkcmd '{print $2}' | $sl_grepcmd $sl_igw `
308 if [ "$sl_igwrttb x" = " x" ]
309 then
310 if [ $scm_info -gt 1 ]; then echo "Creating table for $sl_igw" ; fi
311 sl_cnt="$sl_rtnmax"
312 sl_ok="no"
313 until [ "$sl_cnt" -eq "$sl_rtnmin" ] || [ "$sl_ok" = "yes" ]
314 do
315 #space is used to recognized two and three digit numbers
316 sl_igwrttb=`cat $sl_rttab | awk '{print $1" "}' | grep "$sl_cnt " `
317 if [ "$sl_igwrttb x" = " x" ]
318 then
319 sl_ok="yes"
320 echo "$sl_cnt $sl_igw" >> $sl_rttab
321 fi
322 sl_cnt=$(($sl_cnt - 1 ))
32311simandl done
324 # a new table was created so we should set a flag for rules creation
325 sl_difftbl=1
3267simandl else
327 if [ $scm_info -gt 1 ]; then echo "Table found for $sl_igw no action taken" ; fi
328 fi
3299simandl done
3307simandl} # s_mktables
3318simandl 
3327simandl######################################################################
333s_getcfg()
334{
335if [ $scm_info -gt 0 ]; then echo "Getting config" ; fi
336if [ $scm_info -gt 1 ]; then echo "Using main config $sl_murlcfg" ; fi
337if [ $scm_info -gt 1 ]; then echo "Using local config $sl_sedlocnf" ; fi
338 
33910simandlrm -f "$sl_sedlocache/$sl_nmcnf.main.tmp"
3407simandl 
34110simandl$sl_wgetcmd -q -t 3 $sl_murlcfg -O "$sl_sedlocache/$sl_nmcnf.main.tmp"
342 
3437simandlif [ -s $sl_sedlocache/$sl_nmcnf.main.tmp ]
344 then
345 date > $sl_sedlocache/last_getcnf.txt
346 cp $sl_sedlocache/$sl_nmcnf.main.tmp $sl_sedlocache/$sl_nmcnf.main
34710simandl if [ $scm_info -gt 1 ]; then echo "Main config downloaded and accepted" ; fi
3487simandl else
3498simandl if [ $scm_info -gt 1 ]; then echo "Main config not downloaded - cached config will be used" ; fi
350 echo -n "Main config not downloaded " > $sl_sedlocache/last_getcnf.txt
3517simandl date >> $sl_sedlocache/last_getcnf.txt
352fi
353 
35410simandl# before generating a new cached config we store the old one for
355# comparison with the new one
356rm -f "$sl_sedlocache/$sl_nmcnf.old"
357if [ -s $sl_sedlocache/$sl_nmcnf ]
358 then
359 cp $sl_sedlocache/$sl_nmcnf $sl_sedlocache/$sl_nmcnf.old
360 else
361 touch $sl_sedlocache/$sl_nmcnf.old
362fi
363 
3647simandl# preparing cached config from local and main
36522simandl# the local config should be processed as the first to have
3667simandl# higher priority for rules from local config
367echo "# generated file" > $sl_sedlocache/$sl_nmcnf
36822simandlfor sl_file in `ls $sl_sedlocnf ; ls $sl_sedlocache/$sl_nmcnf.main `
3697simandldo
370cat $sl_file | grep "^mcnf" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2}' >> $sl_sedlocache/$sl_nmcnf
371cat $sl_file | grep "^igw" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3}' >> $sl_sedlocache/$sl_nmcnf
372cat $sl_file | grep "^ip" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}' >> $sl_sedlocache/$sl_nmcnf
373done
3748simandl 
375#local gateways taken from local config
376cat $sl_sedlocnf | grep "^myigw" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3}' >> $sl_sedlocache/$sl_nmcnf
377 
3787simandl#cat $sl_sedlocache/$sl_nmcnf | sort | uniq > $sl_sedlocache/$sl_nmcnf.uniq
379#mv $sl_sedlocache/$sl_nmcnf.uniq $sl_sedlocache/$sl_nmcnf
380 
38110simandlsl_diffcfg=`diff $sl_sedlocache/$sl_nmcnf $sl_sedlocache/$sl_nmcnf.old | grep -c .`
382if [ $sl_diffcfg -gt 0 ]
383 then
384 if [ $scm_info -gt 0 ]; then echo "New config is different than the old one" ; fi
385 else
386 if [ $scm_info -gt 0 ]; then echo "New config is the same as the old one" ; fi
387fi
388 
38911simandl# showing number of rules in config and system
39010simandlsl_numru=`ip ru ls | grep -c lookup`
391sl_numip=`grep -c ^ip $sl_sedlocache/$sl_nmcnf`
392sl_numru=$(($sl_numru - 3 ))
393if [ $sl_numip -gt $sl_numru ]
394 then
395 if [ $scm_info -gt 0 ]; then echo "We have less rules ($sl_numru) than new config has ips ($sl_numip)" ; fi
39611simandl# sl_diffcfg="1"
39710simandl else
398 if [ $scm_info -gt 0 ]; then echo "We have $sl_numru rules and $sl_numip ips" ; fi
399fi
4007simandl}
4018simandl 
4027simandl######################################################################
403s_version()
404{
405 echo sedlo $sl_version
406} # s_version
4078simandl 
4087simandl######################################################################
409s_report()
410{
4119simandl echo Content-type: text/html
412 echo
413 echo "Sedlo na routeru `hostname`"
414 echo "<pre>"
4157simandl echo "##### SEDLO #####"
416 echo "date : `date`"
417 echo "version : $sl_version"
418 echo "local_config : $sl_sedlocnf"
4199simandl echo "main_config : <a href=\"$sl_murlcfg\">$sl_murlcfg</a>"
4207simandl echo "last update : `cat $sl_sedlocache/last_getcnf.txt`"
421 echo "##### TABLES #####"
422 cat $sl_rttab
4239simandl echo ; echo "##### DEFAULT ROUTES IN TABLES #####"
424 $sl_ipcmd ro ls ta all | $sl_grepcmd table | $sl_grepcmd -v local | $sl_trcmd " " "\t"
425 echo ; echo "##### RULES FOR IPS #####"
426 $sl_ipcmd ru ls | $sl_trcmd " " "\t"
427 echo "</pre>"
4287simandl} # s_report
4298simandl 
4307simandl######################################################################
431s_help()
432{
433 echo Pouziti: sedlo [param]
434 echo param:
435 echo -V vypise verzi
436 echo -help vypise napovedu
437 echo -v malo upovidany
438 echo -vv hodne upovidany
439 echo -nogetcfg zajisti ze se nedude znovu nacitat konfigurace a pouzije se predchozi z cache
440 echo -report vypise prehled pravidel a tabulek
441 echo -flru odstrani vsechny pravidla
44211simandl echo -force bezpodminecne znovu obnovi vsechny pravidla
4437simandl} # s_help
4448simandl 
4457simandl######################################################################
446######################################################################
447 
448sl_unknown=""
449scm_nogetcfg=0
450scm_flru=0
451scm_info=0
45211simandlscm_force=0
453sl_diffigw=0
454sl_difftbl=0
4557simandl 
456# parsing input parameters
457while [ "a$1" != "a" ]
458do
459 case $1 in
460 -V)
461 s_version
462 exit 0
463 ;;
464 -h)
465 s_help
466 exit 0
467 ;;
468 -report)
469 s_report
470 exit 0
471 ;;
472 -flru)
473 scm_flru=1
474 shift
475 ;;
47611simandl -force)
477 scm_force=1
478 shift
479 ;;
4807simandl -help)
481 s_help
482 exit 0
483 ;;
484 -nogetcfg)
485 scm_nogetcfg=1
486 shift
487 ;;
488 -v)
489 scm_info=1
490 shift
491 ;;
492 -vv)
493 scm_info=2
494 shift
495 ;;
496 *)
497 sl_unknown="$sl_unknown$1 "
498 shift
499 esac
500done
501 
502# printing the list of bad parameters (if there are some)
503if [ "a$sl_unknown" != "a" ]
504then
505 echo "$slm_unknown $sl_unknown"
506 s_help
507 exit 0
508fi
509 
510if [ $scm_flru -eq 1 ]
511then
51216simandl s_flruall
5137simandl exit 0
514fi
515 
516if [ $scm_nogetcfg -eq 0 ]
517then
518 s_getcfg
519fi
520 
521s_mktables
522s_filltables
52315simandl#toto je pro ladici ucely
52411simandl#echo $sl_difftbl
525#echo $sl_diffcfg
526#echo $sl_diffigw
527#echo $scm_force
52813simandl#exit 0
52915simandl 
53011simandl#flushing and filling rules is done only when
531#new table is created
532#config is changed
533#some igw dissapears or appears
534#-force command line parameter was used
535if [ $sl_difftbl -gt 0 ] || [ $sl_diffcfg -gt 0 ] || [ $sl_diffigw -gt 0 ] || [ $scm_force -gt 0 ]
53610simandlthen
537 s_fillrules
538fi
539 
54016simandl 
5417simandlexit 0

Powered by WebSVN 2.2.1