#!/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 #------------------------------------------------------------------------------ # P4Web base init script # Do nothing unless $SDP_INSTANCE is defined. export SDP_INSTANCE="${1:-Unset}" export OS_INIT_MECHANISM="${OS_INIT_MECHANISM:-Unset}" declare -i StartDelay="${SDP_START_DELAY:-2}" declare -i UseSystemd=0 declare MustUseSystemdMsg= # p4web must run as root if the listen port is 1024 or less, e.g. to run on port 80. declare -i RunAsRoot=0 declare Log= if [[ $SDP_INSTANCE == Unset ]]; then echo -e "\\nError: The SDP_INSTANCE is not defined.\\n" exit 1 fi export P4WEBBIN="/p4/${SDP_INSTANCE:-1}/bin/p4web_${SDP_INSTANCE:-1}" export P4WEBLOG="/p4/${SDP_INSTANCE:-1}/logs/p4web.log" Log="/p4/${SDP_INSTANCE:-1}/logs/p4web.init.log" # Load SDP controlled shell environment. # shellcheck disable=SC1091 source /p4/common/bin/p4_vars "$SDP_INSTANCE" || { echo -e "\\nError: Failed to load SDP environment for instance $SDP_INSTANCE.\\n" exit 1 } # Added support for optional P4WEB_USER setting. If set, P4USER will be set # to this user before starting the p4web service. This is recommended, as it # prevents p4web from possibly logging out the primary super user that # operates checkpoints. If defined, the user should also be added to # SDP_AUTOMATION_USERS defined in the Instance Vars file, i.e. the p4_N.vars # file in /p4/common/config. This change is done in a way to avoid disrupting # existing installations. To use the feature, do something like this, # replacing N with the SDP instance name: # # source /p4/common/bin/p4_vars N # echo P4WEB_USER=p4web >> /p4/common/site/config/$P4HOME.local [[ -n "${P4WEB_USER:-}" ]] && export P4USER="$P4WEB_USER" export P4WEBPORT=${P4WEBPORT:-8080} export P4WEBPORTNUM=${P4WEBPORT##*:} if [[ "$P4WEBPORTNUM" =~ ^[0-9]+$ ]]; then if [[ "$P4WEBPORTNUM" -le 1024 ]]; then export P4WEBARGS="-B -p $P4PORT -w $P4WEBPORT -U $OSUSER -L $P4WEBLOG" RunAsRoot=1 else export P4WEBARGS="-B -p $P4PORT -w $P4WEBPORT -L $P4WEBLOG" fi else echo -e "\\nError: The P4WEBPORTNUM value [$P4WEBPORTNUM] derived from P4WEBPORT [$P4WEBPORT] must be purely numeric.\\n" exit 1 fi # shellcheck disable=SC1091 source "$P4CBIN/ps_functions.sh" || { echo -e "\\nError: Failed to load SDP ps_functions.sh lib.\\n" exit 1 } # Determine if systemd is configured for this instance. if [[ -n "$(command -v systemctl)" ]]; then ServiceName="${P4WEBBIN##*/}" if [[ -n "$(systemctl is-enabled "$ServiceName" 2>/dev/null)" ]]; then UseSystemd=1 MustUseSystemdMsg="\\nError: It appears an attempt was made to start or stop the $ServiceName\\nservice without using systemd. When a systemd unit file is configured, only the\\nsystemd init mechanism can be used to start and stop the service, so that\\nsystemd maintains a more reliable indication of the status of the service. Run\\nas root or as $OSUSER with sudo. For example:\\n\\n\\tsudo systemctl start $ServiceName\\n\\tsudo systemctl stop $ServiceName\\n\\tsystemctl status $ServiceName\\n\\nNote that the 'status' check does not require sudo.\\n\\nThe systemd unit file is:\\n\\n<<<<<<<<\\n$(sudo systemctl cat "$ServiceName")\\n>>>>>>>\\n\\nIf you used 'systemctl' and still got this message, then please check if OS_INIT_MECHANISM is defined\\nin the above file." fi fi if [[ $(id -u) -eq 0 ]]; then if [[ "$RunAsRoot" -eq 0 ]]; then exec su - "$OSUSER" -c "$0 $*" fi elif [[ $(id -u -n) != "$OSUSER" ]]; then if [[ "$RunAsRoot" -eq 1 ]]; then echo -e "\\nError: Running as $(id -u -n), but $0 can only be run as root because the port number is $P4WEBPORTNUM (less than 1024 requires root).\\n" exit 1 else echo -e "\\nError: Running as $(id -u -n), but $0 can only be run as root or $OSUSER.\\n" exit 1 fi else if [[ "$RunAsRoot" -eq 1 ]]; then echo -e "\\nError: Running as $(id -u -n), but $0 can only be run as root because the port number is $P4WEBPORTNUM (less than 1024 requires root).\\n" exit 1 fi fi # See how we were called. case "${2:-usage}" in start) if [[ "$UseSystemd" -eq 1 && "$OS_INIT_MECHANISM" != "systemd" ]]; then echo -e "$MustUseSystemdMsg" exit 1 fi # Delay start $StartDelay seconds, for enhanced start reliability after reboot. sleep "$StartDelay" if [[ "$UseSystemd" -eq 1 ]]; then echo -e "$(date +'%Y-%m-%d-%H%M%S'): Starting $P4WEBBIN with:\\n\\t$P4WEBBIN $P4WEBARGS" # shellcheck disable=SC2086 $P4WEBBIN $P4WEBARGS >> "$Log" 2>&1 else echo -e "$(date +'%Y-%m-%d-%H%M%S'): Starting $P4WEBBIN with:\\n\\t$P4WEBBIN $P4WEBARGS &" >> "$Log" 2>&1 # shellcheck disable=SC2086 $P4WEBBIN $P4WEBARGS >> "$Log" 2>&1 & fi ;; status) p4web_pids=$(get_pids "$P4WEBBIN") if [[ -n "$p4web_pids" ]]; then echo "${P4WEBBIN} is running as pids: $p4web_pids." exit 0 else echo "${P4WEBBIN} is NOT running." exit 1 fi ;; stop) p4web_pids=$(get_pids "$P4WEBBIN") if [[ -n "$p4web_pids" ]]; then while [[ -n "$p4web_pids" ]]; do echo "Shutting down ${P4WEBBIN} pids: $p4web_pids." echo "Shutting down ${P4WEBBIN} pids: $p4web_pids." >> "$Log" 2>&1 # shellcheck disable=SC2086 kill $p4web_pids 2>&1 | $GREP -v -i "No such" sleep 1 p4web_pids=$(get_pids "$P4WEBBIN") done echo "${P4WEBBIN} stopped." exit 0 else echo "${P4WEBBIN} was NOT running." exit 1 fi ;; restart) $0 "$SDP_INSTANCE" stop $0 "$SDP_INSTANCE" start ;; *) echo -e "\\nUsage: $0 SDP_INSTANCE {start|stop|status|restart}\\n" exit 1 ;; esac exit 0