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
⚠️ **GitHub.com Fallback** ⚠️