diff --git a/heartbeat/kamailio.in b/heartbeat/kamailio.in
index 8e4ffc9d5a..ca4b47d8ac 100644
--- a/heartbeat/kamailio.in
+++ b/heartbeat/kamailio.in
@@ -41,6 +41,9 @@
# OCF_RESKEY_kamuser
# OCF_RESKEY_kamgroup
# OCF_RESKEY_extra_options
+# OCF_RESKEY_systemd
+# OCF_RESKEY_register
+# OCF_RESKEY_register_array
# Initialization:
@@ -62,6 +65,9 @@ RESKEY_kamctlrc_default="/etc/kamailio/kamctlrc"
RESKEY_kamuser_default=""
RESKEY_kamgroup_default=""
RESKEY_extra_options_default=""
+RESKEY_systemd_default=false
+RESKEY_register_default=false
+RESKEY_register_array_default="127.0.0.1;100;test.domain.com;sip1234"
#######################################################################
: ${OCF_RESKEY_binary=${RESKEY_binary_default}}
@@ -76,6 +82,9 @@ RESKEY_extra_options_default=""
: ${OCF_RESKEY_kamuser=${RESKEY_kamuser_default}}
: ${OCF_RESKEY_kamgroup=${RESKEY_kamgroup_default}}
: ${OCF_RESKEY_extra_options=${RESKEY_extra_options_default}}
+: ${OCF_RESKEY_systemd=${RESKEY_systemd_default}}
+: ${OCF_RESKEY_register=${RESKEY_register_default}}
+: ${OCF_RESKEY_register_array=${RESKEY_register_array_default}}
#######################################################################
usage() {
@@ -161,9 +170,9 @@ Parameters for a third Kamailio instance:
Usually the same IP address value as for parameter listen_address should be
provided.
- In order to respond with a 200 OK response to the SIP OOPTION requests,
+ In order to respond with a 200 OK response to the SIP OPTION requests,
the kamailio.cfg file needs to contain following section:
- Note: The following "kamailio.cfg" code snippet is part of an XML section.
+ Note: The following "kamailio.cfg" code snippet is part of an XML section.
Therefore it contains two & characters, which need to be replaced
with two ampersand characters within "kamailio.cfg":
@@ -181,7 +190,7 @@ Parameters for a third Kamailio instance:
-
+
SIP IP address the kamailio will listen on.
@@ -234,6 +243,19 @@ Parameters for a third Kamailio instance:
+
+
+ If systemd is used for management of the Kamailio process, its possible to keep it,
+ setting systemd=true.
+ Consider that in this case, all other parameters are overridden and should be defined
+ inside Kamailio systemd definition, with exception of pidfile and monitoring_ip
+ are used for monitoring and may be defined.
+
+ systemd management
+
+
+
+
The location of the "kamctlrc" file for the Kamailio instance.
@@ -283,6 +305,32 @@ Parameters for a third Kamailio instance:
kamailio group
+
+
+
+ Monitor if kamailio can register an extension. In some cases, kamailio responds to options
+ but is not possible to register an extension. Uses UDP to send the register message.
+ If enabled, use register_array to set the register parameters.
+
+ enable extension register
+
+
+
+
+
+ The extension parameters to use in the registration monitoring. It is possible to set multiple
+ extensions to test.
+ The extensions must be separated by a space (" "), each extension
+ containing the following parameters, separated by a semicolon:
+ Socket IP: The kamailio interface to send the register to (Ex:127.0.0.1);
+ Extension: The extension;
+ Domain: The domain to register the extension;
+ Extension password: The password of the extension;
+ Ex: "127.0.0.1;1000;test.domain.com;sip1234 192.168.0.1;2000;test.domain.com;sip5678"
+
+ register extension
+
+
@@ -401,20 +449,27 @@ kamailio_cmd()
kamailio_get_pid() {
if [ -f ${OCF_RESKEY_pidfile} ]; then
PID=`head -n 1 $OCF_RESKEY_pidfile`
- if [ ! -z "$PID" ]; then
- #Cross check if the PID file really contains a process of our kamailio instance:
- kamailio_cmd
- CROSSPID=`pgrep -o -f "${kam_cmd}"`
- if [ x"$PID" == x"$CROSSPID" ]; then
- #ocf_log debug "Found kamailio process PID with value: $PID."
- return 0
- fi
- #ocf_log debug "PID file does not contain a PID of a $OCF_RESKEY_binary process!"
+
+ if [ -z "$PID" ]; then
+ #PID file does not contain a valid PID
+ rm -f ${OCF_RESKEY_pidfile}
return 2
fi
- #PID file does not contain a valid PID
- rm -f ${OCF_RESKEY_pidfile}
+ # if systemd is defined, one can not validate our own kamailio instance
+ if [ $OCF_RESKEY_systemd == true ]; then
+ #ocf_log debug "Found kamailio process PID with value: $PID."
+ return 0
+ fi
+
+ #Cross check if the PID file really contains a process of our kamailio instance:
+ kamailio_cmd
+ CROSSPID=`pgrep -o -f "${kam_cmd}"`
+ if [ x"$PID" == x"$CROSSPID" ]; then
+ #ocf_log debug "Found kamailio process PID with value: $PID."
+ return 0
+ fi
+ #ocf_log debug "PID file does not contain a PID of a $OCF_RESKEY_binary process!"
return 2
fi
@@ -459,7 +514,7 @@ kamailio_status() {
fi
rc=0
- # In case that OCF_RESKEY_kamctlrc we perfom a health check via "kamctl monitor 1"
+ # In case that OCF_RESKEY_kamctlrc we perform a health check via "kamctl monitor 1"
if [ ! -z ${OCF_RESKEY_kamctlrc} ]; then
# PID is running now but it is not save to check via kamctl without care, because
# the implementation analysis in the case that we kill all running processes
@@ -499,9 +554,39 @@ kamailio_status() {
rm -f $errorfile
if [ $result -ne 0 ]; then
- ocf_log $not_running_log_level "Kamailio is running, but not functional as sipsak ${OCF_RESKEY_proto} failed with $(kamailio_format_result $result "$output" "$error")"
+ ocf_log $not_running_log_level "Kamailio is running, but not functional as sipsak OPTIONS ${OCF_RESKEY_proto} failed with $(kamailio_format_result $result "$output" "$error")"
return $OCF_ERR_GENERIC
fi
+
+ # Checks if it is possible to register an extension.
+ if [ ${OCF_RESKEY_register} == true ]; then
+ # Iterate on the extensions array
+ for extension in ${OCF_RESKEY_register_array[@]}; do
+ # Split the extension parameters into an array:
+ # Ex: "127.0.0.1;100;test.domain.com;sip1234" -> ("127.0.0.1" "100" "test.domain.com" "sip1234")
+ IFS=';' read -ra EXTADDR <<< "$extension"
+ reg_hostname=${EXTADDR[0]}
+ reg_extension=${EXTADDR[1]}
+ reg_domain=${EXTADDR[2]}
+ [[ -z ${EXTADDR[3]} ]] && reg_password="" || reg_password="-a ${EXTADDR[3]}"
+
+ # Builds sipsak usrloc-mode string.
+ reg_forced_timeout="timeout 3"
+ reg_sipsak_opts="-U -d -x 5 -p $reg_hostname -H $reg_hostname"
+ reg_sip_uri="-s sip:$reg_extension@$reg_domain"
+ output=`${reg_forced_timeout} $OCF_RESKEY_sipsak ${reg_sipsak_opts} ${reg_sip_uri} ${reg_password}>/dev/null 2>>$errorfile`
+ result=$?
+
+ error=`cat $errorfile`
+ rm -f $errorfile
+ # If cannot register the extension, raise an OCF_ERR
+ if [ $result -ne 0 ]; then
+ ocf_log $not_running_log_level "Kamailio is running, but not functional as sipsak REGISTER ${OCF_RESKEY_proto} failed with $(kamailio_format_result $result "$output" "$error")"
+ return $OCF_ERR_GENERIC
+ fi
+ echo "RESULT: $result"
+ done
+ fi
return $OCF_SUCCESS
}
@@ -529,17 +614,25 @@ kamailio_start() {
fi
fi
- kamailio_cmd
- if [ "$OCF_RESKEY_kamuser" != "" ]; then
- kam_cmd="su -s @BASH_SHELL@ $OCF_RESKEY_kamuser -c \"$kam_cmd\""
- fi
+ if
+ $OCF_RESKEY_systemd
+ then
+ ocf_log info "start kamailio with systemd."
+ systemctl start kamailio
+ result=$?
+ else
+ kamailio_cmd
+ if [ "$OCF_RESKEY_kamuser" != "" ]; then
+ kam_cmd="su -s @BASH_SHELL@ $OCF_RESKEY_kamuser -c \"$kam_cmd\""
+ fi
- ocf_log info "start kamailio with $kam_cmd."
- errorfile=`mktemp`
- output=$(eval ${kam_cmd} 2>>$errorfile)
- result=$?
- error=`cat $errorfile`
- rm -f $errorfile
+ ocf_log info "start kamailio with $kam_cmd."
+ errorfile=`mktemp`
+ output=$(eval ${kam_cmd} 2>>$errorfile)
+ result=$?
+ error=`cat $errorfile`
+ rm -f $errorfile
+ fi
if [ $result -eq 0 ]; then
result=1
@@ -573,59 +666,66 @@ kamailio_stop() {
local TRIES=0
result=$OCF_SUCCESS
- kamailio_cmd
+ if
+ $OCF_RESKEY_systemd
+ then
+ ocf_log info "stop kamailio with systemd."
+ systemctl stop kamailio
+ else
+ kamailio_cmd
+
+ ocf_log info "Stopping kamailio by sending SIGTERM to ${kam_cmd}"
+ pkill -SIGTERM -x -f "${kam_cmd}"
+ if [ $? -eq 1 ]; then
+ # already stopped. no processes found
+ # in case of not specified pidfile, delete the created directory
+ # otherwise only the pidfile itself
+ if [ "${OCF_RESKEY_pidfile}" == "${RESKEY_pidfile_default}" ]; then
+ piddir=`dirname "${OCF_RESKEY_pidfile}"`
+ rm -rf "$piddir"
+ else
+ rm -f "${OCF_RESKEY_pidfile}"
+ fi
+ return $result
+ fi
- ocf_log info "Stopping kamailio by sending SIGTERM to ${kam_cmd}"
- pkill -SIGTERM -x -f "${kam_cmd}"
- if [ $? -eq 1 ]; then
- # already stopped. no processes found
- # in case of not specified pidfile, delete the created directory
- # otherwise only the pidfile itself
- if [ "${OCF_RESKEY_pidfile}" == "${RESKEY_pidfile_default}" ]; then
- piddir=`dirname "${OCF_RESKEY_pidfile}"`
- rm -rf "$piddir"
+ if [ "$OCF_RESKEY_CRM_meta_timeout" != "" ]; then
+ KAMAILIO_STOP_TIMEOUT=$(( ($OCF_RESKEY_CRM_meta_timeout/1000) - 7 ))
else
- rm -f "${OCF_RESKEY_pidfile}"
+ KAMAILIO_STOP_TIMEOUT=20
fi
- return $result
- fi
- if [ "$OCF_RESKEY_CRM_meta_timeout" != "" ]; then
- KAMAILIO_STOP_TIMEOUT=$(( ($OCF_RESKEY_CRM_meta_timeout/1000) - 7 ))
- else
- KAMAILIO_STOP_TIMEOUT=20
- fi
-
- while isRunning_cmd "${kam_cmd}" && [ "$TRIES" -lt "${KAMAILIO_STOP_TIMEOUT}" ]
- do
- sleep 1
- ocf_log info "kamailio ${kam_cmd} is still running after SIGTERM"
- ((TRIES++))
- done
-
- isRunning_cmd "${kam_cmd}"
- RET=$?
-
- if [ "$RET" -eq 0 ]; then
- ocf_log info "Killing ${kam_cmd} with SIGKILL"
- TRIES=0
- pkill -SIGKILL -x -f "${kam_cmd}" > /dev/null 2>&1
-
- while isRunning_cmd "${kam_cmd}" && [ "$TRIES" -lt 3 ]
+ while isRunning_cmd "${kam_cmd}" && [ "$TRIES" -lt "${KAMAILIO_STOP_TIMEOUT}" ]
do
sleep 1
- ocf_log info "kamailio ${kam_cmd} is still running after SIGKILL"
+ ocf_log info "kamailio ${kam_cmd} is still running after SIGTERM"
((TRIES++))
done
isRunning_cmd "${kam_cmd}"
RET=$?
+
if [ "$RET" -eq 0 ]; then
- ocf_log fatal "kamailio is still running even after SIGKILL"
- result=$OCF_ERR_GENERIC
+ ocf_log info "Killing ${kam_cmd} with SIGKILL"
+ TRIES=0
+ pkill -SIGKILL -x -f "${kam_cmd}" > /dev/null 2>&1
+
+ while isRunning_cmd "${kam_cmd}" && [ "$TRIES" -lt 3 ]
+ do
+ sleep 1
+ ocf_log info "kamailio ${kam_cmd} is still running after SIGKILL"
+ ((TRIES++))
+ done
+
+ isRunning_cmd "${kam_cmd}"
+ RET=$?
+ if [ "$RET" -eq 0 ]; then
+ ocf_log fatal "kamailio is still running even after SIGKILL"
+ result=$OCF_ERR_GENERIC
+ fi
+ else
+ ocf_log info "${kam_cmd} has stopped."
fi
- else
- ocf_log info "${kam_cmd} has stopped."
fi
# in case of not specified pidfile, delete the created directory