WWW: http://www.amplifiedmusicservices.com/ PR: ports/144706 Submitted by: Christopher Key <cjk32@cam.ac.uk> Approved by: pgj (mentor)
191 lines
4.4 KiB
Bash
191 lines
4.4 KiB
Bash
#!/bin/sh
|
|
#
|
|
# $Id: musicipserver.in 2458 2010-07-21 11:52:43Z chris $
|
|
#
|
|
|
|
# PROVIDE: musicipserver
|
|
# BEFORE: squeezeboxserver
|
|
# REQUIRE: LOGIN
|
|
# KEYWORD: shutdown
|
|
|
|
#
|
|
# Add the following lines to /etc/rc.conf to enable musicipserver:
|
|
#
|
|
#musicipserver_enable="YES"
|
|
#
|
|
|
|
. /etc/rc.subr
|
|
|
|
name="%%PORTNAME%%"
|
|
procname="%%PREFIX%%/bin/MusicMagicServer"
|
|
status_cmd="${name}_status_cmd"
|
|
start_cmd="${name}_start_cmd"
|
|
stop_cmd="${name}_stop_cmd"
|
|
|
|
examplesdir="%%EXAMPLESDIR%%"
|
|
datadir="%%DATADIR%%"
|
|
logdir="%%MUSICIPSERVERLOGDIR%%"
|
|
rundir="%%MUSICIPSERVERRUNDIR%%"
|
|
statedir="%%MUSICIPSERVERDBDIR%%"
|
|
|
|
serverlogfile=${logdir}/server.log
|
|
mipcorelogfile=${logdir}/mipcore.log
|
|
pidfile=${rundir}/${name}.pid
|
|
serverflogpidfile=${rundir}/${name}-server-flog.pid
|
|
mipcoreflogpidfile=${rundir}/${name}-mipcore-flog.pid
|
|
mipcoretailpidfile=${rundir}/${name}-mipcore-tail.pid
|
|
serverinfifo=${rundir}/${name}-fifo-in
|
|
serveroutfifo=${rundir}/${name}-fifo-out
|
|
mipcorelogfifo=${rundir}/${name}-mipcore-fifo
|
|
|
|
empty="%%LOCALBASE%%/bin/empty"
|
|
flog="%%LOCALBASE%%/bin/flog"
|
|
tail="/usr/bin/tail"
|
|
|
|
load_rc_config $name
|
|
musicip_enable=${musicip_enable:-"NO"}
|
|
musicip_user="%%MUSICIPSERVERUSER%%"
|
|
musicip_group="%%MUSICIPSERVERGROUP%%"
|
|
musicip_port="10002" # Should probably pull this in from mmm.ini
|
|
|
|
musicipserver_check_pidfile()
|
|
{
|
|
check_pidfile ${pidfile} ${empty}
|
|
}
|
|
|
|
musicipserver_status_cmd()
|
|
{
|
|
|
|
pid=$(musicipserver_check_pidfile)
|
|
|
|
if [ -n "${pid}" ]; then
|
|
echo "${name} is running as pid ${pid}."
|
|
else
|
|
echo "${name} is not running."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
musicipserver_start_cmd()
|
|
{
|
|
# Check whether we're already running
|
|
pid=$(musicipserver_check_pidfile)
|
|
|
|
if [ -n "${pid}" ]; then
|
|
echo "${name} already running? (pid=${pid})."
|
|
return 1
|
|
fi
|
|
|
|
echo "Starting ${name}."
|
|
|
|
# MusicIP server will fail to start if there are any sockets still active on port 10002.
|
|
waited=0
|
|
while netstat -n \
|
|
| egrep "^tcp4 +[[:digit:]]+ +[[:digit:]]+ +([[:digit:]]+\.){4}$musicip_port +([[:digit:]]+\.){4}[[:digit:]]+ +TIME_WAIT\$" \
|
|
> /dev/null; do
|
|
|
|
if [ $waited = 0 ]; then
|
|
echo -n "Waiting on sockets"
|
|
waited=1
|
|
else
|
|
echo -n "."
|
|
fi
|
|
|
|
sleep 1
|
|
done
|
|
|
|
if [ $waited = 1 ]; then
|
|
echo "."
|
|
fi
|
|
|
|
|
|
mkfifo ${mipcorelogfifo} \
|
|
&& chown ${musicip_user}:${musicip_group} ${mipcorelogfifo} \
|
|
&& chmod 600 ${mipcorelogfifo}
|
|
|
|
daemon -c -f -p ${mipcoretailpidfile} -u ${musicip_user} \
|
|
"sh" "-c" "exec ${tail} -f ${statedir}/log.txt > ${mipcorelogfifo}"
|
|
|
|
daemon -c -f -p ${mipcoreflogpidfile} -u ${musicip_user} \
|
|
"sh" "-c" "exec ${flog} -t -T '%b %d %T ' ${mipcorelogfile} < ${mipcorelogfifo}"
|
|
|
|
su -m ${musicip_user} -c \
|
|
"cd / && < /dev/null >& /dev/null ${empty} -f -i ${serverinfifo} -o ${serveroutfifo} -p ${pidfile} ${procname} -exec ${datadir} -data ${statedir} -verbose -logex start" \
|
|
&& chmod -x ${serverinfifo} ${serveroutfifo} ${pidfile}
|
|
|
|
daemon -c -f -p ${serverflogpidfile} -u ${musicip_user} \
|
|
"sh" "-c" "exec ${flog} -t -T '%b %d %T ' ${serverlogfile} < ${serveroutfifo}"
|
|
|
|
|
|
# "MusicMagicServer start" either exits is there is an error, or forks is there isn't.
|
|
# To check whether musicipserver starter successfully, we watch the 'empty' process we
|
|
# created, using its pidfile. If it disappears, we know that musicipserver failed, else
|
|
# if it two or more child processes, we know it started successfully.
|
|
|
|
while true; do
|
|
|
|
pid=$(musicipserver_check_pidfile)
|
|
|
|
if [ -z "${pid}" ]; then
|
|
echo "${name} failed to start."
|
|
_musicipserver_stop_cmd
|
|
return 1
|
|
break;
|
|
elif [ $(pgrep -P ${pid} | wc -l) -gt 1 ]; then
|
|
break
|
|
fi
|
|
|
|
sleep 1
|
|
|
|
done
|
|
|
|
}
|
|
|
|
musicipserver_stop_cmd()
|
|
{
|
|
|
|
echo "Stopping ${name}."
|
|
|
|
_musicipserver_stop_cmd
|
|
|
|
}
|
|
|
|
_musicipserver_stop_cmd()
|
|
{
|
|
|
|
pid=$(musicipserver_check_pidfile)
|
|
if [ -n "${pid}" ]; then
|
|
su -m ${musicip_user} -c "${procname} stop" > /dev/null 2>&1 \
|
|
&& wait_for_pids ${pid}
|
|
fi
|
|
|
|
|
|
pid=$(check_pidfile ${serverflogpidfile} ${flog})
|
|
if [ -n "{$pid}" ]; then
|
|
kill ${pid} > /dev/null 2>&1 \
|
|
&& wait_for_pids ${pid} \
|
|
&& rm ${serverflogpidfile}
|
|
fi
|
|
|
|
pid=$(check_pidfile ${mipcoretailpidfile} ${tail})
|
|
if [ -n "{$pid}" ]; then
|
|
kill ${pid} > /dev/null 2>&1 \
|
|
&& wait_for_pids ${pid} \
|
|
&& rm ${mipcoretailpidfile}
|
|
|
|
fi
|
|
|
|
pid=$(check_pidfile ${mipcoreflogpidfile} ${flog})
|
|
if [ -n "{$pid}" ]; then
|
|
kill ${pid} > /dev/null 2>&1 \
|
|
&& wait_for_pids ${pid} \
|
|
&& rm ${mipcoreflogpidfile}
|
|
fi
|
|
|
|
if [ -p ${mipcorelogfifo} ]; then
|
|
rm ${mipcorelogfifo}
|
|
fi
|
|
|
|
}
|
|
|
|
run_rc_command "$1"
|