summaryrefslogtreecommitdiffstats
path: root/multimedia/sickchill/rc.sickchill
blob: f36eb79604e7ff9bac938bbf37073fe1306041e4 (plain)
#!/bin/bash

# Start/stop/restart sickchill.

# Originally created for sickrage in 2016
# Updated to sickchill in 2023

# Copyright 2016-2024  Jeremy Hansen <jebrhansen+SBo@gmail.com>
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
#  EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
#  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Set program name in case you want to run sick{beard|rage|gear|etc}
PROG=${PROG:-sickchill}

# If you want to have multiple instances of sickchill running, set
# the suffix here.
SUFFIX=

# Set the full program name for folders
if [ -n "$SUFFIX" ]; then
  FULLPROG="$PROG-$SUFFIX"
# Just use $PROG if there isn't a suffix set
else
  FULLPROG="$PROG"
fi

# Source SickRage configuration
if [ -f /etc/"$FULLPROG".conf ]; then
        . /etc/"$FULLPROG".conf
fi

# Ensure all required variables are set in conf file
# Edit conf file in /etc/$PROG-$SUFFIX.conf for any changes
MISSING=0
for var in USERNAME HOMEDIR DATADIR PIDFILE PORT; do
  if [ -z "${!var}" ]; then
    ((MISSING++))
    VAR="$var $VAR"
  fi
done
if [ $MISSING -gt 0 ]; then
  echo "/etc/$FULLPROG.conf is missing some or all required variables ($VAR)."
  echo "Please check the file and try again."
fi

# Check if the program is running and pid file exists
check()
{
  if pgrep "$PROG" > /dev/null; then
    # Check if the pidfile matches the running pid
    if [ -e "$PIDFILE" ] && pgrep -f "$PIDFILE" > /dev/null; then
      STATUS=running
    else
      # Check if the program is running without the pid file matching
      if pgrep -f "$FULLPROG.*$PORT" > /dev/null; then
        STATUS=broken
        echo "WARNING: $FULLPROG is running without the correct pid file."
        echo "Did you start it without using the rc.$FULLPROG?"
      else
        STATUS=stopped
      fi
    fi
  else
    STATUS=stopped
  fi
}

status()
{
  if [ $STATUS == "running" ]; then
    echo "$FULLPROG currently running."
  elif [ $STATUS == "stopped" ]; then
    echo "$FULLPROG not running."
  elif [ $STATUS == "broken" ]; then
    echo "Please fix the issue before attempting to run $(basename "$0") again."
  else
    echo "Status unknown."
  fi
}

start()
{
  if [ $STATUS == "stopped" ]; then
    echo -n "Starting $PROG: "
    if su "$USERNAME" -s /bin/sh -c "/usr/bin/${PROG} --daemon --pidfile=${PIDFILE} --datadir=${DATADIR} --port=${PORT} &> /dev/null"; then
      echo "Startup Successful"
    else
      su "$USERNAME" -s /bin/sh -c "/usr/bin/${PROG} --daemon --pidfile=${PIDFILE} --datadir=${DATADIR} --port=${PORT}"
      echo "Startup Failed. The following command is what produced the failure:"
      echo "su $USERNAME -s /bin/sh -c \"/usr/bin/${PROG} --daemon --pidfile=${PIDFILE} --datadir=${DATADIR} --port=${PORT}\""
    fi
  else
    status
  fi
}

stop()
{
  if [ $STATUS == "stopped" ]; then
    echo "$PROG doesn't seem to be running. Please try running"
    echo "$0 start"
  elif [ $STATUS == "broken" ]; then
    echo "Cannot stop. Please correct issue and try again."
  else
    if [ "$EUID" -ne 0 ];then
      echo "Please run as root"
      exit 1
    fi
    # sickchill can take some time to properly shut down.
    # It takes more than 10 seconds on my system top properly close.
    # If it doesn't close by the timeout, force close it.
    TIMEOUT=15
    echo -n $"Giving $PROG $TIMEOUT seconds to shut down: "
    curl -s http://localhost:"$PORT"/home/shutdown/?pid="$(cat "$PIDFILE")" | grep -q "shutting down"
    for (( COUNT=0; COUNT <= TIMEOUT; COUNT++ )); do
      if pgrep -f "$FULLPROG.*$PORT" > /dev/null; then
        SHUTDOWN=success
        break
      fi
      sleep 1
    done
    if [ "$SHUTDOWN" == "success" ]; then
      echo "Shutdown successful."
    else
      echo "Normal Shutdown Failed - Attempting to kill the process."
      sleep 7
      pkill -9 -F "$PIDFILE"
    fi
  fi
}

case "$1" in
  start)
        check
        start
        ;;
  stop)
        check
        stop
        ;;
  restart)
        check
        stop
        sleep 1
        check
        start
        ;;
  status)
        check
        status
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
esac