2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-07-23 12:51:10 +00:00
Files
xcat-core/xCAT/postscripts/cumulusztp

180 lines
5.6 KiB
Bash
Executable File

#!/bin/bash
#this script will be invoked by ZTP(zero touch provision) process in the onie switch
#this script finish the discovery and configuration after the switch is pluged in the cluster and powered on
function error() {
echo -e "\e[0;33mERROR: The Zero Touch Provisioning script failed while running the command $BASH_COMMAND at line $BASH_LINENO.\e[0m" >&2
exit 1
}
# Log all output from this script
exec >/var/log/autoprovision 2>&1
#trap error ERR
#Add Debian Repositories
#since in most cases, the switch has no internet access, skip this step
#echo "deb http://http.us.debian.org/debian jessie main" >> /etc/apt/sources.list
#echo "deb http://security.debian.org/ jessie/updates main" >> /etc/apt/sources.list
# $1 - The name of the network interface
function get_last_lease()
{
local ifname="$1"
local lease=""
while read -r
do
if [[ $REPLY =~ ^lease ]]
then
lease="$REPLY"$'\n'
else
lease+="$REPLY"$'\n'
fi
done <"/var/lib/dhcp/dhclient.${ifname}.leases" 2>/dev/null
echo "${lease}"
}
#get ip address for server node
server_ip="$(grep 'cumulus-provision-url' < <(get_last_lease eth0) | awk -F/ '{print $3}')"
hashostname="$(grep 'host-name' < <(get_last_lease eth0))"
#download /install/postscripts from MN
max_retries=5
retry=0
rc=1 # this is a fail return
downloaded=0
while [ 0 -eq 0 ]; do
if [ -e "/xcatpost" ]; then
rm -rf "/xcatpost"
fi
export LANG=C; wget -l inf -nH -N -r --waitretry=10 --random-wait -e robots=off -T 60 -nH --cut-dirs=2 --reject "index.html*" --no-parent http://$server_ip/install/postscripts/ -P /xcatpost 2> /tmp/wget.log
rc=$?
if [ $rc -eq 0 ]; then
# return from wget was 0 but some OS do not return errors, so we
# have additional checks for
# failed: Connection httpd not running
# 404: Not Found - if directory does not exist
grep -i -E "... failed: Connection refused.$" /tmp/wget.log
rc1=$?
grep -i -E "ERROR 404: Not Found.$" /tmp/wget.log
rc2=$?
# check to see no errors at all, grep returns 1
if [ $rc1 -eq 1 ] && [ $rc2 -eq 1 ]; then
logger -s -t "xcat.cumulusztp" -p local4.info "download_postscripts return successfully "
downloaded=1
break
fi
fi
retry=$(($retry+1))
logger -s -t "xcat.cumulusztp" -p local4.info "download_postscripts retry $retry"
if [ $retry -eq $max_retries ]; then
break
fi
SLI=$(awk 'BEGIN{srand(); printf("%d\n",rand()*20)}')
sleep $SLI
done
if [ "$downloaded" = "0" ];then
logger -s -t "xcat.cumulusztp" -p local4.err "download_postscripts failed"
ztp -R
exit 1
fi
chmod -R +x `find /xcatpost/ -maxdepth 1 -print | grep -E -v '^(/xcatpost/|/xcatpost/_xcat|/xcatpost/_ssh|/xcatpost/ca|/xcatpost/hostkeys)$'`
cd /xcatpost
rc=0
#if 'host-name' appears in dhcp lease, it means that the node definition and dhcp lease
#have been created on MN, no need to invoke discovery process
if [ -n "$hashostname" ]; then
echo "My definition and dhcp lease exist, skip discovery and begin configuring..."
logger -s -t "xcat.cumulusztp" -p local4.info "My definition and dhcp lease exist, skip discovery and begin configuring..."
else
./documulusdiscovery
rc=$?
if [ "$rc" != "0" ];then
ztp -R
exit 1
fi
logger -s -t "xcat.cumulusztp" -p local4.info "switch discovered!"
#restart mgt interface to apply the specified IP address
ifdown eth0;ifup eth0
retry=0
while true; do
#check whether the network access between MN/CN and the node is ready
ping $server_ip -c 1 >/dev/null && break
retry=$[ $retry + 1 ]
if [ $retry -eq 90 ];then
#timeout, complain and exit
logger -s -t "xcat.cumulusztp" -p local4.err " the network between the node and $server_ip is not ready, please check[retry=$retry]..." "/var/log/xcat/xcat.log"
ztp -R
exit 1
fi
#sleep sometime before the next scan
sleep 2
done
fi
echo "installstatus configuring" | socat STDIN TCP:$server_ip:3002,sourceport=301,reuseaddr,retry=5
#push root ssh keys, config passwordless
mkdir -p /root/.ssh
mv _ssh/authorized_keys /root/.ssh/authorized_keys
#install license, if needed
/usr/cumulus/bin/cl-license > /dev/null 2>&1
rc=$?
if [ "$rc" != "0" ];then
if /usr/cumulus/bin/cl-license -i http://$server_ip/install/custom/sw_os/cumulus/licensefile.txt; then
logger -s -t "xcat.cumulusztp" -p local4.info "installed Cumulus license"
systemctl enable switchd
systemctl start switchd
else
logger -s -t "xcat.cumulusztp" -p local4.err "failed to install Cumulus license"
echo "failed to install Cumulus license"
fi
fi
#obtain myposctscript from MN
./getmypostscript.cumulus $server_ip:3001
rc=$?
if [ "$rc" != "0" ]; then
logger -s -t "xcat.cumulusztp" -p local4.info "failed to get mypostscript"
echo "failed to get mypostscript"
ztp -R
exit 1
fi
#setup ntp
echo './setupntp' >> ./mypostscript
#enable snmp
echo './enablesnmp' >> ./mypostscript
#config base interface
echo './configinterface' >> ./mypostscript
#config static ip address for mgt interface
echo './confignics -s' >> ./mypostscript
chmod 700 ./mypostscript
./mypostscript
rc=$?
if [ "$rc" != "0" ]; then
logger -s -t "xcat.cumulusztp" -p local4.info "failed to complete setup"
echo "failed to complete setup"
ztp -R
exit 1
fi
#report status
echo "installstatus configured" | socat STDIN TCP:$server_ip:3002,sourceport=301,reuseaddr,retry=5
# CUMULUS-AUTOPROVISIONING
exit 0