|
@@ -0,0 +1,146 @@
|
|
|
+#!/bin/sh
|
|
|
+
|
|
|
+SVDIR=/etc/sv
|
|
|
+RUNSVDIR=/etc/runit/runsvdir
|
|
|
+
|
|
|
+for SERVICEDIR in /var/service /service NONE; do
|
|
|
+ if [ -d "${SERVICEDIR}" ]; then
|
|
|
+ break
|
|
|
+ fi
|
|
|
+done
|
|
|
+
|
|
|
+if [ "${SERVICEDIR}" = "NONE" ]; then
|
|
|
+ echo "No service directory found"
|
|
|
+ exit 99
|
|
|
+fi
|
|
|
+
|
|
|
+########################################
|
|
|
+
|
|
|
+if [ "$(basename $0)" = "rc-service" ]; then
|
|
|
+ SVC="$1"
|
|
|
+ ACTION="$2"
|
|
|
+
|
|
|
+ if [ "$UID" != "0" ]; then
|
|
|
+ echo "Need root privileges"
|
|
|
+ exit 13
|
|
|
+ fi
|
|
|
+elif [ "$(basename $0)" = "rc-update" ]; then
|
|
|
+ ACTION="$1"
|
|
|
+ SVC="$2"
|
|
|
+ RUNLEVEL="$3"
|
|
|
+else
|
|
|
+ echo "Unknown basename \"$0\""
|
|
|
+ exit 11
|
|
|
+fi
|
|
|
+
|
|
|
+if [ -z "${RUNLEVEL}" ]; then
|
|
|
+ RUNLEVEL=$(readlink ${RUNSVDIR}/current)
|
|
|
+ RUNLEVEL=$(basename ${RUNLEVEL})
|
|
|
+fi
|
|
|
+
|
|
|
+########################################
|
|
|
+
|
|
|
+### DEBUG
|
|
|
+if [ -r /tmp/service.debug.on ]; then
|
|
|
+ printf 2>/dev/null >>/tmp/service.log "%-8s %s\n" "${ACTION}" "${SVC}"
|
|
|
+fi
|
|
|
+
|
|
|
+########################################
|
|
|
+
|
|
|
+if [ "${ACTION}" != "show" ]; then
|
|
|
+ if [ ! -d "${SVDIR}/${SVC}" ]; then
|
|
|
+ echo "Could not find service \"${SVC}\""
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+fi
|
|
|
+
|
|
|
+echo "${ACTION}" | grep -q "start\|stop\|status\|show\|add\|delete"
|
|
|
+if [ $? -ne 0 ]; then
|
|
|
+ echo "Unknown action \"${ACTION}\""
|
|
|
+ exit 10
|
|
|
+fi
|
|
|
+
|
|
|
+if echo "${ACTION}" | grep -qE "start|stop|status"; then
|
|
|
+ if [ ! -L "${SERVICEDIR}/${SVC}" ]; then
|
|
|
+ echo "Service \"${SVC}\" not enabled"
|
|
|
+ exit 9
|
|
|
+ fi
|
|
|
+fi
|
|
|
+
|
|
|
+case "${ACTION}" in
|
|
|
+ "start")
|
|
|
+ OUT=$(sv u "${SVC}" 2>&1)
|
|
|
+ echo "Service \"${SVC}\" started"
|
|
|
+ exit 0
|
|
|
+ ;;
|
|
|
+ "restart")
|
|
|
+ OUT=$(sv restart "${SVC}" 2>&1)
|
|
|
+ echo "Service \"${SVC}\" restarted"
|
|
|
+ exit 0
|
|
|
+ ;;
|
|
|
+ "stop")
|
|
|
+ OUT=$(sv d "${SVC}" 2>&1)
|
|
|
+ echo "Service \"${SVC}\" stopped"
|
|
|
+ exit 0
|
|
|
+ ;;
|
|
|
+ "status")
|
|
|
+ OUT=$(sv s "${SVC}" 2>&1)
|
|
|
+ if echo "${OUT}" | grep -q "^run"; then
|
|
|
+ echo "Service \"${SVC}\" started"
|
|
|
+ exit 0
|
|
|
+ elif echo "${OUT}" | grep -q "^down.*normally up"; then
|
|
|
+ echo "Service \"${SVC}\" crashed"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+ ;;
|
|
|
+
|
|
|
+ "add")
|
|
|
+ if [ ! -d "${RUNSVDIR}/${RUNLEVEL}" ]; then
|
|
|
+ echo "Unknown runlevel \"${RUNLEVEL}\""
|
|
|
+ exit 12
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ ! -L "${RUNSVDIR}/${RUNLEVEL}/${SVC}" ]; then
|
|
|
+ ln -s "${SVDIR}/${SVC}" "${RUNSVDIR}/${RUNLEVEL}/${SVC}"
|
|
|
+ echo " * service ${SVC} added to runlevel default"
|
|
|
+ exit 0
|
|
|
+ else
|
|
|
+ echo " * rc-update: ${SVC} already installed in runlevel 'default'; skipping"
|
|
|
+ exit 0
|
|
|
+ fi
|
|
|
+ ;;
|
|
|
+ "delete")
|
|
|
+ if [ ! -d "${RUNSVDIR}/${RUNLEVEL}" ]; then
|
|
|
+ echo "Unknown runlevel \"${RUNLEVEL}\""
|
|
|
+ exit 12
|
|
|
+ fi
|
|
|
+
|
|
|
+ if [ -L "${RUNSVDIR}/${RUNLEVEL}/${SVC}" ]; then
|
|
|
+ rm "${RUNSVDIR}/${RUNLEVEL}/${SVC}"
|
|
|
+ echo " * service ${SVC} removed from runlevel default"
|
|
|
+ exit 0
|
|
|
+ else
|
|
|
+ echo " * rc-update: service '${SVC}' is not in the runlevel '${RUNLEVEL}'"
|
|
|
+ exit 0
|
|
|
+ fi
|
|
|
+ ;;
|
|
|
+ "show")
|
|
|
+ for S in $(cd ${SVDIR}; ls -1); do
|
|
|
+ printf " %-20s |" "${S}"
|
|
|
+ for RL in $(cd ${RUNSVDIR}; find -name "${S}"); do
|
|
|
+ printf " %s" "$(echo ${RL} | cut -d/ -f2)"
|
|
|
+ done
|
|
|
+ printf "\n"
|
|
|
+ done
|
|
|
+ exit 0
|
|
|
+ ;;
|
|
|
+
|
|
|
+ *)
|
|
|
+ ### DEBUG
|
|
|
+ if [ -r /tmp/service.debug.on ]; then
|
|
|
+ printf >>/tmp/service.log "UNKNOWN ACTION ${ACTION}\n" "${ACTION}" "${SVC}"
|
|
|
+ fi
|
|
|
+ ;;
|
|
|
+
|
|
|
+esac
|
|
|
+
|