Recently I set up an Icecast server to be able to stream music on hold to my Asterisk servers at work. Here is an updated init script for Icecast2 that adds support to start the Ices2 source client at the same time. For streaming audio from a playlist with Ogg support, Ices2 is a good candidate. For streaming audio from an mp3 based playlist, have a look at Ices0 that can be downloaded on the same site. There is also an array of different Icecast source clients to choose from here. This just happened to be the first one that I tried out. I ended up bastardizing the code somewhat to make it conform to my own personal preferences by using functions and what not to make it all pretty like. I also chose to run Ices2 as the same user as the icecast user, so you would have to update any permissions on the Ices2 directories and config files as needed.
#!/bin/sh
### BEGIN INIT INFO
# Provides: icecast2
# Required-Start: $remote_fs $network
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts the icecast audio streaming server daemon
### END INIT INFO
#
# icecast2
#
# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
# Modified for Debian
# by Ian Murdock <imurdock@gnu.ai.mit.edu>.
#
# Further modified by Keegan Quinn <ice@thebasement.org>
# for use with Icecast 2
#
# Violated by Nathan Thomas <nthomas@paperstreetoline.com>
# Added support for ices2 source client and various other code tweaks
#
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/icecast2
NAME=icecast2
DESC="icecast2 streaming media server"
ICES_DAEMON=/usr/bin/ices2
ICES_NAME=ices2
ICES_DESC="ices2 ogg playlist plugin"
if [ ! -x $DAEMON ]; then
echo "Cannot locate the $NAME executable. Exit"
exit 1
elif [ ! -x $ICES_DAEMON ]; then
echo "Cannot locate the $ICES_NAME executable. Exit"
exit 1
fi
. /lib/lsb/init-functions
# Defaults
CONFIGFILE="/etc/icecast2/icecast.xml"
CONFIGDEFAULTFILE="/etc/default/icecast2"
USERID=icecast2
GROUPID=icecast
ENABLE="false"
ICES_CONFIGFILE="/etc/ices2/ices-playlist.xml"
# Reads config file (will override defaults above)
[ -r "$CONFIGDEFAULTFILE" ] && . $CONFIGDEFAULTFILE
if [ "$ENABLE" != "true" ]; then
echo "$NAME daemon disabled - read $CONFIGDEFAULTFILE."
exit 0
fi
set -e
start_icecast(){
echo -n "Starting $DESC: "
if [ -z `pidof $NAME` ] ; then
start-stop-daemon --start --quiet --chuid $USERID:$GROUPID --exec $DAEMON -- -b -c $CONFIGFILE > /dev/null 2>&1
if [ "$?" -eq 0 ] ; then
echo "OK"
return 0
fi
else
echo "Failed...$NAME (pid `pidof $NAME`) is already running."
return 1
fi
}
stop_icecast(){
echo -n "Stopping $DESC: "
# Send TERM after 5 seconds, wait at most 30 seconds.
start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet --name $NAME --exec $DAEMON > /dev/null 2>&1
if [ -z `pidof $NAME` ] ; then
echo "OK"
return 0
else
echo "Failed...Couldn't kill $NAME process for some reason."
return 1
fi
}
status_icecast(){
if [ -z `pidof $NAME` ] ; then
echo "Service $NAME is: Stopped"
else
echo "Service $NAME is: Running...(pid `pidof $NAME`)"
fi
}
start_ices(){
echo -n "Starting $ICES_DESC: "
if [ -z `pidof $ICES_NAME` ] ; then
start-stop-daemon --start --quiet --chuid $USERID:$GROUPID --exec $ICES_DAEMON -- $ICES_CONFIGFILE > /dev/null 2>&1 # add an "&" at the end if background!=0 in ices2 xml file
if [ "$?" -eq 0 ] ; then
echo "OK"
return 0
fi
else
echo "Failed...$ICES_NAME (pid `pidof $ICES_NAME`) is already running."
return 1
fi
}
stop_ices(){
echo -n "Stopping $ICES_DESC: "
# Send TERM after 5 seconds, wait at most 30 seconds.
start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet --name $ICES_NAME --exec $ICES_DAEMON > /dev/null 2>&1
if [ -z `pidof $ICES_NAME` ] ; then
echo "OK"
return 0
else
echo "Failed...Couldn't kill $ICES_NAME process for some reason."
return 1
fi
}
status_ices(){
if [ -z `pidof $ICES_NAME` ] ; then
echo "Service $ICES_NAME is: Stopped"
else
echo "Service $ICES_NAME is: Running...(pid `pidof $ICES_NAME`)"
fi
}
restart(){
stop_ices
stop_icecast
start_icecast
start_ices
}
case "$1" in
start)
start_icecast
start_ices
;;
stop)
stop_ices
stop_icecast
;;
reload|force-reload)
restart
;;
restart)
restart
;;
status)
status_icecast
status_ices
;;
*)
echo "Usage: $0 {start|stop|restart|status|reload|force-reload}" >&2
exit 1
;;
esac
exit 0
