From 573a0a5ff1489d0ae3c582b844a80b9f693b4c71 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Fri, 01 Jun 2018 15:01:07 -0400 Subject: bin/svc: New script --- diff --git a/.gitignore.d/homerc b/.gitignore.d/homerc index 66206ac..b674cd2 100644 --- a/.gitignore.d/homerc +++ b/.gitignore.d/homerc @@ -6,6 +6,7 @@ !/.gitignore.d/homerc !/bin/ !/bin/rc +!/bin/svc # Exclude swap and backup files *.s[a-w]? diff --git a/bin/svc b/bin/svc new file mode 100755 index 0000000..5587c6d --- /dev/null +++ b/bin/svc @@ -0,0 +1,134 @@ +#!/bin/sh + +set -eu + +XDG_DATA_HOME= +XDG_CONFIG_HOME= +XDG_DATA_DIRS= +XDG_CONFIG_DIRS= +XDG_CACHE_HOME= +PIDDIR= +SERVICES= + +# TODO: "[....] service" output if attached to a tty + +load_service() +{ + local service="${1}" + shift 1 + + XDG_DATA_HOME="${XDG_DATA_HOME:-${HOME}/.local/share}" + XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-${HOME}/.config}" + XDG_DATA_DIRS="${XDG_DATA_DIRS:-/usr/local/share/:/usr/share/}" + XDG_CONFIG_DIRS="${XDG_CONFIG_DIRS:-/etc/xdg}" + XDG_CACHE_HOME="${XDG_CACHE_HOME:-${HOME}/.cache}" + PIDDIR="${XDG_CACHE_HOME}/homerc" + + # Default functions + stop() { :; } + restart() { stop; start; } + status() { :; } + + # TODO: Errors + . "${XDG_CONFIG_HOME}/homerc/${service}" +} + +act() +{ + local action="${1}" + shift 1 + + "${action}" + return ${?} +} + +match_session() +{ + local needle="${1}" + local haystack="${2}" + shift 2 + local hay= + + IFS=',' + for hay in ${haystack}; do + unset IFS + case "${hay}" in + '') continue;; + "${needle}" | "${needle}:"*) return 0;; + esac + done + unset IFS + + return 1 +} + +chg_sessions() +{ + local old_sessions="${1}" + local new_sessions="${2}" + shift 2 + local is_running= + local should_run= + + is_running=false + should_run=false + for session in ${SESSIONS}; do + if match_session "${session}" "${old_sessions}"; then + is_running=true + fi + if match_session "${session}" "${new_sessions}"; then + should_run=true + fi + done + + if ${is_running} && ! ${should_run}; then + act 'stop' + return ${?} + fi + if ! ${is_running} && ${should_run}; then + act 'start' + return ${?} + fi + + # No change. + return 0 +} + +usage() +{ + printf 'Usage: %s {start|stop|restart|status}\n' "${progname}" + + return 0 +} + +main() +{ + local service= + local action= + + if [ ${#} -ne 2 ]; then + usage 1>&2 + return 1 + fi + service="${1}" + action="${2}" + + case "${action}" in + 'start' | 'stop' | 'restart' | 'status') + load_service "${service}" || return 1 + act "${action}" + ;; + *';'*) + load_service "${service}" || return 1 + chg_sessions "${action%%;*}" "${action#*;}" + ;; + *) + usage 1>&2 + return 1 + ;; + esac + + return 0 +} + +main "${@}" -- cgit v0.9.1