Service.sh template - droboports/droboports.github.io GitHub Wiki
Replace %VAR%
by its respective value.
#!/usr/bin/env sh
#
# service.sh template
# import DroboApps framework functions
. /etc/service.subr
### app-specific section
# DroboApp framework version
framework_version="2.0"
# app description
name="%NAME%"
version="%VERSION%"
description="%DESCRIPTION%"
# framework-mandated variables
pidfile="/tmp/DroboApps/${name}/pid.txt"
logfile="/tmp/DroboApps/${name}/log.txt"
statusfile="/tmp/DroboApps/${name}/status.txt"
errorfile="/tmp/DroboApps/${name}/error.txt"
# app-specific variables
prog_dir="$(dirname $(realpath ${0}))"
daemon="${prog_dir}/sbin/%DAEMON%"
# _is_running
# returns: 0 if app is running, 1 if not running or pidfile does not exist.
_is_running() {
/sbin/start-stop-daemon -K -t -x "${daemon}" -p "${pidfile}" -q
}
# _is_stopped
# returns: 0 if stopped, 1 if running.
_is_stopped() {
if _is_running; then
return 1;
fi
return 0;
}
# used by apps that load kernel modules.
_load_modules() {
local kversion="$(uname -r)"
local fversion="$(_firmware_version)"
local modules="%MODULES%"
case "${fversion}" in
3.2*) kversion="${kversion}-3.2.0" ;;
3.1*|3.0*) kversion="${kversion}" ;;
*) echo "Unsupported firmware revision: ${fversion}"; return 1 ;;
esac
for ko in ${modules}; do
if [[ -z "$(lsmod | grep ^${ko})" ]]; then
insmod "${prog_dir}/modules/${kversion}/${ko}.ko"
fi
done
}
start() {
set -u # exit on unset variable
set -e # exit on uncaught error code
set -x # enable script trace
_load_modules
"${daemon}" ...
}
# override /etc/service.subrc
stop_service() {
if _is_stopped; then
echo ${name} is not running >&3
if [[ "${1:-}" == "-f" ]]; then
return 0
else
return 1
fi
fi
/sbin/start-stop-daemon -K -x "${daemon}" -p "${pidfile}" -v
}
### common section
# script hardening
set -o errexit # exit on uncaught error code
set -o nounset # exit on unset variable
set -o pipefail # propagate last error code on pipe
# ensure log folder exists
if ! grep -q ^tmpfs /proc/mounts; then mount -t tmpfs tmpfs /tmp; fi
logfolder="$(dirname ${logfile})"
if [[ ! -d "${logfolder}" ]]; then mkdir -p "${logfolder}"; fi
# redirect all output to logfile
exec 3>&1 1>> "${logfile}" 2>&1
# log current date, time, and invocation parameters
echo $(date +"%Y-%m-%d %H-%M-%S"): ${0} ${@}
# returns a string like "3.2.0 [8.45.72385]"
# or nothing if nasd is not running
_firmware_version() {
local line
/usr/bin/nc 127.0.0.1 5000 2> "${logfile}" | while read line; do
if (echo ${line} | grep -q mVersion); then
echo ${line} | sed 's|.*<mVersion>\(.*\)</mVersion>.*|\1|g'
break;
fi
done
}
_service_start() {
if _is_running; then
echo ${name} is already running >&3
return 1
fi
set +x # disable script trace
set +e # disable error code check
set +u # disable unset variable check
start_service
}
_service_stop() {
stop_service
}
_service_waitstop() {
stop_service -f
while ! _is_stopped; do
sleep 1
done
}
_service_restart() {
_service_waitstop
_service_start
}
_service_reload() {
reload_service
}
_service_status() {
status >&3
}
_service_help() {
echo "Usage: $0 [start|stop|waitstop|restart|status]" >&3
exit 1
}
# enable script tracing
set -o xtrace
case "${1:-}" in
start|stop|waitstop|restart|status) _service_${1} ;;
*) _service_help ;;
esac