I have successfully been able to write up an rc.d script to manage multiple instances of a Python daemon. I used www/fcgiwrap as a reference.
In rc.conf I have:
The rc.d script is as follows:
It seems to work. For example, by a specific profile:
It also starts all profiles without specifying a profile name:
If you notice above each profile always uses the same status "Starting tidepool" for example. How can I make it so it uses the profile name so it looks like "Starting tekpool"?
Secondly, I was hoping some one could explain the following line in the script:
Am I correct in assuming that this will allow me to disable specific profiles in rc.conf?
Lastly, are there any tips or suggestions anyone could offer to improve/clean the code up a bit? This sections seems to bother me a little.
For example, should it be referencing the rc.d script directly or should I use the /usr/sbin/service command?
In rc.conf I have:
Code:
tidepool_enable="YES"
tidepool_profiles="tekpool joulepool"
The rc.d script is as follows:
Code:
#!/bin/sh
# $FreeBSD$
#
# PROVIDE: tidepool
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
# to enable this service:
#
# tidepool_enable (bool): Set to NO by default.
# Set it to YES to enable tidepool.
# tidepool_confdir (path): Set to /usr/local/etc/tidepool
# by default.
# tidepool_poolname (name): Set to tidepool
# by default.
. /etc/rc.subr
name=tidepool
rcvar=${name}_enable
load_rc_config ${name}
: ${tidepool_enable:="NO"}
: ${tidepool_confdir="/usr/local/etc/tidepool"}
: ${tidepool_poolname="tidepool"}
# This handles profile specific vars.
if [ -n "$2" ]; then
profile="$2"
if [ -n "${tidepool_profiles}" ]; then
eval tidepool_enable="\${tidepool_${profile}_enable:-${tidepool_enable}}"
tidepool_poolname=${profile}
else
echo "$0: extra argument ignored"
fi
else
if [ -n "${tidepool_profiles}" -a -n "$1" ]; then
for profile in ${tidepool_profiles}; do
echo "===> ${name} profile: ${profile}"
/usr/local/etc/rc.d/${name} $1 ${profile}
retcode="$?"
if [ "0${retcode}" -ne 0 ]; then
failed="${profile} (${retcode}) ${failed:-}"
else
success="${profile} ${success:-}"
fi
done
# It exits so that non-profile rc.d is not started when there are profiles.
exit 0
fi
fi
tidepool_chdir=/usr/local/${name}
tacfile=${tidepool_confdir}/tacs/${tidepool_poolname}.tac
pidfile=/var/run/${tidepool_poolname}.pid
procname=${tidepool_poolname}d
command="/usr/local/bin/twistd"
required_files=${tacfile}
command_args="-y ${tacfile} --pidfile ${pidfile} -l /var/log/${tidepool_poolname}.log"
run_rc_command "$1"
It seems to work. For example, by a specific profile:
root@pools01:~ # service tidepool start tekpool
Code:
Starting tidepool.
root@pools01:~ # service tidepool status tekpool
tidepool is running as pid 8438.
root@pools01:~ # service tidepool stop tekpool
Stopping tidepool.
It also starts all profiles without specifying a profile name:
root@pools01:~ # service tidepool start
Code:
===> tidepool profile: tekpool
Starting tidepool.
===> tidepool profile: joulepool
Starting tidepool.
root@pools01:~ # service tidepool status
===> tidepool profile: tekpool
tidepool is running as pid 8481.
===> tidepool profile: joulepool
tidepool is running as pid 8487.
root@pools01:~ # service tidepool stop
===> tidepool profile: tekpool
Stopping tidepool.
===> tidepool profile: joulepool
Stopping tidepool.
If you notice above each profile always uses the same status "Starting tidepool" for example. How can I make it so it uses the profile name so it looks like "Starting tekpool"?
Secondly, I was hoping some one could explain the following line in the script:
Code:
eval tidepool_enable="\${tidepool_${profile}_enable:-${tidepool_enable}}"
Am I correct in assuming that this will allow me to disable specific profiles in rc.conf?
Code:
tidepool_tekpool_enable="NO"
Lastly, are there any tips or suggestions anyone could offer to improve/clean the code up a bit? This sections seems to bother me a little.
Code:
for profile in ${tidepool_profiles}; do
echo "===> ${name} profile: ${profile}"
/usr/local/etc/rc.d/${name} $1 ${profile}
retcode="$?"
if [ "0${retcode}" -ne 0 ]; then
failed="${profile} (${retcode}) ${failed:-}"
else
success="${profile} ${success:-}"
fi
done
For example, should it be referencing the rc.d script directly or should I use the /usr/sbin/service command?