mirror of
https://github.com/xcat2/xcat-core.git
synced 2026-08-04 08:26:59 +00:00
886db49e27
The generated /opt/xcat/xcatinstallpost ran the install postscripts first and only disabled the xcatpostinit1 service afterwards. If one of those postscripts rebooted the node (for example a firmware or kernel update), the service was still enabled, so on the next boot the whole postscript set ran again from the start. Disable the service *before* running the postscripts so a mid-postscript reboot cannot re-trigger them. The disable decision reads OSVER (base variant only), RUNBOOTSCRIPTS and NODESTATUS, which the included xcatinstallpost script would otherwise set. Moving the INCLUDE below the disable block leaves those variables unset, so read them up front (the included script re-reads them) and source xcatlib.sh so msgutil_r is available; the disable decision is then identical to before. The original change (lenovobuild9184cbe0) touched only the legacy post.xcat. Modern EL uses the systemd variants: post.xcat.ng (RHEL/CentOS 8 and 9) and post.xcat.rhels10 (RHEL 10). Apply the same reorder to all three so the fix actually takes effect on current platforms. Lab-validated with a full AlmaLinux 9.8 stateful install (post.xcat.ng path): the generated xcatinstallpost disables the service before running the postscripts, the postscripts run exactly once, the node reaches "booted", and with the default NODESTATUS=1 the service is left enabled just as before. Recovered from the unmerged lenovobuild branch (original9184cbe0), adapted and extended to the .ng and .rhels10 variants. Co-authored-by: Jarrod Johnson <10814490+jjohnson42@users.noreply.github.com>
547 lines
21 KiB
Bash
Executable File
547 lines
21 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Run xCAT post install
|
|
#
|
|
export MASTER_IP="#ENV:MASTER_IP#"
|
|
export MASTER="#XCATVAR:XCATMASTER#"
|
|
export NODESTATUS="#XCATVAR:NODESTATUS#"
|
|
export XCATIPORT=#TABLE:site:key=xcatiport:value#
|
|
export INSTALLDIR=#TABLE:site:key=installdir:value#
|
|
export TFTPDIR=#TABLE:site:key=tftpdir:value#
|
|
export XCATDEBUGMODE="#TABLEBLANKOKAY:site:key=xcatdebugmode:value#"
|
|
export HTTPPORT="#TABLEBLANKOKAY:site:key=httpport:value#"
|
|
|
|
#INCLUDE:#ENV:XCATROOT#/share/xcat/install/scripts/scriptlib#
|
|
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
set -x
|
|
fi
|
|
|
|
if [ -z "$XCATIPORT" ]; then
|
|
XCATIPORT="3002"
|
|
fi
|
|
if [ -z "$INSTALLDIR" ]; then
|
|
INSTALLDIR="/install"
|
|
fi
|
|
if [ -z "$TFTPDIR" ]; then
|
|
TFTPDIR="/tftpboot"
|
|
fi
|
|
if [[ $TFTPDIR != /* ]]; then
|
|
TFTPDIR="/"$TFTPDIR
|
|
fi
|
|
if [ -z "$HTTPPORT" ]; then
|
|
HTTPPORT="80"
|
|
fi
|
|
|
|
NODESTATUS=$(echo "$NODESTATUS"| tr -d \'\"| tr A-Z a-z)
|
|
|
|
(cat << 'EOF'
|
|
#INCLUDE:#TABLE:site:key=installdir:value#/postscripts/updateflag.awk#
|
|
EOF
|
|
) >/tmp/updateflag
|
|
|
|
chmod 0755 /tmp/updateflag
|
|
|
|
cd /tmp
|
|
log_label="xcat.deployment"
|
|
msgutil_r "$MASTER_IP" "info" "Executing post.xcat to prepare for firstbooting ..." "/var/log/xcat/xcat.log" "$log_label"
|
|
|
|
RAND=$(perl -e 'print int(rand(50)). "\n"')
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "sleep $RAND" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
sleep $RAND
|
|
|
|
# Stop if no openssl to help the next bit
|
|
if [ ! -x /usr/bin/openssl ]; then
|
|
msgutil_r "$MASTER_IP" "error" "/usr/bin/openssl does not exist, halt ..." "/var/log/xcat/xcat.log" "$log_label"
|
|
/tmp/updateflag $MASTER $XCATIPORT "installstatus failed"
|
|
sleep 36500d
|
|
fi
|
|
|
|
#save to /opt/xcat/xcatinfo file
|
|
if [ ! -f /opt/xcat/xcatinfo ]; then
|
|
mkdir -p /opt/xcat
|
|
touch /opt/xcat/xcatinfo
|
|
fi
|
|
|
|
grep 'XCATSERVER' /opt/xcat/xcatinfo > /dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
sed -i "s/XCATSERVER=.*/XCATSERVER=$MASTER_IP/" /opt/xcat/xcatinfo
|
|
else
|
|
echo "XCATSERVER=$MASTER_IP" >> /opt/xcat/xcatinfo
|
|
fi
|
|
|
|
grep 'INSTALLDIR' /opt/xcat/xcatinfo > /dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
sed -i "s/INSTALLDIR=.*/INSTALLDIR=$INSTALLDIR/" /opt/xcat/xcatinfo
|
|
else
|
|
echo "INSTALLDIR=$INSTALLDIR" >> /opt/xcat/xcatinfo
|
|
fi
|
|
|
|
grep 'HTTPPORT' /opt/xcat/xcatinfo > /dev/null 2>&1
|
|
if [ $? -eq 0 ]; then
|
|
sed -i "s/HTTPPORT=.*/HTTPPORT=$HTTPPORT/" /opt/xcat/xcatinfo
|
|
else
|
|
echo "HTTPPORT=$HTTPPORT" >> /opt/xcat/xcatinfo
|
|
fi
|
|
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "/opt/xcat/xcatinfo generated" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
|
|
# download the postscripts
|
|
msgutil_r "$MASTER_IP" "info" "trying to download postscripts from $MASTER_IP..." "/var/log/xcat/xcat.log" "$log_label"
|
|
|
|
# Stop if no wget to help the next bit
|
|
if [ ! -x /usr/bin/wget ]; then
|
|
msgutil_r "$MASTER_IP" "error" "/usr/bin/wget does not exist, halt ..." "/var/log/xcat/xcat.log" "$log_label"
|
|
/tmp/updateflag $MASTER $XCATIPORT "installstatus failed"
|
|
sleep 36500d
|
|
fi
|
|
|
|
# These dispatcher scripts are not needed by the legacy post.xcat path. Newer
|
|
# wget parses HTML-looking regex strings inside downloaded scripts and fails the
|
|
# whole recursive download on bogus URLs.
|
|
wget -l inf -N -r --waitretry=10 --random-wait --retry-connrefused -e robots=off -nH --cut-dirs=2 --reject "index.html*,post.xcat.ng,post.xcat.rhels10" --no-parent -t 20 -T 60 http://${MASTER_IP}:${HTTPPORT}${INSTALLDIR}/postscripts/ -P /xcatpost 2> /tmp/wget.log
|
|
if [ "$?" != "0" ]; then
|
|
msgutil_r "$MASTER_IP" "error" "failed to download postscripts from http://$MASTER_IP$INSTALLDIR/postscripts/,check /tmp/wget.log on the node, halt ..." "/var/log/xcat/xcat.log" "$log_label"
|
|
/tmp/updateflag $MASTER $XCATIPORT "installstatus failed"
|
|
sleep 36500d
|
|
fi
|
|
chmod -R +x `find /xcatpost/ -maxdepth 1 -print | grep -E -v '^(/xcatpost/|/xcatpost/_xcat|/xcatpost/_ssh|/xcatpost/ca|/xcatpost/hostkeys)$'`
|
|
msgutil_r "$MASTER_IP" "info" "postscripts downloaded successfully" "/var/log/xcat/xcat.log" "$log_label"
|
|
|
|
# get the precreated mypostscript file
|
|
if [ -x /xcatpost/mypostscript ]; then
|
|
rm -rf /xcatpost/mypostscript
|
|
fi
|
|
export NODE=#TABLE:nodelist:THISNODE:node#
|
|
|
|
msgutil_r "$MASTER_IP" "info" "trying to get mypostscript from $MASTER_IP..." "/var/log/xcat/xcat.log" "$log_label"
|
|
|
|
wget -N --waitretry=10 --random-wait --retry-connrefused -t 20 -T 60 http://${MASTER_IP}:${HTTPPORT}${TFTPDIR}/mypostscripts/mypostscript.$NODE -P /xcatpost 2> /tmp/wget.log
|
|
if [ "$?" = "0" ]; then
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "precreated mypostscript downloaded successfully" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
mv /xcatpost/mypostscript.$NODE /xcatpost/mypostscript
|
|
chmod 700 /xcatpost/mypostscript
|
|
fi
|
|
|
|
USEOPENSSLFORXCAT=1 #Though this is the only method going forward, flag to allow backward compatibility with 2.2 generated netboot images
|
|
export USEOPENSSLFORXCAT
|
|
XCATSERVER=$MASTER_IP:3001
|
|
export XCATSERVER
|
|
|
|
# If mypostscript doesn't exist, we will get it through getpostscript.awk
|
|
if [ ! -x /xcatpost/mypostscript ]; then
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "no pre-generated mypostscript.<nodename>, trying to get it with getpostscript.awk..." "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
|
|
# To support the postscripts in the subdirectories under /install/postscripts
|
|
# chmod +x /xcatpost/*
|
|
# Stop if no getpostscript.awk to help the next bit
|
|
if [ ! -x /xcatpost/getpostscript.awk ]; then
|
|
msgutil_r "$MASTER_IP" "error" "/xcatpost/getpostscript.awk does not exist, halt ..." "/var/log/xcat/xcat.log" "$log_label"
|
|
/tmp/updateflag $MASTER $XCATIPORT "installstatus failed"
|
|
sleep 36500d
|
|
fi
|
|
/xcatpost/getpostscript.awk |egrep '<data>'|sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' | sed -e 's/</</g' -e 's/>/>/g' -e 's/&/\&/g' -e 's/"/"/g' -e "s/'/'/g" > /xcatpost/mypostscript
|
|
|
|
MYCONT=`grep ^MASTER= /xcatpost/mypostscript`
|
|
RETRY=0
|
|
while [ -z "$MYCONT" ]; do
|
|
RETRY=$(($RETRY+1))
|
|
if [ $RETRY -eq "10" ]; then
|
|
break
|
|
fi
|
|
|
|
let SLI=$RANDOM%10+10
|
|
sleep $SLI
|
|
/xcatpost/getpostscript.awk |egrep '<data>'|sed -e 's/<[^>]*>//g'|egrep -v '^ *$'|sed -e 's/^ *//' | sed -e 's/</</g' -e 's/>/>/g' -e 's/&/\&/g' -e 's/"/"/g' -e "s/'/'/g" > /xcatpost/mypostscript
|
|
|
|
MYCONT=`grep ^MASTER= /xcatpost/mypostscript`
|
|
done
|
|
|
|
if [ -z "$MYCONT" ]; then
|
|
msgutil_r "$MASTER_IP" "error" "failed to get mypostscript from $MASTER_IP, halt ..." "/var/log/xcat/xcat.log" "$log_label"
|
|
/tmp/updateflag $MASTER $XCATIPORT "installstatus failed"
|
|
sleep 36500d
|
|
fi
|
|
fi
|
|
|
|
TMP=`sed "/^#\s*postscripts-start-here/,/^#\s*postscripts-end-here/ s/\(.*\)/run_ps postscript \1/;s/run_ps postscript\s*#/#/;s/run_ps postscript\s*$//" /xcatpost/mypostscript`
|
|
echo "$TMP" > /xcatpost/mypostscript
|
|
TMP=`sed "/^#\s*postbootscripts-start-here/,/^#\s*postbootscripts-end-here/ s/\(.*\)/run_ps postbootscript \1/;s/run_ps postbootscript\s*#/#/;s/run_ps postbootscript\s*$//" /xcatpost/mypostscript`
|
|
|
|
cd /xcatpost
|
|
#gunzip xcatpost.tar.gz
|
|
#tar -xvf xcatpost.tar
|
|
#/xcatpost/#TABLE:nodelist:THISNODE:node#
|
|
export PATH=$PATH:/xcatpost
|
|
|
|
# use the run_ps subroutine to run the postscripts
|
|
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
echo "set -x" > /xcatpost/mypostscript
|
|
else
|
|
cat /dev/null > /xcatpost/mypostscript
|
|
fi
|
|
|
|
echo "
|
|
|
|
. /xcatpost/xcatlib.sh
|
|
|
|
# global value to store the running status of the postbootscripts,the value is non-zero if one postbootscript failed
|
|
return_value=0
|
|
|
|
# subroutine used to run postscripts
|
|
# \$1 argument is the script type
|
|
# rest argument is the script name and arguments
|
|
run_ps () {
|
|
local ret_local=0
|
|
mkdir -p "\"/var/log/xcat\""
|
|
# On some Linux distro, the rsyslogd daemon write log files with permision
|
|
# other than root:root. And in some case, the directory /var/log/xcat was
|
|
# created by xCAT, and had root:root ownership. In this way, rsyslogd
|
|
# did not have enough permission to write to log files under this directory.
|
|
# As a dirty hack, change the ownership of directory /var/log/xcat to the
|
|
# same ownership of directory /var/log.
|
|
chown `ls -ld /var/log | awk '{ print \$3\":\"\$4 }'` "\"/var/log/xcat\""
|
|
local logfile=\"/var/log/xcat/xcat.log\"
|
|
local scriptype=\$1
|
|
shift;
|
|
|
|
if [ -z \"\$scriptype\" ]; then
|
|
scriptype=\"postscript\"
|
|
fi
|
|
log_label=\"xcat.deployment.\"\$scriptype
|
|
export LOGLABEL=\$log_label
|
|
if [ -f \$1 ]; then
|
|
msgutil_r \"\$MASTER_IP\" \"info\" "\"\$scriptype start..: \$1\"" \"\$logfile\" \"\$log_label\"
|
|
if [ \"\$XCATDEBUGMODE\" = \"1\" ] || [ \"\$XCATDEBUGMODE\" = \"2\" ]; then
|
|
local compt=\$(file \$1)
|
|
local reg=\"shell script\"
|
|
if [[ \"\$compt\" =~ \$reg ]]; then
|
|
bash -x ./\$@ 2>&1
|
|
ret_local=\$?
|
|
else
|
|
./\$@ 2>&1 | logger -t \$log_label -p debug
|
|
ret_local=\${PIPESTATUS[0]}
|
|
fi
|
|
else
|
|
./\$@ 2>&1
|
|
ret_local=\${PIPESTATUS[0]}
|
|
fi
|
|
|
|
if [ \"\$ret_local\" -ne \"0\" ]; then
|
|
return_value=\$ret_local
|
|
fi
|
|
msgutil_r \"\$MASTER_IP\" \"info\" "\"\$scriptype end...: \$1 return with \$ret_local\"" \"\$logfile\" \"\$log_label\"
|
|
else
|
|
msgutil_r \"\$MASTER_IP\" \"error\" "\"\$scriptype \$1 does NOT exist.\"" \"\$logfile\" \"\$log_label\"
|
|
return_value=-1
|
|
fi
|
|
|
|
|
|
return 0
|
|
}
|
|
# subroutine end
|
|
|
|
" >> /xcatpost/mypostscript
|
|
echo "$TMP" >> /xcatpost/mypostscript
|
|
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
echo "set +x" >> /xcatpost/mypostscript
|
|
fi
|
|
|
|
chmod +x /xcatpost/mypostscript
|
|
if [ ! -x /xcatpost/mypostscript ]; then
|
|
msgutil_r "$MASTER_IP" "error" "failed to generate mypostscript file, halt ..." "/var/log/xcat/xcat.log" "$log_label"
|
|
/tmp/updateflag $MASTER $XCATIPORT "installstatus failed"
|
|
sleep 36500d
|
|
else
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "generate mypostscript file successfully" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
fi
|
|
|
|
|
|
#save the postboot scripts to /xcatpost/mypostscript.post
|
|
TMP=`sed "/^#\s*postscripts-start-here/,/^#\s*postscripts-end-here/ d" /xcatpost/mypostscript`
|
|
echo "$TMP" > /xcatpost/mypostscript.post
|
|
chmod 755 /xcatpost/mypostscript.post
|
|
|
|
if [ ! -x /xcatpost/mypostscript.post ]; then
|
|
msgutil_r "$MASTER_IP" "error" "failed to generate /xcatpost/mypostscript.post" "/var/log/xcat/xcat.log" "$log_label"
|
|
else
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "generate mypostscript.post file successfully" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
fi
|
|
|
|
|
|
export OSVER=#TABLE:nodetype:THISNODE:os#
|
|
#create the post init service as a hook to run PS and PBS, as well as status updating
|
|
hassystemd=0
|
|
systemctl --version 2>/dev/null
|
|
if [ $? -eq 0 ]; then
|
|
hassystemd=1
|
|
fi
|
|
|
|
if [ $hassystemd -eq 1 ] ; then
|
|
if [[ $OSVER =~ sle && $OSVER != sles11* ]]; then
|
|
cat >/etc/systemd/system/xcatpostinit1.service <<'EOF'
|
|
#INCLUDE:/install/postscripts/xcatpostinit1.service.yast2#
|
|
EOF
|
|
cat >/opt/xcat/xcatpostinit1.service.sles <<'EOF'
|
|
#INCLUDE:/install/postscripts/xcatpostinit1.service#
|
|
EOF
|
|
else
|
|
cat >/etc/systemd/system/xcatpostinit1.service <<'EOF'
|
|
#INCLUDE:/install/postscripts/xcatpostinit1.service#
|
|
EOF
|
|
fi
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "/etc/systemd/system/xcatpostinit1.service generated" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
|
|
ln -s /etc/systemd/system/xcatpostinit1.service /etc/systemd/system/multi-user.target.wants/xcatpostinit1.service
|
|
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "xcatpostinit1.service enabled" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
cat >/opt/xcat/xcatpostinit1 << 'EOF'
|
|
#INCLUDE:/install/postscripts/xcatpostinit1.install#
|
|
EOF
|
|
chmod 755 /opt/xcat/xcatpostinit1
|
|
else
|
|
cat >/etc/init.d/xcatpostinit1 << 'EOF'
|
|
#INCLUDE:#TABLE:site:key=installdir:value#/postscripts/xcatpostinit1.install#
|
|
EOF
|
|
chmod 755 /etc/init.d/xcatpostinit1
|
|
|
|
if [ ! -x /etc/init.d/xcatpostinit1 ]; then
|
|
msgutil_r "$MASTER_IP" "error" "failed to generate /etc/init.d/xcatpostinit1" "/var/log/xcat/xcat.log" "$log_label"
|
|
else
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "/etc/init.d/xcatpostinit1 generated" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
fi
|
|
|
|
if [[ $OSVER == ubuntu* ]]; then
|
|
ln -s /etc/init.d/xcatpostinit1 /etc/rc2.d/S84xcatpostinit1
|
|
else
|
|
ln -s /etc/init.d/xcatpostinit1 /etc/rc.d/rc3.d/S84xcatpostinit1
|
|
ln -s /etc/init.d/xcatpostinit1 /etc/rc.d/rc4.d/S84xcatpostinit1
|
|
ln -s /etc/init.d/xcatpostinit1 /etc/rc.d/rc5.d/S84xcatpostinit1
|
|
fi
|
|
|
|
if [[ $OSVER == ubuntu* ]]; then
|
|
update-rc.d xcatpostinit1 defaults
|
|
else
|
|
if [[ $OSVER == sle* ]]; then
|
|
if [[ $OSVER == sles10* ]]; then
|
|
/sbin/insserv xcatpostinit1
|
|
else
|
|
/sbin/insserv -p /etc/init.d xcatpostinit1
|
|
fi
|
|
fi
|
|
#chkconfig --add xcatpostinit1
|
|
chkconfig xcatpostinit1 on
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "service xcatpostinit1 enabled" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
#create the xcatinstallpost
|
|
mkdir -p /opt/xcat
|
|
cat >/opt/xcat/xcatinstallpost << 'EOF'
|
|
#!/bin/bash
|
|
# Disable the xcatpostinit1 service *before* running the postscripts (the
|
|
# INCLUDE at the end). If a postscript reboots the node, the service is
|
|
# already disabled, so the whole postscript set is not run again on reboot.
|
|
# The disable decision needs OSVER, RUNBOOTSCRIPTS and NODESTATUS, which the
|
|
# included script would otherwise set; read them up front (it re-reads them),
|
|
# and source xcatlib.sh so msgutil_r is available for the debug messages.
|
|
[ -f /xcatpost/xcatlib.sh ] && . /xcatpost/xcatlib.sh
|
|
if [ -f /xcatpost/mypostscript.post ]; then
|
|
OSVER=`grep '^OSVER=' /xcatpost/mypostscript.post |cut -d= -f2|sed s/\'//g`
|
|
RUNBOOTSCRIPTS=`grep 'RUNBOOTSCRIPTS=' /xcatpost/mypostscript.post |cut -d= -f2 | tr -d \'\" | tr A-Z a-z`
|
|
XCATDEBUGMODE=`grep 'XCATDEBUGMODE=' /xcatpost/mypostscript.post |cut -d= -f2 | tr -d \'\" | tr A-Z a-z`
|
|
MASTER_IP=`grep '^MASTER_IP=' /xcatpost/mypostscript.post |cut -d= -f2|sed s/\'//g`
|
|
fi
|
|
[ -f /xcatpost/mypostscript ] && NODESTATUS=`grep 'NODESTATUS=' /xcatpost/mypostscript |awk -F = '{print $2}'|tr -d \'\" | tr A-Z a-z `
|
|
[ -z "$NODESTATUS" ] && NODESTATUS="1"
|
|
|
|
if [[ $OSVER == ubuntu* ]]; then
|
|
if [[ ! "$RUNBOOTSCRIPTS" =~ ^(1|yes|y)$ ]]; then
|
|
update-rc.d -f xcatpostinit1 remove
|
|
fi
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "update-rc.d -f xcatpostinit1 remove" "/var/log/xcat/xcat.log" "xcat.xcatinstallpost"
|
|
fi
|
|
else
|
|
if [[ ! "$RUNBOOTSCRIPTS" =~ ^(1|yes|y)$ ]] && [[ ! "$NODESTATUS" =~ ^(1|yes|y)$ ]]; then
|
|
chkconfig xcatpostinit1 off
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "service xcatpostinit1 disabled" "/var/log/xcat/xcat.log" "xcat.xcatinstallpost"
|
|
fi
|
|
fi
|
|
|
|
fi
|
|
|
|
#INCLUDE:#TABLE:site:key=installdir:value#/postscripts/xcatinstallpost#
|
|
|
|
EOF
|
|
chmod 755 /opt/xcat/xcatinstallpost
|
|
|
|
if [ ! -x /opt/xcat/xcatinstallpost ]; then
|
|
msgutil_r "$MASTER_IP" "error" "failed to generate /opt/xcat/xcatinstallpost" "/var/log/xcat/xcat.log" "$log_label"
|
|
else
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "/opt/xcat/xcatinstallpost generated" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
fi
|
|
|
|
|
|
#create the dskls post
|
|
cat >/opt/xcat/xcatdsklspost << 'EOF'
|
|
#INCLUDE:#TABLE:site:key=installdir:value#/postscripts/xcatdsklspost#
|
|
EOF
|
|
chmod 755 /opt/xcat/xcatdsklspost
|
|
|
|
if [ ! -x /opt/xcat/xcatdsklspost ]; then
|
|
msgutil_r "$MASTER_IP" "error" "failed to generate /opt/xcat/xcatdsklspost" "/var/log/xcat/xcat.log" "$log_label"
|
|
else
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "/opt/xcat/xcatdsklspost generated" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
fi
|
|
|
|
|
|
#create the preboot script and run here
|
|
TMP=`sed "/^#\s*postbootscripts-start-here/,/^#\s*postbootscripts-end-here/ d" /xcatpost/mypostscript`
|
|
echo "$TMP" > /xcatpost/mypostscript
|
|
|
|
echo "
|
|
#save bad return code to /opt/xcat/xcatinfo
|
|
if [ \"\$return_value\" -ne \"0\" ]; then
|
|
grep 'POSTSCRIPTS_RC' /opt/xcat/xcatinfo > /dev/null 2>&1
|
|
if [ \$? -eq 0 ]; then
|
|
sed -i \"s/POSTSCRIPTS_RC=.*/POSTSCRIPTS_RC=1/\" /opt/xcat/xcatinfo
|
|
else
|
|
echo \"POSTSCRIPTS_RC=1\" >> /opt/xcat/xcatinfo
|
|
fi
|
|
fi
|
|
" >> /xcatpost/mypostscript
|
|
|
|
chmod 700 /xcatpost/mypostscript
|
|
|
|
export ARCH=#TABLE:nodetype:THISNODE:arch#
|
|
export CONSOLEPORT=#TABLEBLANKOKAY:nodehm:THISNODE:serialport#
|
|
|
|
#for redhat:
|
|
#place-holder for the code to save the repo info on compute node,pointing to the "pkgdir" of the osimage
|
|
#so that the provisioned node has the repo pointed to the distro path on MN
|
|
#WRITEREPO#
|
|
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "info" "running mypostscript" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
/xcatpost/mypostscript
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "info" "mypostscript returned" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
|
|
|
|
if [[ $OSVER == ubuntu* ]]; then
|
|
if [[ -r /boot/grub/menu.lst ]]; then
|
|
sed -i 's/^serial/#serial/' /boot/grub/menu.lst
|
|
sed -i 's/^terminal/#terminal/' /boot/grub/menu.lst
|
|
elif [[ -r /boot/grub/grub.cfg ]] ; then
|
|
update-grub
|
|
fi
|
|
|
|
#print the kernel messages and service start messages with systemd on the console during system bootup
|
|
[ -f /etc/default/grub ] && sed -i -e '/GRUB_CMDLINE_LINUX_DEFAULT=/s/quiet//;s/splash//' -e '/#GRUB_TERMINAL=/s/#//' -e 's/#GRUB_GFXMODE=.*/GRUB_GFXMODE=text/' /etc/default/grub && update-grub
|
|
|
|
if echo "$ARCH" | grep -i 'x86_64'; then
|
|
#grab the install-time console configuration from /proc/cmdline inside os installer
|
|
CONSOLECFG=$(awk 'BEGIN{RS="[ \n]" ;ORS=" "} $0 ~ /^console=/{print $0}' /proc/cmdline)
|
|
#if the console configuration is not applied to the grub configuration,apply it
|
|
cat /boot/grub/grub.cfg |grep "$CONSOLECFG" >/dev/null 2>&1 || ([ -f /etc/default/grub ] && sed -i -e "/GRUB_CMDLINE_LINUX_DEFAULT=/s/=\"/=\" $CONSOLECFG /" /etc/default/grub && update-grub)
|
|
fi
|
|
if echo "$ARCH" | grep -i 'ppc64'; then
|
|
if [ -z "$CONSOLEPORT" ] ; then
|
|
export CONSOLEPORT=0
|
|
fi
|
|
CONSOLE="hvc$CONSOLEPORT"
|
|
if [[ -r /etc/default/grub ]] ; then
|
|
sed -i "s/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"console=$CONSOLE\"/" /etc/default/grub
|
|
else
|
|
echo "GRUB_CMDLINE_LINUX_DEFAULT=\"console=$CONSOLE\"" > /etc/default/grub
|
|
fi
|
|
update-grub
|
|
|
|
cat >/etc/init/$CONSOLE\.conf << 'EOF'
|
|
start on stopped rc RUNLEVEL=[2345] and (
|
|
not-container or
|
|
container CONTAINER=lxc or
|
|
container CONTAINER=lxc-libvirt)
|
|
|
|
stop on runlevel [!2345]
|
|
respawn
|
|
#exec /sbin/getty -L 115200 hvc0 vt102
|
|
script
|
|
for i in `cat /proc/cmdline`; do
|
|
KEY=`echo $i|cut -d= -f 1`
|
|
if [ "$KEY" == "console" -a "$i" != "console=tty0" ]; then
|
|
VALUE=`echo $i | awk -F= '{print $2}'`
|
|
COTTY=`echo $VALUE|awk -F, '{print $1}'`
|
|
COSPEED=`echo $VALUE|awk -F, '{print $2}'|awk -Fn '{print $1}'`
|
|
|
|
break
|
|
fi
|
|
done
|
|
|
|
exec /sbin/getty -L $COSPEED $COTTY vt102
|
|
end script
|
|
EOF
|
|
fi
|
|
sed -i '/127.0.1.1/d' /etc/hosts
|
|
else
|
|
[ -f /boot/grub/grub.conf ] && sed -i 's/^serial/#serial/' /boot/grub/grub.conf
|
|
[ -f /boot/grub/grub.conf ] && sed -i 's/^terminal/#terminal/' /boot/grub/grub.conf
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
msgutil_r "$MASTER_IP" "debug" "/boot/grub/grub.conf updated" "/var/log/xcat/xcat.log" "$log_label"
|
|
fi
|
|
fi
|
|
|
|
|
|
msgutil_r "$MASTER_IP" "info" "finished firstboot preparation, sending request to $MASTER:3002 for changing status..." "/var/log/xcat/xcat.log" "$log_label"
|
|
#the following command should always be run to prevent infinite installation loops
|
|
updateflag.awk $MASTER 3002
|
|
|
|
cd /
|
|
|
|
# fix the issue#929@github, the "service network restart" in <sles post scripts>
|
|
# makes the 'network' service in start status, then it causes the
|
|
# services YaST2-Second-Stage.service and xcatpostinit1 services to be run in parallel.
|
|
# But the YaST2-Second-Stage.service calls the Yast2 which conflics with the zypper
|
|
# which is called in xcatpostinit1->otherpkgs.
|
|
# The correct services start order is 'YaST2-Second-Stage.service'->'network'->'xcatpostinit1' in serial.
|
|
# To skip the conflict, the network service should be stoped in the yast first stage. Then base on the service
|
|
# dependency, the service start order will be 'YaST2-Second-Stage.service'->'network'->'xcatpostinit1' in serial.
|
|
# Then the Yast2 will be stopped before running the zypper in otherpkgs.
|
|
if [[ $OSVER =~ sle && $OSVER != sles11* ]]; then
|
|
service network stop
|
|
fi
|
|
|
|
if [ "$XCATDEBUGMODE" = "1" ] || [ "$XCATDEBUGMODE" = "2" ]; then
|
|
set +x
|
|
fi
|