#!/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