From 8d70a7eed3da547d62c7e433a02c9bb8e54f51a9 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Sat, 7 Jan 2023 18:31:25 +0100 Subject: [PATCH] add mrc start scripts --- mrc/install.sh | 11 ++++++++ mrc/mrc-start.sh | 45 +++++++++++++++++++++++++++++++++ mrc/mrc-stop.sh | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ mrc/mrc.service | 31 +++++++++++++++++++++++ 4 files changed, 152 insertions(+) create mode 100644 mrc/install.sh create mode 100755 mrc/mrc-start.sh create mode 100755 mrc/mrc-stop.sh create mode 100644 mrc/mrc.service diff --git a/mrc/install.sh b/mrc/install.sh new file mode 100644 index 0000000..97afaab --- /dev/null +++ b/mrc/install.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +MYSTIC_DIR="$1" + +sed -e "s!@MYSTIC_DIR@!${MYSTIC_DIR}!g" mrc-start.sh > ${MYSTIC_DIR}/mrc-start +chmod +x ${MYSTIC_DIR}/mrc-start +sed -e "s!@MYSTIC_DIR@!${MYSTIC_DIR}!g" mrc-stop.sh > ${MYSTIC_DIR}/mrc-stop +chmod +x ${MYSTIC_DIR}/mrc-stop +sed -e "s!@MYSTIC_DIR@!${MYSTIC_DIR}!g" mrc.service > /etc/systemd/system/mrc.service +systemctl daemon-reload + diff --git a/mrc/mrc-start.sh b/mrc/mrc-start.sh new file mode 100755 index 0000000..6f45c60 --- /dev/null +++ b/mrc/mrc-start.sh @@ -0,0 +1,45 @@ +#!/bin/bash +#================================================================================================== +# This shell script will launch the 'Multi Relay Chat' python script. It is intended to be called # +# via a forked systemd .service file. The script will check that mrc_client.py is not already # +# running then will launch it. To avoid problems, it should be launched using the same user that # +# owns the mystic install directory. If executing manually, use 'sudo -u username' or ensure you # +# are logged into the terminal as the user that owns the mystic directory. In a systemd .service # +# file, you should use the 'User=' option in the [Service] section. The script will exit with an # +# appropriate error code to indicate whether is was successful or not. This script is indended to # +# work only with Debian, Ubuntu, Raspbian and other debian based distributions. # +#================================================================================================== + +# MRC Variables: +MRC_PATH=@MYSTIC_DIR@ +MRC_SERVER=mrc.bottomlessabyss.net +MRC_PORT=5000 +MRC_PID=$(ps auxwww | grep "/usr/bin/python ./mrc_client.py" | grep -v grep | awk '{print $2}') + +echo "Attempting to start the Multi Relay Chat (MRC) python script.." + +# Make sure the mrc_client.py script isn't already running: +if [ ! -z "$MRC_PID" ] +then + echo "Error: mrc_client.py script is already running at PID $MRC_PID. Stop it first." + exit 1 +fi + +# Starting the MRC python script +cd $MRC_PATH >/dev/null +./mrc_client.py $MRC_SERVER $MRC_PORT & +cd - >/dev/null + +# Wait 3 seconds and check for a PID +sleep 3 +MRC_PID=$(ps auxwww | grep "/usr/bin/python ./mrc_client.py" | grep -v grep | awk '{print $2}') + +# Making sure it started successfully +if [ ! -z "$MRC_PID" ] +then + echo "Success! The mrc_client.py script is now running with PID $MRC_PID" + exit 0 +else + echo "Error: mrc_client.py failed to start. Exiting." + exit 1 +fi \ No newline at end of file diff --git a/mrc/mrc-stop.sh b/mrc/mrc-stop.sh new file mode 100755 index 0000000..abf8537 --- /dev/null +++ b/mrc/mrc-stop.sh @@ -0,0 +1,65 @@ +#!/bin/bash +#================================================================================================== +# This shell script will stop the 'Multi Relay Chat' python script. It is intended to be called # +# via a forked systemd .service file. The script will check that mrc_client.py is running then # +# will stop it via SIGTERM. If it can't be stopped gracefully within 30 seconds, it will be # +# forcefully stopped. The script will exit with an appropriate error code to indicate whether it # +# was successful or not. This script is indended to work only with Debian, Ubuntu, Raspbian and # +# other debian based distributions. # +#================================================================================================== + +# MRC Variables. Be sure to set your MRC script path (usually your main mystic directory) +MRC_PATH=@MYSTIC_DIR@ +MRC_SERVER=mrc.bottomlessabyss.net +MRC_PORT=5000 +MRC_PID=$(ps auxwww | grep "/usr/bin/python ./mrc_client.py" | grep -v grep | awk '{print $2}') + +echo "Attempting to stop the Multi Relay Chat (MRC) python script.." + +# Make sure the mrc_client.py script is running: +if [ -z "$MRC_PID" ] +then + echo "Error: mrc_client.py is not running so can't be stopped." + exit 1 +fi + +# Stopping the MRC python script +echo "The MRC PID is $MRC_PID. Sending a SIGTERM.." +kill -s TERM $MRC_PID + +# Making sure it stopped successfully +MRC_COUNTER=0 +echo "Checking to ensure the process stops.." + +while [ $MRC_COUNTER -lt 6 ] +do + MRC_PID=$(ps auxwww | grep "/usr/bin/python ./mrc_client.py" | grep -v grep | awk '{print $2}') + if [ ! -z "$MRC_PID" ] + then + echo "Process still running. Waiting 5 seconds.." + sleep 5 + else + echo "Finished! mrc_client.py script has been stopped successfully." + exit 0 + fi + let MRC_COUNTER=MRC_COUNTER+1 +done + +# If it's still running after 30 seconds (6 intervals) then use kill -9 +if [ "$MRC_COUNTER" -eq 6 ] && [ ! -z "$MRC_PID" ] +then + echo "The mrc_client.py script failed to stop after 60 seconds. Stopping forcefully.." + kill -9 $MRC_PID +fi + +# Wait 5 seconds, then double check to ensure it stopped. Otherwise it's considered a failure. +sleep 5 +MRC_PID=$(ps auxwww | grep "/usr/bin/python ./mrc_client.py" | grep -v grep | awk '{print $2}') +if [ ! -z "$MRC_PID" ] +then + echo "Error: Failed to kill the mrc_client.py script." + exit 1 +else + echo "Success. The mrc_client.py script was forcefully stopped." + exit 0 +fi \ No newline at end of file diff --git a/mrc/mrc.service b/mrc/mrc.service new file mode 100644 index 0000000..af36136 --- /dev/null +++ b/mrc/mrc.service @@ -0,0 +1,31 @@ +#================================================================================================== +# This systemd service file can be used to start and stop the 'Multi Relay Chat' python script as # +# a proper service module. In order for it to work correctly, it must be set to 'Type=forking'. # +# As a forking service, it will decide if start/stop was a failure based on the returned error # +# code. A return of 0 will be considered success, and a return of 1 will be a failure. The MRC # +# python script should ideally be launched as the same user who owns the mystic directories. To # +# do this, be sure to uncomment and set the 'User=' option in the [Service] section below. If you # +# don't, the script will be executed as root, which may have security implications. This file is # +# indended to work with Debian, Ubuntu, Raspbian and other debian based distributions, but may # +# work with others as well. # +# # +# Be sure to set the location of your mrc-start.sh and mrc-stop.sh scripts in the [Service] # +# section below, and to optionally set your user as described above. # +#================================================================================================== + +[Unit] +Description=Multi Relay Chat for Mystic BBS +After=network.target +After=systemd-user-sessions.service +After=network-online.target + +[Service] +Type=forking +# Be sure to set 'User' below to the user who owns your mystic directory. +User=mystic +# Ensure that the paths and filenames below are correct. +ExecStart=@MYSTIC_DIR@/mrc-start +ExecStop=@MYSTIC_DIR@/mrc-stop + +[Install] +WantedBy=multi-user.target \ No newline at end of file