#!/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/perforce_software/helix-installer/main/LICENSE #------------------------------------------------------------------------------ set -u #------------------------------------------------------------------------------ # Declarations declare Version=1.4.5 declare ResetTarget=/hxdepots 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=Unset declare PasswordFile= #------------------------------------------------------------------------------ # 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 == Unset ]] && \ 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 PasswordFile=$P4CCFG/.p4passwd.${P4SERVER}.admin 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 $PasswordFile > $TmpFile cat $PasswordFile >> $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 Sample Values # P4PORT [ssl:]<P4DPortNum> ssl:1999, 1999 # P4BROKERPORT [ssl:]<BrokerPort> ssl:1666, 1666 for p in $P4PORT $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 < $PasswordFile" $cmd < $PasswordFile ||\ bail "Login as perforce using P4PORT=$p failed. Aborting." done runCmd "cat $P4TICKETS" "Showing P4TICKETS:" runCmd "cp $ResetTarget/sdp/Server/setup/*.p4s ." \ "Copying spec files from SDP server setup area." ||\ bail "Failed to copy *.p4s spec files from SDP server area [$ResetTarget/sdp/Server/setup/]." runCmd "$ResetTarget/sdp/Server/setup/configure_new_server.sh $SDPInstance" \ "Applying SDP configurables." ||\ bail "Failed to set SDP configurables. 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 "$P4BIN admin updatespecdepot -a" \ "Updating spec depot." || bail "Failed to udpate spec depot. Aborting." runCmd "/usr/bin/rsync -a /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. |