p4d_base #23

  • //
  • guest/
  • perforce_software/
  • sdp/
  • main/
  • Server/
  • Unix/
  • p4/
  • common/
  • bin/
  • p4d_base
  • View
  • Commits
  • Open Download .zip Download (7 KB)
#!/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}"
declare -i StartDelay="${SDP_START_DELAY:-2}"
declare -i ExitCode=0

if [[ "$SDP_INSTANCE" == Unset ]]; then
   echo -e "\\nError: The SDP_INSTANCE is not defined.\\n."
   exit 1
fi

# Load SDP controlled shell environment.
# shellcheck disable=SC1091
source /p4/common/bin/p4_vars "$SDP_INSTANCE"
ExitCode="$?"

if [[ "$ExitCode" -ne 0 ]]; then
   echo -e "\\nError: Failed to load SDP environment for instance $SDP_INSTANCE.\\n"
   exit 1
fi

# shellcheck disable=SC1090
source "$P4CBIN/backup_functions.sh"
ExitCode="$?"

if [[ "$ExitCode" -ne 0 ]]; then
   echo -e "\\nError: Failed to load SDP lib $P4CBIN/backup_functions.sh.\\n"
   exit 1
fi

LOGFILE="$LOGS/p4d_init.log"
THISSCRIPT="${0##*/}"
CMDLINE="$0 $*"
set_vars

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

# For P4D 2017.1+, automatically replace '-d' with '--daemonsafe'.
# Disable shellcheck as we intend a string compare even though it looks like
# we're trying to compare a decimal value.
# shellcheck disable=SC2072
if [[ "$P4D_VERSION" > "2017.1" ]]; then
   export P4D_FLAGS=${P4D_FLAGS/ -d / --daemonsafe }
fi

log "\\nCalled $THISSCRIPT called with command line:\\n$CMDLINE"

# See how we were called.
case "${2:-usage}" in
   force_start)
      echo "Starting $P4DBIN $P4D_FLAGS" | tee -a "$LOGFILE"
      # Delay start $StartDelay seconds, unless P4ROOT is empty.
      [[ -r "$P4ROOT/db.domain" ]] && sleep "$StartDelay"

      # shellcheck disable=SC2086
      "$P4DBIN" $P4D_FLAGS >> "$LOGFILE" 2>&1
   ;;

   start)
      if [[ -r "$P4ROOT/db.domain" ]]; then
         echo "Preflight check: $P4DBIN -r $P4ROOT -xvU" | tee -a "$LOGFILE"
         "$P4DBIN" -r "$P4ROOT" -xvU >> "$LOGFILE" 2>&1
         ExitCode="$?"
         echo "EXIT_CODE=$ExitCode" >> "$LOGFILE"

         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 available, but not recommended.  Review this file:\\n$LOGFILE\\n" | tee -a "$LOGFILE"
            exit 1
         fi

         echo "Preflight journal corruption check" | tee -a "$LOGFILE"
         mytmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')
         tail -10000 "$P4JOURNAL" | grep -v "@vv@" > "$mytmpdir/jnl.test"
         "$P4DBIN" -r "$mytmpdir" -f -jr "$mytmpdir/jnl.test" >> "$LOGFILE" 2>&1
         ExitCode=$?
         echo "EXIT_CODE=$ExitCode" >> "$LOGFILE"
         if [[ "$ExitCode" -ne 0 ]]; then
            echo -e "\\nError: Corrupt end of journal detected. Journal is being rotated so corruption is at end of file. Please Contact Perforce Support (support@perforce.com).  Server is still being started as normal. NOTE All replicas will likely stop replicating until this is fixed!!!! Review this file:\\n$LOGFILE\\n" | tee -a "$LOGFILE"
            get_journalnum
            p4d_truncate_journal
            subject="ERROR!!! - $HOSTNAME $P4SERVER Journal corruption detected."
            mail_sender_opt=$(get_mail_sender_opt)
            echo "Sending mail: $SDPMAIL -s $subject $mail_sender_opt $MAILTO" | tee -a "$LOGFILE"
            "$SDPMAIL" -s "$subject" "$mail_sender_opt" "$MAILTO" < "$LOGFILE"
         fi
      fi

      echo "Starting $P4DBIN $P4D_FLAGS" | tee -a "$LOGFILE"

      # Delay start $StartDelay seconds, unless P4ROOT is empty.
      [[ -r "$P4ROOT/db.domain" ]] && sleep "$StartDelay"

      # shellcheck disable=SC2086
      "$P4DBIN" $P4D_FLAGS >> "$LOGFILE" 2>&1
   ;;

   status)
      if [[ -r "$P4ROOT/server.pid" ]]; then
         pid=$(cat "$P4ROOT/server.pid")
         echo -e "\\nThe $P4ROOT/server.pid file contains pid $pid.  Pid info:" | tee -a "$LOGFILE"
         "$PS" -f -p "$pid" > /dev/null 2>&1 | tee -a "$LOGFILE"
         ExitCode="$?"

         if [[ "$ExitCode" -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" | tee -a "$LOGFILE"
         fi
      fi

      "$P4BIN" -p "$P4PORT" -u "$P4USER" info -s 2>&1 | tee -a "$LOGFILE"
   ;;

   admin_stop)
      # If there is no server.pid file, shut down the old fashioned way.
      echo -n "Shutting down $P4DBIN: " | tee -a "$LOGFILE"
      if [[ "${P4REPLICA}" == "FALSE" ]]; then
         "$P4CBIN/p4login"
      fi
      echo "$P4BIN -p $P4PORT -u $P4USER admin stop" | tee -a "$LOGFILE"
      "$P4BIN" -p "$P4PORT" -u "$P4USER" admin stop 2>&1 | tee -a "$LOGFILE"
      sleep 5
      "$P4BIN" -p "$P4PORT" info > /dev/null 2>&1
      ExitCode="$?"
      if [[ "$ExitCode" -eq 0 ]]; then
         echo -e "\\nError: Server shutdown failed." | tee -a "$LOGFILE"
         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." | tee -a "$LOGFILE"
            kill "$pid" 2>&1 | tee -a "$LOGFILE"
            sleep 1

            "$PS" -p "$pid" > /dev/null 2>&1
            status=$?

            if [[ $status -eq 0 ]]; then
               echo -n "Waiting for p4d to shutdown ..." | tee -a "$LOGFILE"

               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." | tee -a "$LOGFILE"
         else
            echo -e "\\nError: A server.pid file exists, but that process id is not running.  This could indicate abnormal process termination.\\n" | tee -a "$LOGFILE"
            exit 1
         fi
      else
         echo -e "\\nWarning: Missing $P4ROOT/server.pid. Attempting shutdown with 'p4 admin stop'.\\n" | tee -a "$LOGFILE"
         echo "$0" "$SDP_INSTANCE" admin_stop | tee -a "$LOGFILE"
         $0 "$SDP_INSTANCE" admin_stop 2>&1 | tee -a "$LOGFILE"
      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

# Change User Description Committed
#32 31566 C. Thomas Tyler Released SDP 2024.2.31564 (2025/05/14).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#31 31077 C. Thomas Tyler Released SDP 2024.2.31075 (2024/12/20).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#30 30297 C. Thomas Tyler Released SDP 2023.2.30295 (2024/05/08).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#29 29143 C. Thomas Tyler Released SDP 2022.1.29141 (2022/10/29).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#28 28989 C. Thomas Tyler Released SDP 2022.1.28987 (2022/08/25).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#27 28858 C. Thomas Tyler Released SDP 2022.1.28855 (2022/05/27).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#26 28412 C. Thomas Tyler Released SDP 2021.2.28410 (2021/11/24).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#25 27958 C. Thomas Tyler Released SDP 2020.1.27955 (Patch 12, 2021/08/13).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev',
with selective removal of work-in-progress files.
#24 27331 C. Thomas Tyler Released SDP 2020.1.27325 (2021/01/29).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#23 26403 C. Thomas Tyler Released SDP 2019.3.26400 (2020/03/28).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#22 26161 C. Thomas Tyler Released SDP 2019.3.26159 (2019/11/06).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#21 25483 C. Thomas Tyler Released SDP 2019.1.25480 (2019/04/11).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#20 25245 C. Thomas Tyler Released SDP 2019.1.25238 (2019/03/02).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#19 23510 C. Thomas Tyler Released SDP 2018.1.23504 (2018/01/19).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev',
with selective removal of work-in-progress files.
#18 23331 C. Thomas Tyler Released SDP 2017.4.23329 (2017/12/05).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#17 23044 C. Thomas Tyler Released SDP 2017.3.23041 (2017/10/24).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#16 22685 Russell C. Jackson (Rusty) Update main with current changes from dev.
#15 20565 C. Thomas Tyler Released SDP 2016.1.20559 (2016/09/14).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev',
with selective removal of work-in-progress files.
#14 20519 C. Thomas Tyler Released SDP 2016.1.20491 (2016/09/09).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev',
with selective removal of work-in-progress files.
#13 20481 C. Thomas Tyler Released SDP 2016.1.20460.

          Copy Up using 'p4 copy -r -b perforce_software-sdp-dev',
          with selective removal of changes related to work-in-progress files.
#12 20353 C. Thomas Tyler Released SDP 2016.1.20348.
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev',
with selective removal of changes related to work-in-progress
changes.
#11 18688 Russell C. Jackson (Rusty) Copy dev to main
#10 17315 C. Thomas Tyler Released SDP/MultiArch/2016.1/17297 (2016/02/03).

Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#9 16263 Russell C. Jackson (Rusty) Added shutdown check to init script and used it in weekly_sync_replica.
#8 15856 C. Thomas Tyler Replaced the big license comment block with a shortened
form referencing the LICENSE file included with the SDP
package, and also by the URL for the license file in
The Workshop.
#7 15777 C. Thomas Tyler No functional changes.

Style Policing only on bash scripts only.

Normalized indentation and line breaks, removed offending tabs, and general whitespace
usage.
#6 15776 C. Thomas Tyler Fixed a typo, a spurious back-tick (`) character that somehow
snuck in.  Also fixed some tab/whitespace inconsistency issues.
#5 15775 Russell C. Jackson (Rusty) Added test to only login on a master
#4 13908 C. Thomas Tyler Pushing SDP 2015.1.13906.
#3 12171 Russell C. Jackson (Rusty) Merge in changes to remove the need for p4master_run.
#2 11524 Russell C. Jackson (Rusty) Released updated version of the SDP from Dev.
#1 10148 C. Thomas Tyler Promoted the Perforce Server Deployment Package to The Workshop.