#!/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
