#!/bin/bash
set -eu
ACTION="$1"
SERVICE="$2"
WORKDIR=/var/lib/lfsservicemgr
LOG="logger -t lfsservicemgr[$$]"
LOGINFO="$LOG -p daemon.info"
LOGERR="$LOG -s -p daemon.err"

$LOGINFO "invoked by $PPID with $@"
mkdir -p "$WORKDIR"
case "$SERVICE" in
    dhcpd)
	CONFFILE="$WORKDIR/dhcpd.conf"
	PIDFILE=/var/run/dhcpd.pid
	LEASEFILE=/var/db/dhcpd.leases
	LISTFILE="$WORKDIR/dhcplist"
	touch "$LISTFILE"
	mkdir -p $(dirname "$LEASEFILE")

	case "$ACTION" in
	    start)
		CONFIGS=$(cat "$LISTFILE")
		if test "$CONFIGS"; then
		    ERR=$(cat $CONFIGS 2>&1 > "$CONFFILE") || { $LOGINFO concatenating files failed: $ERR ;exit 1; }
		    $LOGINFO starting with configs $CONFIGS
		    touch "$LEASEFILE"
		    chown dhcpd:dhcpd "$LEASEFILE"
		    dhcpd -q -cf "$CONFFILE" -lf "$LEASEFILE" -user dhcpd -group dhcpd -pf "$PIDFILE"
		else
		    $LOGINFO no configs, not starting
		fi
		;;
	    stop)
		if test -r "$PIDFILE"; then
		    killall dhcpd || true
		    rm "$PIDFILE"
		fi
		;;
	    reload)
		$0 restart "$SERVICE"
		;;
	    restart)
		$0 stop "$SERVICE"
		$0 start "$SERVICE"
		;;
	    register)
		FILE="$3"
		if ! test -r "$FILE"; then
		    $LOGERR "File $FILE not readable."
		    exit 1
		fi
		if test -d "$FILE"; then
		    $LOGERR "$FILE is a directory, not a file."
		    exit 1
		fi
		(
		    cat "$LISTFILE"
		    echo $3
		) | sort -u > "$LISTFILE".new
		mv "$LISTFILE".new "$LISTFILE"
		$0 restart "$SERVICE"
		;;
	    unregister)
		grep -v "^$3\$" "$LISTFILE" > "$LISTFILE".new || true
		mv "$LISTFILE".new "$LISTFILE"
		$0 restart "$SERVICE"
		;;
	    *)
		$LOGERR "Unknown action '$ACTION'."
		exit 1
		;;
	esac
	;;
    *)
	$LOGERR "Unknown service '$SERVICE'."
	exit 1
	;;
esac
