#!/bin/bash
set -u
declare -i ErrorCount=0
declare ThisScript=${0##*/}
declare ThisHost=${HOSTNAME%%.*}
declare ThisUser=
declare Version=1.4.3
declare ThisScriptHome=/p4/common/site/bin
declare SDPHostsCfg=/p4/common/site/config/sdp_hosts.cfg
declare FromHost=
declare HostUpgradeLog=
declare HostUpgradeCmd=
declare -i NoOp=1
declare LogTime=
declare Log=
declare H1="=============================================================================="
declare H2="------------------------------------------------------------------------------"
declare H3="++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
function msg () { echo -e "$*"; }
function errmsg () { msg "\\nError: ${1:-Unknown Error}\\n"; ErrorCount+=1; }
function bail () { errmsg "${1:-Unknown Error}"; exit "${2:-$ErrorCount}"; }
function usage () { msg "$ThisScript - Global Topology Upgrade."; exit 2; }
#------------------------------------------------------------------------------
# Function: terminate
# shellcheck disable=SC2317
function terminate
{
# Disable signal trapping.
trap - EXIT SIGINT SIGTERM
#dbg "$ThisScript: EXITCODE: $ErrorCount"
# Stop logging.
[[ "$Log" == off ]] || msg "\\nLog is: $Log\\n${H1}"
# With the trap removed, exit.
exit "$ErrorCount"
}
declare -i shiftArgs=0
set +u
while [[ $# -gt 0 ]]; do
case $1 in
(-h) usage -h;;
(-man) usage -man;;
(-V) msg "$ThisScript version $Version"; exit 2;;
(-y) NoOp=0;;
(-from) FromHost="$2"; shiftArgs=1;;
(-L) Log="$2"; shiftArgs=1;;
(-D) set -x;; # Debug; use 'set -x' mode.
(-*) usage -h "Unknown option ($1).";;
(*) usage -h "Unknown parameter ($1).";;
esac
# Shift (modify $#) the appropriate number of times.
shift; while [[ $shiftArgs -gt 0 ]]; do
[[ $# -eq 0 ]] && usage -h "Incorrect number of arguments."
shiftArgs=$shiftArgs-1
shift
done
done
set -u
source "$SDPHostsCfg" ||\
bail "Could not do: 'source $SDPHostsCfg'"
LogTime=$(date +'%Y-%m-%d-%H%M%S')
Log="${LOGS}/${ThisScript%.sh}.main.${LogTime}.log"
if [[ "$Log" != off ]]; then
touch "$Log" || bail "Could not touch log: $Log"
exec > >(tee "$Log")
exec 2>&1
msg "${H1}\\nLog is: $Log\\n"
fi
ThisUser=$(id -n -u)
msg "Starting $ThisScript version $Version as $ThisUser@$ThisHost on $(date)."
trap terminate EXIT SIGINT SIGTERM
msg "${H1}\\nDoing Outer-to-Inner Upgrades ..."
if [[ "$ThisHost" == $P4MS_HOST && -z "$FromHost" ]]; then
for h in $ALL_SDP_HOSTS; do
msg "${H2}\\nKicking off upgrade on $h."
HostUpgradeCmd="$ThisScriptHome/$ThisScript -from $ThisHost"
[[ "$NoOp" -eq 0 ]] && HostUpgradeCmd+=" -y"
HostUpgradeLog="${LOGS}/${ThisScript%.sh}.${h}.${LogTime}.log"
ssh -q "$h" "$HostUpgradeCmd" > "$HostUpgradeLog" 2>&1 ||\
bail "$ThisScript failed on host $h. See: $HostUpgradeLog"
msg "Verified: Upgrade AOK on $h. Details in $HostUpgradeLog"
done
fi
if [[ -z "$FromHost" ]]; then
if [[ "$ThisHost" == $P4MS_HOST ]]; then
msg "${H3}\\nALL DONE!"
exit 0
else
bail "A Global Topology Upgrade must be kicked off from the P4MS server, $P4MS_HOST."
fi
fi
cd /hxdepots || bail "Could not do: cd /hxdepots"
[[ -d downloads ]] || mkdir downloads
cd downloads || bail "Could not do: cd downloads [from $PWD]."
[[ -d new ]] && mv new old."$(date +'%Y%m%d-%H%M%S')"
[[ -e sdp.Unix.tgz ]] && mv sdp.Unix.tgz sdp.Unix.old."$(date +'%Y%m%d-%H%M%S')"
curl -s -L -O https://swarm.workshop.perforce.com/download/guest/perforce_software/sdp/downloads/sdp.Unix.tgz
ls -l sdp.Unix.tgz
mkdir new || bail "Could not do: mkdir new [from $PWD]."
cd new || bail "Could not do: cd new [from $PWD]."
tar -xzf ../sdp.Unix.tgz || bail "Could not do: tar xzf ../sdp.Unix.tgz [from $PWD]."
cd /hxdepots/downloads/new/sdp/Server/Unix/p4/common/sdp_upgrade ||\
bail "Could not do: cd /hxdepots/downloads/new/sdp/Server/Unix/p4/common/sdp_upgrade"
./sdp_upgrade.sh || bail "SDP Upgrade preflight failed on $ThisHost. Aborting."
if [[ "$NoOp" -eq 0 ]]; then
sleep 2
./sdp_upgrade.sh -y || bail "SDP Upgrade failed on $ThisHost. Aborting."
else
msg "DRY RUN: Not executing sdp_upgrade.sh with '-y'."
fi
cd /p4/sdp/helix_binaries || bail "Could not do: cd /p4/sdp/helix_binaries"
if [[ "$NoOp" -eq 0 ]]; then
./get_helix_binaries.sh -r r24.2 || bail "Call to get_helix_binaries.sh failed."
else
msg "DRY RUN: Executing ./get_helix_binaries.sh with '-n'."
./get_helix_binaries.sh -r r24.2 -n || bail "Call to get_helix_binaries.sh failed."
fi
cd /home/perforce || bail "Could not do: cd /home/perforce"
upgrade.sh || bail "P4D Upgrade preflight failed on $ThisHost. Aborting."
if [[ "$NoOp" -eq 0 ]]; then
sleep 2
upgrade.sh -y || bail "P4D Upgrade failed on $ThisHost. Aborting."
else
msg "DRY RUN: Not executing upgrade.sh with '-y'."
fi
exit "$ErrorCount"