mirror of
https://github.com/xcat2/xcat-core.git
synced 2026-10-02 08:51:44 +00:00
2652cb152f
Reuse NetworkManager for persistent routes, bond setup and connection properties on openEuler. Preserve ifcfg handling where the connection still uses it. Propagate route failures to local callers.
288 lines
9.0 KiB
Bash
Executable File
288 lines
9.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# IBM(c) 2014 EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
|
|
# Usage:
|
|
# configbond bondname nic1@nic2@... [opt1@opt2@...]
|
|
#
|
|
# Description:
|
|
# This script is used to configure bond interface base on the arguments from the
|
|
# command line and the network information from nics and networks tables.
|
|
#
|
|
# This script will create bond interface named <bondname> with 'nic1','nic2'... as slave
|
|
# devices. The bonding options 'opt1','opt2'... will be configured to bond interface.
|
|
#
|
|
# The network information for the bond interface will be gotten from the nics.nicsip and
|
|
# nics.nicnetworks for interface <bondname>. If cannot get for <bondname>, try to
|
|
# search for nic1. If failed too, then nic2 ...
|
|
#
|
|
# It only supports to configure one bond device at each run. If you want to create
|
|
# multiple bond devices, call it multiple times.
|
|
#
|
|
# Note:
|
|
# This script only works for IPv4 so far.
|
|
|
|
|
|
# Following are examples of variables which are exported from mypostscript. Mostly, we need the nics and
|
|
# networks related varirables which are exported from xcat nics and networks tables.
|
|
# NICIPS=bond0!10.0.0.12
|
|
# NICTYPES=bond0!Ethernet
|
|
# NICHOSTNAMESUFFIXES=bond0!-bond0
|
|
# NICNETWORKS=bond0!10_0_0_0-255_255_255_0
|
|
# NICCUSTOMSCRIPTS=bond0!configbond
|
|
# NETWORKS_LINES=2
|
|
# NETWORKS_LINE1=netname=10_0_0_0-255_255_255_0||net=10.0.0.0||mask=255.255.255.0||mgtifname=eth1||gateway=<xcatmaster>||dhcpserver=||tftpserver=10.0.0.10||nameservers=||ntpservers=||logservers=||dynamicrange=||staticrange=||staticrangeincrement=||nodehostname=||ddnsdomain=||vlanid=||domain=||mtu=||disable=||comments=
|
|
# NETWORKS_LINE2=netname=10_0_2_0-255_255_255_0||net=10.0.2.0||mask=255.255.255.0||mgtifname=eth0||gateway=10.0.2.2||dhcpserver=||tftpserver=10.0.2.15||nameservers=||ntpservers=||logservers=||dynamicrange=||staticrange=||staticrangeincrement=||nodehostname=||ddnsdomain=||vlanid=||domain=||mtu=||disable=||comments=
|
|
|
|
|
|
# load library for network caculation
|
|
if [ "$(uname -s|tr 'A-Z' 'a-z')" = "linux" ];then
|
|
str_dir_name=`dirname $0`
|
|
. $str_dir_name/xcatlib.sh
|
|
fi
|
|
|
|
if [ -n "$LOGLABEL" ]; then
|
|
log_label=$LOGLABEL
|
|
else
|
|
log_label="xcat"
|
|
fi
|
|
|
|
# Subroutine to display message and pass it to syslog
|
|
# Usage: showmsg "message to putput" ["error"]
|
|
function showmsg() {
|
|
msg="configbond: $1"
|
|
error=$2
|
|
|
|
if [ -n "$error" ]; then
|
|
$(logger -t $log_label -p local4.err $msg)
|
|
else
|
|
$(logger -t $log_label -p local4.info $msg)
|
|
fi
|
|
|
|
echo $msg
|
|
}
|
|
|
|
# Check OS version and get the directory of network configuration file
|
|
str_bond_name=''
|
|
str_os_type=`uname | tr 'A-Z' 'a-z'`
|
|
str_cfg_dir=''
|
|
str_temp=''
|
|
if [ "$str_os_type" = "linux" ];then
|
|
str_temp=`echo $OSVER | grep -E '(sles|suse)'`
|
|
if [ -f "/etc/redhat-release" ] || xcat_is_openeuler "$OSVER"; then
|
|
str_os_type="redhat"
|
|
str_cfg_dir="/etc/sysconfig/network-scripts"
|
|
elif [ -f "/etc/SuSE-release" -o -n "$str_temp" ];then
|
|
str_os_type="sles"
|
|
str_cfg_dir="/etc/sysconfig/network"
|
|
elif [ -f /etc/os-release ] && cat /etc/os-release |grep NAME|grep -i SLE >/dev/null; then
|
|
str_os_type="sles"
|
|
str_cfg_dir="/etc/sysconfig/network"
|
|
else
|
|
showmsg "Only supports RHEL and SLES" "error"
|
|
exit -1
|
|
fi
|
|
else
|
|
showmsg "Does NOT support non-Linux Operating System" "error"
|
|
exit -1
|
|
fi
|
|
|
|
|
|
# Parse arguments
|
|
old_ifs=$IFS
|
|
IFS=$'@'
|
|
|
|
if [ $# -eq 2 ];then
|
|
array_bond_opts="mode=4 miimon=100 downdelay=0 updelay=0 lacp_rate=fast xmit_hash_policy=1"
|
|
elif [ $# -eq 3 ]; then
|
|
array_bond_opts=($3)
|
|
else
|
|
showmsg "Only supports 2 or 3 arguments. Usage: configbond bondname nic1@nic2@... [opt1@opt2@...]"
|
|
exit -1
|
|
fi
|
|
|
|
str_bond_name=$1
|
|
array_bond_slaves=($2)
|
|
IFS=$old_ifs
|
|
|
|
# examples of variables
|
|
# str_bond_name=bond0
|
|
# array_bond_slaves=(eth1 eth2)
|
|
# array_bond_opts=(mode=1 miimon=100)
|
|
|
|
# Check the existence of slave devices and remove the inactive ones
|
|
realdevs=$(ip addr show 2>&1 | grep -E '^[1-9]' | cut -d: -f2)
|
|
for slave in ${array_bond_slaves[*]}; do
|
|
active=0
|
|
for rdev in $realdevs; do
|
|
if [ $rdev = $slave ]; then
|
|
active=1
|
|
fi
|
|
done
|
|
if [ $active -eq 0 ]; then
|
|
showmsg "Warning: device $slave does not exist. It will not be configured as a slave device."
|
|
# remove the device from slave list
|
|
allslaves=${array_bond_slaves[*]}
|
|
allslaves=${allslaves/$slave/}
|
|
array_bond_slaves=($allslaves)
|
|
fi
|
|
done
|
|
|
|
if [ ${#array_bond_slaves[*]} -eq 0 ]; then
|
|
showmsg "No available slave devices to use." "error"
|
|
exit -1
|
|
fi
|
|
|
|
showmsg "Create bond interface $str_bond_name with slaves=\"${array_bond_slaves[*]}\" opts=\"${array_bond_opts[*]}\""
|
|
|
|
# Get bond device's IP address
|
|
str_bond_ip=""
|
|
if [ -z "$NICIPS" ]; then
|
|
showmsg "Failed to get IP for bond interface: $str_bond_name. No IP is set in nics.nicips table."
|
|
exit 1
|
|
else
|
|
for devname in $str_bond_name ${array_bond_slaves[*]}; do # for each "bondname nic1 nic2 ..."
|
|
for ifipinfo in ${NICIPS//,/ }; do # for each "ifname!ifip"
|
|
old_ifs=$IFS
|
|
IFS=$'!'
|
|
arrayifinfo=($ifipinfo) # [0] - ifname; [1] - if ip address
|
|
IFS=$old_ifs
|
|
|
|
if [ "$devname" = "${arrayifinfo[0]}" ]; then
|
|
str_bond_ip=${arrayifinfo[1]}
|
|
break 2
|
|
fi
|
|
done
|
|
done
|
|
fi
|
|
|
|
# remove the left part from |. that means only keeping the first ip in the interface if there are alias ip
|
|
str_bond_ip=${str_bond_ip%%|*}
|
|
|
|
if [ -z "str_bond_ip" ]; then
|
|
showmsg "Failed to get IP for $str_bond_name ${array_bond_slaves[*]} from $NICIPS"
|
|
exit 1
|
|
fi
|
|
|
|
# Get the network and netmask info for the $str_bond_ip from networks table
|
|
str_bond_net=
|
|
str_bond_mask=
|
|
num_i=1
|
|
while [ $num_i -le $NETWORKS_LINES ];do
|
|
eval str_bond_network=\$NETWORKS_LINE$num_i
|
|
str_temp_net=${str_bond_network#*net=} # remove the left part from 'net='
|
|
str_temp_net=${str_temp_net%%|*} # remove the right part from first '|'
|
|
str_temp_mask=${str_bond_network#*mask=} # remove the left part from 'mask='
|
|
str_temp_mask=${str_temp_mask%%|*} # remove the right part from first '|'
|
|
|
|
str_temp_net1=$(v4calcnet $str_bond_ip $str_temp_mask)
|
|
str_temp_net2=$(v4calcnet $str_temp_net $str_temp_mask)
|
|
if [ "$str_temp_net1" = "$str_temp_net2" ];then
|
|
str_bond_net=$str_temp_net
|
|
str_bond_mask=$str_temp_mask
|
|
break
|
|
fi
|
|
num_i=$((num_i+1))
|
|
done
|
|
|
|
if [ -z "$str_bond_net" ] || [ -z "$str_bond_mask" ]; then
|
|
showmsg "Cannot find network information for bond IP $str_bond_ip from networks table." "error"
|
|
exit 1
|
|
fi
|
|
|
|
showmsg "IP information for $str_bond_name: IP=$str_bond_ip; network=$str_bond_net; netmask=$str_bond_mask"
|
|
|
|
if xcat_is_openeuler "$OSVER"; then
|
|
. "$str_dir_name/nicutils.sh"
|
|
check_NetworkManager_or_network_service
|
|
if [ $? -ne 1 ]; then
|
|
showmsg "NetworkManager must be active to configure a bond on openEuler" "error"
|
|
exit 1
|
|
fi
|
|
networkmanager_active=1
|
|
str_bond_ports=$(IFS=,; echo "${array_bond_slaves[*]}")
|
|
str_bond_options=${array_bond_opts[*]}
|
|
create_bond_interface_nmcli "bondname=$str_bond_name" \
|
|
"slave_ports=$str_bond_ports" "slave_type=ethernet" \
|
|
"_ipaddr=$str_bond_ip" "_netmask=$str_bond_mask" \
|
|
"_bonding_opts=${str_bond_options// /,}"
|
|
exit $?
|
|
fi
|
|
|
|
# Create bond config file
|
|
|
|
str_master_file="${str_cfg_dir}/ifcfg-${str_bond_name}"
|
|
|
|
if [ "$str_os_type" = "redhat" ];then
|
|
# Create the master file
|
|
cat > $str_master_file <<EOF
|
|
DEVICE=${str_bond_name}
|
|
BOOTPROTO=none
|
|
IPADDR=${str_bond_ip}
|
|
NETMASK=${str_bond_mask}
|
|
ONBOOT=yes
|
|
USERCTL=no
|
|
TYPE=Bond
|
|
BONDING_OPTS="${array_bond_opts[*]}"
|
|
EOF
|
|
|
|
# Create the slave files
|
|
for slave in ${array_bond_slaves[*]}; do
|
|
str_slave_file="${str_cfg_dir}/ifcfg-${slave}"
|
|
cat > $str_slave_file <<EOF
|
|
DEVICE=${slave}
|
|
MASTER=${str_bond_name}
|
|
SLAVE=yes
|
|
BOOTPROTO=none
|
|
ONBOOT=yes
|
|
USERCTL=no
|
|
EOF
|
|
done
|
|
|
|
elif [ "$str_os_type" = "sles" ];then
|
|
# Create the master file
|
|
cat > $str_master_file <<EOF
|
|
NAME='Bonded Interface'
|
|
BOOTPROTO=static
|
|
BONDING_MASTER=yes
|
|
TYPE=Bond
|
|
IPADDR=${str_bond_ip}
|
|
NETMASK=${str_bond_mask}
|
|
STARTMODE=onboot
|
|
USERCONTROL=no
|
|
BONDING_MODULE_OPTS="${array_bond_opts[*]}"
|
|
EOF
|
|
|
|
# Create the slave entries and files
|
|
num_index=0
|
|
for slave in ${array_bond_slaves[*]}; do
|
|
# this is a special part to inject each slave device to master cfg
|
|
echo "BONDING_SLAVE_${num_index}=$slave" >> $str_master_file
|
|
num_index=$((num_index+1))
|
|
|
|
str_slave_file="${str_cfg_dir}/ifcfg-${slave}"
|
|
echo "BOOTPROTO=none" > $str_slave_file
|
|
echo "STARTMODE=hotplug" >> $str_slave_file
|
|
done
|
|
fi
|
|
|
|
# add bonding driver alias for <bondname>
|
|
echo "alias $str_bond_name bonding" > /etc/modprobe.d/$str_bond_name.conf
|
|
|
|
# Bring down the slave devices first
|
|
for slave in ${str_bond_name} ${array_bond_slaves[*]}; do
|
|
$(ifdown $slave &>/dev/null)
|
|
done
|
|
|
|
# Bring up bond device
|
|
$(ifup ${str_bond_name} &>/dev/null)
|
|
|
|
if [ $? -ne 0 ]; then
|
|
showmsg "Failed to bring up $str_bond_name" "error"
|
|
exit 1
|
|
fi
|
|
|
|
showmsg "Finished the configuration for bond interface $str_bond_name"
|
|
exit 0
|
|
|
|
|