freebsd-ports/audio/linux-musicipserver/files/musicipserver.in
Giuseppe Pilichi 0a313e7621 This is an application for generating playlists based upon musical content.
WWW:	http://www.amplifiedmusicservices.com/

PR:		ports/144706
Submitted by:	Christopher Key <cjk32@cam.ac.uk>
Approved by:	pgj (mentor)
2010-08-08 13:36:48 +00:00

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"