configure_sample_depot_for_sdp.sh #1

  • //
  • guest/
  • perforce_software/
  • helix-installer/
  • dev/
  • src/
  • configure_sample_depot_for_sdp.sh
  • View
  • Commits
  • Open Download .zip Download (11 KB)
#!/bin/bash
#==============================================================================
# Copyright and license info is available in the LICENSE file included with
# this package, and also available online:
# https://swarm.workshop.perforce.com/view/guest/tom_tyler/helix-installer/main/LICENSE
#------------------------------------------------------------------------------
set -u

#------------------------------------------------------------------------------
# Declarations
declare Version=1.3.3
declare ResetTarget=/depotdata
declare DownloadsDir=$ResetTarget/downloads
declare BackupDir=Unset
declare BackupFile=
declare TmpFile=/tmp/tmp.csd4sdp.$$.$RANDOM
declare RunUser=perforce
declare Arch=x86_64
declare ApiArch=
declare ThisArch=
declare RunArch=x86_64
declare ThisOS=$(uname -s)
declare ThisUser=$(whoami)
declare CBIN=/p4/common/bin
declare ThisScript=${0##*/}
declare SDPInstance=Undefined

#------------------------------------------------------------------------------
# Function: usage (required function)
#
# Input:
# $1 - style, either -h (for short form) or -man (for man-page like format).
#------------------------------------------------------------------------------
function usage {
   declare style=${1:--h}

   echo "USAGE for $ThisScript v$Version:

$ThisScript -i <sdp_instance> [-d <data_dir>]

or

$ThisScript [-h|-man]
"
   if [[ $style == -man ]]; then
      echo -e "
DESCRIPTION:
	This script transforms a stock Sample Depot instance into
	one that works with the SDP.

REQUIREMENTS:
	A P4D process must be live and running with the stock
	Sample Depot data set, on a sport 

ARGUMENTS:
 -i <sdp_instance>
	Specify the SDP Instance in which the Sample Depot data set is
	running.  This argument is required.

 -d <data_dir>
	Specify the data directory where supporting files exist, such as the
	*.p4s data files used by this script.

 -D     Set extreme debugging verbosity.

HELP OPTIONS:
 -h	Display short help message
 -man	Display man-style help message

EXAMPLES:
	Usage to configure Instance 1:
	cd /where/this/script/is
	$ThisScript 1 2>&1 | tee log.${ThisScript%.sh}.1

	Usage to configure Instance abc:
	cd /where/this/script/is
	$ThisScript abc 2>&1 | tee log.${ThisScript%.sh}.abc
"
   fi

   exit 1
}

#------------------------------------------------------------------------------
# Function bail().
# Sample Usage:
#    bail "Missing something important. Aborting."
#    bail "Aborting with exit code 3." 3
function bail () { echo -e "\nError: ${1:-Unknown Error}\n"; exit ${2:-1}; }

#------------------------------------------------------------------------------
# Functions.  The runCmd() function is similar to functions defined in SDP core
# libraries, but we need to duplicate them here since this script runs before
# the SDP is available on the machine (and we want no dependencies for this
# script.
function runCmd {
   declare cmd=${1:-echo Testing runCmd}
   declare desc=${2:-""}

   declare cmdToShow=$cmd

   [[ $cmdToShow == *"<"* ]] && cmdToShow=${cmdToShow%%<*}
   [[ $cmdToShow == *">"* ]] && cmdToShow=${cmdToShow%%>*}

   [[ -n "$desc" ]] && echo $desc
   echo Running: $cmdToShow
   if [[ $NoOp -eq 0 ]]; then
      $cmd
   else
      echo "NO-OP: Would run: $cmdToShow"
   fi
   return $?
}

#==============================================================================
# Command Line Processing

declare -i NoOp=0
declare -i shiftArgs=0
declare DataDir="$PWD"

set +u

while [[ $# -gt 0 ]]; do
   case $1 in
      (-i) SDPInstance=$2; shiftArgs=1;;
      (-d) DataDir="$2"; shiftArgs=1;;
      (-n) NoOp=1;;
      (-h) usage -h;;
      (-man) usage -man;;
      (-D) set -x;; # Debug; use 'set -x' mode.
   esac

   # Shift (modify $#) the appropriate number of times.
   shift; while [[ $shiftArgs -gt 0 ]]; do
      [[ $# -eq 0 ]] && bail "Usage Error: Wrong numbers of args or flags to args."
      shiftArgs=$shiftArgs-1
      shift
   done
done
set -u

#------------------------------------------------------------------------------
# Usage Validation

[[ $SDPInstance == Undefined ]] && bail "Bad Usage: The '<sdp_instance>' argument is required."

[[ ! -r $CBIN/p4_vars ]] && bail "Missing SDP Environment File [$CBIN/p4_vars]. Aborting."

if [[ $ThisUser != $RunUser ]]; then
   bail "Run as $RunUser, not $ThisUser."
else
   echo Verified: Running as user $RunUser.
fi

# Load SDP environment and variable definintions.
source $CBIN/p4_vars $SDPInstance ||\
   bail "Failed to load SDP environment. Aborting."

unset P4CONFIG
unset P4ENVIRO

runCmd "$P4BIN -u bruno -s info -s" "Verifying server is offline." &&\
   bail "Perforce server is unexpectedly online. Aborting."

runCmd "/p4/${SDPInstance}/bin/p4d_${SDPInstance} -jr $DownloadsDir/PerforceSample/checkpoint" \
   "Loading the Sample Depot metadata in instance ${SDPInstance}." ||\
   bail "Failed to load Sample Depot checkpoint."

runCmd "/p4/${SDPInstance}/bin/p4d_${SDPInstance} -xu" \
   "Upgrading databases (p4d -xu) for instance ${SDPInstance}." ||\
   bail "Failed to upgrade databases."

if [[ $P4PORT == "ssl:"* ]]; then
   runCmd "/p4/${SDPInstance}/bin/p4d_${SDPInstance} -Gc" \
      "Generating OpenSSL Certificates for instance $SDPInstance." ||\
      bail "Failed to generate OpenSSL Certs for Instance $SDPInstance."
fi

if [[ $NoOp -eq 0 ]]; then
   echo "Starting services p4broker_${SDPInstance}_init and p4d_${SDPInstance}_init."
   /p4/${SDPInstance}/bin/p4broker_${SDPInstance}_init start < /dev/null > /dev/null 2>&1 &
   /p4/${SDPInstance}/bin/p4d_${SDPInstance}_init start < /dev/null > /dev/null 2>&1 &
   sleep 1
else
   echo "NO-OP: Would start services p4broker_${SDPInstance}_init and p4d_${SDPInstance}_init."
fi

if [[ $P4PORT == "ssl:"* ]]; then
   # Note: Automating a 'p4 trust -y' (especially with '-f') is TOTALLY
   # INAPPROPRIATE in any production environment, as it defeats the purpose of the
   # Open SSL trust mechanism.  But for our purposes here scripts that spin up
   # throw-away data sets for testing or training purposes, it's just dandy.
   runCmd "/p4/${SDPInstance}/bin/p4_${SDPInstance} trust -f -y" \
      "Trusting the OpenSSL Cert of the server." ||\
      bail "Failed to trust the server."

   runCmd "/p4/${SDPInstance}/bin/p4_${SDPInstance} -p $P4BROKERPORT trust -f -y" \
      "Trusting the OpenSSL Cert of the server." ||\
      bail "Failed to trust the server."
fi

runCmd "$P4BIN -u bruno -s info -s" "Verifying direct connection to Perforce server." ||\
   bail "Could not connect to Perforce server."

runCmd "$P4BIN -u bruno -s -p $P4BROKERPORT info -s" "Verifying via-broker connection to Perforce server." ||\
   bail "Could not connect to Perforce server."

[[ "$($P4BIN -u bruno protects -m)" == super ]] ||\
   bail "Could not verify super user access for $P4USER on port $P4PORT.  Is this the Sample depot? Aborting."

echo "Super user access for bruno verified."

if [[ $NoOp -eq 0 ]]; then
   echo "Creating user $P4USER."
   sed "s:__EDITME_ADMIN_P4USER__:$P4USER:g" $DataDir/admin.user.p4s > $TmpFile
   $P4BIN -u bruno user -f -i < $TmpFile

   echo "Adding user to NoTicketExpiration group."
   sed "s:__EDITME_ADMIN_P4USER__:$P4USER:g" $DataDir/NoTicketExpiration.group.p4s > $TmpFile
   $P4BIN -u bruno group -i < $TmpFile

   echo "Promoting user $P4USER to super user."
   $P4BIN -u bruno protect -o > $TmpFile
   echo -e "\tsuper user $P4USER * //...\n" >> $TmpFile
   $P4BIN -u bruno protect -i < $TmpFile
else
   echo "NO-OP: Would create $P4USER as a super user."
fi

cat /p4/common/bin/adminpass > $TmpFile
cat /p4/common/bin/adminpass >> $TmpFile

$P4BIN -u bruno passwd $P4USER < $TmpFile

runCmd "/p4/common/bin/p4login" "Logging in $P4USER super user." ||\
   bail "Failed to login super user $P4USER. Aborting."

# Variable     Format                              Samples
# P4PORT       [ssl:]<HostIp>:<P4DPortNum>         ssl:192.168.1.3:1999
# P4DPORT      [ssl:]<P4DPortNum>                  ssl:1999, 1999
# P4BROKERPORT [ssl:]<BrokerPort>                  ssl:1666, 1666
for p in $P4PORT $P4DPORT $P4BROKERPORT; do
   if [[ $p == "ssl:"* ]]; then
      runCmd "$P4BIN -p $p trust -y" "Trusting P4PORT=$p." ||\
         bail "Failed to trust P4PORT=$p."
   fi
   cmd="$P4BIN -u $P4USER -p $p login -a"
   echo "Running: $cmd < /p4/common/bin/adminpass"
   $cmd < /p4/common/bin/adminpass ||\
      bail "Login as perforce using P4PORT=$p failed.  Aborting."
done

runCmd "cat $P4TICKETS" "Showing P4TICKETS:"

runCmd "$ResetTarget/sdp/Server/setup/configure_new_server.sh $SDPInstance" \
   "Applying SDP configurables." ||\
   bail "Failed to set SDP configurables. Aborting."

runCmd "$P4BIN admin updatespecdepot -a" \
   "Updating spec depot." || bail "Failed to udpate spec depot. Aborting."

for depot in $(/bin/ls -d $ResetTarget/downloads/PerforceSample/*); do
   [[ $depot == *"checkpoint"* ]] && continue
   [[ $depot == *"README"* ]] && continue
   [[ $depot == *"readme"* ]] && continue
   if [[ $depot == *"spec"* ]]; then
      runCmd "/usr/bin/rsync -a $depot/ /p4/$SDPInstance/depots/${depot##*/}" \
         "Copying Sample Depot archive files for spec depot [${depot##*/}]." ||\
         echo -e "\nWarning: Non-zero exit code $? from rsync for depot ${depot##*/}."
   else
      runCmd "/usr/bin/rsync -a --delete $depot/ /p4/$SDPInstance/depots/${depot##*/}" \
         "Copying Sample Depot archive files for depot [${depot##*/}]." ||\
         echo -e "\nWarning: Non-zero exit code $? from rsync for depot ${depot##*/}."
   fi
done

runCmd "/usr/bin/rsync -a --delete /p4/$SDPInstance/root/spec/ /p4/$SDPInstance/depots/spec" \
   "Copying a few spec depot files." ||\
   echo -e "\nWarning: Non-zero exit code $? from rsync for spec depot."

runCmd "/bin/rm -rf /p4/$SDPInstance/root/spec" \
   "Cleanup redundant copy of spec depot files." ||:

runCmd "/p4/common/bin/live_checkpoint.sh $SDPInstance" \
   "Taking Live Checkpoint." || bail "Live checkpoint failed. Aborting."

[[ $BackupDir == Unset ]] && BackupDir=/p4/$SDPInstance/backup

if [[ -d $BackupDir ]]; then
    runCmd "/bin/rm -rf $BackupDir" \
       "Removing old backup dir [$BackupDir]."
fi

if [[ ! -d $BackupDir ]]; then
   runCmd "/bin/mkdir -p $BackupDir" \
      "Creating new empty backups directory: $BackupDir." ||\
      bail "Failed to create backups dir [$BackupDir]. Aborting."
fi

BackupFile=$BackupDir/p4_$SDPInstance.backup.$(date +'%Y-%m-%d-%H%M').tgz
LastCheckpoint=$(ls -1 -t /p4/$SDPInstance/checkpoints/p4_${SDPInstance}.ckp.*.gz 2>/dev/null)
BackupPaths="/p4/${SDPInstance}/depots"
[[ -n "$LastCheckpoint" ]] && BackupPaths="$BackupPaths $LastCheckpoint"

runCmd "tar -czf $BackupFile $BackupPaths" \
   "Creating backup $BackupFile." ||\
   bail "Failed to backup instance $SDPInstance. Aborting."

echo -e "\nSUCCESS:  SDP Instance $SDPInstance loaded with sample depot data, live checkpoint done, and backup created.  Good to go!\n"

exit 0
# Change User Description Committed
#25 28409 C. Thomas Tyler Tweaked configure_sample_depot_for_sdp.sh to avoid generating SSL
certs if they already exist.
#24 28120 C. Thomas Tyler Added -no_systemd option to avoid using systemd.

This is useful for operating in containerized test environments
where systemd is not available.
#23 27418 C. Thomas Tyler configure_sample_depot_for_sdp.sh works with non-default /hxdepots dir.
#22 27373 C. Thomas Tyler Adjusted to work even when neither systemd nor the SysV init mechanisms
are present (e.g. for Mac OSX).
#21 27226 C. Thomas Tyler Fixed test suite issue; consecutive runs got Permission denied for 'mv'.

The command 'mv configure_new_servers.sh configure_new_servers.sh.orig'
would fail with a Permission denied error test runs after the first.
#20 27163 C. Thomas Tyler Removed dead code related to un-implemented '-n' (NoOp) feature.
#19 27162 C. Thomas Tyler Fixed issue with detection of server being online when SSL enabled.

The p4d and p4broker servers would not be seen as online if trust
needed to be established for SSL-enabled setup.
#18 27160 C. Thomas Tyler Upgraded so that, in event of failure to start p4d or p4broker,
addtional info is displayed in the abort message.
#17 27106 C. Thomas Tyler configure_sample_depot.sh v1.7.3.
Added wait loop to way for p4d service start when configuring the
SDP Sample Depot, to improve overall robustness.  Wait loop has a
max delay of 120 seconds.
#16 26770 C. Thomas Tyler Fixed server startup call on RHEL/CentOS 6.
#15 26570 C. Thomas Tyler Refined output in several spots.
#14 26569 C. Thomas Tyler Refined service start logic to use SysV or systemd if available.

Updated for shellcheck compliance.
#13 26019 C. Thomas Tyler Enabled Sample Depot install with non-default OSUSER.
#12 25816 C. Thomas Tyler Typo fix in comment.
#11 25814 C. Thomas Tyler Made configure_sample_depot_for_sdp.sh shellcheck v0.6.0 compliant.
#10 22294 C. Thomas Tyler Routine merge down to dev from main.
#9 22289 C. Thomas Tyler Routine merge down to dev from main.
#8 22192 C. Thomas Tyler Routine merge down to dev from main.
#7 21833 C. Thomas Tyler Routine Merge Down to dev from main for Helix Installer.
#6 21502 C. Thomas Tyler Routine merge down to dev from main.
#5 21351 C. Thomas Tyler Merge Down to dev from main.
#4 20484 C. Thomas Tyler Routine Merge Down to dev from main.
#3 19364 C. Thomas Tyler Routine merge down to dev from main using:
p4 merge -b perforce_software-helix-installer-dev
#2 19315 C. Thomas Tyler Routine Merge Down to dev from main for helix-installer.
#1 19232 C. Thomas Tyler Populate -b perforce_software-helix-installer-dev.
//guest/perforce_software/helix-installer/main/src/configure_sample_depot_for_sdp.sh
#1 19230 C. Thomas Tyler Populate -o //guest/tom_tyler/helix-installer/...
//guest/perforce_software/helix-installer/....
//guest/tom_tyler/helix-installer/main/src/configure_sample_depot_for_sdp.sh
#7 16606 C. Thomas Tyler Improved handling of simulated mail from SDP scripts, so that
live_checkpoint succeeds on all platforms; it had failed
previosuly on Mac/Darwin due to failure sending email.

Improved backup handling.
#6 16603 C. Thomas Tyler Fixed issue working with SSL-enabled servers.
#5 16403 C. Thomas Tyler Added comments detailing various SDP 'p4 login' calls;
tweaked calls.
#4 16398 C. Thomas Tyler Added 'p4d -xu' to upgrade databases.
#3 16394 C. Thomas Tyler Added logins with various ways P4PORT may be specified.
#2 16360 C. Thomas Tyler Minor code and copyright cleanup.
#1 15829 C. Thomas Tyler Moved Helix Installer to new Workshop Standard
for personal projects.
//guest/tom_tyler/sw/main/hi/src/configure_sample_depot_for_sdp.sh
#16 15060 C. Thomas Tyler Rollback of Copy Up done with a new utility that apparently needs some work.
#15 15051 C. Thomas Tyler Copy Up using 'p4 copy -r -b tom_tyler-hi-dev'
#14 14987 C. Thomas Tyler Reduced excessive noise from from rsync and tar commands.

Added '--delete' to rsync commands handling the Sample Depot
to force a clean reset.

Added clear completion messages.
#13 14985 C. Thomas Tyler Added exit 0 to keep Vagrant happy.
#12 14982 C. Thomas Tyler Fixed embarrasing typo.
#11 14974 C. Thomas Tyler Fixed issues handling non-SSL servers.
#10 14972 C. Thomas Tyler Doc tweaks.
#9 14961 C. Thomas Tyler Fixed optimization to avoid bogus rsync commands.
#8 14958 C. Thomas Tyler Modified to do 'p4 trust' and 'p4 info' via-broker in addition to direct.
#7 14957 C. Thomas Tyler Fixed 'tar' command, now cross-platform smart and PATH-dependent.
#6 14955 C. Thomas Tyler Made 'sed' PATH-dependent, removing hard coding.
#5 14120 C. Thomas Tyler Moved sample depot checkpoint load to configurator script.
Added '-fast' flag to speed up testing.
Various minor tweaks.
#4 14109 C. Thomas Tyler Tweaked copy of spec depot files to get a clean verify.
Added detection of rsync failure.
#3 14106 C. Thomas Tyler Implemented Sample Depot SDP configurator script.

Tightened logic around process kill statement, and made it
work for Linux/Mac.
#2 14062 C. Thomas Tyler Added super user and set password.
#1 14033 C. Thomas Tyler Added script to transform stock Sample Depot data set to be
SDP compliant (mostly a stub at this point).  Various improvements
to reset_sdp.sh and the wrapper r.sh.