Permalink
Fetching contributors…
Cannot retrieve contributors at this time
executable file 244 lines (214 sloc) 5.41 KB
#!/bin/bash
######################################################################
#
# Copyright (c) 2015 arakasi72 (https://github.com/arakasi72)
#
# --> Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
#
######################################################################
# rTorrent Stop/Start/Restart
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/bin:/sbin
FILE="$HOME/rtorrent/.session/rtorrent.lock"
SERVICE='rtorrent'
SERVICEB='irssi'
RTPID=$(pgrep -fx -u $LOGNAME $SERVICE)
# Sets default status can be askkill, autokill, or donotkill
KILLSTATUS='askkill'
KILLSIGNAL='-2'
RTLOG="/dev/null"
loglines=500
useerr=0
LOGFLAG=0
helpflag=1
# write log file
log_header() {
RTLOG="$HOME/rt.log"
echo >> $RTLOG
date >> $RTLOG
echo "$0 $@" >> $RTLOG
if [ $(cat "$RTLOG" | wc -l) -gt $loglines ]; then
tail -$loglines "$RTLOG" > $HOME/rt.temp
cat $HOME/rt.temp > $RTLOG
rm -f $HOME/rt.temp
fi
}
# function to check if service is running
service_running(){
pgrep -fx -u $LOGNAME $SERVICE > /dev/null
}
# function to ask user for y/n response
ask_user(){
if [ -t 1 ]; then
while true
do
read -p "Unable to close $SERVICE, close using kill -9? " answer
case $answer in [Yy]* ) return 0 ;;
[Nn]* ) return 1 ;;
* ) echo "Enter y or n";;
esac
done
else
echo "Running in background -a auto response is y" >> $RTLOG
return 0
fi
}
# function that starts service
start_service(){
local seconds=0
if [ $SERVICE = "rtorrent" ]; then
if [ -a $FILE ]; then
echo "removing $FILE" | tee -a "$RTLOG"
rm -f $FILE
else
echo "No session lock file" | tee -a "$RTLOG"
fi
fi
echo -n "Starting $SERVICE"
screen -d -m -S $SERVICE $SERVICE
while ! (service_running)
do
seconds=$(( $seconds + 1 ))
echo -n "."
sleep 1
if [ $seconds = 10 ]; then
echo
return 1
fi
done
echo
return 0
}
# function that stops service
stop_service(){
local seconds=0
echo -n "$SERVICE shutting down using kill $1"
kill $1 $RTPID
while ( service_running )
do
seconds=$(( $seconds + 1 ))
echo -n " ."
sleep 1
if [ $seconds = 20 ]; then
echo
return 1
fi
done
echo
return 0
}
# reports any usage error
usage_error() {
echo "usage: [-h] [-a|-k|-d] [-l] [start | stop | restart]" | tee -a "$RTLOG"
if [ $1 = 1 ]; then
echo "only one of the options -a -k -d allowed" | tee -a "$RTLOG"
elif [ $1 = 2 ]; then
echo "incorrect option used" | tee -a "$RTLOG"
elif [ $1 = 3 ]; then
echo "incorrect argument used" | tee -a "$RTLOG"
elif [ $1 = 4 ]; then
echo "too many arguments, only 1 argument allowed" | tee -a "$RTLOG"
fi
exit 1
}
# prints usage help to screen
usage_help() {
echo "usage: [-h] [-i] [-a|-k|-d] [-l] [start | stop | restart]"
echo "options:"
echo " -h usage help display"
echo " -i sets service to $SERVICEB"
echo " -l send results to log file (~/rt.log)"
echo " -a if unable to close $SERVICE ask user whether to use kill -9"
echo " -k if unable to close $SERVICE use kill -9"
echo " -d if unable to close $SERVICE do not use kill -9"
echo "arguments:"
echo " start starts $SERVICE"
echo " stop stops $SERVICE"
echo " restart first stops and then starts $SERVICE"
exit 0
}
#exit if run by root
if [ "$(id -u)" = "0" ]; then
echo "Cannot be run as root, or with sudo"
exit
fi
# Check for options
while getopts ":hlikad" optname
do
case $optname in
"k" )[[ -n $OPTFLAG ]] && useerr=1 || KILLSTATUS='autokill' && OPTFLAG=1 ;;
"a" )[[ -n $OPTFLAG ]] && useerr=1 || KILLSTATUS='askkill' && OPTFLAG=1 ;;
"d" )[[ -n $OPTFLAG ]] && useerr=1 || KILLSTATUS='donotkill' && OPTFLAG=1 ;;
"i" ) SERVICE=$SERVICEB && RTPID=$(pgrep -fx -u $LOGNAME $SERVICE) ;;
"l" ) LOGFLAG=1 ;;
"h" ) helpflag=0 ;;
* ) useerr=2 ;;
esac
done
if [ $helpflag = 0 ]; then
usage_help
fi
if [ $LOGFLAG = 1 ]; then
log_header "$@"
fi
if [ $useerr -gt 0 ]; then
usage_error $useerr
fi
shift $(( $OPTIND - 1 ))
# Check correct arguments used
if [ $# = 1 ]; then
if ! [[ $1 = "stop" || $1 = "start" || $1 = "restart" ]]; then
useerr=3
usage_error $useerr
fi
fi
# Check if there is more than 1 argument
if [ $# -gt 1 ]; then
useerr=4
usage_error $useerr
fi
# Check if service is running
if [ $# = 0 ]; then
if ( service_running ); then
echo "$SERVICE is running"
else
echo "$SERVICE is NOT running"
fi
fi
# Stop Service
if [[ $1 = "stop" || $1 = "restart" ]]; then
if ! ( service_running ); then
echo "$SERVICE was not running"
else
if ! ( stop_service $KILLSIGNAL ); then
case $KILLSTATUS in
"autokill" )
KILLSIGNAL='-9'
stop_service $KILLSIGNAL ;;
"askkill" )
if ( ask_user ); then
KILLSIGNAL='-9'
stop_service $KILLSIGNAL
fi ;;
esac
fi
if ( service_running ); then
echo "WARNING unable to close $SERVICE using $KILLSIGNAL" | tee -a "$RTLOG"
exit 1
else
echo "$SERVICE has been closed using kill $KILLSIGNAL" | tee -a "$RTLOG"
fi
fi
fi
# Start Service
if [[ $1 = "start" || $1 = "restart" ]]; then
if ( service_running ); then
echo "$SERVICE was already running"
else
if ( start_service ); then
echo "$SERVICE has been started" | tee -a "$RTLOG"
else
echo "WARNING: Unable to start $SERVICE" | tee -a "$RTLOG"
fi
fi
fi
echo "There were no problems encountered" >> "$RTLOG"