6801e064cf
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@15864 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
352 lines
9.7 KiB
Bash
Executable File
352 lines
9.7 KiB
Bash
Executable File
#!/bin/sh
|
|
# IBM(c) 2011EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
|
|
#-------------------------------------------------------------------------------
|
|
#=head1 routeop
|
|
#=head2 routeop is called by makeroutes command and setuproutes postscript to
|
|
# setup a route on a node.
|
|
# The syntax is:
|
|
# routeop add/delete net mask gateway ifname
|
|
#=cut
|
|
#-------------------------------------------------------------------------------
|
|
|
|
op=$1
|
|
|
|
net=$2
|
|
mask=$3
|
|
gw=$4
|
|
if [ -n "$5" ]; then
|
|
ifname=$5
|
|
fi
|
|
|
|
|
|
route_exists()
|
|
{
|
|
net=$1
|
|
mask=$2
|
|
gw=$3
|
|
ret=0
|
|
|
|
if [ -n "$4" ]; then
|
|
ifname=$4
|
|
fi
|
|
|
|
os_type=$(uname -s)
|
|
|
|
# ipv6
|
|
if echo $net | grep : 2>&1 1>/dev/null
|
|
then
|
|
result=`ip -6 route show $net/$mask`
|
|
if [ $? -ne 0 ] || [ -z "$result" ]
|
|
then
|
|
ret=0
|
|
else
|
|
ret=1
|
|
fi
|
|
else
|
|
result=`netstat -nr|grep $net`;
|
|
if [ $? -eq 0 ] && [ -n "$result" ]; then
|
|
for x in `echo "$result"|tr -s " " ","`
|
|
do
|
|
if [ "$os_type" = "Linux" ]; then
|
|
net1=`echo $x|cut -d',' -f1`
|
|
gw1=`echo $x|cut -d',' -f2`
|
|
mask1=`echo $x|cut -d',' -f3`
|
|
if [ "$net" = "$net1" ] && [ "$mask" = "$mask1" ] && [ "$gw" = "$gw1" ]; then
|
|
ret=1
|
|
break
|
|
fi
|
|
else
|
|
tmp1=`echo $x|cut -d',' -f1`
|
|
gw1=`echo $x|cut -d',' -f2`
|
|
|
|
n1=`echo $net |cut -d'.' -f1`
|
|
n2=`echo $net |cut -d'.' -f2`
|
|
n3=`echo $net |cut -d'.' -f3`
|
|
n4=`echo $net |cut -d'.' -f4`
|
|
|
|
netnum="$(( ($n1 << 24) + ($n2 << 16) + ($n3 << 8) + $n4 ))"
|
|
bits=32
|
|
while [ `expr $netnum % 2` -eq 0 ]
|
|
do
|
|
bits="$(( $bits - 1 ))"
|
|
netnum="$(( $netnum >> 1 ))"
|
|
done
|
|
|
|
tmp2="$net/$bits";
|
|
#echo "$tmp2=$tmp2"
|
|
if [ "$tmp1" = "$tmp2" ] && [ "$gw" = "$gw1" ]; then
|
|
ret=1
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
|
|
echo $ret
|
|
}
|
|
|
|
add_persistent_route()
|
|
{
|
|
net=$1;
|
|
mask=$2;
|
|
gw=$3;
|
|
if [ -n "$4" ]; then
|
|
ifname=$4
|
|
fi
|
|
|
|
xcat_config_start="# xCAT_CONFIG_START";
|
|
xcat_config_end="# xCAT_CONFIG_END";
|
|
|
|
if [ "$(uname -s)" = "Linux" ]; then
|
|
#determine the os name
|
|
OS_name="something"
|
|
if [ -f /etc/redhat-release ]
|
|
then
|
|
OS_name="redhat" #it can be RedHatFerdora or CentOS
|
|
elif [ -f /etc/SuSE-release ]
|
|
then
|
|
OS_name="sles"
|
|
fi
|
|
|
|
case $OS_name in
|
|
sles)
|
|
#echo "sles"
|
|
# ipv6 net
|
|
filename="/etc/sysconfig/network/routes";
|
|
if echo $net | grep : 2>&1 1>/dev/null
|
|
then
|
|
route="$net/$mask $gw - -"
|
|
route1="$net\/$mask $gw - -";
|
|
else
|
|
route="$net $gw $mask $ifname";
|
|
route1="$net $gw $mask $ifname";
|
|
fi
|
|
if [ -f $filename ]; then
|
|
grep "$route" $filename 2>&1 1>/dev/null
|
|
if [ $? -ne 0 ]; then #route does not exist
|
|
grep "$xcat_config_start" $filename 2>&1 1>/dev/null
|
|
if [ $? -ne 0 ]; then #no xCAT section
|
|
echo $xcat_config_start >> $filename
|
|
echo $route >> $filename
|
|
echo $xcat_config_end >> $filename
|
|
else
|
|
sed -i -e s/"$xcat_config_end"/"$route1\n$xcat_config_end"/g $filename
|
|
fi
|
|
echo "Persistent route \"$route\" added in $filename."
|
|
else
|
|
echo "Persistent route \"$route\" already exists in $filename."
|
|
fi
|
|
else
|
|
#echo "got here"
|
|
echo "$xcat_config_start" > $filename
|
|
echo "$route" >> $filename
|
|
echo "$xcat_config_end" >> $filename
|
|
echo "Route \"$route\" added in $filename."
|
|
fi
|
|
|
|
;;
|
|
ubuntu*)
|
|
echo "Adding persistent route on Ubuntu is not supported yet."
|
|
;;
|
|
redhat)
|
|
#echo "rh/fedora/centos"
|
|
# ipv6 net
|
|
if echo $net | grep : 2>&1 1>/dev/null
|
|
then
|
|
filename="/etc/sysconfig/static-routes-ipv6";
|
|
route="$ifname $net/$mask $gw";
|
|
# $net/mask does not work with sed cmd
|
|
route1="$ifname $net\/$mask $gw";
|
|
else
|
|
filename="/etc/sysconfig/static-routes";
|
|
route="any net $net netmask $mask gw $gw $ifname";
|
|
route1="any net $net netmask $mask gw $gw $ifname";
|
|
fi
|
|
if [ -f $filename ]; then
|
|
grep "$route" $filename 2>&1 1>/dev/null
|
|
if [ $? -ne 0 ]; then #route does not exist
|
|
grep "$xcat_config_start" $filename 2>&1 1>/dev/null
|
|
if [ $? -ne 0 ]; then #no xCAT section
|
|
echo $xcat_config_start >> $filename
|
|
echo $route >> $filename
|
|
echo $xcat_config_end >> $filename
|
|
else
|
|
sed -i -e s/"$xcat_config_end"/"$route1\n$xcat_config_end"/g $filename
|
|
fi
|
|
echo "Persistent route \"$route\" added in $filename."
|
|
else
|
|
echo "Persistent route \"$route\" already exists in $filename."
|
|
fi
|
|
else
|
|
#echo "got here"
|
|
echo "$xcat_config_start" > $filename
|
|
echo "$route" >> $filename
|
|
echo "$xcat_config_end" >> $filename
|
|
echo "Persistent route \"$route\" added in $filename."
|
|
fi
|
|
;;
|
|
esac
|
|
else #AIX
|
|
echo "Adding persistent route on AIX is not supported yet."
|
|
fi
|
|
}
|
|
|
|
rm_persistent_route()
|
|
{
|
|
net=$1;
|
|
mask=$2;
|
|
gw=$3;
|
|
if [ -n "$4" ]; then
|
|
ifname=$4
|
|
fi
|
|
|
|
if [ "$(uname -s)" = "Linux" ]; then
|
|
#determine the os name
|
|
OS_name="something"
|
|
if [ -f /etc/redhat-release ]
|
|
then
|
|
OS_name="redhat" #it can be RedHatFerdora or CentOS
|
|
elif [ -f /etc/SuSE-release ]
|
|
then
|
|
OS_name="sles"
|
|
fi
|
|
|
|
case $OS_name in
|
|
sles)
|
|
#echo "sles"
|
|
filename="/etc/sysconfig/network/routes";
|
|
# ipv6 net
|
|
if echo $net | grep : 2>&1 1>/dev/null
|
|
then
|
|
route="$net/$mask $gw - -";
|
|
route1="$net\/$mask $gw - -";
|
|
else
|
|
route="$net $gw $mask";
|
|
route1="$net $gw $mask";
|
|
fi
|
|
if [ -f $filename ]; then
|
|
grep "$route" $filename 2>&1 1>/dev/null
|
|
if [ $? -ne 0 ]; then # Does not exist in file
|
|
echo "Persistent route \"$route\" does not exist in $filename."
|
|
else
|
|
sed -i -e s/"$route1"//g $filename
|
|
echo "Persistent route \"$route\" removed from $filename."
|
|
fi
|
|
else
|
|
echo "Persistent route file $filename does not exist."
|
|
fi
|
|
;;
|
|
ubuntu*)
|
|
echo "Removing persistent route on Ubuntu is not supported yet."
|
|
;;
|
|
redhat)
|
|
#echo "rh/fedora/centos"
|
|
#ipv6
|
|
if echo $net | grep : 2>&1 1>/dev/null
|
|
then
|
|
filename="/etc/sysconfig/static-routes-ipv6";
|
|
# $net/$mask does not work with sed
|
|
route="$ifname $net\/$mask $gw"
|
|
route1="$ifname $net/$mask $gw"
|
|
else
|
|
filename="/etc/sysconfig/static-routes";
|
|
route="any net $net netmask $mask gw $gw $ifname";
|
|
route1="any net $net netmask $mask gw $gw $ifname";
|
|
fi
|
|
if [ -f $filename ]; then
|
|
grep "$route" $filename 2>&1 1>/dev/null
|
|
if [ $? -ne 0 ]; then # Does not exist in file
|
|
echo "Persistent route \"$route1\" does not exist in $filename."
|
|
else
|
|
sed -i -e s/"$route"//g $filename
|
|
echo "Persistent route \"$route1\" removed from $filename."
|
|
fi
|
|
else
|
|
echo "Persistent route file $filename does not exist."
|
|
fi
|
|
;;
|
|
esac
|
|
else #AIX
|
|
echo "Removing persistent route on AIX is not supported yet."
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
if [ "$op" = "add" ]; then
|
|
result=$(route_exists $net $mask $gw)
|
|
if [ "$result" = "0" ]; then
|
|
#ipv6
|
|
if echo $net | grep : 2>&1 1>/dev/null
|
|
then
|
|
if [ "$(uname -s)" = "Linux" ]; then
|
|
cmd="ip -6 route add $net/$mask via $gw"
|
|
else
|
|
# AIX TODO
|
|
cmd="ip -6 route add $net/$mask via $gw"
|
|
fi
|
|
else
|
|
if [ "$(uname -s)" = "Linux" ]; then
|
|
cmd="route add -net $net netmask $mask gw $gw"
|
|
else
|
|
cmd="route add -net $net -netmask $mask $gw"
|
|
fi
|
|
fi
|
|
echo "Adding temporary route: $cmd"
|
|
result=`$cmd 2>&1`
|
|
code=$?
|
|
if [ $code -ne 0 ]; then
|
|
logger -t xCAT -p local4.err "$cmd\nerror code=$code, result=$result."
|
|
echo " error code=$code, result=$result."
|
|
#exit 1;
|
|
fi
|
|
else
|
|
#ipv6
|
|
if echo $net | grep : 2>&1 1>/dev/null
|
|
then
|
|
echo "The temporary route ($net/$mask $gw) already exists."
|
|
else
|
|
echo "The temporary route ($net $mask $gw) already exists."
|
|
fi
|
|
fi
|
|
|
|
#add persistent route
|
|
add_persistent_route $net $mask $gw $ifname
|
|
elif [ "$op" = "delete" ]; then
|
|
result=$(route_exists $net $mask $gw)
|
|
if [ "$result" = "1" ]; then
|
|
# ipv6
|
|
if echo $net | grep : 2>&1 1>/dev/null
|
|
then
|
|
if [ "$(uname -s)" = "Linux" ]; then
|
|
cmd="ip -6 route delete $net/$mask via $gw"
|
|
else
|
|
# AIX TODO
|
|
cmd="ip -6 route delete $net/$mask via $gw"
|
|
fi
|
|
else
|
|
if [ "$(uname -s)" = "Linux" ]; then
|
|
cmd="route delete -net $net netmask $mask gw $gw"
|
|
else
|
|
cmd="route delete -net $net -netmask $mask $gw"
|
|
fi
|
|
fi
|
|
|
|
echo "Removing temporary route: $cmd"
|
|
result=`$cmd 2>&1`
|
|
code=$?
|
|
if [ $code -ne 0 ]; then
|
|
logger -t xCAT -p local4.err "$cmd\nerror code=$code, result=$result."
|
|
echo " error code=$code, result=$result."
|
|
fi
|
|
else
|
|
echo "The temporary route ($net $mask $gw) does not exist."
|
|
fi
|
|
|
|
#remove the persistent route
|
|
rm_persistent_route $net $mask $gw $ifname
|
|
fi
|
|
exit 0
|