613 lines
14 KiB
Bash
Executable File
613 lines
14 KiB
Bash
Executable File
function hashencode(){
|
|
local str_map="$1"
|
|
echo `echo $str_map | sed 's/\./xDOTx/g' | sed 's/:/xCOLONx/g' | sed 's/,/:xCOMMAx/g'`
|
|
}
|
|
|
|
function hashset(){
|
|
local str_hashname="hash${1}${2}"
|
|
local str_value=$3
|
|
str_hashname=$(hashencode $str_hashname)
|
|
eval "${str_hashname}='${str_value}'"
|
|
}
|
|
|
|
function hashget(){
|
|
local str_hashname="hash${1}${2}"
|
|
str_hashname=$(hashencode $str_hashname)
|
|
eval echo "\$${str_hashname}"
|
|
}
|
|
|
|
function debianpreconf(){
|
|
#create the config sub dir
|
|
if [ ! -d "/etc/network/interfaces.d" ];then
|
|
mkdir -p "/etc/network/interfaces.d"
|
|
fi
|
|
#search xcat flag
|
|
grep '#XCAT_CONFIG' /etc/network/interfaces
|
|
if [ $? -eq 0 ];then
|
|
return
|
|
fi
|
|
|
|
#back up the old interface configure
|
|
if [ ! -e "/etc/network/interfaces.bak" ];then
|
|
mv /etc/network/interfaces /etc/network/interfaces.bak
|
|
fi
|
|
|
|
#create the new config file
|
|
echo "#XCAT_CONFIG" > /etc/network/interfaces
|
|
echo "source /etc/network/interfaces.d/*" >> /etc/network/interfaces
|
|
|
|
local str_conf_file=''
|
|
|
|
#read the backfile
|
|
cat /etc/network/interfaces.bak | while read str_line
|
|
do
|
|
if [ ! "$str_line" ];then
|
|
continue
|
|
fi
|
|
local str_first_char=${str_line:0:1}
|
|
if [ $str_first_char = '#' ];then
|
|
continue
|
|
fi
|
|
|
|
local str_conf_type=`echo $str_line | cut -d" " -f1`
|
|
if [ $str_conf_type = 'auto' -o $str_conf_type = 'allow-hotplug' ];then
|
|
str_line=${str_line#$str_conf_type}
|
|
for str_nic_name in $str_line; do
|
|
echo "$str_conf_type $str_nic_name" > "/etc/network/interfaces.d/$str_nic_name"
|
|
done
|
|
elif [ $str_conf_type = 'iface' -o $str_conf_type = 'mapping' ];then
|
|
#find out the nic name, should think about the eth0:1
|
|
str_nic_name=`echo $str_line | cut -d" " -f 2 | cut -d":" -f 1`
|
|
str_conf_file="/etc/network/interfaces.d/$str_nic_name"
|
|
if [ ! -e $str_conf_file ];then
|
|
echo "auto $str_nic_name" > $str_conf_file
|
|
fi
|
|
|
|
#write lines into the conffile
|
|
echo $str_line >> $str_conf_file
|
|
else
|
|
# Write the remaining lines of the nic conf info to conffile
|
|
# It is possible that there are some lines at the beginning of /etc/network/interfaces,
|
|
# that we could not recognize, ignore these lines. The indication is that the str_conf_file is empty
|
|
if [ ! -z "$str_conf_file" ]; then
|
|
echo $str_line >> $str_conf_file
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
#tranfer the netmask to prefix for ipv4
|
|
function v4mask2prefix(){
|
|
local num_bits=0
|
|
local old_ifs=$IFS
|
|
IFS=$'.'
|
|
local array_num_temp=($1)
|
|
IFS=$old_ifs
|
|
for num_dec in ${array_num_temp[@]}
|
|
do
|
|
case $num_dec in
|
|
255) let num_bits+=8;;
|
|
254) let num_bits+=7;;
|
|
252) let num_bits+=6;;
|
|
248) let num_bits+=5;;
|
|
240) let num_bits+=4;;
|
|
224) let num_bits+=3;;
|
|
192) let num_bits+=2;;
|
|
128) let num_bits+=1;;
|
|
0) ;;
|
|
*) echo "Error: $dec is not recognised"; exit 1
|
|
esac
|
|
done
|
|
echo "$num_bits"
|
|
}
|
|
|
|
function v4prefix2mask(){
|
|
local a=$1
|
|
local b=0
|
|
local num_index=1
|
|
local str_temp=''
|
|
local str_mask=''
|
|
|
|
while [[ $num_index -le 4 ]]
|
|
do
|
|
if [ $a -ge 8 ];then
|
|
b=8
|
|
a=$((a-8))
|
|
else
|
|
b=$a
|
|
a=0
|
|
fi
|
|
case $b in
|
|
0) str_temp="0";;
|
|
1) str_temp="128";;
|
|
2) str_temp="192";;
|
|
3) str_temp="224";;
|
|
4) str_temp="240";;
|
|
5) str_temp="248";;
|
|
6) str_temp="252";;
|
|
7) str_temp="254";;
|
|
8) str_temp="255";;
|
|
esac
|
|
|
|
str_mask=$str_mask$str_temp"."
|
|
|
|
num_index=$((num_index+1))
|
|
done
|
|
|
|
str_mask=`echo $str_mask | sed 's/\.$//'`
|
|
echo "$str_mask"
|
|
}
|
|
|
|
function v4calcbcase(){
|
|
local str_mask=$2
|
|
echo $str_mask | grep '\.' > /dev/null
|
|
if [ $? -ne 0 ];then
|
|
str_mask=$(v4prefix2mask $str_mask)
|
|
fi
|
|
local str_bcast=''
|
|
local str_temp=''
|
|
local str_ifs=$IFS
|
|
IFS=$'.'
|
|
local array_ip=($1)
|
|
local array_mask=($str_mask)
|
|
IFS=$str_ifs
|
|
|
|
if [ ${#array_ip[*]} -ne 4 -o ${#array_mask[*]} -ne 4 ];then
|
|
echo "255.255.255.255"
|
|
return
|
|
fi
|
|
|
|
for index in {0..3}
|
|
do
|
|
str_temp=`echo $[ ${array_ip[$index]}|(${array_mask[$index]} ^ 255) ]`
|
|
str_bcast=$str_bcast$str_temp"."
|
|
done
|
|
|
|
str_bcast=`echo $str_bcast | sed 's/\.$//'`
|
|
echo "$str_bcast"
|
|
}
|
|
|
|
function v4calcnet(){
|
|
local str_mask=$2
|
|
echo $str_mask | grep '\.' > /dev/null
|
|
if [ $? -ne 0 ];then
|
|
str_mask=$(v4prefix2mask $str_mask)
|
|
fi
|
|
local str_net=''
|
|
local str_temp=''
|
|
local str_ifs=$IFS
|
|
IFS=$'.'
|
|
local array_ip=($1)
|
|
local array_mask=($str_mask)
|
|
IFS=$str_ifs
|
|
|
|
for index in {0..3}
|
|
do
|
|
str_temp=`echo $[ ${array_ip[$index]}&${array_mask[$index]} ]`
|
|
str_net=$str_net$str_temp"."
|
|
done
|
|
|
|
str_net=`echo $str_net | sed 's/\.$//'`
|
|
echo "$str_net"
|
|
}
|
|
|
|
function v6expand(){
|
|
local str_v6address=$1
|
|
str_v6address=${str_v6address%%/*}
|
|
echo "$str_v6address" | grep '::' > /dev/null
|
|
if [ $? -ne 0 ];then
|
|
echo "$str_v6address"
|
|
return
|
|
fi
|
|
|
|
local num_colon=`echo "$str_v6address" | grep -o ':' | wc -l`
|
|
local num_omit=$((7-num_colon))
|
|
local str_temp=0
|
|
local num_index=1
|
|
while [ $num_index -le $num_omit ];do
|
|
str_temp=$str_temp":0"
|
|
num_index=$((num_index+1))
|
|
done
|
|
|
|
str_v6address=`echo $str_v6address | sed "s/::/:$str_temp:/" | sed 's/^:/0:/' | sed 's/:$/:0/'`
|
|
echo "$str_v6address"
|
|
}
|
|
|
|
function v6prefix2mask(){
|
|
local num_v6prefix=$1
|
|
num_v6prefix=`echo $num_v6prefix | sed 's:/::g'`
|
|
if [ $num_v6prefix -gt 128 ];then
|
|
$num_v6prefix=128
|
|
fi
|
|
|
|
if [ $num_v6prefix -le 0 ];then
|
|
$num_v6prefix=1
|
|
fi
|
|
|
|
local num_i=1
|
|
local str_mask=''
|
|
while [ $num_i -le 8 ];do
|
|
if [ $num_v6prefix -ge 16 ];then
|
|
str_mask=$str_mask"ffff:"
|
|
num_v6prefix=$((num_v6prefix-16))
|
|
elif [ $num_v6prefix -eq 0 ];then
|
|
str_mask=$str_mask"0:"
|
|
else
|
|
local str_temp=$(((65535>>$num_v6prefix)^65535))
|
|
str_temp=`echo "$str_temp"|awk '{printf("%x\n",$0)}'`
|
|
str_mask=$str_mask"$str_temp:"
|
|
num_v6prefix=0
|
|
fi
|
|
num_i=$((num_i+1))
|
|
done
|
|
|
|
str_mask=`echo $str_mask | sed 's/:$//'`
|
|
echo "$str_mask"
|
|
}
|
|
|
|
function v6calcnet(){
|
|
local str_v6ip=$(v6expand $1)
|
|
local str_v6mask=$2
|
|
local str_v6net=''
|
|
|
|
echo "$str_v6maks " | grep ':' > /dev/null
|
|
if [ $? -ne 0 ];then
|
|
str_v6mask=$(v6prefix2mask $str_v6mask)
|
|
fi
|
|
|
|
local str_old_ifs=$IFS
|
|
IFS=$':'
|
|
local array_ip=($str_v6ip)
|
|
local array_mask=($str_v6mask)
|
|
IFS=$str_old_ifs
|
|
|
|
for num_i in {0..7}
|
|
do
|
|
str_temp=$(( 0x${array_ip[$num_i]} & 0x${array_mask[$num_i]} ))
|
|
str_temp=`echo $str_temp | awk '{printf("%x\n",$0)}'`
|
|
str_v6net=$str_v6net$str_temp":"
|
|
done
|
|
|
|
str_v6net=`echo $str_v6net | sed 's/:$//'`
|
|
echo "$str_v6net"
|
|
}
|
|
|
|
|
|
function servicemap {
|
|
local svcname=$1
|
|
local svcmgrtype=$2
|
|
local svclistname=
|
|
|
|
# if there are more than 1 possible service names for a service among
|
|
# different os distributions and os releases, the service should be
|
|
# specified with structure
|
|
# INIT_(general service name) = "list of possible service names"
|
|
#
|
|
INIT_dhcp="dhcp3-server dhcpd isc-dhcp-server";
|
|
|
|
INIT_nfs="nfsserver nfs-server nfs nfs-kernel-server";
|
|
|
|
INIT_named="named bind9";
|
|
|
|
INIT_syslog="syslog syslogd rsyslog";
|
|
|
|
INIT_firewall="iptables firewalld ufw";
|
|
|
|
INIT_http="apache2 httpd";
|
|
|
|
INIT_ntpserver="ntpd ntp";
|
|
|
|
INIT_mysql="mysqld mysql";
|
|
|
|
INIT_ssh="sshd ssh";
|
|
|
|
local path=
|
|
local postfix=""
|
|
local retdefault=$svcname
|
|
local svcvar=${svcname//[-.]/_}
|
|
if [ "$svcmgrtype" = "0" ];then
|
|
path="/etc/init.d/"
|
|
elif [ "$svcmgrtype" = "1" ];then
|
|
#retdefault=$svcname.service
|
|
path="/usr/lib/systemd/system/"
|
|
postfix=".service"
|
|
elif [ "$svcmgrtype" = "2" ];then
|
|
path="/etc/init/"
|
|
postfix=".conf"
|
|
fi
|
|
|
|
svclistname=INIT_$svcvar
|
|
local svclist=$(eval echo \$$svclistname)
|
|
|
|
if [ -z "$svclist" ];then
|
|
svclist="$retdefault"
|
|
fi
|
|
|
|
for name in `echo $svclist`
|
|
do
|
|
if [ -e "$path$name$postfix" ];then
|
|
echo $name
|
|
break
|
|
fi
|
|
done
|
|
|
|
}
|
|
|
|
#some special services cannot be processed in sysVinit, upstart and systemd framework, should be process here...
|
|
#Notice:
|
|
# return value:
|
|
# 127 : if the service $svcname cannot be processed in this function
|
|
# otherwise: the return value of the service action
|
|
|
|
function specialservicemgr {
|
|
local svcname=$1
|
|
local action=$2
|
|
|
|
if [ "$svcname" = "firewall" ];then
|
|
type -P SuSEfirewall2 >/dev/null 2>&1
|
|
if [ "$?" = "0" ] ;then
|
|
case "$action" in
|
|
"start"|"stop")
|
|
SuSEfirewall2 $action
|
|
;;
|
|
"restart")
|
|
SuSEfirewall2 stop
|
|
SuSEfirewall2 start
|
|
;;
|
|
"disable")
|
|
SuSEfirewall2 off
|
|
;;
|
|
"enable")
|
|
SuSEfirewall2 on
|
|
;;
|
|
"status")
|
|
service SuSEfirewall2_setup status
|
|
;;
|
|
*)
|
|
return 127
|
|
;;
|
|
esac
|
|
return $?
|
|
fi
|
|
fi
|
|
|
|
return 127
|
|
}
|
|
|
|
function startservice {
|
|
local svcname=$1
|
|
|
|
local retval
|
|
specialservicemgr "$svcname" start
|
|
retval=$?
|
|
if [ "$retval" != "127" ]; then
|
|
return $retval
|
|
fi
|
|
|
|
|
|
local cmd=
|
|
local svcunit=`servicemap $svcname 1`
|
|
local svcjob=`servicemap $svcname 2`
|
|
local svcd=`servicemap $svcname 0`
|
|
|
|
if [ -n "$svcunit" ];then
|
|
cmd="systemctl start $svcunit"
|
|
elif [ -n "$svcjob" ];then
|
|
cmd="initctl start $svcjob";
|
|
elif [ -n "$svcd" ];then
|
|
cmd="service $svcd start";
|
|
fi
|
|
|
|
if [ -z "$cmd" ];then
|
|
return 127
|
|
fi
|
|
|
|
eval $cmd
|
|
}
|
|
|
|
|
|
|
|
function stopservice {
|
|
local svcname=$1
|
|
|
|
local retval
|
|
specialservicemgr "$svcname" stop
|
|
retval=$?
|
|
if [ "$retval" != "127" ]; then
|
|
return $retval
|
|
fi
|
|
|
|
local cmd=
|
|
local svcunit=`servicemap $svcname 1`
|
|
local svcjob=`servicemap $svcname 2`
|
|
local svcd=`servicemap $svcname 0`
|
|
|
|
if [ -n "$svcunit" ];then
|
|
cmd="systemctl stop $svcunit"
|
|
elif [ -n "$svcjob" ];then
|
|
initctl status $svcjob | grep stop
|
|
if [ "$?" = "0" ] ; then
|
|
return 0
|
|
else
|
|
cmd="initctl stop $svcjob"
|
|
fi
|
|
elif [ -n "$svcd" ];then
|
|
cmd="service $svcd stop"
|
|
fi
|
|
|
|
echo $cmd
|
|
|
|
if [ -z "$cmd" ];then
|
|
return 127
|
|
fi
|
|
|
|
eval $cmd
|
|
}
|
|
|
|
|
|
function restartservice {
|
|
local svcname=$1
|
|
|
|
local retval
|
|
specialservicemgr "$svcname" restart
|
|
retval=$?
|
|
if [ "$retval" != "127" ]; then
|
|
return $retval
|
|
fi
|
|
|
|
|
|
local cmd=
|
|
local svcunit=`servicemap $svcname 1`
|
|
local svcjob=`servicemap $svcname 2`
|
|
local svcd=`servicemap $svcname 0`
|
|
|
|
if [ -n "$svcunit" ];then
|
|
cmd="systemctl restart $svcunit"
|
|
elif [ -n "$svcjob" ];then
|
|
initctl status $svcjob | grep stop
|
|
if [ "$?" = "0" ];then
|
|
cmd= "initctl start $svcjob"
|
|
else
|
|
cmd="initctl restart $svcjob"
|
|
fi
|
|
elif [ -n "$svcd" ];then
|
|
cmd="service $svcd restart"
|
|
fi
|
|
|
|
if [ -z "$cmd" ];then
|
|
return 127
|
|
fi
|
|
|
|
eval $cmd
|
|
}
|
|
|
|
|
|
function checkservicestatus {
|
|
local svcname=$1
|
|
|
|
local retval
|
|
specialservicemgr "$svcname" status
|
|
retval=$?
|
|
if [ "$retval" != "127" ]; then
|
|
return $retval
|
|
fi
|
|
|
|
|
|
local svcunit=`servicemap $svcname 1`
|
|
local svcjob=`servicemap $svcname 2`
|
|
local svcd=`servicemap $svcname 0`
|
|
|
|
local output=
|
|
local retcode=3
|
|
|
|
if [ -n "$svcunit" ];then
|
|
output=$(systemctl show --property=ActiveState $svcunit|awk -F '=' '{print $2}')
|
|
if echo $output|grep -E -i "^active$";then
|
|
retcode=0
|
|
elif echo $output|grep -E -i "^inactive$";then
|
|
retcode=1
|
|
elif echo $output|grep -E -i "^failed$";then
|
|
retcode=2
|
|
fi
|
|
elif [ -n "$svcjob" ];then
|
|
output=$(initctl status $svcjob)
|
|
if echo $output|grep -i "waiting";then
|
|
retcode=2
|
|
elif echo $output|grep -i "running";then
|
|
retcode=0
|
|
fi
|
|
elif [ -n "$svcd" ];then
|
|
output=$(service $svcd status)
|
|
retcode=$?
|
|
echo $output
|
|
# if echo $output|grep -E -i "(stopped|not running)";then
|
|
# retcode=1
|
|
# elif echo $output|grep -E -i "running";then
|
|
# retcode=0
|
|
# fi
|
|
else
|
|
retcode=127
|
|
fi
|
|
#echo $svcunit-----$svcd
|
|
return $retcode
|
|
|
|
}
|
|
|
|
function enableservice {
|
|
local svcname=$1
|
|
|
|
local retval
|
|
specialservicemgr "$svcname" enable
|
|
retval=$?
|
|
if [ "$retval" != "127" ]; then
|
|
return $retval
|
|
fi
|
|
|
|
|
|
local cmd=
|
|
local svcunit=`servicemap $svcname 1`
|
|
local svcjob=`servicemap $svcname 2`
|
|
local svcd=`servicemap $svcname 0`
|
|
|
|
if [ -n "$svcunit" ];then
|
|
cmd="systemctl enable $svcunit"
|
|
elif [ -n "$svcjob" ];then
|
|
cmd="update-rc.d $svcjob defaults"
|
|
elif [ -n "$svcd" ];then
|
|
command -v chkconfig >/dev/null 2>&1
|
|
if [ $? -eq 0 ];then
|
|
cmd="chkconfig $svcd on"
|
|
else
|
|
command -v update-rc.d >/dev/null 2>&1
|
|
if [ $? -eq 0 ];then
|
|
cmd="update-rc.d $svcd defaults"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$cmd" ];then
|
|
return 127
|
|
fi
|
|
|
|
eval $cmd
|
|
}
|
|
|
|
|
|
function disableservice {
|
|
local svcname=$1
|
|
|
|
local retval
|
|
specialservicemgr "$svcname" disable
|
|
retval=$?
|
|
if [ "$retval" != "127" ]; then
|
|
return $retval
|
|
fi
|
|
|
|
local cmd=
|
|
local svcunit=`servicemap $svcname 1`
|
|
local svcjob=`servicemap $svcname 2`
|
|
local svcd=`servicemap $svcname 0`
|
|
|
|
if [ -n "$svcunit" ];then
|
|
cmd="systemctl disable $svcunit"
|
|
elif [ -n "$svcjob" ];then
|
|
cmd="update-rc.d -f $svcd remove"
|
|
elif [ -n "$svcd" ];then
|
|
command -v chkconfig >/dev/null 2>&1
|
|
if [ $? -eq 0 ];then
|
|
cmd="chkconfig $svcd off";
|
|
else
|
|
command -v update-rc.d >/dev/null 2>&1
|
|
if [ $? -eq 0 ];then
|
|
cmd="update-rc.d -f $svcd remove"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$cmd" ];then
|
|
return 127
|
|
fi
|
|
|
|
eval $cmd
|
|
}
|