commit 7161edc222ae1b1a0a6a36881a7a94c5cb6de149
Author: Christoph Lohmann <20h@r-36.net>
Date:   Wed, 10 Apr 2013 21:24:08 +0200
Initial commit of svc.
Diffstat:
35 files changed, 499 insertions(+), 0 deletions(-)
diff --git a/LICENSE b/LICENSE
@@ -0,0 +1,21 @@
+MIT/X Consortium License
+
+© 2012-13 Christoph Lohmann <20h@r-36.net>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
@@ -0,0 +1,52 @@
+# SVC – Service Handling
+
+This framework is a simple tool to handle service starting and restarting.
+
+The documentation is sparse due to it being in alpha stage.
+
+## Installation
+
+	% chmod 755 /bin/svc
+	% cp -rf svc /
+
+## Services
+### Simplest case
+
+	% touch /svc/avail/somebin
+	% svc -s somebin
+
+This will run »somebin« in the $PATH using the script in /svc/bare.sh.
+
+### Some params
+
+	% touch /svc/avail/somebin
+	% echo 'PARAMS="-a"' > /svc/default/somebin
+	% svc -s somebin
+
+This will run »somebin -a« in the $PATH using the script /svc/bare.sh.
+
+### Own script
+
+	% cp /svc/bare.sh /svc/default/somebin
+	% $EDITOR /svc/default/somebin
+	% echo 'SOME_VAR="no"' > /svc/default/somebin
+	% svc -s somebin
+
+This will run »somebin« with the script at /svc/default/somebin using the
+special variable from /svc/default/somebin.
+
+## svc(1)
+
+	% svc -a	# list all links in /svc/run (all activated services)
+	% svc -a ser	# activate service »ser« to be run on startup
+	% svc -c	# create the basic directories of svc (configure)
+	% svc -d ser	# deactivate service »ser«
+	% svc -k	# kill all services linked to /svc/run
+	% svc -k ser	# kill the service »ser«
+	% svc -s	# run all services linked to /svc/run
+	% svc -s ser	# run service »ser«
+	% svc -l	# list all services in /svc/avail
+	% svc -r ser	# restart service »ser«
+
+Have fun!
+
diff --git a/bin/svc b/bin/svc
@@ -0,0 +1,112 @@
+#!/bin/sh
+#
+# See LICENSE file for license details.
+#
+
+BASEDIR="/svc"
+BASENAME="$(basename $0)"
+
+usage() {
+	printf "usage: %s [-acdklrs] [service]\n" "$BASENAME" >&2
+	exit 1
+}
+
+if [ $# -lt 1 ];
+then
+	usage
+fi
+
+runservice() {
+	service="$1"
+	dir="$2"
+	cmd="$3"
+
+	if [ $(stat -L -t "$BASEDIR/$dir/$service" | cut -d' ' -f 2) -eq 0 ];
+	then
+		"$BASEDIR/bare.sh" "$service" "$cmd" 2>&1 >/dev/null &
+	else
+		"$BASEDIR/$dir/$service" "$cmd" 2>&1 >/dev/null &
+	fi
+}
+
+doservice() {
+	cmd="$1"
+	service="$2"
+
+	if [ -z "${service}" ];
+	then
+		cd $BASEDIR/run
+		services=$(ls -1 .)
+		for s in ${services};
+		do
+			runservice "$s" run "$cmd"
+			printf "%s: '%s' %s.\n" \
+				"$BASENAME" "$s" "$cmd"
+		done
+	else
+		if [ -x "$BASEDIR/avail/$service" ];
+		then	
+			runservice "$service" avail "$cmd"
+			printf "%s: '%s' %s.\n" \
+				"$BASENAME" "$service" "$cmd"
+		else
+			printf "%s: '%s' is not available or executable.\n" \
+				"$BASENAME" "$service" >&2
+			exit 1
+		fi
+	fi
+}
+
+case "$1" in
+	-a)
+		if [ $# -gt 1 ] && [ -e "$BASEDIR/avail/$2" ];
+		then
+			ln -sf "$BASEDIR/avail/$2" "$BASEDIR/run/$2"
+			printf "%s: '%s' activated.\n" \
+				"$BASENAME" "$2"
+		else
+			cd $BASEDIR/run
+			ls .
+		fi 
+		;;	
+	-c)
+		[ -d "$BASEDIR" ] || mkdir -p "$BASEDIR"
+		[ -d "$BASEDIR/avail" ] || mkdir -p "$BASEDIR/avail"
+		[ -d "$BASEDIR/default" ] || mkdir -p "$BASEDIR/default"
+		[ -d "$BASEDIR/run" ] || mkdir -p "$BASEDIR/run"
+		;;
+	-d)
+		if [ $# -gt 1 ] && [ -e "$BASEDIR/run/$2" ];
+		then
+			rm -f "$BASEDIR/run/$2"
+			printf "%s: '%s' deactivated.\n" \
+				"$BASENAME" "$2"
+		else
+			printf "%s: No service given or service is not marked as to run.\n" \
+				"$BASENAME" >&2
+			exit 1
+		fi
+		;;
+	-k|-s)
+		doservice "$1" "$2"
+		;;
+	-l)
+		cd $BASEDIR/avail
+		ls .
+		;;
+	-r)
+		if [ $# -gt 1 ];
+		then
+			svc -k "$2"
+			svc -s "$2"
+		else
+			printf "%s: please give a service name.\n" \
+				"$BASENAME" >&2
+			exit 1
+		fi
+		;;
+	*)
+		usage
+		;;
+esac
+
diff --git a/svc/avail/acpid b/svc/avail/acpid
diff --git a/svc/avail/alsa b/svc/avail/alsa
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+SERVICE="alsa"
+
+[ -e "/svc/default/$SERVICE" ] && . "/svc/default/$SERVICE"
+
+PID=$(pidof -o %PPID $BIN)
+
+case $1 in
+	-s)
+		[ -e "$STATEFILE" ] || alsactl $PARAMS store
+		alsactl $PARAMS restore
+
+		dfiles="/sys/modules/snd_ac97_codec/parameters/power_save
+			/sys/modules/snd_hda_intel/parameters/power_save"
+		for f in dfiles;
+		do
+			if [ -e $f ];
+			then
+				echo $POWERSAVE > $f
+				[ -c /dev/dsp ] && echo 1 > /dev/dsp
+			fi
+		done
+		;;
+	-k)
+		[ "$SAVEVOLUME" = "yes" ] && alsactl $PARAMS store
+		[ "$MUTEVOLUME" = "yes" ] && amixer -q set Master 0 mute
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/avail/atd b/svc/avail/atd
diff --git a/svc/avail/barebone b/svc/avail/barebone
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+SERVICE="barebone"
+
+[ -e "/svc/default/$SERVICE" ] && . "/svc/default/$SERVICE"
+
+BIN="/usr/bin/$SERVICE"
+
+PID=$(pidof -o %PPID $BIN)
+
+case $1 in
+	-s)
+		[ -z "$PID" ] && $BIN $PARAMS;
+		;;
+	-k)
+		[ -n "$PID" ] && kill -9 $PID &> /dev/null;
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/avail/crond b/svc/avail/crond
diff --git a/svc/avail/dovecot b/svc/avail/dovecot
diff --git a/svc/avail/fancontrol b/svc/avail/fancontrol
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+set -x
+
+SERVICE="fancontrol"
+
+[ -e "/svc/default/$SERVICE" ] && . "/svc/default/$SERVICE"
+
+BIN="/usr/sbin/$SERVICE"
+
+PID=$(pidof -o %PPID -x $BIN)
+
+case $1 in
+	-s)
+		[ -z "$PID" ] && {
+			rm /run/fancontrol.pid
+			$BIN $PARAMS
+		}
+		;;
+	-k)
+		[ -n "$PID" ] && {
+			for p in $PID;
+			do
+				kill -9 $p &> /dev/null;
+			done
+		}
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/avail/gpsd b/svc/avail/gpsd
diff --git a/svc/avail/hostapd b/svc/avail/hostapd
diff --git a/svc/avail/hwclock b/svc/avail/hwclock
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+. /svc/default/hwclock
+
+case $1 in
+	-s)
+		;;
+	-k)
+		hwclock --adjust $PARAMS
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/avail/input-event-daemon b/svc/avail/input-event-daemon
diff --git a/svc/avail/laptop-mode b/svc/avail/laptop-mode
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+SERVICE="laptop-mode"
+
+[ -e "/svc/default/$SERVICE" ] && . "/svc/default/$SERVICE"
+
+BIN="/usr/sbin/$SERVICE"
+
+case $1 in
+	-s)
+		[ ! -d /run/laptop-mode-tools ] && install -d /run/laptop-mode-tools
+		rm -f /run/laptop-mode-tools/*
+		touch /run/laptop-mode-tools/enabled
+		$BIN auto 2>&1 >/dev/null
+		;;
+	-k)
+		rm -f /run/laptop-mode-tools/enabled
+		$BIN stop 2>&1 >/dev/null
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/avail/nscd b/svc/avail/nscd
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+SERVICE="nscd"
+
+BIN="/usr/sbin/$SERVICE"
+
+PID=$(pidof -o %PPID $BIN)
+
+case $1 in
+	-s)
+		if [ -z $PID ];
+		then
+			rm -f "/run/$SERVICE.pid" 2>&1 >/dev/null
+			mkdir -p /run/nscd /var/db/nscd
+			rm -f /run/nscd/* /var/db/nscd/* 2>&1 >/dev/null
+
+			$BIN $PARAMS;
+		fi
+		;;
+	-k)
+		if [ -n $PID ];
+		then
+			nscd --shutdown 2>&1 >/dev/null
+			rm -f "/run/$SERVICE.pid" 2>&1 >/dev/null
+		fi
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/avail/oscam b/svc/avail/oscam
diff --git a/svc/avail/rfkill b/svc/avail/rfkill
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+. /svc/default/rfkill
+
+case $1 in
+	-s)
+		for s in $BLOCK;
+		do
+			rfkill block $s
+		done
+
+		for s in $UNBLOCK
+		do
+			rfkill unblock $s
+		done
+		;;
+	-k)
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/avail/rfkilld b/svc/avail/rfkilld
diff --git a/svc/avail/sensors b/svc/avail/sensors
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+. /svc/default/sensors
+
+case $1 in
+	-s)
+		for m in $HWMON_MODULES;
+		do
+			modprobe $m
+		done
+		;;
+	-k)
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/avail/sshd b/svc/avail/sshd
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+SERVICE="sshd"
+
+[ -e "/svc/default/$SERVICE" ] && . "/svc/default/$SERVICE"
+
+BIN=""
+for p in /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin;
+do
+	if [ -x "$p/$SERVICE" ];
+	then
+		BIN="$p/$SERVICE"
+		break
+	fi
+done
+[ -z "$BIN" ] && exit 1
+
+PID=$(pidof -o %PPID $BIN)
+
+case $1 in
+	-s)
+		ssh-keygen -A
+		[ -d /var/empty ] || mkdir -p /var/empty
+		[ -z "$PID" ] && $BIN $PARAMS;
+		;;
+	-k)
+		[ -n "$PID" ] && kill -9 $PID &> /dev/null;
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/avail/syslog-ng b/svc/avail/syslog-ng
diff --git a/svc/avail/wireless-regdom b/svc/avail/wireless-regdom
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+. /svc/default/wireless-regdom
+
+case $1 in
+	-s)
+		;;
+	-k)
+		iw reg set $REGDOM
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/bare.sh b/svc/bare.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+[ $# -eq 0 ] && SERVICE="$0"
+
+if [ $# -gt 0 ];
+then
+	SERVICE="$1"
+	shift 1
+fi
+
+[ -e "/svc/default/$SERVICE" ] && . "/svc/default/$SERVICE"
+
+BIN=""
+for p in /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin;
+do
+	if [ -x "$p/$SERVICE" ];
+	then
+		BIN="$p/$SERVICE"
+		break
+	fi
+done
+[ -z "$BIN" ] && exit 1
+
+PID=$(pidof -o %PPID $BIN)
+
+case $1 in
+	-s)
+		[ -z "$PID" ] && $BIN $PARAMS;
+		;;
+	-k)
+		[ -n "$PID" ] && kill -9 $PID &> /dev/null;
+		;;
+	*)
+		echo "usage: $0 -s|-k"
+		exit 1
+esac
+
diff --git a/svc/default/alsa b/svc/default/alsa
@@ -0,0 +1,6 @@
+STATEFILE="/var/lib/alsa/asound.state"
+PARAMS=""
+SAVEVOLUME="yes"
+MUTEVOLUME="no"
+POWERSAVE=0
+
diff --git a/svc/default/crond b/svc/default/crond
@@ -0,0 +1,2 @@
+PARAMS="-s /cron/cron.d -c /cron/crontabs -t /cron/cronstamps -S -l info"
+
diff --git a/svc/default/dovecot b/svc/default/dovecot
@@ -0,0 +1,2 @@
+PARAMS="-c /cfg/dovecot/dovecot.conf"
+
diff --git a/svc/default/fancontrol b/svc/default/fancontrol
@@ -0,0 +1,2 @@
+PARAMS="-D"
+
diff --git a/svc/default/gpsd b/svc/default/gpsd
@@ -0,0 +1,2 @@
+PARAMS="-F /run/gpsd.sock /dev/ttyUSB0"
+
diff --git a/svc/default/hostapd b/svc/default/hostapd
@@ -0,0 +1,2 @@
+PARAMS="-B /cfg/hostapd/hostapd.conf"
+
diff --git a/svc/default/hwclock b/svc/default/hwclock
@@ -0,0 +1,3 @@
+# --utc or --localtime
+PARAMS="--utc"
+
diff --git a/svc/default/oscam b/svc/default/oscam
@@ -0,0 +1,2 @@
+PARAMS="-b -c /cfg/oscam"
+
diff --git a/svc/default/rfkill b/svc/default/rfkill
@@ -0,0 +1,3 @@
+BLOCK="wwan bluetooth"
+UNBLOCK="wifi"
+
diff --git a/svc/default/sensors b/svc/default/sensors
@@ -0,0 +1,5 @@
+# Get here the HWMON_MODULES from the generated lm_sensors file, which
+# sensors-detect(8) generates.
+
+HWMON_MODULES="coretemp"
+
diff --git a/svc/default/wireless-regdom b/svc/default/wireless-regdom
@@ -0,0 +1,2 @@
+REGDOM="de"
+