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