TT#26264 Add systemd unit service file, remove sysvinit support

Migrate to use proper systemd unit files for full support, and thus to increase
consistency when bringing up and shutting down the system, or when restarting
services, to have more integration with the init system as a whole.

As part of this change and since we are revamping the init support, we also
remove sysvinit support.

There are systemd-unit files for different distributions under pkg/kamailio, but
we have a special set-up in which "-lb" and "-proxy" are different services.

Change-Id: Ib8b4c335339f6362503f6c74f637058a81a81e51
changes/06/20006/6
Manuel Montecelo 7 years ago
parent f457334906
commit a1a0865ed4

@ -1,4 +0,0 @@
# do not use upstream script, we have our own
# /etc/default/kamailio.* configuration, generated
# via /etc/ngcp-config/templates/etc/default/kamailio.*
RUN_KAMAILIO=no

@ -1,280 +0,0 @@
#!/bin/bash
### BEGIN INIT INFO
# Provides: kamailio-lb
# Required-Start: $syslog $network $local_fs $remote_fs $time
# 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
umask 0022
TYPE=lb
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
out=$($DAEMON "${OPTIONS[@]}" -c > /dev/null 2>&1)
retcode=$?
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 -m 0755 $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
[ -z "$SHM_MEMORY" ] && SHM_MEMORY=64
[ -z "$PKG_MEMORY" ] && PKG_MEMORY=4
SHM_MEMORY=${SHM_MEMORY//[^[:digit:]]/}
PKG_MEMORY=${PKG_MEMORY//[^[:digit:]]/}
[ "$SHM_MEMORY" -le 0 ] && SHM_MEMORY=64
[ "$PKG_MEMORY" -le 0 ] && PKG_MEMORY=4
[ -z "$USER" ] && USER=kamailio
[ -z "$GROUP" ] && GROUP=kamailio
if /usr/sbin/ngcp-virt-identify --type container; then
echo "container environment detected. Skip ulimit commands"
else
if [ "$DUMP_CORE" = "yes" ] ; then
# set proper ulimit
ulimit -c unlimited
fi
# raise memlock limit, otherwise mysql client fails to initialize
ulimit -l unlimited
# raise file descriptors limit, otherwise we get "Can't send
# command to RTP proxy" on massive number of calls with RTP
ulimit -n 16384
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)
if [ -x "/usr/sbin/ngcp-check-active" ] ; then
/usr/sbin/ngcp-check-active -q
status=$?
case "${status}" in
0|3)
echo "Active node or transition."
;;
*)
echo "Ignored start action in inactive node ($status)"
exit 0
;;
esac
fi
check_homedir
create_radius_seqfile
if [ "$1" != "debug" ]; then
check_fork
fi
echo "Starting $DESC using $CFGFILE: "
start_kamailio_daemon
;;
safe-stop)
check_kamailio_config
echo "Stopping $DESC:"
start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE --retry 5 \
--exec $DAEMON
echo -n "$NAME "
if [ $? -eq 0 ] ; then
echo "stopped."
exit 0
else
echo "failed to stop."
exit 1
fi
;;
stop)
echo "Stopping $DESC:"
start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE --retry 5 \
--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:"
start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE --retry=5 \
--exec $DAEMON
if [ $? -ne 0 ] ; then
echo "$NAME failed to stop."
exit 1
fi
if [ -x "/usr/sbin/ngcp-check-active" ] ; then
/usr/sbin/ngcp-check-active -q
status=$?
case "${status}" in
0|3)
echo "Active node or transition."
;;
*)
echo "Ignored start action in inactive node ($status)"
exit 0
;;
esac
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
;;
check-config)
echo -n "Checking config for $DESC: "
check_kamailio_config
echo "config is OK"
exit 0
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|safe-stop|restart|force-reload|debug|check-config|status}" >&2
exit 1
;;
esac
exit 0

@ -0,0 +1,30 @@
[Unit]
Description=Kamailio (OpenSER) - the Open Source SIP Server, LB
After=network-online.target
After=remote-fs.target
After=time-sync.target
Requires=network-online.target
Requires=remote-fs.target
Requires=time-sync.target
[Service]
Type=simple
User=kamailio
Group=kamailio
PIDFile=/run/kamailio/kamailio.lb.pid
Environment='CFGFILE=/etc/kamailio/lb/kamailio.cfg'
# Values of SHM_MEMORY=64 and PKG_MEMORY=16 taken from old sysvinit file
# Amount of shared memory to allocate for the running Kamailio server (in MiB)
Environment='SHM_MEMORY=64'
# Amount of private memory for each Kamailio process (in MiB)
Environment='PKG_MEMORY=16'
# Check if config OK before starting
ExecStartPre=/usr/sbin/kamailio -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY -c
# -DD means to not daemonise
ExecStart=/usr/sbin/kamailio -P /run/kamailio/kamailio.lb.pid -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY -DD
Restart=on-abort
LimitMEMLOCK=infinity
LimitNOFILE=16384
[Install]
WantedBy=multi-user.target

@ -1,4 +0,0 @@
# do not use upstream script, we have our own
# /etc/default/kamailio.* configuration, generated
# via /etc/ngcp-config/templates/etc/default/kamailio.*
RUN_KAMAILIO=no

@ -1,282 +0,0 @@
#!/bin/bash
### BEGIN INIT INFO
# Provides: kamailio-proxy
# Required-Start: $syslog $network $local_fs $time $remote_fs
# Required-Stop: $syslog $network $local_fs $remote_fs
# Should-Start: mysql
# Should-Stop: mysql
# 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
umask 0022
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
out=$($DAEMON "${OPTIONS[@]}" -c > /dev/null 2>&1)
retcode=$?
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 -m 0755 $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
[ -z "$SHM_MEMORY" ] && SHM_MEMORY=64
[ -z "$PKG_MEMORY" ] && PKG_MEMORY=4
SHM_MEMORY=${SHM_MEMORY//[^[:digit:]]/}
PKG_MEMORY=${PKG_MEMORY//[^[:digit:]]/}
[ "$SHM_MEMORY" -le 0 ] && SHM_MEMORY=64
[ "$PKG_MEMORY" -le 0 ] && PKG_MEMORY=4
[ -z "$USER" ] && USER=kamailio
[ -z "$GROUP" ] && GROUP=kamailio
if /usr/sbin/ngcp-virt-identify --type container; then
echo "container environment detected. Skip ulimit commands"
else
if [ "$DUMP_CORE" = "yes" ] ; then
# set proper ulimit
ulimit -c unlimited
fi
# raise memlock limit, otherwise mysql client fails to initialize
ulimit -l unlimited
# raise file descriptors limit, otherwise we get "Can't send
# command to RTP proxy" on massive number of calls with RTP
ulimit -n 16384
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)
if [ -x "/usr/sbin/ngcp-check-active" ] ; then
/usr/sbin/ngcp-check-active -q
status=$?
case "${status}" in
0|3)
echo "Active node or transition."
;;
*)
echo "Ignored start action in inactive node ($status)"
exit 0
;;
esac
fi
check_homedir
create_radius_seqfile
if [ "$1" != "debug" ]; then
check_fork
fi
echo "Starting $DESC using $CFGFILE: "
start_kamailio_daemon
;;
safe-stop)
check_kamailio_config
echo "Stopping $DESC:"
start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE --retry 5 \
--exec $DAEMON
echo -n "$NAME "
if [ $? -eq 0 ] ; then
echo "stopped."
exit 0
else
echo "failed to stop."
exit 1
fi
;;
stop)
echo "Stopping $DESC:"
start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE --retry 5 \
--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:"
start-stop-daemon --oknodo --stop --quiet --pidfile $PIDFILE --retry=5 \
--exec $DAEMON
if [ $? -ne 0 ] ; then
echo "$NAME failed to stop."
exit 1
fi
if [ -x "/usr/sbin/ngcp-check-active" ] ; then
/usr/sbin/ngcp-check-active -q
status=$?
case "${status}" in
0|3)
echo "Active node or transition."
;;
*)
echo "Ignored start action in inactive node ($status)"
exit 0
;;
esac
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
;;
check-config)
echo -n "Checking config for $DESC: "
check_kamailio_config
echo "config is OK"
exit 0
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|safe-stop|restart|force-reload|debug|check-config|status}" >&2
exit 1
;;
esac
exit 0

@ -0,0 +1,30 @@
[Unit]
Description=Kamailio (OpenSER) - the Open Source SIP Server, Proxy
After=mariadb.service
After=network-online.target
After=remote-fs.target
Requires=mariadb.service
Requires=network-online.target
Requires=remote-fs.target
[Service]
Type=simple
User=kamailio
Group=kamailio
PIDFile=/run/kamailio/kamailio.proxy.pid
Environment='CFGFILE=/etc/kamailio/proxy/kamailio.cfg'
# Values of SHM_MEMORY=125 and PKG_MEMORY=32 taken from old sysvinit file
# Amount of shared memory to allocate for the running Kamailio server (in MiB)
Environment='SHM_MEMORY=125'
# Amount of private memory for each Kamailio process (in MiB)
Environment='PKG_MEMORY=32'
# Check if config OK before starting
ExecStartPre=/usr/sbin/kamailio -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY -c
# -DD means to not daemonise
ExecStart=/usr/sbin/kamailio -P /run/kamailio/kamailio.proxy.pid -f $CFGFILE -m $SHM_MEMORY -M $PKG_MEMORY -DD
Restart=on-abort
LimitMEMLOCK=infinity
LimitNOFILE=16384
[Install]
WantedBy=multi-user.target

@ -0,0 +1,2 @@
# /run/kamailio created as tmpfile in "ngcp-kamailio" package
f /run/kamailio/kamailio_radius.seq 0660 kamailio kamailio

@ -1,2 +1,4 @@
ngcp-kamailio: postrm-contains-additional-updaterc.d-calls etc/init.d/kamailio-proxy
ngcp-kamailio: postrm-contains-additional-updaterc.d-calls etc/init.d/kamailio-lb
ngcp-kamailio: init.d-script-not-included-in-package etc/init.d/kamailio-proxy
ngcp-kamailio: init.d-script-not-included-in-package etc/init.d/kamailio-lb

@ -0,0 +1,4 @@
rm_conffile /etc/default/kamailio-lb 5.1.2-1+0~mr6.3~ ngcp-kamailio
rm_conffile /etc/default/kamailio-proxy 5.1.2-1+0~mr6.3~ ngcp-kamailio
rm_conffile /etc/init.d/kamailio-lb 5.1.2-1+0~mr6.3~ ngcp-kamailio
rm_conffile /etc/init.d/kamailio-proxy 5.1.2-1+0~mr6.3~ ngcp-kamailio

@ -0,0 +1 @@
d /run/kamailio 0755 kamailio kamailio
Loading…
Cancel
Save