#!/bin/bash #============================================================================== # Copyright and license info is available in the LICENSE file included with # the Server Deployment Package (SDP), and also available online: # https://swarm.workshop.perforce.com/projects/perforce-software-sdp/view/main/LICENSE #------------------------------------------------------------------------------ # Helix Server base init script # Do nothing unless $SDP_INSTANCE is defined. export SDP_INSTANCE=${1:-Unset} if [[ $SDP_INSTANCE == Unset ]]; then echo -e "\nError: The SDP_INSTANCE is not defined.\n." exit 1 fi # Load SDP controlled shell environment. source /p4/common/bin/p4_vars "$SDP_INSTANCE" if [[ $? -ne 0 ]]; then echo -e "\nError: Failed to load SDP environment for instance $SDP_INSTANCE.\n" exit 1 fi if [[ $(id -u) -eq 0 ]]; then exec su - $OSUSER -c "$0 $*" elif [[ $(id -u -n) != $OSUSER ]]; then echo "$0 can only be run by root or $OSUSER" exit 1 fi if [[ ! -x $P4DBIN ]]; then echo -e "\nError: $P4DBIN is not executable." exit 2; fi # Ensure that the '--pid-file' argument is provided, and add it if it is not. # This is intended to prevent problems upgrading the SDP in case the # /p4/common/config/p4_N.vars file isn't updated to use the new template. if [[ "$P4D_FLAGS" != *"--pid-file"* ]]; then export P4D_FLAGS="$P4D_FLAGS --pid-file" fi # See how we were called. case "${2:-status}" in force_start) echo "Starting $P4DBIN $P4D_FLAGS" $P4DBIN $P4D_FLAGS ;; start) if [[ -r $P4ROOT/db.domain ]]; then PreflightLog=${P4TMP}/preflight.log $P4DBIN -r $P4ROOT -xvU > $PreflightLog 2>&1 ExitCode=$? echo EXIT_CODE=$ExitCode >> $PreflightLog if [[ $ExitCode -ne 0 ]]; then echo -e "\nError: DB check with 'p4d -xvU' failed. Database integrity is in question. Please Contact Perforce Support (support@perforce.com). The force_start option is availble, but not recommended. See:\n" cat $PreflightLog /bin/rm -f $PreflightLog exit 1 else /bin/rm -f $PreflightLog fi fi # Setting P4JOURNAL in the database to $P4JOURNAL. $P4DBIN -r $P4ROOT "-cset P4JOURNAL=$P4JOURNAL" echo "Starting $P4DBIN $P4D_FLAGS" $P4DBIN $P4D_FLAGS ;; status) if [[ -r $P4ROOT/server.pid ]]; then pid=$(cat $P4ROOT/server.pid) echo -e "\nThe $P4ROOT/server.pid file contains pid $pid. Pid info:" $PS -f -p $pid echo if [[ $? -ne 0 ]]; then echo -e "\nError: A server.pid file exists, but that process id is not running. This could indicate abnormal process termination.\n" fi fi $P4BIN -p $P4PORT -u $P4USER info -s ;; admin_stop) # If there is no server.pid file, shut down the old fashioned way. echo -n "Shutting down $P4DBIN: " if [[ "${P4REPLICA}" == "FALSE" ]]; then $P4BIN -p $P4PORT -u $P4USER login < /p4/common/config/.p4passwd.${P4SERVER}.admin fi $P4BIN -p $P4PORT -u $P4USER admin stop sleep 5 $P4BIN -p $P4PORT info > /dev/null 2>&1 ExitCode=$? if [[ $ExitCode -eq 0 ]]; then echo -e "\nError: Server shutdown failed." exit 1 else exit 0 fi ;; stop) if [[ -r $P4ROOT/server.pid ]]; then pid=$(cat $P4ROOT/server.pid) $PS -p $pid > /dev/null 2>&1 status=$? if [[ $status -eq 0 ]]; then echo -e "\nSending SIGTERM signal to pid $pid in $P4ROOT/server.pid." kill $pid sleep 1 $PS -p $pid > /dev/null 2>&1 status=$? if [[ $status -eq 0 ]]; then echo -n "Waiting for p4d to shutdown ..." while [[ $status -eq 0 ]]; do echo -n "." sleep 5 $PS -p $pid > /dev/null 2>&1 status=$? done fi echo -e "\nConfirmed shutdown of $P4DBIN." else echo -e "\nError: A server.pid file exists, but that process id is not running. This could indicate abnormal process termination.\n" exit 1 fi else echo -e "\nWarning: Missing $P4ROOT/server.pid. Attempting shtudown with 'p4 admin stop'.\n" $0 $SDP_INSTANCE admin_stop fi ;; restart) $0 $SDP_INSTANCE stop $0 $SDP_INSTANCE start ;; *) echo -e "\nUsage: $0 SDP_INSTANCE {start|stop|admin_stop|status|restart|force_start}\n" exit 1 ;; esac exit 0