sedlo |
Subversion Repositories: |
Compare with Previous - Blame - Download
#!/bin/bash
# author : Petr Simandl www.simandl.cz
# release date : 07/09/2004
# name : sedlo
# description : dynamic side routing tables tool
# license : GPL
sl_version="0.0.3pre4"
PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
sl_nmcnf="sedlo.conf"
sl_sedlocnf="/etc/$sl_nmcnf"
sl_sedlocache="/var/cache/sedlo"
sl_rttab="/etc/iproute2/rt_tables"
sl_rtnmin=110
sl_rtnmax=200
sl_ipnodef="10.0.0.0/8"
slm_unknown="Nezname parametry : "
sl_ipcmd=`which ip`
sl_trcmd=`which tr`
sl_wgetcmd=`which wget`
sl_hnmcmd=`which hostname`
sl_awkcmd=`which awk`
sl_catcmd=`which cat`
sl_grepcmd=`which grep`
if [ -e $sl_sedlocnf ]
then
sl_nop=1
else
echo "$sl_sedlocnf not found"
exit 1
fi
if [ -e $sl_rttab ]
then
sl_nop=1
else
echo "$sl_rttab not found"
exit 1
fi
sl_murlcfg=`cat $sl_sedlocnf | grep "^mcnf" | uniq | awk '{print $2}'`
sl_local_conf_myigw=`awk '/^myigw/ { print $2 "*" $3 "*" $4 }' < $sl_sedlocnf`
######################################################################
s_flqq()
{
if [ $scm_info -gt 0 ]; then echo "Managing rules" ; fi
sl_rules=`($sl_ipcmd ru ls | $sl_grepcmd -v "from all lookup" | $sl_awkcmd '{print $3"*ru"}' ; \
$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd "^ip" | $sl_awkcmd '{print $2"*ip"}') | sort | uniq`
sl_merged=`echo $sl_rules $sl_ips | sort | uniq`
echo $sl_merged
} # s_flru
######################################################################
s_flru()
{
if [ $scm_info -gt 0 ]; then echo "Flushing all rules" ; fi
sl_rules=`$sl_ipcmd ru ls | $sl_grepcmd -v "from all lookup" | $sl_grepcmd " 10." | $sl_trcmd '[:blank:]' '*'`
for sl_rule in $sl_rules
do
# sl_ipn=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2}'`
sl_ipgws=`echo $sl_rule | $sl_awkcmd -F '*' '{print $2,$3,$4,$5,$6,$7}'`
$sl_ipcmd ru del $sl_ipgws
done
} # s_flru
######################################################################
s_fillrules()
{
s_flru
if [ $scm_info -gt 0 ]; then echo "Creating rules" ; fi
sl_ips=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd "^ip" | $sl_awkcmd '{print $2"*"$4"*"$5"*"$6}'`
this_router="THIS_ROUTER*$sl_local_conf_myigw"
# $this_router format: THIS_ROUTER*igw1name*igw2name*igw3name
for sl_ip in $this_router $sl_ips
do
sl_ipn=`echo $sl_ip | $sl_awkcmd -F '*' '{print $1}'`
sl_ipgws=`echo $sl_ip | $sl_awkcmd -F '*' '{print $2,$3,$4}'`
sl_ok="no"
for sl_ipgw in $sl_ipgws
do
sl_tbl=`$sl_ipcmd ro ls ta $sl_ipgw`
if [ "$sl_tbl x" != " x" ] && [ "$sl_ok" = "no" ]
then
if [ $scm_info -gt 1 ]; then echo "Creating new rules to send $sl_ipn to table $sl_ipgw" ; fi
case "$sl_ipn" in
"THIS_ROUTER")
$sl_ipcmd ru add iif lo table $sl_ipgw ;;
*)
$sl_ipcmd ru add from $sl_ipn table $sl_ipgw ;;
esac
sl_ok="yes"
else
if [ "$sl_ok" = "no" ]
then
if [ $scm_info -gt 1 ]; then echo "For $sl_ipn table $sl_ipgw not used because it is empty" ; fi
else
if [ $scm_info -gt 1 ]; then echo "For $sl_ipn table $sl_ipgw not used because it has lower priority" ; fi
fi
fi
done
done
$sl_ipcmd ru add from $sl_ipnodef to $sl_ipnodef lookup main
} # s_fillrules
######################################################################
s_filltables()
{
if [ $scm_info -gt 0 ]; then echo "Filling tables" ; fi
sl_igws=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd "^igw" | $sl_awkcmd '{print $3"*"$2}'`
for sl_igw in $sl_igws
do
sl_igwn=`echo $sl_igw | $sl_awkcmd -F '*' '{print $1}'`
sl_igwip=`echo $sl_igw | $sl_awkcmd -F '*' '{print $2}'`
sl_igwgt=`$sl_ipcmd ro ls | $sl_grepcmd "^$sl_igwip " | $sl_awkcmd '{print $3}'`
if [ "$sl_igwgt x" = " x" ]
then
if [ $scm_info -gt 1 ]; then echo "Route not found for igw $sl_igwn - leaving table as is" ; fi
else
sl_tbl=`$sl_ipcmd ro ls ta $sl_igwn`
if [ "$sl_tbl x" != " x" ]
then
$sl_ipcmd ro fl ta $sl_igwn
fi
$sl_ipcmd ro add 0.0.0.0/1 via $sl_igwgt ta $sl_igwn
$sl_ipcmd ro add 128.0.0.0/1 via $sl_igwgt ta $sl_igwn
if [ $scm_info -gt 1 ]; then echo "Table filled for igw $sl_igwn" ; fi
fi
done
} # s_filltables
######################################################################
s_mktables()
{
if [ $scm_info -gt 0 ]; then echo "Creating tables " ; fi
sl_igws=`$sl_catcmd $sl_sedlocache/$sl_nmcnf | $sl_grepcmd "^igw" | $sl_awkcmd '{print $3}'`
for sl_igw in $sl_igws
do
sl_igwrttb=`$sl_catcmd $sl_rttab | $sl_awkcmd '{print $2}' | $sl_grepcmd $sl_igw `
if [ "$sl_igwrttb x" = " x" ]
then
if [ $scm_info -gt 1 ]; then echo "Creating table for $sl_igw" ; fi
sl_cnt="$sl_rtnmax"
sl_ok="no"
until [ "$sl_cnt" -eq "$sl_rtnmin" ] || [ "$sl_ok" = "yes" ]
do
#space is used to recognized two and three digit numbers
sl_igwrttb=`cat $sl_rttab | awk '{print $1" "}' | grep "$sl_cnt " `
if [ "$sl_igwrttb x" = " x" ]
then
sl_ok="yes"
echo "$sl_cnt $sl_igw" >> $sl_rttab
fi
sl_cnt=$(($sl_cnt - 1 ))
done
else
if [ $scm_info -gt 1 ]; then echo "Table found for $sl_igw no action taken" ; fi
fi
done
} # s_mktables
######################################################################
s_getcfg()
{
if [ $scm_info -gt 0 ]; then echo "Getting config" ; fi
if [ $scm_info -gt 1 ]; then echo "Using main config $sl_murlcfg" ; fi
if [ $scm_info -gt 1 ]; then echo "Using local config $sl_sedlocnf" ; fi
wget $sl_murlcfg -O "$sl_sedlocache/$sl_nmcnf.main.tmp" -q
if [ -s $sl_sedlocache/$sl_nmcnf.main.tmp ]
then
date > $sl_sedlocache/last_getcnf.txt
cp $sl_sedlocache/$sl_nmcnf.main.tmp $sl_sedlocache/$sl_nmcnf.main
if [ $scm_info -gt 1 ]; then echo "Main config accepted" ; fi
else
if [ $scm_info -gt 1 ]; then echo "Main config not accepted - using cached config" ; fi
echo -n "Main config not found " > $sl_sedlocache/last_getcnf.txt
date >> $sl_sedlocache/last_getcnf.txt
fi
# preparing cached config from local and main
# the local config should be processed as the second to have
# higher priority for rules from local config
echo "# generated file" > $sl_sedlocache/$sl_nmcnf
for sl_file in `ls $sl_sedlocache/$sl_nmcnf.main ; ls $sl_sedlocnf`
do
cat $sl_file | grep "^mcnf" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2}' >> $sl_sedlocache/$sl_nmcnf
cat $sl_file | grep "^igw" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3}' >> $sl_sedlocache/$sl_nmcnf
cat $sl_file | grep "^ip" | $sl_trcmd ';' '#' | awk '{print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6}' >> $sl_sedlocache/$sl_nmcnf
done
#cat $sl_sedlocache/$sl_nmcnf | sort | uniq > $sl_sedlocache/$sl_nmcnf.uniq
#mv $sl_sedlocache/$sl_nmcnf.uniq $sl_sedlocache/$sl_nmcnf
}
######################################################################
s_version()
{
echo sedlo $sl_version
} # s_version
######################################################################
s_report()
{
echo "##### SEDLO #####"
echo "date : `date`"
echo "version : $sl_version"
echo "local_config : $sl_sedlocnf"
echo "main_config : $sl_murlcfg"
echo "last update : `cat $sl_sedlocache/last_getcnf.txt`"
echo "##### TABLES #####"
cat $sl_rttab
echo "##### RULES #####"
$sl_ipcmd ru ls
} # s_report
######################################################################
s_help()
{
echo Pouziti: sedlo [param]
echo param:
echo -V vypise verzi
echo -help vypise napovedu
echo -v malo upovidany
echo -vv hodne upovidany
echo -nogetcfg zajisti ze se nedude znovu nacitat konfigurace a pouzije se predchozi z cache
echo -report vypise prehled pravidel a tabulek
echo -flru odstrani vsechny pravidla
} # s_help
######################################################################
######################################################################
sl_unknown=""
scm_nogetcfg=0
scm_flru=0
scm_info=0
# parsing input parameters
while [ "a$1" != "a" ]
do
case $1 in
-V)
s_version
exit 0
;;
-h)
s_help
exit 0
;;
-report)
s_report
exit 0
;;
-flru)
scm_flru=1
shift
;;
-help)
s_help
exit 0
;;
-nogetcfg)
scm_nogetcfg=1
shift
;;
-v)
scm_info=1
shift
;;
-vv)
scm_info=2
shift
;;
*)
sl_unknown="$sl_unknown$1 "
shift
esac
done
# printing the list of bad parameters (if there are some)
if [ "a$sl_unknown" != "a" ]
then
echo "$slm_unknown $sl_unknown"
s_help
exit 0
fi
if [ $scm_flru -eq 1 ]
then
s_flqq
exit 0
fi
if [ $scm_nogetcfg -eq 0 ]
then
s_getcfg
fi
s_mktables
s_filltables
s_fillrules
exit 0