#!/bin/sh

# RoarD initscript
#
# Copyright (c) 2008-2011 Philipp 'ph3-der-loewe' Schafft <lion@lion.leolix.org>
# Copyright (c)      2007 Javier Fernandez-Sanguino <jfs@debian.org>
#
# This is free software; you may redistribute it and/or modify
# it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3,
# or (at your option) any later version.
#
# This is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License with
# the Debian operating system, in /usr/share/common-licenses/GPL;  if
# not, write to the Free Software Foundation, Inc., 59 Temple Place,
# Suite 330, Boston, MA 02111-1307 USA
#
### BEGIN INIT INFO
# Provides:          muroard
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Should-Start:
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: sound server for audio mixing
# Description:       RoarD is a RoarAudio based server for audio mixing.
#                    Its main purpose is to mix audio from
#                    different clients before sending it to its output (normally a soundcard).
#                    It is completely network transparent (UNIX sockets, TCP/IP).
### END INIT INFO

#set -e

. /lib/lsb/init-functions

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/muroard
NAME=muroard
DESC="muRoarD"

DAEMON_BN=`basename $DAEMON`

PIDFILE=/var/run/$DAEMON_BN.pid
SCRIPTNAME=/etc/init.d/$NAME

USER_LIST="$DAEMON_BN roard roar nobody";

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0;

# Read config file if it is present.
if [ -r /etc/default/$NAME ]
then
    . /etc/default/$NAME
fi

# This is no longer needed as done by start-stop-daemon.
#MUROARD_OPTS="--daemon $MUROARD_OPTS"

if [ "$ROARAUDIO_DEFAULT_SOCKET" != '' ]
then
 ln -s "$ROARAUDIO_DEFAULT_SOCKET" /etc/roarserver
fi

case "$MUROARD_AF" in
  UNIX|unix)
   MUROARD_OPTS="--unix $MUROARD_OPTS"
   [ "$MUROARD_SOCKET" = '' ]  || MUROARD_OPTS="--bind $MUROARD_SOCKET $MUROARD_OPTS"
  ;;
  TCP|tcp)
   MUROARD_OPTS="--tcp $MUROARD_OPTS"
   [ "$MUROARD_PORT"   = '' ]  || MUROARD_OPTS="--port $MUROARD_PORT $MUROARD_OPTS"
   [ "$MUROARD_HOST"   = '' ]  || MUROARD_OPTS="--bind $MUROARD_HOST $MUROARD_OPTS"
  ;;
  DECnet|DECNET|decnet)
   MUROARD_OPTS="-n $MUROARD_OPTS"
   [ "$MUROARD_OBJECT" = '' ]  || MUROARD_OPTS="--bind ::$MUROARD_OBJECT $MUROARD_OPTS"
  ;;
esac

[ "$MUROARD_RATE"    = '' ] || MUROARD_OPTS="--rate  $MUROARD_RATE $MUROARD_OPTS"
[ "$MUROARD_CHANNEL" = '' ] || MUROARD_OPTS="--chans $MUROARD_CHANNEL $MUROARD_OPTS"

[ "$MUROARD_DEVICE" = '' ]  || MUROARD_OPTS="--odevice $MUROARD_DEVICE $MUROARD_OPTS"

if [ "$MUROARD_USER" = '' ]
then
 for _u in $USER_LIST
 do
  _r=`id -un $_u 2> /dev/null`
  if [ "$_u" = "$_r" ]
  then
   MUROARD_USER="$_u";
   break;
  fi
 done
else
 _r=`id -un "$MUROARD_USER" 2> /dev/null`
 if [ "$_r" != "$MUROARD_USER" ]
 then
  echo "Error starting muRoarD: can not find configured user $MUROARD_USER" >&2
  echo "Hint: re-configure user in /etc/default/$NAME (see MUROARD_USER)" >&2
  exit 1;
 fi
fi

if [ "$MUROARD_USER" = '' ]
then
 echo "Error starting muRoarD: can not find any user to run roard as." >&2
 echo "Hint: configure user in /etc/default/$NAME explicitly (see MUROARD_USER)" >&2
 exit 1;
fi

set -e

SSD_OPTS="--pidfile $PIDFILE --user $MUROARD_USER --exec $DAEMON"

if [ "$MUROARD_GROUP" != '' ]
then
 CHUID="$MUROARD_USER:$MUROARD_GROUP"
 SSD_OPTS="$SSD_OPTS --group $MUROARD_GROUP"
else
 CHUID="$MUROARD_USER"
fi

case "$1" in
  start)
        [ "$MUROARD" = 'YES' ] || exit 0;
        echo -n "Starting $DESC: "
        start-stop-daemon --start --chuid $CHUID $SSD_OPTS --make-pidfile --background -- $MUROARD_OPTS
        echo "$NAME."
        ;;
  stop|terminate|shutdown)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --retry 8 --oknodo --quiet $SSD_OPTS || true
        echo "$NAME."
        ;;
  restart|force-reload)
        $0 stop
        $0 start
        ;;
  status)
        echo -n "Status of $DESC: "
        set +e
        if [ "$PIDFILE" != '' ]
        then
            PID=`cat $PIDFILE 2> /dev/null`
            if [ "$PID" != '' ]
            then
                kill -0 $PID 2> /dev/null
                if [ "$?" = '0' ]
                then
                    echo "running."
                    exit 0;
                else
                    echo "dead (stale pid file)."
                    exit 1;
                fi
            else
                echo "not running."
                exit 3;
            fi
        fi
        set -e
        echo "unknown (no pid file configured)."
        exit 4
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|terminate|shutdown|status}" >&2
        exit 1
        ;;
esac

exit 0

#ll
