jablonka.czprosek.czf

sedlo

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

 

Line No. Rev Author Line
17simandl#!/bin/bash
2# author : Petr Simandl www.simandl.cz
315simandl# release date : 1/11/2006
47simandl# name : sedlo
5# description : dynamic side routing tables tool
6# license : GPL
7 
815simandlsl_version="0.0.4pre6"
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
19sl_ipnodef="10.0.0.0/8"
20 
21slm_unknown="Nezname parametry : "
22 
23sl_ipcmd=`which ip`
24sl_trcmd=`which tr`
25sl_wgetcmd=`which wget`
26sl_hnmcmd=`which hostname`
27sl_awkcmd=`which awk`
28sl_catcmd=`which cat`
29sl_grepcmd=`which grep`
3010simandlsl_diffcmd=`which diff`
317simandl 
32if [ -e $sl_sedlocnf ]
33 then
34 sl_nop=1
35 else
36 echo "$sl_sedlocnf not found"
37 exit 1
38fi
39 
40if [ -e $sl_rttab ]
41 then
42 sl_nop=1
43 else
44 echo "$sl_rttab not found"
45 exit 1
46fi
47 
489simandlsl_murlcfg=`cat $sl_sedlocnf | grep "^mcnf" | uniq | awk '{print $2" "$3" "$4}'`
497simandl 
50######################################################################
518simandls_maru()
527simandl{
53if [ $scm_info -gt 0 ]; then echo "Managing rules" ; fi
54 
55sl_rules=`($sl_ipcmd ru ls | $sl_grepcmd -v "from all lookup" | $sl_awkcmd '{print $3"*ru"}' ; \
56$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd "^ip" | $sl_awkcmd '{print $2"*ip"}') | sort | uniq`
57 
58sl_merged=`echo $sl_rules $sl_ips | sort | uniq`
59 
60echo $sl_merged
61 
628simandl} # s_maru
637simandl######################################################################
64s_flru()
65{
66if [ $scm_info -gt 0 ]; then echo "Flushing all rules" ; fi
67 
68sl_rules=`$sl_ipcmd ru ls | $sl_grepcmd -v "from all lookup" | $sl_grepcmd " 10." | $sl_trcmd '[:blank:]' '*'`
69 
70for sl_rule in $sl_rules
71do
72# sl_ipn=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2}'`
73 sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
74 $sl_ipcmd ru del $sl_ipgws
75done
76 
778simandl#this should make faster applying of new routing tables
78$sl_ipcmd ro flush cache
79 
807simandl} # s_flru
818simandl 
827simandl######################################################################
8310simandl# here we get each ip and we create a rule to send this ip to a
84# certain table
85# this routine can be skipped when the number of ips and ip directions
86# are still the same = old and new configs are the same
877simandls_fillrules()
88{
898simandl 
90#flush old rules before filling new ones
91#not so nice solution - it is planned to change just what's necessary
92#by s_maru
937simandls_flru
94 
9510simandlif [ $scm_info -gt 0 ]; then echo "Creating rules for ips" ; fi
967simandl 
97sl_ips=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd "^ip" | $sl_awkcmd '{print $2"*"$4"*"$5"*"$6}'`
98 
99for sl_ip in $sl_ips
100do
101 sl_ipn=`echo $sl_ip | $sl_awkcmd -F '*' '{print $1}'`
102 sl_ipgws=`echo $sl_ip | $sl_awkcmd -F '*' '{print $2,$3,$4}'`
103 sl_ok="no"
104 for sl_ipgw in $sl_ipgws
105 do
106 sl_tbl=`$sl_ipcmd ro ls ta $sl_ipgw`
107 if [ "$sl_tbl x" != " x" ] && [ "$sl_ok" = "no" ]
108 then
109 if [ $scm_info -gt 1 ]; then echo "Creating new rules to send $sl_ipn to table $sl_ipgw" ; fi
110 $sl_ipcmd ru add from $sl_ipn lookup $sl_ipgw
111 sl_ok="yes"
112 else
113 if [ "$sl_ok" = "no" ]
114 then
115 if [ $scm_info -gt 1 ]; then echo "For $sl_ipn table $sl_ipgw not used because it is empty" ; fi
116 else
117 if [ $scm_info -gt 1 ]; then echo "For $sl_ipn table $sl_ipgw not used because it has lower priority" ; fi
118 fi
119 fi
120 done
121done
122 
123$sl_ipcmd ru add from $sl_ipnodef to $sl_ipnodef lookup main
124 
1258simandl#this should make faster applying of new routing tables
126$sl_ipcmd ro flush cache
127 
1287simandl} # s_fillrules
1298simandl 
1307simandl######################################################################
13110simandl# here we look into the main routing table for path to our iGWs
132# and we fill these tables with two halves default nets that
133# point to appropriate direction
134# this routine can be skipped when the routing table is the same
1357simandls_filltables()
136{
13710simandlif [ $scm_info -gt 0 ]; then echo "Checking main routing table" ; fi
138 
1397simandlif [ $scm_info -gt 0 ]; then echo "Filling tables" ; fi
140 
1419simandlsl_igws=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd -E "^igw|^myigw" | $sl_awkcmd '{print $3"*"$2"*"$1}'`
1427simandl 
143for sl_igw in $sl_igws
144 do
145 sl_igwn=`echo $sl_igw | $sl_awkcmd -F '*' '{print $1}'`
146 sl_igwip=`echo $sl_igw | $sl_awkcmd -F '*' '{print $2}'`
1479simandl sl_igwtype=`echo $sl_igw | $sl_awkcmd -F '*' '{print $3}'`
14815simandl 
14914simandl#oprava falesneho routovani na lokalni iface - pokud jsme lokalni igw tak se nema najit ip
150#protoze cesta dal neni - jsme totiz uz na lokalnim iface
15115simandl#head je tam proto ze se pro prespolni(a bgp) muze objevit vice rout s ruznou metrikou tak vezmem jen prvni (head)
152#s nejmensi metrikou (sort)
153 sl_igwgt=`$sl_ipcmd ro ls | $sl_grepcmd -v "proto kernel" | $sl_grepcmd "^$sl_igwip " | sort | $sl_awkcmd '{print $3}' | head -n 1`
1547simandl 
1559simandl # equal cost multipath detection - just first IP is taken as way to igw
1567simandl if [ "$sl_igwgt x" = "zebra x" ]
157 then
158 sl_igwgt=`$sl_ipcmd ro ls | $sl_grepcmd -A 1 "^$sl_igwip " | $sl_grepcmd "nexthop" | $sl_awkcmd '{print $3}'`
159 fi
160 
1619simandl #if myigw then fill table for local gateway with single ip from config
162 if [ "$sl_igwtype x" = "myigw x" ]
163 then
164 sl_igwgt=$sl_igwip
165 fi
16611simandl #testing if the igw has not a route in global routing table
1677simandl if [ "$sl_igwgt x" = " x" ]
168 then
16911simandl if [ $scm_info -gt 1 ]; then echo "Route not found for igw $sl_igwn" ; fi
170 sl_myigw=`cat $sl_sedlocnf | $sl_grepcmd "^myigw" | $sl_grepcmd $sl_igwn | $sl_awkcmd '{print $3}'`
171 #testing if the igw without route is in local config
172 #if not we go to flush its table and set flag to redo rules
173 if [ "$sl_myigw x" = " x" ]
174 then
175 #getting num of routes of igw
17613simandl sl_igwnr=`$sl_ipcmd ro ls ta all | $sl_grepcmd -c "table ${sl_igwn} "`
17711simandl if [ "$sl_igwnr x" = "0 x" ]
178 then
17912simandl if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn is already empty - no action taken" ; fi
18011simandl else
18112simandl if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn will be flushed and rules rearranged" ; fi
18211simandl $sl_ipcmd ro fl ta $sl_igwn
183 #because this igw dissapeared we set a flag for rules recreation
184 sl_diffigw=1
185 fi
186 else
18713simandl if [ $scm_info -gt 1 ]; then echo "Igw $sl_igwn found in local config - leaving table as is" ; fi
18811simandl fi
1897simandl else
190 sl_tbl=`$sl_ipcmd ro ls ta $sl_igwn`
19112simandl #if the table is empty we fill it and we set flag for rules recreation
192 if [ "$sl_tbl x" = " x" ]
1937simandl then
19412simandl sl_diffigw=1
195 $sl_ipcmd ro add 0.0.0.0/1 via $sl_igwgt ta $sl_igwn
196 $sl_ipcmd ro add 128.0.0.0/1 via $sl_igwgt ta $sl_igwn
197 if [ "$sl_igwtype x" = "myigw x" ]
198 then
199 if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn filled with default myigw $sl_igwgt" ; fi
200 else
201 if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn filled with default gw $sl_igwgt" ; fi
202 fi
203 #the table is not empty so we check if routes are the same
2049simandl else
20512simandl #picking default gateway from the table
206 sl_igwogt=`$sl_ipcmd ro ls ta $sl_igwn | $sl_awkcmd '{print $3}' | uniq`
207 #checking if the old default is same as the new one
208 if [ "$sl_igwogt x" = "$sl_igwgt x" ]
209 then
210 if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn will not be changed and default is $sl_igwgt" ; fi
211 else
212 #the new default is different so we will flush the table, fill new default
21315simandl if [ $scm_info -gt 1 ]; then echo "Table $sl_igwn will be rewritten to default $sl_igwgt" ; fi
21412simandl #flushing old default route in the table
215 $sl_ipcmd ro fl ta $sl_igwn
216 #filling new default
217 $sl_ipcmd ro add 0.0.0.0/1 via $sl_igwgt ta $sl_igwn
218 $sl_ipcmd ro add 128.0.0.0/1 via $sl_igwgt ta $sl_igwn
219 fi
2209simandl fi
2217simandl fi
222 done
223 
224} # s_filltables
2258simandl 
2267simandl######################################################################
22710simandl# filling rttab with tables from config
228# only new tables are created with a new uniq number that is not important because
229# usually we handle tables just by their names
230# this routine acts only when a new iGW appears - only adding a table is supported
231# no deleting is implemented because it seems to be not necessary to delete an old table
232# because there is space enough and after reboot table will not be created
2337simandls_mktables()
234{
23510simandlif [ $scm_info -gt 0 ]; then echo "Checking tables" ; fi
236 
2379simandlsl_igws=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd -E "^igw|^myigw" | $sl_awkcmd '{print $3}'`
2387simandlfor sl_igw in $sl_igws
239 do
240 sl_igwrttb=`$sl_catcmd $sl_rttab | $sl_awkcmd '{print $2}' | $sl_grepcmd $sl_igw `
241 if [ "$sl_igwrttb x" = " x" ]
242 then
243 if [ $scm_info -gt 1 ]; then echo "Creating table for $sl_igw" ; fi
244 sl_cnt="$sl_rtnmax"
245 sl_ok="no"
246 until [ "$sl_cnt" -eq "$sl_rtnmin" ] || [ "$sl_ok" = "yes" ]
247 do
248 #space is used to recognized two and three digit numbers
249 sl_igwrttb=`cat $sl_rttab | awk '{print $1" "}' | grep "$sl_cnt " `
250 if [ "$sl_igwrttb x" = " x" ]
251 then
252 sl_ok="yes"
253 echo "$sl_cnt $sl_igw" >> $sl_rttab
254 fi
255 sl_cnt=$(($sl_cnt - 1 ))
25611simandl done
257 # a new table was created so we should set a flag for rules creation
258 sl_difftbl=1
2597simandl else
260 if [ $scm_info -gt 1 ]; then echo "Table found for $sl_igw no action taken" ; fi
261 fi
2629simandl done
2637simandl} # s_mktables
2648simandl 
2657simandl######################################################################
266s_getcfg()
267{
268if [ $scm_info -gt 0 ]; then echo "Getting config" ; fi
269if [ $scm_info -gt 1 ]; then echo "Using main config $sl_murlcfg" ; fi
270if [ $scm_info -gt 1 ]; then echo "Using local config $sl_sedlocnf" ; fi
271 
27210simandlrm -f "$sl_sedlocache/$sl_nmcnf.main.tmp"
2737simandl 
27410simandl$sl_wgetcmd -q -t 3 $sl_murlcfg -O "$sl_sedlocache/$sl_nmcnf.main.tmp"
275 
2767simandlif [ -s $sl_sedlocache/$sl_nmcnf.main.tmp ]
277 then
278 date > $sl_sedlocache/last_getcnf.txt
279 cp $sl_sedlocache/$sl_nmcnf.main.tmp $sl_sedlocache/$sl_nmcnf.main
28010simandl if [ $scm_info -gt 1 ]; then echo "Main config downloaded and accepted" ; fi
2817simandl else
2828simandl if [ $scm_info -gt 1 ]; then echo "Main config not downloaded - cached config will be used" ; fi
283 echo -n "Main config not downloaded " > $sl_sedlocache/last_getcnf.txt
2847simandl date >> $sl_sedlocache/last_getcnf.txt
285fi
286 
28710simandl# before generating a new cached config we store the old one for
288# comparison with the new one
289rm -f "$sl_sedlocache/$sl_nmcnf.old"
290if [ -s $sl_sedlocache/$sl_nmcnf ]
291 then
292 cp $sl_sedlocache/$sl_nmcnf $sl_sedlocache/$sl_nmcnf.old
293 else
294 touch $sl_sedlocache/$sl_nmcnf.old
295fi
296 
2977simandl# preparing cached config from local and main
298# the local config should be processed as the second to have
299# higher priority for rules from local config
300echo "# generated file" > $sl_sedlocache/$sl_nmcnf
301for sl_file in `ls $sl_sedlocache/$sl_nmcnf.main ; ls $sl_sedlocnf`
302do
303cat $sl_file | grep "^mcnf" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2}' >> $sl_sedlocache/$sl_nmcnf
304cat $sl_file | grep "^igw" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3}' >> $sl_sedlocache/$sl_nmcnf
305cat $sl_file | grep "^ip" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}' >> $sl_sedlocache/$sl_nmcnf
306done
3078simandl 
308#local gateways taken from local config
309cat $sl_sedlocnf | grep "^myigw" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3}' >> $sl_sedlocache/$sl_nmcnf
310 
3117simandl#cat $sl_sedlocache/$sl_nmcnf | sort | uniq > $sl_sedlocache/$sl_nmcnf.uniq
312#mv $sl_sedlocache/$sl_nmcnf.uniq $sl_sedlocache/$sl_nmcnf
313 
31410simandlsl_diffcfg=`diff $sl_sedlocache/$sl_nmcnf $sl_sedlocache/$sl_nmcnf.old | grep -c .`
315if [ $sl_diffcfg -gt 0 ]
316 then
317 if [ $scm_info -gt 0 ]; then echo "New config is different than the old one" ; fi
318 else
319 if [ $scm_info -gt 0 ]; then echo "New config is the same as the old one" ; fi
320fi
321 
32211simandl# showing number of rules in config and system
32310simandlsl_numru=`ip ru ls | grep -c lookup`
324sl_numip=`grep -c ^ip $sl_sedlocache/$sl_nmcnf`
325sl_numru=$(($sl_numru - 3 ))
326if [ $sl_numip -gt $sl_numru ]
327 then
328 if [ $scm_info -gt 0 ]; then echo "We have less rules ($sl_numru) than new config has ips ($sl_numip)" ; fi
32911simandl# sl_diffcfg="1"
33010simandl else
331 if [ $scm_info -gt 0 ]; then echo "We have $sl_numru rules and $sl_numip ips" ; fi
332fi
333 
3347simandl}
3358simandl 
3367simandl######################################################################
337s_version()
338{
339 echo sedlo $sl_version
340} # s_version
3418simandl 
3427simandl######################################################################
343s_report()
344{
3459simandl echo Content-type: text/html
346 echo
347 echo "Sedlo na routeru `hostname`"
348 echo "<pre>"
3497simandl echo "##### SEDLO #####"
350 echo "date : `date`"
351 echo "version : $sl_version"
352 echo "local_config : $sl_sedlocnf"
3539simandl echo "main_config : <a href=\"$sl_murlcfg\">$sl_murlcfg</a>"
3547simandl echo "last update : `cat $sl_sedlocache/last_getcnf.txt`"
355 echo "##### TABLES #####"
356 cat $sl_rttab
3579simandl echo ; echo "##### DEFAULT ROUTES IN TABLES #####"
358 $sl_ipcmd ro ls ta all | $sl_grepcmd table | $sl_grepcmd -v local | $sl_trcmd " " "\t"
359 echo ; echo "##### RULES FOR IPS #####"
360 $sl_ipcmd ru ls | $sl_trcmd " " "\t"
361 echo "</pre>"
3627simandl} # s_report
3638simandl 
3649simandl 
365 
3667simandl######################################################################
367s_help()
368{
369 echo Pouziti: sedlo [param]
370 echo param:
371 echo -V vypise verzi
372 echo -help vypise napovedu
373 echo -v malo upovidany
374 echo -vv hodne upovidany
375 echo -nogetcfg zajisti ze se nedude znovu nacitat konfigurace a pouzije se predchozi z cache
376 echo -report vypise prehled pravidel a tabulek
377 echo -flru odstrani vsechny pravidla
37811simandl echo -force bezpodminecne znovu obnovi vsechny pravidla
3797simandl} # s_help
3808simandl 
3817simandl######################################################################
382######################################################################
383 
384sl_unknown=""
385scm_nogetcfg=0
386scm_flru=0
387scm_info=0
38811simandlscm_force=0
389sl_diffigw=0
390sl_difftbl=0
3917simandl 
392# parsing input parameters
393while [ "a$1" != "a" ]
394do
395 case $1 in
396 -V)
397 s_version
398 exit 0
399 ;;
400 -h)
401 s_help
402 exit 0
403 ;;
404 -report)
405 s_report
406 exit 0
407 ;;
408 -flru)
409 scm_flru=1
410 shift
411 ;;
41211simandl -force)
413 scm_force=1
414 shift
415 ;;
4167simandl -help)
417 s_help
418 exit 0
419 ;;
420 -nogetcfg)
421 scm_nogetcfg=1
422 shift
423 ;;
424 -v)
425 scm_info=1
426 shift
427 ;;
428 -vv)
429 scm_info=2
430 shift
431 ;;
432 *)
433 sl_unknown="$sl_unknown$1 "
434 shift
435 esac
436done
437 
438# printing the list of bad parameters (if there are some)
439if [ "a$sl_unknown" != "a" ]
440then
441 echo "$slm_unknown $sl_unknown"
442 s_help
443 exit 0
444fi
445 
446if [ $scm_flru -eq 1 ]
447then
448 s_flru
449 exit 0
450fi
451 
452if [ $scm_nogetcfg -eq 0 ]
453then
454 s_getcfg
455fi
456 
457s_mktables
458s_filltables
45915simandl#toto je pro ladici ucely
46011simandl#echo $sl_difftbl
461#echo $sl_diffcfg
462#echo $sl_diffigw
463#echo $scm_force
46413simandl#exit 0
46515simandl 
46611simandl#flushing and filling rules is done only when
467#new table is created
468#config is changed
469#some igw dissapears or appears
470#-force command line parameter was used
471if [ $sl_difftbl -gt 0 ] || [ $sl_diffcfg -gt 0 ] || [ $sl_diffigw -gt 0 ] || [ $scm_force -gt 0 ]
47210simandlthen
473 s_fillrules
474fi
475 
4767simandlexit 0

Powered by WebSVN 2.2.1