From d58a81f35cd0187866f8f06b90a375a088181210 Mon Sep 17 00:00:00 2001 From: Yousong Zhou Date: Sun, 4 Aug 2019 15:36:08 +0000 Subject: pservice: initial version The can be convenient for running commands or services as procd services without needing to separately write initscripts, just uci configuration. The package was imported from [1]. [1] https://github.com/yousong/waller/tree/0a85f5c75fb70627f68cbbcab4807e02e3299e2e/pservice Ref: https://github.com/yousong/waller/issues/1 Signed-off-by: Yousong Zhou --- utils/pservice/files/pservice.config | 24 ++++++++++ utils/pservice/files/pservice.init | 85 ++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 utils/pservice/files/pservice.config create mode 100755 utils/pservice/files/pservice.init (limited to 'utils/pservice/files') diff --git a/utils/pservice/files/pservice.config b/utils/pservice/files/pservice.config new file mode 100644 index 000000000..0f505b398 --- /dev/null +++ b/utils/pservice/files/pservice.config @@ -0,0 +1,24 @@ +config pservice + option disabled 1 + option name 'demo0' + option command /bin/sh + option respawn_maxfail 0 + list args -c + list args 'env | logger -t $name; exec sleep $time' + list env 'v0=0' + list env 'v1=val with space' + list env 'name=demo0' + list env 'time=1799' + list file /tmp/sleep.conf + +config pservice + option disabled 1 + option name 8021x + option command /usr/sbin/wpa_supplicant + option stdout 1 + list args -i + list args eth0.1 + list args -D + list args wired + list args -c + list args /etc/wpa_supplicant-eth0.1.conf diff --git a/utils/pservice/files/pservice.init b/utils/pservice/files/pservice.init new file mode 100755 index 000000000..0a275f8f7 --- /dev/null +++ b/utils/pservice/files/pservice.init @@ -0,0 +1,85 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2017 Yousong Zhou + +START=99 + +USE_PROCD=1 + +pservice_list_cb() { + local val="$1"; shift + local param="$1"; shift + + procd_append_param "$param" "$val" +} + +pservice() { + local cfg="$1" + + eval "$(validate_pservice_section "$cfg" pservice_validate_mklocal)" + validate_pservice_section "$cfg" || return 1 + [ "$disabled" = 0 ] || return 0 + [ -x "$command" ] || return 1 + + procd_open_instance "$name" + procd_set_param command "$command" + procd_set_param stderr "$stderr" + procd_set_param stdout "$stdout" + procd_set_param respawn "$respawn_threshold" "$respawn_timeout" "$respawn_maxfail" + [ -z "$args" ] || config_list_foreach "$cfg" args pservice_list_cb command + if [ -n "$env" ]; then + procd_set_param env + config_list_foreach "$cfg" env pservice_list_cb env + fi + if [ -n "$file" ]; then + procd_set_param file + config_list_foreach "$cfg" file pservice_list_cb file + fi + procd_close_instance +} + +start_service() { + config_load 'pservice' + config_foreach pservice pservice +} + +stop_service() { + true +} + +service_triggers() { + procd_open_validate + validate_pservice_section + procd_close_validate +} + +pservice_validate_mklocal() { + local tuple opts + + shift 2 + for tuple in "$@"; do + opts="${tuple%%:*} $opts" + done + [ -z "$opts" ] || echo "local $opts" +} + +pservice_validate() { + uci_validate_section pservice "$@" +} + +validate_pservice_section() { + local cfg="$1"; shift + local func="$1"; shift + + "${func:-pservice_validate}" pservice "$cfg" \ + "disabled:bool:0" \ + "name:string" \ + "env:regex('^[a-zA-Z_][a-zA-Z0-9_]*=.*$')" \ + "command:file" \ + "args:list(string)" \ + "stderr:bool:0" \ + "stdout:bool:0" \ + "respawn_threshold:uinteger:3600" \ + "respawn_timeout:uinteger:5" \ + "respawn_maxfail:uinteger:5" \ + "file:string" +} -- cgit v1.2.3