#!/bin/bash # IBM(c) 2013 EPL license http://www.eclipse.org/legal/epl-v10.html # Internal script used by confignics only # xCAT post script for configuring ib adapters. # Work for both IPv4 and IPv6 # The following are a sample of the env used: # NIC_IBNICS=ib0,ib1 # NIC_IBAPORTS=1 (or 2) # OSVER=sles11.1 # NICNODE=dxm360m4n04 # NICIPS='eth0!10.1.34.242,ib1!15.0.1.242,ib2!15.0.2.242' # NICHOSTNAMESUFFIXES='eth1!-eth1,ib1!-ib1,ib2!-ib2' # NICTYPES='eth1!ethernet,ib1!infiniband,ib2!infiniband' # NICNETWORKS='eth0!10_1_0_0-255_255_255_0,ib1!ib1,ib2!ib2' # NETWORKS_LINES=3 # NETWORKS_LINE1='netname=10_1_0_0-255_255_255_0||net=10.1.0.0||mask=255.255.255.0||mgtifname=eth1||gateway=||dhcpserver=10.1.0.205||tftpserver=10.1.0.205||nameservers=||ntpservers=||logservers=||dynamicrange=||staticrange=||staticrangeincrement=||nodehostname=||ddnsdomain=||vlanid=||domain=||disable=||comments=' # NETWORKS_LINE2='netname=ib1||net=15.0.1.0||mask=255.255.255.0||mgtifname=||gateway=15.0.1.254||dhcpserver=||tftpserver=||nameservers=||ntpservers=||logservers=||dynamicrange=||staticrange=||staticrangeincrement=||nodehostname=||ddnsdomain=||vlanid=||domain=||disable=||comments=' # NETWORKS_LINE3='netname=ib3||net=15.0.3.0||mask=255.255.255.0||mgtifname=||gateway=||dhcpserver=||tftpserver=||nameservers=||ntpservers=||logservers=||dynamicrange=||staticrange=||staticrangeincrement=||nodehostname=||ddnsdomain=||vlanid=||domain=||disable=||comments=' if [ "$(uname -s|tr 'A-Z' 'a-z')" = "linux" ];then str_dir_name=`dirname $0` . $str_dir_name/xcatlib.sh fi #This is the number of ports for each ib adpator. portnum=1 if [ -n "$NIC_IBAPORTS" ]; then portnum=$NIC_IBAPORTS fi # pmatch determines if 1st argument string is matched by 2nd argument pattern pmatch () { case $1 in $2) return 0;; # zero return code means string matched by pattern esac return 1 # non-zero return code means string not matched by pattern } convert_netmask_to_cidr() { let cidrnum=0 OLFIFS=$IFS IFS=. for x in $1 do case $x in 255) cidrnum=$(expr $cidrnum + 8);; 254) cidrnum=$(expr $cidrnum + 7);; 252) cidrnum=$(expr $cidrnum + 6);; 248) cidrnum=$(expr $cidrnum + 5);; 240) cidrnum=$(expr $cidrnum + 4);; 224) cidrnum=$(expr $cidrnum + 3);; 192) cidrnum=$(expr $cidrnum + 2);; 128) cidrnum=$(expr $cidrnum + 1);; 0);; esac done IFS=$OLDIFS echo $cidrnum } # This function parse the NICEXTRAPARAMS into an array. # Each arry element contains all the extra params for an ip # For example: # NICEXTRAPARAMS="eth0!MTU=1500 sonething=x|MTU=1460,ib0!MTU=65520 CONNECTED_MODE=yes". # After calling this function with eth0: # array_extra_param[0]="MTU=1500 sonething=x" # array_extra_param[1]="MTU=1460" function get_nic_extra_params() { nic=$1 if [ ! "$NICEXTRAPARAMS" ];then return fi old_ifs=$IFS IFS=$',' array_conf_temp=($NICEXTRAPARAMS) IFS=$old_ifs #echo "NICEXTRA=$NICEXTRAPARAMS" i=0 while [ $i -lt ${#array_conf_temp[@]} ] do token="${array_conf_temp[$i]}" D= if echo "$token" | grep "!"; then D="!" else D=":" fi key=`echo "$token" | cut -d"$D" -f 1` #echo "key=$key nic=$nic" if [ "$key" == "$nic" ]; then str_temp_value=`echo "$token" | cut -d"$D" -f 2` #echo "token=$token, str_temp_value=$str_temp_value" old_ifs=$IFS IFS=$'|' array_nic_params=($str_temp_value) IFS=$old_ifs return fi i=$((i+1)) done } # This functions parse the extra parameters for an ip address of a nic # Input is like this: # MTU=65520 something=yes # After the function is called: # array_extra_param_names[0]="MTU" # array_extra_param_values[0]="65520" # array_extra_param_names[1]="something" # array_extra_param_values[0]="yes" # function parse_nic_extra_params() { str_extra=$1 unset array_extra_param_names unset array_extra_param_values old_ifs=$IFS IFS=$' ' params_temp=($str_extra) IFS=$old_ifs k=0 while [ $k -lt ${#params_temp[@]} ] do token2="${params_temp[$k]}" array_extra_param_names[$k]=`echo "$token2" | cut -d'=' -f 1` array_extra_param_values[$k]=`echo "$token2" | cut -d'=' -f 2` k=$((k+1)) done } #if $NIC_IBNICS is not defined, all ib nics' configuration files will be deleted. if [ -z "$NIC_IBNICS" ]; then echo "nothing to do." fi #find correct IB driver PLTFRM=`uname` if [[ $OSVER == rhels5* || "$OSVER" == rhels6* || "$OSVER" == ubuntu14* ]] then ib_driver="rdma" #/sbin/service $ib_driver status checkservicestatus $ib_driver #if [ $? -eq 1 ] if [ $? -ne 0 ] then ib_driver="openibd" #/sbin/service $ib_driver status checkservicestatus $ib_driver #if [ $? -eq 1 ] if [ $? -ne 0 ] then echo "Not found the driver dameon: rdma or openibd" logger -p local4.info -t xcat "Not found the driver dameon: rdma or openibd" exit fi fi else ib_driver="openibd" fi #make changes to the confiuration file if [ $PLTFRM == "Linux" ] then if [ -f "/etc/rdma/rdma.conf" ] then TMP1=`sed "s/SDP_LOAD=yes/SDP_LOAD=no/g" /etc/rdma/rdma.conf` echo "$TMP1" > /etc/rdma/rdma.conf elif [ -f "/etc/infiniband/openib.conf" ] then TMP1=`sed "s/SDP_LOAD=yes/SDP_LOAD=no/g" /etc/infiniband/openib.conf` echo "$TMP1" > /etc/infiniband/openib.conf fi if [ -f "/etc/modprobe.conf" ] then if [ "$portnum" == "1" ]; then TMP2=`sed "/options ib_ehca nr_ports/d" /etc/modprobe.conf` echo "$TMP2" > /etc/modprobe.conf echo 'options ib_ehca nr_ports=1' >> /etc/modprobe.conf else TMP2=`sed "/options ib_ehca nr_ports=1/d" /etc/modprobe.conf` echo "$TMP2" > /etc/modprobe.conf fi TMP3=`sed "/options ib_ehca lock_hcalls/d" /etc/modprobe.conf` echo "$TMP3" > /etc/modprobe.conf echo 'options ib_ehca lock_hcalls=0' >> /etc/modprobe.conf fi #/sbin/chkconfig --level 2345 $ib_driver on > /dev/null 2>&1 enableservice $ib_driver > /dev/null 2>&1 #/sbin/service $ib_driver restart restartservice $ib_driver sysctl -p fi #clean up existing ib nic configrations if [ $PLTFRM == "Linux" ] then if [ -f /etc/redhat-release ] then OS_name="redhat" elif [ -f /etc/SuSE-release ] then OS_name="suse" elif [ -f /etc/os-release ] && cat /etc/os-release |grep NAME|grep Ubuntu>/dev/null then OS_name="ubuntu" else echo "Unsupported to config IB on this OS!" logger -p local4.info -t xcat "Unsupported to config IB on this OS!" exit fi if [ $OS_name != 'ubuntu' ]; then if [ $OS_name == 'suse' ] then dir="/etc/sysconfig/network" else dir="/etc/sysconfig/network-scripts" fi #`rm -f $dir/ifcfg-$nic` 2>&1 1>/dev/null # nic aliases `rm -f $dir/ifcfg-ib*` 2>&1 1>/dev/null else interfaces="/etc/network/interfaces" for tmp in `sed -n "/auto ib/=" ${interfaces}` do startline=`sed -n "/auto ib/=" ${interfaces}| head -n 1` endline=`sed -n "$startline,/^auto/p" ${interfaces} |wc -l` if sed -n "$startline,/^auto/p" ${interfaces} |sed '$!d' |grep "auto" >/dev/null;then endline=`expr $startline + $endline - 2` else endline=`expr $startline + $endline - 1` fi ((startline--)) temp=`sed -n ${startline}p ${interfaces}` while [[ $temp =~ ^# ]] do ((startline--)) temp=`sed -n ${startline}p ${interfaces}` done ((startline++)) temp=`sed -n ${endline}p ${interfaces}` while [[ $temp =~ ^# ]] do ((endline--)) temp=`sed -n ${endline}p ${interfaces}` done sed -i ${startline},${endline}d ${interfaces} done fi else loop_number=`lsdev | grep "IP over Infiniband Network Interface" | wc -l` num=0 while [ $num -lt $loop_number ] do if [ "$portnum" == "2" ]; then num0=`expr $num \* 2` num1=`expr $num0 + 1` `rmdev -d -l ib$num0 >/dev/null 2>&1` `rmdev -d -l ib$num1 >/dev/null 2>&1` `rmdev -d -l ml$num >/dev/null 2>&1` num=`expr $num + 1` else `rmdev -d -l ib$num >/dev/null 2>&1` n=`expr $num % 2` if [ $n == 1 ] then mlnum=`expr $num / 2` `rmdev -d -l ml$mlnum >/dev/null 2>&1` fi num=`expr $num + 1` fi done `rmdev -dl icm >/dev/null 2>&1` #restart the managers mkdev -c management -s infiniband -t icm cfgmgr fi declare -a array_nic_params declare -a array_extra_param_names declare -a array_extra_param_values goodnics="" for nic in `echo "$NIC_IBNICS" | tr "," "\n"` do #Get nic ips nicips="" for tmp in `echo "$NICIPS" | tr "," "\n"` do nic_tmp=`echo "$tmp" | awk -F"!" '{print $1}'`; if [ $nic_tmp == $nic ]; then # nicips=ip1|ip2|ip3 nicips=`echo "$tmp" | awk -F"!" '{print $2}'`; break fi done # echo "nic=$nic, nicip=$nicip" #get nic networks name nicnets="" for tmp in `echo "$NICNETWORKS" | tr "," "\n"` do nic_tmp=`echo "$tmp" | awk -F"!" '{print $1}'`; if [ $nic_tmp == $nic ]; then # nicnets=net1|net2|net3 nicnets=`echo "$tmp" | awk -F"!" '{print $2}'`; break fi done #echo "nic=$nic, nicnet=$nicnet" if [ -z "$nicnets" ]; then echo "No network defined for $nic" logger -p local4.info -t xcat "No network defined for $nic" continue fi unset array_nic_params unset array_extra_param_names unset array_extra_param_values get_nic_extra_params $nic j=0 while [ $j -lt ${#array_nic_params[@]} ] do token1="${array_nic_params[$j]}" echo "array_nic_params $j=$token1" j=$((j+1)) done ipindex=0 for nicip in `echo $nicips | tr "|" "\n"` do ipindex=`expr $ipindex + 1` nicnet=`echo $nicnets | cut -d '|' -f$ipindex` #get netmask and gateway index=0; found=0 while [ $index -lt $NETWORKS_LINES ] do index=$((index+1)) eval netline=\$NETWORKS_LINE$index if [[ -n "$netline" ]]; then for tmp in `echo "$netline" | tr "\|" "\n"` do key=`echo "$tmp" | awk -F"=" '{print $1}'`; case $key in netname) netname=`echo "$tmp" | awk -F"=" '{print $2}'` if [ "$netname" != "$nicnet" ]; then break; fi ;; net) net=`echo "$tmp" | awk -F"=" '{print $2}'` ;; mask) netmask=`echo "$tmp" | awk -F"=" '{print $2}'` # remove the prefix "/" from ipv6 mask if echo $netmask | grep "/" 2>&1 1>/dev/null then netmask=`echo $netmask | awk -F'/' '{print $2}'` fi ;; gateway) gateway=`echo "$tmp" | awk -F"=" '{print $2}'` found=1 ;; esac if [ $found -eq 1 ]; then break; fi done # end for tmp in `echo "$netline" | tr "\|" "\n"` if [ $found -eq 1 ]; then break; fi fi # end if [[ -n "$netline" ]] done # end while [ $index -lt $NETWORKS_LINES ] #echo "found=$found" #echo "index=$index netname=$nicnet net=$net mask=$netmask gateway=$gateway" # Setup goodnics list if [ "$found" == "0" ]; then echo "Cannot find network $nicnet for $nic" logger -p local4.info -t xcat "Cannot find network $nicnet for $nic" continue else if [ -z "$goodnics" ]; then goodnics=$nic else goodnics="$goodnics,$nic" fi fi #there should be only one gateway on a node and that should go through the to the xcat management node and would be set up from the install nic. Anything else should be a route if [ "$gateway" == "" ] || [ "$gateway" == "<xcatmaster>" ]; then gateway='' fi if [ ${#array_nic_params[@]} -gt 0 ]; then str_extra_params=${array_nic_params[$ipindex-1]} parse_nic_extra_params "$str_extra_params" fi if [ $PLTFRM == "Linux" ] then # Issue openibd for Linux at boot time if [ -f /etc/sysctl.conf ] then TMP1=`sed "/net.ipv4.conf.$nic.arp_filter=1/d" /etc/sysctl.conf` echo "$TMP1" > /etc/sysctl.conf TMP2=`sed "/net.ipv4.conf.$nic.arp_ignore=1/d" /etc/sysctl.conf` echo "$TMP2" > /etc/sysctl.conf cfg="net.ipv4.conf.$nic.arp_filter=1" grep "$cfg" /etc/sysctl.conf 2>&1 1>/dev/null if [ $? -ne 0 ] then echo "net.ipv4.conf.$nic.arp_filter=1" >> /etc/sysctl.conf fi cfg="net.ipv4.conf.$nic.arp_ignore=1" grep "$cfg" /etc/sysctl.conf 2>&1 1>/dev/null if [ $? -ne 0 ] then echo "net.ipv4.conf.$nic.arp_ignore=1" >> /etc/sysctl.conf fi fi if [ $OS_name == 'suse' ] then # First ip address if [ $ipindex -eq 1 ] then # Write the info to the ifcfg file echo "DEVICE=$nic NM_CONTROLLED=no BOOTPROTO=static STARTMODE=onboot IPADDR=$nicip" > $dir/ifcfg-$nic # ipv6 if echo $nicip | grep : 2>&1 1>/dev/null then echo "PREFIXLEN=$netmask" >> $dir/ifcfg-$nic else echo "NETMASK=$netmask" >> $dir/ifcfg-$nic fi if [ -n "$gateway" ]; then # Do not add duplicate default gateway entry grep -E "default\\s+$gateway\\s+" /etc/sysconfig/network/routes 2>&1 1>/dev/null if [ $? -ne 0 ]; then echo "default $gateway - -" >> /etc/sysconfig/network/routes fi fi #add extra params i=0 while [ $i -lt ${#array_extra_param_names[@]} ] do name="${array_extra_param_names[$i]}" value="${array_extra_param_values[$i]}" echo " $i: name=$name value=$value" echo "${name}=${value}" >> $dir/ifcfg-$nic i=$((i+1)) done else # not the first ip address echo "LABEL_$ipindex=$ipindex IPADDR_$ipindex=$nicip" >> $dir/ifcfg-$nic # ipv6 if echo $nicip | grep : 2>&1 1>/dev/null then echo "PREFIXLEN_$ipindex=$netmask" >> $dir/ifcfg-$nic else echo "NETMASK_$ipindex=$netmask" >> $dir/ifcfg-$nic fi if [ -n "$gateway" ]; then # Do not add duplicate default gateway entry grep -E "default\\s+$gateway\\s+" /etc/sysconfig/network/routes 2>&1 1>/dev/null if [ $? -ne 0 ]; then echo "default $gateway - -" >> /etc/sysconfig/network/routes fi fi #add extra params i=0 while [ $i -lt ${#array_extra_param_names[@]} ] do name="${array_extra_param_names[$i]}" value="${array_extra_param_values[$i]}" echo " $i: name=$name value=$value" echo "${name}=${value}" >> $dir/ifcfg-$nic i=$((i+1)) done fi # end if [ $ipindex -eq 1 ] elif [ $OS_name == 'redhat' ] then # First ip address if [ $ipindex -eq 1 ] then # Write the info to the ifcfg file echo "DEVICE=$nic NM_CONTROLLED=no BOOTPROTO=none ONBOOT=yes IPADDR=$nicip" > $dir/ifcfg-$nic # ipv6 if echo $nicip | grep : 2>&1 1>/dev/null then echo "PREFIXLEN=$netmask" >> $dir/ifcfg-$nic else if [[ "$OSVER" == rhels6* ]] then #get prefix from netmask, this is for IPv4 only prefix=24 prefix=$(convert_netmask_to_cidr $netmask) echo "PREFIX=$prefix" >> $dir/ifcfg-$nic else echo "NETMASK=$netmask" >> $dir/ifcfg-$nic fi fi if [ -n "$gateway" ]; then echo "GATEWAY=$gateway" >> $dir/ifcfg-$nic fi #add extra params i=0 while [ $i -lt ${#array_extra_param_names[@]} ] do name="${array_extra_param_names[$i]}" value="${array_extra_param_values[$i]}" echo " $i: name=$name value=$value" echo "${name}=${value}" >> $dir/ifcfg-$nic i=$((i+1)) done else # not the first ip address # ipv6 if echo $nicip | grep : 2>&1 1>/dev/null then grep "IPV6INIT" $dir/ifcfg-$nic 2>&1 1>/dev/null # The first ipv6 address if [ $? -ne 0 ] then echo "IPV6INIT=yes IPV6ADDR=$nicip/$netmask" >> $dir/ifcfg-$nic else echo "IPV6ADDR_SECONDARIES=$nicip/$netmask" >> $dir/ifcfg-$nic fi if [ -n "$gateway" ]; then echo "IPV6_DEFAULTGW=$gateway" >> $dir/ifcfg-$nic fi else # ipv4 address echo "DEVICE=$nic:$ipindex NM_CONTROLLED=no BOOTPROTO=none ONBOOT=yes IPADDR=$nicip" > $dir/ifcfg-$nic:$ipindex if [[ "$OSVER" == rhels6* ]] then #get prefix from netmask, this is for IPv4 only prefix=24 prefix=$(convert_netmask_to_cidr $netmask) echo "PREFIX=$prefix" >> $dir/ifcfg-$nic:$ipindex else echo "NETMASK=$netmask" >> $dir/ifcfg-$nic:$ipindex fi if [ -n "$gateway" ]; then echo "GATEWAY=$gateway" >> $dir/ifcfg-$nic:$ipindex fi #add extra params i=0 while [ $i -lt ${#array_extra_param_names[@]} ] do name="${array_extra_param_names[$i]}" value="${array_extra_param_values[$i]}" echo " $i: name=$name value=$value" echo "${name}=${value}" >> $dir/ifcfg-$nic:$ipindex i=$((i+1)) done # need to run ifup eth1:1 for RedHat goodnics="$goodnics,$nic:$ipindex" fi fi # end not the first ip address elif [ $OS_name == 'ubuntu' ] then # First ip address if [ $ipindex -eq 1 ]; then # ipv6 if echo $nicip | grep : 2>&1 1>/dev/null then echo "auto $nic iface $nic inet6 static address $nicip netmask $netmask" >> /etc/network/interfaces if [ -n "$gateway" ]; then echo "gateway $gateway" >> /etc/network/interfaces fi # ipv4 else # Write the info to the ifcfg file echo "auto $nic iface $nic inet static address $nicip netmask $netmask" >> /etc/network/interfaces #if [ -n "$gateway" ]; then # echo "gateway $gateway" >> /etc/network/interfaces #fi fi else # Not the first ip address # ipv6 if echo $nicip | grep : 2>&1 1>/dev/null then echo "auto $nic iface $nic inet6 static address $nicip netmask $netmask" >> /etc/network/interfaces if [ -n "$gateway" ]; then echo "gateway $gateway" >> /etc/network/interfaces fi else # ipv4 echo "auto $nic:$ipindex iface $nic:$ipindex inet static address $nicip netmask $netmask" >> /etc/network/interfaces #if [ -n "$gateway" ]; then # echo "gateway $gateway" >> /etc/network/interfaces #fi fi #add extra params i=0 while [ $i -lt ${#array_extra_param_names[@]} ] do name="${array_extra_param_names[$i]}" value="${array_extra_param_values[$i]}" echo " $i: name=$name value=$value" echo "${name} ${value}" >> /etc/network/interfaces i=$((i+1)) done fi else echo "Unsupported operating system" logger -p local4.err -t xcat "Unsupported operating system" fi elif [ $PLTFRM == "AIX" ]; then if ( pmatch $nic "ml*" ); then #for ml* interface num=${nic##ml} mlt="mlt$num" #Check whether the mlt is available lsdev -C | grep $mlt | grep Available 2>&1 >/dev/null if [ $? -ne 0 ] then echo "$mltnum is not available." logger -p local4.info -t xcat "$mltnum is not available." continue fi #Check whether the ml0 is available lsdev -C | grep $nic 2>&1 >/dev/null if [ $? -ne 0 ] then cfgmgr 2>&1 >/dev/null fi chdev -l $nic -a state=detach 2>&1 chdev -l $nic -a netaddr=$nicip -a netmask=$netmask -a state=up 2>&1 else #assume it is ib* #lsdev -C | grep icm | grep Available #if [ $? -ne 0 ] #then # mkdev -c management -s infiniband -t icm # if [ $? -ne 0 ] # then # mkdev -l icm # if [ $? -ne 0 ] # then # exit $? # fi # fi # fi #Configure the IB interfaces. Customize the port num. num=${nic##ib} #this assumes that all the nics starts with 'ib' if [ "$portnum" == "1" ]; then iba_num=$num ib_adapter="iba$iba_num" port=1 else iba_num=`expr $num / 2` ib_adapter="iba$iba_num" if [ $(($num % 2)) == 0 ] then port=1 else port=2 fi fi if [ $NODE ]; then shortname=$NODE else shortname=`hostname -s` fi chdev -l $ib_adapter -a hostname=$shortname mkiba -a $nicip -i $nic -A $ib_adapter -p $port -P -1 -S up -m $netmask fi # end assume it is ib* fi # end if AIX done # end for nicip done # end for nic # echo "goodnics=$goodnics" # Bringup all the ib interfaces if [ $PLTFRM == "Linux" ] then #/sbin/service $ib_driver restart restartservice $ib_driver for nic in `echo "$goodnics" | tr "," "\n"|sort -u` do sleep 5 if [[ "$OSVER" == rhels6* ]] then ip link set dev $nic up else if [[ "$OSVER" == ubuntu14* ]] then interfaces="/etc/network/interfaces" for tmp in `cat $interfaces |grep "auto ib" |sort -u|awk '{print $2}'` do ifdown $tmp > /dev/null 2>&1 sleep 2 ifup $tmp > /dev/null 2>&1 done else ifup $nic > /dev/null 2>&1 fi fi done fi