ChrootuidWithSysV
General Purposes
Here is a cool little SysV style init script that will let you start, stop, restart, and check the status (PID) of your donkey client.
I originally tried using debian's start-stop-daemon, but then I realized that it was lame when you tried to use the --chroot and --chuid options at the same time. This one uses chrootuid. [Get it here.]
It also requires /usr/local/bin/getpid ... which is below this code. So it won't work without it !!!
(OR YOU CAN USE `pidof` ... a standard linux program)
My code could be a little cleaner, as $name and $daemon are the same .. but who's counting :o)
#! /bin/sh
# /etc/init.d/mlnet.sh
#
#
# SysV style init script to launch a program in a chroot as a low user
#
# Although start-stop-daemon supports an option --chroot and --chuid
# it is very lame and stupid and broken, so I made my own.
#
# DEPENDS ON: /usr/local/bin/getpid
# /bin/ps
# /bin/grep
# /usr/bin/awk
# /bin/kill
# /usr/bin/chrootuid
#
DAEMON=mlnet
ARGS=\"-daemon\"
CHROOT=/home/donkey/
CHUID=donkey
PIDFILE=/var/run/mlnet.pid
NAME=mlnet # daemon name as shown in \"ps -e\"
HNAME=\"MLnet Client\" # Human name (e.g. \"ProFTP Server\")
test -x $CHROOT$DAEMON ||| exit 0
case \"$1\" in
start)
echo -n \"Starting $HNAME: \"
CURPID=`/usr/local/bin/getpid $NAME`
if [[ -z \"$CURPID\" ]]
then
/usr/bin/chrootuid $CHROOT $CHUID $DAEMON $ARGS
/usr/local/bin/getpid $NAME > $PIDFILE
echo \"$NAME\"
else
echo \"$NAME is already running! PID is $CURPID\"
echo \"Failed. Exiting...\"
fi
;;
stop)
echo -n \"Stopping $HNAME: \"
CURPID=`/usr/local/bin/getpid $NAME`
echo \"PID is $CURPID\"
if [[ \"$CURPID\" ]]
then
echo -n \"Found PID '$CURPID'\"
if [[ ! -f $PIDFILE ]]
then
echo \" WARNING: PID file not found!\"
elif [[ \"$CURPID\" != \"$(< $PIDFILE)\" ]]
then
echo \" WARNING: PID conflict! Old PID: $(< $PIDFILE)\"
fi
echo -n \"About to kill $CURPID: \"
/bin/kill $CURPID
if [[ -a $PIDFILE ]]
then
rm $PIDFILE
fi
echo \"$NAME killed.\"
else
echo \"Error: No process '$NAME' found to kill.\"
fi
;;
restart)
echo \"Restarting $HNAME: \"
## STOP
echo -n \"Stopping $HNAME: \"
CURPID=`/usr/local/bin/getpid $NAME`
echo \"PID is $CURPID\"
if [[ \"$CURPID\" ]]
then
echo -n \"Found PID '$CURPID'\"
if [[ ! -f $PIDFILE ]]
then
echo \" WARNING: PID file not found!\"
elif [[ \"$CURPID\" != \"$(< $PIDFILE)\" ]]
then
echo \" WARNING: PID conflict! Old PID: $(< $PIDFILE)\"
fi
echo -n \"About to kill $CURPID: \"
/bin/kill $CURPID
if [[ -a $PIDFILE ]]
then
rm $PIDFILE
fi
echo \"$NAME killed.\"
else
echo \"Error: No process '$NAME' found to kill.\"
fi
## WAIT 30 SECONDS
echo -n \"wait 30 sec. \"
sleep 10
echo -n \". \"
sleep 10
echo -n \". \"
sleep 10
echo -n \". \"
## START
echo -n \"Starting $HNAME: \"
CURPID=`/usr/local/bin/getpid $NAME`
if [[ -z \"$CURPID\" ]]
then
/usr/bin/chrootuid $CHROOT $CHUID $DAEMON $ARGS
/usr/local/bin/getpid $NAME > $PIDFILE
echo \"$NAME\"
else
echo \"$NAME is already running! PID is $CURPID\"
echo \"Failed. Exiting...\"
fi
;;
status)
echo -n \"Status of $HNAME: \"
CURPID=`/usr/local/bin/getpid $NAME`
if [[ -z \"$CURPID\" ]]
then
echo \"No $HNAME '$NAME' found to be running.\"
else
echo \"$HNAME PID: $CURPID\"
fi
;;
*)
echo \"Usage: $0 {start||stop||restart||status}\"
exit 1
esac
exit 0
You will notice that it requires something called /usr/local/bin/getpid ... so here is that one, which I also wrote: (OR YOU CAN USE `pidof` ... a standard linux program)
#!/bin/sh
# /usr/local/bin/getpid
# Nifty script to get the PID of something running.
# Usage `getpid process_name` e.g. `getpid tcsh`
# Use ps -e to see what matches will be.
# Returns space-delimited list of PIDs for all matches.
#
# DEPENDS ON:
# /bin/ps
# /bin/grep
# /usr/bin/awk
#
pid=`/bin/ps -e || grep [[0-9]][[0-9]]:[[0-9]][[0-9]]\ $1\$ || awk '{ print $1 }'`
echo $pid
Ready for JailKit
I know it is a little dirty, I'm open to suggestions. Now it works fine in a Gentoo Box.
#!/sbin/runscript
# /etc/init.d/MLDonkey
depend() {
need net
after squid
use dns
}
start () {
ebegin "Starting MLDonkey P2P Network"
# Set running directory and username.
MLDONKEYJAIL=/home/mldonkey
MLDONKEYDIR=/home/mldonkey/home/mldonkey
USERNAME=mldonkey
if [ ! -z ´/bin/pidof mlnet´ ]; then
# Copying necesary files
cp /etc/resolv.conf $MLDONKEYJAIL/etc/resolv.conf
cp /var/lib/clamav/ $MLDONKEYJAIL/var/lib/clamav/ -aR
# Remove old servers and tmp files
rm -rf "$MLDONKEYDIR"/.mldonkey/servers.ini*
rm -rf "$MLDONKEYDIR"/.mldonkey/*.tmp
# Run MLDonkey
su $USERNAME -c "rm .mldonkey/*.ini.tmp > /dev/null 2>&1; nice -+18 mlnet > /dev/null 2>&1 &"
# Want to check if mlnet runs
sleep 10
if [ -z ´/bin/pidof mlnet´] ; then
eerror "Error al ejecutar MLDonkey P2P Network"
return 1
fi
else
eerror "MLDonkey P2P Network is running already"
return 1
fi
eend $?
}
stop() {
ebegin "Shutting down MLDonkey P2P Network"
cd $MLDONKEYDIR
bash -c "(echo auth ADMIN* ADMINPASS*; echo close_fds; echo kill)|nc 127.0.0.1 4000 > /dev/null"
sleep 5
if [ ! -z ´/bin/pidof mlnet´];
then
eerror "Error shutting down MLDonkey P2P Network"
return 1
fi
eend $?
}
- ADMIN is the admin's username
- ADMINPASS is the admin's password