244 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
						|
#(C)IBM Corp
 | 
						|
# 
 | 
						|
 | 
						|
 | 
						|
if [ "$(uname -s|tr 'A-Z' 'a-z')" = "linux" ];then
 | 
						|
   str_dir_name=`dirname $0`
 | 
						|
   . $str_dir_name/xcatlib.sh
 | 
						|
fi
 | 
						|
 | 
						|
 | 
						|
# create /etc/sysconfig/network-scripts/
 | 
						|
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
 | 
						|
}
 | 
						|
 | 
						|
for i in `/bin/cat /proc/cmdline`; do
 | 
						|
    KEY=`/bin/echo $i  | /bin/awk -F= '{print $1}'`
 | 
						|
    if [ "$KEY" = "ifname" ]; then
 | 
						|
        ifname=`/bin/echo $i | /bin/awk -F= '{print $2}'`
 | 
						|
        MACX=${ifname#*:}
 | 
						|
        ETHX=${ifname%:$MACX*}
 | 
						|
        break
 | 
						|
    elif [ "$KEY" = "netdev" ]; then
 | 
						|
        ETHX=`/bin/echo $i | /bin/awk -F= '{print $2}'`
 | 
						|
        MACX=`/sbin/ip link show $ETHX | /bin/grep ether | /bin/awk '{print $2}'`
 | 
						|
        break
 | 
						|
    elif [ "$KEY" = "BOOTIF" ]; then
 | 
						|
        MACX=`/bin/echo $i | /bin/awk -F= '{print $2}'|sed -e s/^01-// -e s/-/:/g`
 | 
						|
        #ETHX=`/sbin/ifconfig | /bin/grep -i $MACX | /bin/awk '{print $1}'`
 | 
						|
        ETHX=`/sbin/ip -oneline link show |/bin/grep -i $MACX |/bin/awk -F ":" '{print $2}'|/bin/grep -o "[^ ]\+\( \+[^ ]\+\)*"`
 | 
						|
        break
 | 
						|
    fi
 | 
						|
done
 | 
						|
 | 
						|
if [ ! -z "$MACX" ] && [ ! -z "$ETHX" ]; then
 | 
						|
	if (pmatch $OSVER "sles*") || (pmatch $OSVER "suse*") || [ -f /etc/SuSE-release ]; then
 | 
						|
		CONFFILE=$MNTDIR/etc/sysconfig/network/ifcfg-$ETHX
 | 
						|
	fi
 | 
						|
	if (pmatch $OSVER "fedora*") || (pmatch $OSVER "rhel6*") || (pmatch $OSVER "rhels6*") || [ -f /etc/fedora-release ] || [ -f /etc/redhat-release ];then
 | 
						|
		CONFFILE=$MNTDIR/etc/sysconfig/network-scripts/ifcfg-$ETHX
 | 
						|
	fi
 | 
						|
    if [ ! -e $CONFFILE ]; then
 | 
						|
        /bin/touch $CONFFILE
 | 
						|
    fi
 | 
						|
    if (pmatch $ETHX "hf*") ; then
 | 
						|
        IP=`/sbin/ifconfig $ETHX | /bin/grep -i "inet addr" | awk '{print $2}' | awk -F: '{print $2}'`
 | 
						|
        MASK=`/sbin/ifconfig $ETHX | /bin/grep -i "inet addr" | awk '{print $4}' | awk -F: '{print $2}'`
 | 
						|
        echo "DEVICE=$ETHX" > $CONFFILE
 | 
						|
        echo "BOOTPROTO=static" >> $CONFFILE
 | 
						|
        echo "HWADDR=$MACX" >> $CONFFILE
 | 
						|
        echo "ONBOOT=yes" >> $CONFFILE
 | 
						|
        echo "IPADDR=$IP" >> $CONFFILE
 | 
						|
        echo "NETMASK=$MASK" >> $CONFFILE
 | 
						|
    else
 | 
						|
        echo "DEVICE=$ETHX" > $CONFFILE
 | 
						|
        echo "BOOTPROTO=dhcp" >> $CONFFILE
 | 
						|
        echo "HWADDR=$MACX" >> $CONFFILE
 | 
						|
        echo "ONBOOT=yes" >> $CONFFILE
 | 
						|
    fi
 | 
						|
fi
 | 
						|
 | 
						|
 | 
						|
for i in `cat /proc/cmdline`; do
 | 
						|
    KEY=`echo $i | awk -F= '{print $1}'`
 | 
						|
    if [ "$KEY" = "dump" ]; then
 | 
						|
        DUMP=`echo $i |awk -F= '{print $2}'`
 | 
						|
        if [ ! -z "$XCAT" ]; then
 | 
						|
            break
 | 
						|
        fi
 | 
						|
    elif [ "$KEY" = "XCAT" ]; then
 | 
						|
        XCAT=`echo $i |awk -F= '{print $2}'`
 | 
						|
        if [ ! -z "$DUMP" ]; then
 | 
						|
            break
 | 
						|
        fi
 | 
						|
    fi
 | 
						|
done
 | 
						|
 | 
						|
if [ ! -z "$DUMP" ]; then
 | 
						|
    # parse "dump=<proto>://<nfsserver_IP>/<directory>"
 | 
						|
    KDPATH=${DUMP#*:}
 | 
						|
    KDPROTO=${DUMP%:$KDPATH*}
 | 
						|
    
 | 
						|
    KDPATH=${KDPATH/\/\//}
 | 
						|
    KDIP=`echo $KDPATH | cut -d'/' -f1`
 | 
						|
    KDPATH=${KDPATH/$KDIP/}
 | 
						|
 | 
						|
    # if "dump=<proto>:///<directory>", use $xcatmaster as the default NFS server
 | 
						|
    if [ -z $KDIP ]; then
 | 
						|
        KDIP=${XCAT%:*}
 | 
						|
    fi
 | 
						|
 | 
						|
    # workaround for RHEL6
 | 
						|
    # the $KDIP:$KDPATH directory will be used to generate the initrd for kdump service
 | 
						|
    MOUNTPATH=""
 | 
						|
    if ((pmatch $OSVER "*6\.*")); then
 | 
						|
	MOUNTPATH="/tmp"
 | 
						|
    elif (pmatch $OSVER "*7\.*"); then
 | 
						|
        MOUNTPATH="/mnt"
 | 
						|
    else
 | 
						|
	MOUNTPATH="/var/tmp"
 | 
						|
    fi 
 | 
						|
 | 
						|
    if [ "$KDPROTO" = "nfs" ]; then
 | 
						|
	if (pmatch $OSVER "sles*") || (pmatch $OSVER "suse*") || [ -f /etc/SuSE-release ]; then
 | 
						|
            if (pmatch $OSVER "*10*"); then
 | 
						|
                #run mkinitrd to generater the kdump-init base
 | 
						|
                if (pmatch $ARCH "x86*"); then
 | 
						|
                    /sbin/mkinitrd -m "nfs tg3 bnx2 bnx2x e1000 e1000e igb mlx_en be2net af_packet firmware_class"
 | 
						|
                else
 | 
						|
                    /sbin/mkinitrd -m "nfs be2net e1000e ibmveth igb firmware_class tg3 e1000"
 | 
						|
                fi
 | 
						|
                /bin/mkdir -p /var/tmp/tempinit
 | 
						|
                cd /boot/
 | 
						|
                KDUMPINIT=`ls initrd-*-kdump`
 | 
						|
                /bin/cp /boot/${KDUMPINIT} /var/tmp/tempinit/
 | 
						|
                #change to the /var/tmp/tempinit/ directory
 | 
						|
                cd /var/tmp/tempinit/
 | 
						|
                /bin/zcat ${KDUMPINIT} | /bin/cpio -id
 | 
						|
                /bin/rm -f ${KDUMPINIT}
 | 
						|
                /bin/mkdir -p ./var/lib/dhcpcd/
 | 
						|
                /bin/mkdir -p ./lib/udev/devices/
 | 
						|
                if (pmatch $ARCH "ppc*"); then
 | 
						|
                    /bin/mkdir -p ./lib/power6/
 | 
						|
                    /bin/mkdir -p ./lib/power7/
 | 
						|
                fi
 | 
						|
                /bin/cp -r /lib/udev/devices/* ./lib/udev/devices/
 | 
						|
                for file in "/sbin/ifconfig /usr/bin/clear /bin/touch /bin/grep /sbin/dhcpcd /sbin/ip /bin/awk /bin/makedumpfile"
 | 
						|
                do
 | 
						|
                    for line in `ldd $file`
 | 
						|
                    do
 | 
						|
                        if [ ${line:0:1} = "/"  ]; then
 | 
						|
                            line=`echo $line | grep -v :`
 | 
						|
                            if [ $line ];then
 | 
						|
                                if [ ! -e .$line ];then
 | 
						|
                                    /bin/cp -L  $line .$line
 | 
						|
                                fi
 | 
						|
                            fi
 | 
						|
                        fi
 | 
						|
                    done
 | 
						|
                    /bin/cp $file "./bin/" 
 | 
						|
                 done
 | 
						|
 | 
						|
                #modify the original init to support dump to an nfs server
 | 
						|
                cat > ./bin/dumpfile << EOF
 | 
						|
#!/bin/bash
 | 
						|
if [ -e /proc/vmcore ];then
 | 
						|
    /bin/touch /var/lib/dhcpcd/dhcpcd-$ETHX.info
 | 
						|
    for i in 1 2 3 4 5 6 7 8 9 10
 | 
						|
    do
 | 
						|
        /bin/dhcpcd $ETHX
 | 
						|
        /bin/sleep 2
 | 
						|
        temp=\`/bin/ifconfig | /bin/grep inet\`
 | 
						|
        if [ -n "\$temp" ]; then
 | 
						|
            break
 | 
						|
        fi
 | 
						|
        echo -e "Failed to acquire address, retrying"
 | 
						|
    done
 | 
						|
 | 
						|
    if [ -z "\$temp" ];then
 | 
						|
        exit
 | 
						|
    fi
 | 
						|
 | 
						|
    HOSTNAME=`hostname`
 | 
						|
 | 
						|
    /bin/mkdir /mnt
 | 
						|
    /bin/mount -t nfs -o nolock ${KDIP}:${KDPATH} /mnt
 | 
						|
    if [ -e /mnt/$HOSTNAME ];then
 | 
						|
        /bin/rm -f /mnt/$HOSTNAME
 | 
						|
    fi
 | 
						|
    /bin/makedumpfile -c /proc/vmcore /mnt/$HOSTNAME
 | 
						|
    /bin/umount -l /mnt
 | 
						|
    /sbin/reboot -d -f
 | 
						|
fi
 | 
						|
EOF
 | 
						|
                chmod a+x ./bin/dumpfile
 | 
						|
                /bin/sed -i "s/^# No multipath support/ \/bin\/dumpfile\n/" ./init
 | 
						|
                /bin/rm -f /boot/${KDUMPINIT}
 | 
						|
                /usr/bin/find . | cpio -H newc -o|gzip -9 -c - > /boot/${KDUMPINIT}
 | 
						|
                cd /
 | 
						|
                /bin/rm -rf "/var/tmp/tempinit"
 | 
						|
                #service kdump restart
 | 
						|
                restartservice kdump
 | 
						|
            else
 | 
						|
                /bin/mount -o nolock $KDIP:$KDPATH $MOUNTPATH
 | 
						|
	        KDTEMPPATH=${KDPATH//\//\\\/}
 | 
						|
	        KDTEMPPATH="nfs:\/\/${KDIP}${KDTEMPPATH}\/${NODE}"
 | 
						|
	        sed -i "s/^KDUMP_SAVEDIR=.*$/KDUMP_SAVEDIR=\"${KDTEMPPATH}\"/" /etc/sysconfig/kdump
 | 
						|
                sed -i "s/^KDUMP_COPY_KERNEL=.*$/KDUMP_COPY_KERNEL=\"no\"/" /etc/sysconfig/kdump
 | 
						|
                sed -i "s/^KDUMP_PRESCRIPT=.*$/KDUMP_PRESCRIPT=\"\/tmp\/createdir\"/" /etc/sysconfig/kdump
 | 
						|
                sed -i "s/^KDUMP_REQUIRED_PROGRAMS=.*$/KDUMP_REQUIRED_PROGRAMS=\"\/tmp\/createdir\"/" /etc/sysconfig/kdump
 | 
						|
                TEMPDELAY=$(($RANDOM%30))
 | 
						|
                #work around for the kdump on sles 11.2
 | 
						|
                echo "/bin/mkdir -p /root/tmp/" > /tmp/createdir
 | 
						|
                #following 5 lines is the work around for kdump on multiply nodes
 | 
						|
                echo "/bin/sleep ${TEMPDELAY}" >> /tmp/createdir
 | 
						|
                echo "/bin/mount -o nolock ${KDIP}:${KDPATH} /tmp" >> /tmp/createdir
 | 
						|
                echo "/bin/mkdir -p /tmp/${NODE}" >> /tmp/createdir
 | 
						|
                echo "/bin/sleep ${TEMPDELAY}" >> /tmp/createdir
 | 
						|
                echo "/bin/umount /tmp" >> /tmp/createdir
 | 
						|
                /bin/chmod 777 /tmp/createdir    
 | 
						|
                #change the mount and remount shell scripts' name, workaround for kdump on stateless node
 | 
						|
                oldmount=`ls /lib/mkinitrd/boot/*-mount.sh`
 | 
						|
                oldremount=`ls /lib/mkinitrd/boot/*-remount.sh`
 | 
						|
                mv $oldmount ${oldmount}.bak
 | 
						|
                mv $oldremount ${oldremount}.bak
 | 
						|
	        /etc/init.d/boot.kdump restart
 | 
						|
                mv ${oldmount}.bak $oldmount
 | 
						|
                mv ${oldremount}.bak $oldremount
 | 
						|
            fi
 | 
						|
	else
 | 
						|
            if (pmatch $OSVER "rhel7*") || (pmatch $OSVER "rhels7*");then
 | 
						|
               /bin/mount -o vers=3 $KDIP:$KDPATH $MOUNTPATH
 | 
						|
               #/bin/mount -o nolock $KDIP:$KDPATH $MOUNTPATH
 | 
						|
               [ -d $MOUNTPATH/var/crash ] || mkdir -p $MOUNTPATH/var/crash
 | 
						|
               echo "nfs $KDIP:$KDPATH" > /etc/kdump.conf 
 | 
						|
               echo "default shell" >> /etc/kdump.conf
 | 
						|
               sed -i 's/KDUMP_COMMANDLINE_APPEND="/KDUMP_COMMANDLINE_APPEND="nonodestatus /' /etc/sysconfig/kdump
 | 
						|
               [ -f /etc/dracut.conf ] && mv /etc/dracut.conf  /tmp/dracut.conf
 | 
						|
               restartservice kdump
 | 
						|
               [ -f /tmp/dracut.conf ] && mv /tmp/dracut.conf /etc/dracut.conf 
 | 
						|
	    elif (pmatch $OSVER "fedora*") || (pmatch $OSVER "rhel6*") || (pmatch $OSVER "rhels6*") || [ -f /etc/fedora-release ] || [ -f /etc/redhat-release ];then
 | 
						|
                /bin/mount -o nolock $KDIP:$KDPATH $MOUNTPATH
 | 
						|
		echo "net $KDIP:$KDPATH" > /etc/kdump.conf
 | 
						|
                echo "link_delay 180" >> /etc/kdump.conf
 | 
						|
		#/etc/init.d/kdump restart
 | 
						|
		restartservice kdump
 | 
						|
	    fi
 | 
						|
	fi
 | 
						|
    fi
 | 
						|
 | 
						|
    /bin/umount -l $MOUNTPATH
 | 
						|
else
 | 
						|
    /bin/echo "The kdump server is not configured"
 | 
						|
fi
 | 
						|
 | 
						|
exit 0
 |