jablonka.czprosek.czf

sedlo

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

 

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 
824simandlsl_version="0.0.4pre11"
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"
1524simandlmkdir -p /var/cache/sedlo
167simandl 
17sl_rttab="/etc/iproute2/rt_tables"
18sl_rtnmin=110
19sl_rtnmax=200
2016simandl#all traffic that is handled as internal (CZF traffic)
217simandlsl_ipnodef="10.0.0.0/8"
2222simandl#this will specify base priority in rule table
23sl_priobase=10000
24#this will specify base priority in rule table select mask
25sl_priorulesmask="100.."
2616simandl#no default traffic will have rule at higher priority
2722simandlsl_prionodef=$(($sl_priobase - 1))
287simandl 
29slm_unknown="Nezname parametry : "
30 
31sl_ipcmd=`which ip`
32sl_trcmd=`which tr`
33sl_wgetcmd=`which wget`
34sl_hnmcmd=`which hostname`
35sl_awkcmd=`which awk`
36sl_catcmd=`which cat`
37sl_grepcmd=`which grep`
3810simandlsl_diffcmd=`which diff`
397simandl 
40if [ -e $sl_sedlocnf ]
41 then
42 sl_nop=1
43 else
44 echo "$sl_sedlocnf not found"
45 exit 1
46fi
47 
48if [ -e $sl_rttab ]
49 then
50 sl_nop=1
51 else
52 echo "$sl_rttab not found"
53 exit 1
54fi
55 
569simandlsl_murlcfg=`cat $sl_sedlocnf | grep "^mcnf" | uniq | awk '{print $2" "$3" "$4}'`
577simandl 
58######################################################################
5922simandl#this will delete all rules at sl_prionodef and sl_priorulesmask priorities
6016simandls_flruall()
61{
62if [ $scm_info -gt 0 ]; then echo "Flushing all rules" ; fi
63 
64sl_rules=`$sl_ipcmd ru ls | $sl_grepcmd "^"$sl_prionodef":" | $sl_trcmd '[:blank:]' '*'`
65for sl_rule in $sl_rules
66do
67 sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
68 $sl_ipcmd ru del $sl_ipgws
69 #this should make faster applying of new routing tables
70 $sl_ipcmd ro flush cache
71done
72 
7322simandlsl_rules=`$sl_ipcmd ru ls | $sl_grepcmd "^"$sl_priorulesmask":" | $sl_trcmd '[:blank:]' '*'`
7416simandlfor sl_rule in $sl_rules
75do
76 sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
77 $sl_ipcmd ru del $sl_ipgws
78 #this should make faster applying of new routing tables
79 $sl_ipcmd ro flush cache
80done
81 
82} # s_flruall
83 
84######################################################################
85s_checknodefru()
86{
87#checking if we have present nodef rule and if not we create it
88sl_nodefrule=`$sl_ipcmd ru ls | $sl_grepcmd "^"$sl_prionodef":" | $sl_trcmd '[:blank:]' '*'`
89#echo $sl_nodefrule
90if [ "$sl_nodefrule x" == " x" ]
91 then
92 if [ $scm_info -gt 0 ]; then echo "Creating rule for nodef route" ; fi
93 $sl_ipcmd ru add from $sl_ipnodef to $sl_ipnodef lookup main prio $sl_prionodef
94fi
95}
96 
97######################################################################
9810simandl# here we get each ip and we create a rule to send this ip to a
99# certain table
100# this routine can be skipped when the number of ips and ip directions
101# are still the same = old and new configs are the same
1027simandls_fillrules()
103{
1048simandl 
10516simandl#this will check no default rule if exists and if not it will be created
106s_checknodefru
107 
10817simandlif [ $scm_info -gt 0 ]; then echo "Checking rules for ips" ; fi
1097simandl 
110sl_ips=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd "^ip" | $sl_awkcmd '{print $2"*"$4"*"$5"*"$6}'`
11122simandlsl_rules=`$sl_ipcmd ru ls | $sl_grepcmd ^$sl_priorulesmask":" | $sl_trcmd '[:blank:]' '*'`
1127simandl 
11317simandl#for all IPs we check and leave, change or create rule
1147simandlfor sl_ip in $sl_ips
115do
116 sl_ipn=`echo $sl_ip | $sl_awkcmd -F '*' '{print $1}'`
117 sl_ipgws=`echo $sl_ip | $sl_awkcmd -F '*' '{print $2,$3,$4}'`
118 sl_ok="no"
11917simandl #for all GWs we check rules
1207simandl for sl_ipgw in $sl_ipgws
121 do
122 sl_tbl=`$sl_ipcmd ro ls ta $sl_ipgw`
12317simandl #check if table exists
1247simandl if [ "$sl_tbl x" != " x" ] && [ "$sl_ok" = "no" ]
125 then
12617simandl #we have IP and GW table
127 #check if the rule alredady exists
128 sl_oldrule=`echo $sl_rules | $sl_trcmd " " "\n" | $sl_grepcmd "\*"$sl_ipn"\*"`
129 sl_exactrule=`echo $sl_oldrule | $sl_trcmd " " "\n" | $sl_grepcmd "\*"$sl_ipgw"\*"`
130 if [ "$sl_exactrule x" == " x" ]
131 then
132 #exact rule doesn't exist so we check if an old rule for this IP is present
133 if [ "$sl_oldrule x" != " x" ]
134 then
135 #some old rule(s) for IP is present so we delete it
136 for sl_rule in $sl_oldrule
137 do
138 sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
139 if [ $scm_info -gt 0 ]; then echo "Deleting old rule $sl_ipgws" ; fi
140 $sl_ipcmd ru del $sl_ipgws
141 #this should make faster applying of new routing tables
142 $sl_ipcmd ro flush cache
143 done
144 fi
14522simandl #getting subnet mask if exists
146 sl_subnet=`echo $sl_ip | $sl_awkcmd -F '/' '{print $2}' | $sl_awkcmd -F '*' '{print $1}' `
147 if [ "$sl_subnet x" == " x" ]
148 then
149 #if subnet was not found we set subnet to 32
150 sl_subnet=32
151 else
152 #this is just to be sure to have subnet between 1 and 32
153 if [ $sl_subnet -gt 32 ]; then sl_subnet=32 ; fi
154 if [ $sl_subnet -lt 1 ]; then sl_subnet=1 ; fi
155 fi
156 #bigger subnets have lower priority
157 sl_priorule=$(($sl_priobase + 32))
158 sl_priorule=$(($sl_priorule - $sl_subnet))
159 
16017simandl if [ $scm_info -gt 0 ]; then echo "Creating new rule to send $sl_ipn to table $sl_ipgw" ; fi
16122simandl $sl_ipcmd ru add from $sl_ipn lookup $sl_ipgw prio $sl_priorule
16217simandl 
163 else
164 if [ $scm_info -gt 1 ]; then echo "Rule to send $sl_ipn to table $sl_ipgw already exists" ; fi
165 fi
1667simandl sl_ok="yes"
167 else
16817simandl #we have no table
1697simandl if [ "$sl_ok" = "no" ]
170 then
171 if [ $scm_info -gt 1 ]; then echo "For $sl_ipn table $sl_ipgw not used because it is empty" ; fi
172 else
17316simandl if [ $scm_info -gt 1 ]; then echo "For $sl_ipn table $sl_ipgw not used because it has lower priority" ; fi
1747simandl fi
175 fi
176 done
177done
178 
17917simandl#finally we check all rules and if there is a rule without IP from config we delete it
180for sl_rule in $sl_rules
181do
182 sl_iprule=`echo $sl_rule | $sl_awkcmd -F '*' '{print $3}'`
183 sl_ipconf=`echo $sl_ips | $sl_trcmd " " "\n" | $sl_grepcmd "^"$sl_iprule"\*"`
1847simandl 
18517simandl if [ "$sl_ipconf x" == " x" ]
186 then
187 #we have a rule without an IP in config so we delete this rule
188 sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
189 if [ $scm_info -gt 0 ]; then echo "Deleting non config rule $sl_ipgws" ; fi
190 $sl_ipcmd ru del $sl_ipgws
191 #this should make faster applying of new routing tables
192 $sl_ipcmd ro flush cache
193 fi
194done
195 
1967simandl} # s_fillrules
1978simandl 
1987simandl######################################################################
19910simandl# here we look into the main routing table for path to our iGWs
200# and we fill these tables with two halves default nets that
201# point to appropriate direction
202# this routine can be skipped when the routing table is the same
2037simandls_filltables()
204{
20510simandlif [ $scm_info -gt 0 ]; then echo "Checking main routing table" ; fi
206 
2077simandlif [ $scm_info -gt 0 ]; then echo "Filling tables" ; fi
208 
2099simandlsl_igws=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd -E "^igw|^myigw" | $sl_awkcmd '{print $3"*"$2"*"$1}'`
2107simandl 
211for sl_igw in $sl_igws
212 do
213 sl_igwn=`echo $sl_igw | $sl_awkcmd -F '*' '{print $1}'`
214 sl_igwip=`echo $sl_igw | $sl_awkcmd -F '*' '{print $2}'`
2159simandl sl_igwtype=`echo $sl_igw | $sl_awkcmd -F '*' '{print $3}'`
21615simandl 
21714simandl#oprava falesneho routovani na lokalni iface - pokud jsme lokalni igw tak se nema najit ip
218#protoze cesta dal neni - jsme totiz uz na lokalnim iface
21915simandl#head je tam proto ze se pro prespolni(a bgp) muze objevit vice rout s ruznou metrikou tak vezmem jen prvni (head)
220#s nejmensi metrikou (sort)
221 sl_igwgt=`$sl_ipcmd ro ls | $sl_grepcmd -v "proto kernel" | $sl_grepcmd "^$sl_igwip " | sort | $sl_awkcmd '{print $3}' | head -n 1`
2227simandl 
2239simandl # equal cost multipath detection - just first IP is taken as way to igw
2247simandl if [ "$sl_igwgt x" = "zebra x" ]
225 then
226 sl_igwgt=`$sl_ipcmd ro ls | $sl_grepcmd -A 1 "^$sl_igwip " | $sl_grepcmd "nexthop" | $sl_awkcmd '{print $3}'`
227 fi
228 
2299simandl #if myigw then fill table for local gateway with single ip from config
230 if [ "$sl_igwtype x" = "myigw x" ]
231 then
232 sl_igwgt=$sl_igwip
233 fi
23411simandl #testing if the igw has not a route in global routing table
2357simandl if [ "$sl_igwgt x" = " x" ]
236 then
23711simandl if [ $scm_info -gt 1 ]; then echo "Route not found for igw $sl_igwn" ; fi
238 sl_myigw=`cat $sl_sedlocnf | $sl_grepcmd "^myigw" | $sl_grepcmd $sl_igwn | $sl_awkcmd '{print $3}'`
239 #testing if the igw without route is in local config
240 #if not we go to flush its table and set flag to redo rules
241 if [ "$sl_myigw x" = " x" ]
242 then
243 #getting num of routes of igw
24413simandl sl_igwnr=`$sl_ipcmd ro ls ta all | $sl_grepcmd -c "table ${sl_igwn} "`
24511simandl if [ "$sl_igwnr x" = "0 x" ]
246 then
24712simandl if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn is already empty - no action taken" ; fi
24811simandl else
24912simandl if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn will be flushed and rules rearranged" ; fi
25011simandl $sl_ipcmd ro fl ta $sl_igwn
251 #because this igw dissapeared we set a flag for rules recreation
252 sl_diffigw=1
253 fi
254 else
25513simandl if [ $scm_info -gt 1 ]; then echo "Igw $sl_igwn found in local config - leaving table as is" ; fi
25611simandl fi
2577simandl else
258 sl_tbl=`$sl_ipcmd ro ls ta $sl_igwn`
25912simandl #if the table is empty we fill it and we set flag for rules recreation
260 if [ "$sl_tbl x" = " x" ]
2617simandl then
26212simandl sl_diffigw=1
263 $sl_ipcmd ro add 0.0.0.0/1 via $sl_igwgt ta $sl_igwn
264 $sl_ipcmd ro add 128.0.0.0/1 via $sl_igwgt ta $sl_igwn
265 if [ "$sl_igwtype x" = "myigw x" ]
266 then
267 if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn filled with default myigw $sl_igwgt" ; fi
268 else
269 if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn filled with default gw $sl_igwgt" ; fi
270 fi
271 #the table is not empty so we check if routes are the same
2729simandl else
27312simandl #picking default gateway from the table
274 sl_igwogt=`$sl_ipcmd ro ls ta $sl_igwn | $sl_awkcmd '{print $3}' | uniq`
275 #checking if the old default is same as the new one
276 if [ "$sl_igwogt x" = "$sl_igwgt x" ]
277 then
278 if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn will not be changed and default is $sl_igwgt" ; fi
279 else
280 #the new default is different so we will flush the table, fill new default
28115simandl if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn will be rewritten to default $sl_igwgt" ; fi
28212simandl #flushing old default route in the table
283 $sl_ipcmd ro fl ta $sl_igwn
284 #filling new default
285 $sl_ipcmd ro add 0.0.0.0/1 via $sl_igwgt ta $sl_igwn
286 $sl_ipcmd ro add 128.0.0.0/1 via $sl_igwgt ta $sl_igwn
287 fi
2889simandl fi
2897simandl fi
290 done
291 
292} # s_filltables
2938simandl 
2947simandl######################################################################
29510simandl# filling rttab with tables from config
296# only new tables are created with a new uniq number that is not important because
297# usually we handle tables just by their names
298# this routine acts only when a new iGW appears - only adding a table is supported
299# no deleting is implemented because it seems to be not necessary to delete an old table
300# because there is space enough and after reboot table will not be created
3017simandls_mktables()
302{
30310simandlif [ $scm_info -gt 0 ]; then echo "Checking tables" ; fi
304 
3059simandlsl_igws=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd -E "^igw|^myigw" | $sl_awkcmd '{print $3}'`
3067simandlfor sl_igw in $sl_igws
307 do
308 sl_igwrttb=`$sl_catcmd $sl_rttab | $sl_awkcmd '{print $2}' | $sl_grepcmd $sl_igw `
309 if [ "$sl_igwrttb x" = " x" ]
310 then
311 if [ $scm_info -gt 1 ]; then echo "Creating table for $sl_igw" ; fi
312 sl_cnt="$sl_rtnmax"
313 sl_ok="no"
314 until [ "$sl_cnt" -eq "$sl_rtnmin" ] || [ "$sl_ok" = "yes" ]
315 do
316 #space is used to recognized two and three digit numbers
317 sl_igwrttb=`cat $sl_rttab | awk '{print $1" "}' | grep "$sl_cnt " `
318 if [ "$sl_igwrttb x" = " x" ]
319 then
320 sl_ok="yes"
321 echo "$sl_cnt $sl_igw" >> $sl_rttab
322 fi
323 sl_cnt=$(($sl_cnt - 1 ))
32411simandl done
325 # a new table was created so we should set a flag for rules creation
326 sl_difftbl=1
3277simandl else
328 if [ $scm_info -gt 1 ]; then echo "Table found for $sl_igw no action taken" ; fi
329 fi
3309simandl done
3317simandl} # s_mktables
3328simandl 
3337simandl######################################################################
334s_getcfg()
335{
336if [ $scm_info -gt 0 ]; then echo "Getting config" ; fi
337if [ $scm_info -gt 1 ]; then echo "Using main config $sl_murlcfg" ; fi
338if [ $scm_info -gt 1 ]; then echo "Using local config $sl_sedlocnf" ; fi
339 
34010simandlrm -f "$sl_sedlocache/$sl_nmcnf.main.tmp"
3417simandl 
34210simandl$sl_wgetcmd -q -t 3 $sl_murlcfg -O "$sl_sedlocache/$sl_nmcnf.main.tmp"
343 
3447simandlif [ -s $sl_sedlocache/$sl_nmcnf.main.tmp ]
345 then
346 date > $sl_sedlocache/last_getcnf.txt
347 cp $sl_sedlocache/$sl_nmcnf.main.tmp $sl_sedlocache/$sl_nmcnf.main
34810simandl if [ $scm_info -gt 1 ]; then echo "Main config downloaded and accepted" ; fi
3497simandl else
3508simandl if [ $scm_info -gt 1 ]; then echo "Main config not downloaded - cached config will be used" ; fi
351 echo -n "Main config not downloaded " > $sl_sedlocache/last_getcnf.txt
3527simandl date >> $sl_sedlocache/last_getcnf.txt
353fi
354 
35510simandl# before generating a new cached config we store the old one for
356# comparison with the new one
357rm -f "$sl_sedlocache/$sl_nmcnf.old"
358if [ -s $sl_sedlocache/$sl_nmcnf ]
359 then
360 cp $sl_sedlocache/$sl_nmcnf $sl_sedlocache/$sl_nmcnf.old
361 else
362 touch $sl_sedlocache/$sl_nmcnf.old
363fi
364 
3657simandl# preparing cached config from local and main
36622simandl# the local config should be processed as the first to have
3677simandl# higher priority for rules from local config
368echo "# generated file" > $sl_sedlocache/$sl_nmcnf
36922simandlfor sl_file in `ls $sl_sedlocnf ; ls $sl_sedlocache/$sl_nmcnf.main `
3707simandldo
371cat $sl_file | grep "^mcnf" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2}' >> $sl_sedlocache/$sl_nmcnf
372cat $sl_file | grep "^igw" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3}' >> $sl_sedlocache/$sl_nmcnf
373cat $sl_file | grep "^ip" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}' >> $sl_sedlocache/$sl_nmcnf
374done
3758simandl 
376#local gateways taken from local config
377cat $sl_sedlocnf | grep "^myigw" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3}' >> $sl_sedlocache/$sl_nmcnf
378 
3797simandl#cat $sl_sedlocache/$sl_nmcnf | sort | uniq > $sl_sedlocache/$sl_nmcnf.uniq
380#mv $sl_sedlocache/$sl_nmcnf.uniq $sl_sedlocache/$sl_nmcnf
381 
38210simandlsl_diffcfg=`diff $sl_sedlocache/$sl_nmcnf $sl_sedlocache/$sl_nmcnf.old | grep -c .`
383if [ $sl_diffcfg -gt 0 ]
384 then
385 if [ $scm_info -gt 0 ]; then echo "New config is different than the old one" ; fi
386 else
387 if [ $scm_info -gt 0 ]; then echo "New config is the same as the old one" ; fi
388fi
389 
39011simandl# showing number of rules in config and system
39110simandlsl_numru=`ip ru ls | grep -c lookup`
392sl_numip=`grep -c ^ip $sl_sedlocache/$sl_nmcnf`
393sl_numru=$(($sl_numru - 3 ))
394if [ $sl_numip -gt $sl_numru ]
395 then
396 if [ $scm_info -gt 0 ]; then echo "We have less rules ($sl_numru) than new config has ips ($sl_numip)" ; fi
39711simandl# sl_diffcfg="1"
39810simandl else
399 if [ $scm_info -gt 0 ]; then echo "We have $sl_numru rules and $sl_numip ips" ; fi
400fi
4017simandl}
4028simandl 
4037simandl######################################################################
404s_version()
405{
406 echo sedlo $sl_version
407} # s_version
4088simandl 
4097simandl######################################################################
410s_report()
411{
4129simandl echo Content-type: text/html
413 echo
414 echo "Sedlo na routeru `hostname`"
415 echo "<pre>"
4167simandl echo "##### SEDLO #####"
417 echo "date : `date`"
418 echo "version : $sl_version"
419 echo "local_config : $sl_sedlocnf"
4209simandl echo "main_config : <a href=\"$sl_murlcfg\">$sl_murlcfg</a>"
4217simandl echo "last update : `cat $sl_sedlocache/last_getcnf.txt`"
422 echo "##### TABLES #####"
423 cat $sl_rttab
4249simandl echo ; echo "##### DEFAULT ROUTES IN TABLES #####"
425 $sl_ipcmd ro ls ta all | $sl_grepcmd table | $sl_grepcmd -v local | $sl_trcmd " " "\t"
426 echo ; echo "##### RULES FOR IPS #####"
427 $sl_ipcmd ru ls | $sl_trcmd " " "\t"
428 echo "</pre>"
4297simandl} # s_report
4308simandl 
4317simandl######################################################################
432s_help()
433{
434 echo Pouziti: sedlo [param]
435 echo param:
436 echo -V vypise verzi
437 echo -help vypise napovedu
438 echo -v malo upovidany
439 echo -vv hodne upovidany
440 echo -nogetcfg zajisti ze se nedude znovu nacitat konfigurace a pouzije se predchozi z cache
441 echo -report vypise prehled pravidel a tabulek
442 echo -flru odstrani vsechny pravidla
44311simandl echo -force bezpodminecne znovu obnovi vsechny pravidla
4447simandl} # s_help
4458simandl 
4467simandl######################################################################
447######################################################################
448 
449sl_unknown=""
450scm_nogetcfg=0
451scm_flru=0
452scm_info=0
45311simandlscm_force=0
454sl_diffigw=0
455sl_difftbl=0
4567simandl 
457# parsing input parameters
458while [ "a$1" != "a" ]
459do
460 case $1 in
461 -V)
462 s_version
463 exit 0
464 ;;
465 -h)
466 s_help
467 exit 0
468 ;;
469 -report)
470 s_report
471 exit 0
472 ;;
473 -flru)
474 scm_flru=1
475 shift
476 ;;
47711simandl -force)
478 scm_force=1
479 shift
480 ;;
4817simandl -help)
482 s_help
483 exit 0
484 ;;
485 -nogetcfg)
486 scm_nogetcfg=1
487 shift
488 ;;
489 -v)
490 scm_info=1
491 shift
492 ;;
493 -vv)
494 scm_info=2
495 shift
496 ;;
497 *)
498 sl_unknown="$sl_unknown$1 "
499 shift
500 esac
501done
502 
503# printing the list of bad parameters (if there are some)
504if [ "a$sl_unknown" != "a" ]
505then
506 echo "$slm_unknown $sl_unknown"
507 s_help
508 exit 0
509fi
510 
511if [ $scm_flru -eq 1 ]
512then
51316simandl s_flruall
5147simandl exit 0
515fi
516 
517if [ $scm_nogetcfg -eq 0 ]
518then
519 s_getcfg
520fi
521 
522s_mktables
523s_filltables
52415simandl#toto je pro ladici ucely
52511simandl#echo $sl_difftbl
526#echo $sl_diffcfg
527#echo $sl_diffigw
528#echo $scm_force
52913simandl#exit 0
53015simandl 
53111simandl#flushing and filling rules is done only when
532#new table is created
533#config is changed
534#some igw dissapears or appears
535#-force command line parameter was used
536if [ $sl_difftbl -gt 0 ] || [ $sl_diffcfg -gt 0 ] || [ $sl_diffigw -gt 0 ] || [ $scm_force -gt 0 ]
53710simandlthen
538 s_fillrules
539fi
540 
54116simandl 
5427simandlexit 0

Powered by WebSVN 2.2.1