#!/bin/sh /etc/rc.common # Copyright (C) 2017 OpenWrt.org START=90 USE_PROCD=1 #PROCD_DEBUG=1 FS=freeswitch DEFAULT=/etc/default/$FS LOGGER="/usr/bin/logger -p user.err -s -t $FS" OPTIONS= TIMEOUT=30 [ -f $DEFAULT ] && . $DEFAULT fs_user="${FS_USER:-$FS}" fs_group="${FS_GROUP:-$FS}" fs_dir_etc="/etc/$FS" fs_dir_localstate="/var/lib/$FS" fs_dir_run="/var/run/$FS" fs_dir_cache="${FS_DIR_CACHE:-/tmp/$FS/cache}" fs_dir_db="${FS_DIR_DB:-/tmp/$FS/db}" fs_dir_log="${FS_DIR_LOG:-/tmp/$FS/log}" fs_dir_recordings="${FS_DIR_RECORDINGS:-/tmp/$FS/recordings}" fs_dir_storage="${FS_DIR_STORAGE:-/tmp/$FS/storage}" fs_dir_temp="${FS_DIR_TEMP:-/tmp/$FS/temp}" start_service() { local dir= if [ -f "/etc/${FS}_disabled" ]; then $LOGGER File \"/etc/${FS}_disabled\" exists $LOGGER Remove it once your configuration is set up exit 1 fi for dir in "$fs_dir_cache" "$fs_dir_db" "$fs_dir_localstate" \ "$fs_dir_log" "$fs_dir_recordings" "$fs_dir_run" "$fs_dir_storage" \ "$fs_dir_temp" do [ -n "$dir" ] && { mkdir -p "$dir" chown "$fs_user":"$fs_group" "$dir" chmod 750 "$dir" } done #[ -d "$fs_dir_etc" ] && { # find "$fs_dir_etc" -type f -exec chown root:"$fs_group" {} \; # find "$fs_dir_etc" -type f -exec chmod 640 {} \; #} procd_open_instance # starting with full path seems cleaner judging by 'ps' output procd_set_param command /usr/bin/$FS # need to specify all or none of -conf, -log, and -db procd_append_param command -cache "$fs_dir_cache" -conf \ "$fs_dir_etc" -db "$fs_dir_db" -log "$fs_dir_log" -recordings \ "$fs_dir_recordings" -run "$fs_dir_run" -storage "$fs_dir_storage" \ -temp "$fs_dir_temp" procd_append_param command -c # -nc -nf: workaround for interop issue (which causes high load) #procd_append_param command -nc -nf procd_append_param command $OPTIONS procd_set_param user "$fs_user" # forward stdout of the command to logd #procd_set_param stdout 1 # same for stderr procd_set_param stderr 1 procd_close_instance } stop_service() { local retval= local mypid= local timeout=$TIMEOUT pgrep $FS &> /dev/null [ $? -ne 0 ] && exit 0 [ -f "$fs_dir_run"/${FS}.pid ] retval=$? # init script could find itself in a scenario where FS was started # very recently, so make it wait a while for a pid file to appear while [ $retval -ne 0 -a $timeout -gt 0 ]; do sleep 1 [ -f "$fs_dir_run"/${FS}.pid ] retval=$? timeout=$(($timeout-1)) done [ $retval -eq 0 ] || { $LOGGER PID file does not exist exit 1 } mypid=$(cat "$fs_dir_run"/${FS}.pid) [ "$mypid" -gt 1 ] 2> /dev/null || { $LOGGER PID file contains garbage exit 1 } timeout=$TIMEOUT kill $mypid pgrep $FS | grep -w $mypid &>/dev/null retval=$? while [ $retval -eq 0 -a $timeout -gt 0 ]; do sleep 10 pgrep $FS | grep -w $mypid &>/dev/null retval=$? [ $retval -eq 0 ] && kill $mypid 2>/dev/null timeout=$(($timeout-10)) done [ $retval -ne 1 ] && { $LOGGER Failed to stop $FS exit 1 } }