#!/bin/sh ### BEGIN INIT INFO # Provides: kamailio-proxy # Required-Start: $syslog $network $local_fs $time mysql $remote_fs # Required-Stop: $syslog $network $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start the Kamailio SIP proxy server # Description: Start the Kamailio SIP proxy server ### END INIT INFO TYPE=proxy PATH=/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/kamailio NAME=kamailio DESC=kamailio-$TYPE HOMEDIR=/var/run/kamailio PIDFILE=$HOMEDIR/$NAME.$TYPE.pid DEFAULTS=/etc/default/kamailio.$TYPE CFGFILE=/etc/kamailio/$TYPE/kamailio.cfg RUN_KAMAILIO=no # Do not start kamailio if fork=no is set in the config file # otherwise the boot process will just stop check_fork () { if grep -q "^[[:space:]]*fork[[:space:]]*=[[:space:]]*no.*" $CFGFILE; then echo "Not starting $DESC: fork=no specified in config file; run /etc/init.d/kamailio debug instead" exit 1 fi } check_kamailio_config () { # Check if kamailio configuration is valid before starting the server set +e out=$($DAEMON $OPTIONS -c 2>&1 > /dev/null) retcode=$? set -e if [ "$retcode" != '0' ]; then echo "Not executing command for $DESC: invalid configuration file!" echo -e "\n$out\n" exit 1 fi } check_homedir () { # Create HOMEDIR directory in case it doesn't exist if [ ! -d $HOMEDIR ]; then mkdir $HOMEDIR fi # Set the appropiate owner and group chown ${USER}:${GROUP} $HOMEDIR } create_radius_seqfile () { # Create a radius sequence file to be used by the radius client if # radius accounting is enabled. This is needed to avoid any issue # with the file not being writable if kamailio first starts as user # root because DUMP_CORE is enabled and creates this file as user # root and then later it switches back to user kamailio and cannot # write to the file. If the file exists before kamailio starts, it # won't change it's ownership and will be writable for both root # and kamailio, no matter what options are chosen at install time RADIUS_SEQ_FILE=$HOMEDIR/kamailio_radius.seq if [ ! -f $RADIUS_SEQ_FILE ]; then touch $RADIUS_SEQ_FILE fi chown ${USER}:${GROUP} $RADIUS_SEQ_FILE chmod 660 $RADIUS_SEQ_FILE } if [ ! -f $DAEMON ]; then echo "No $DESC daemon at $DAEMON." case "$1" in status) # LSB - 4: program or service status is unknown. exit 4 ;; *) # LSB - 5: program is not installed. exit 5 ;; esac fi # Load startup options if available if [ -f $DEFAULTS ]; then . $DEFAULTS || true fi if [ "$RUN_KAMAILIO" != "yes" ]; then echo "$DESC not yet configured. Edit /etc/default/kamailio.$TYPE first." exit 0 fi set -e test -z "$SHM_MEMORY" && SHM_MEMORY=64 test -z "$PKG_MEMORY" && PKG_MEMORY=4 SHM_MEMORY=$((`echo $SHM_MEMORY | sed -e 's/[^0-9]//g'`)) PKG_MEMORY=$((`echo $PKG_MEMORY | sed -e 's/[^0-9]//g'`)) [ $SHM_MEMORY -le 0 ] && SHM_MEMORY=64 [ $PKG_MEMORY -le 0 ] && PKG_MEMORY=4 [ -z "$USER" ] && USER=kamailio [ -z "$GROUP" ] && GROUP=kamailio if test "$DUMP_CORE" = "yes" ; then # set proper ulimit ulimit -c unlimited # directory for the core dump files # COREDIR=/home/corefiles # [ -d $COREDIR ] || mkdir $COREDIR # chmod 777 $COREDIR # echo "$COREDIR/core.$TYPE.%e.sig%s.%p" > /proc/sys/kernel/core_pattern fi if [ "$SSD_SUID" != "yes" ]; then OPTIONS="-f $CFGFILE -P $PIDFILE -m $SHM_MEMORY -M $PKG_MEMORY -u $USER -g $GROUP" SSDOPTS="" else OPTIONS="-f $CFGFILE -P $PIDFILE -m $SHM_MEMORY -M $PKG_MEMORY" SSDOPTS="--chuid $USER:$GROUP" fi start_kamailio_daemon () { start-stop-daemon --start --quiet --pidfile $PIDFILE $SSDOPTS \ --exec $DAEMON -- $OPTIONS res=$? echo -n "$NAME " if [ $res -eq 0 ] ; then echo "started." exit 0 else if [ ! -r "$PIDFILE" ]; then echo "error, failed to start." exit 1 elif read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then echo "already running." exit 0 else echo "error, failed to start ($PIDFILE exists)." exit 1 fi fi } case "$1" in start|debug) check_kamailio_config check_homedir create_radius_seqfile if [ "$1" != "debug" ]; then check_fork fi echo "Starting $DESC using $CFGFILE: " set +e start_kamailio_daemon ;; stop) check_kamailio_config echo "Stopping $DESC:" start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE \ --exec $DAEMON echo -n "$NAME " if [ $? -eq 0 ] ; then echo "stopped." exit 0 else echo "failed to stop." exit 1 fi ;; restart|force-reload) check_kamailio_config check_homedir create_radius_seqfile echo "Restarting $DESC:" set +e start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE --retry=5 \ --exec $DAEMON if [ $? -ne 0 ] ; then echo "$NAME failed to stop." exit 1 fi start_kamailio_daemon ;; status) echo -n "Status of $DESC: $NAME " if [ ! -r "$PIDFILE" ]; then echo "is not running." exit 3 fi if read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then echo "is running." exit 0 else echo "is not running but $PIDFILE exists." exit 1 fi ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload|debug|status}" >&2 exit 1 ;; esac exit 0