diff options
Diffstat (limited to 'package/system/procd/files/procd.sh')
| -rw-r--r-- | package/system/procd/files/procd.sh | 108 |
1 files changed, 103 insertions, 5 deletions
diff --git a/package/system/procd/files/procd.sh b/package/system/procd/files/procd.sh index d86b7219da8..8ee25f4f08b 100644 --- a/package/system/procd/files/procd.sh +++ b/package/system/procd/files/procd.sh @@ -198,7 +198,6 @@ _procd_add_jail() { netns) json_add_boolean "netns" "1";; userns) json_add_boolean "userns" "1";; cgroupsns) json_add_boolean "cgroupsns" "1";; - console) json_add_boolean "console" "1";; esac done json_add_object "mount" @@ -329,6 +328,79 @@ _procd_add_config_trigger() { json_close_array } +_procd_add_mount_trigger() { + json_add_array + _procd_add_array_data "$1" + local action="$2" + local multi=0 + shift ; shift + + json_add_array + _procd_add_array_data "if" + + if [ "$2" ]; then + json_add_array + _procd_add_array_data "or" + multi=1 + fi + + while [ "$1" ]; do + json_add_array + _procd_add_array_data "eq" "target" "$1" + shift + json_close_array + done + + [ $multi = 1 ] && json_close_array + + json_add_array + _procd_add_array_data "run_script" /etc/init.d/$name $action + json_close_array + + json_close_array + _procd_add_timeout + json_close_array +} + +_procd_add_action_mount_trigger() { + local action="$1" + shift + local mountpoints="$(procd_get_mountpoints "$@")" + [ "${mountpoints//[[:space:]]}" ] || return 0 + local script=$(readlink "$initscript") + local name=$(basename ${script:-$initscript}) + + _procd_open_trigger + _procd_add_mount_trigger mount.add $action "$mountpoints" + _procd_close_trigger +} + +procd_get_mountpoints() { + ( + __procd_check_mount() { + local cfg="$1" + local path="${2%%/}/" + local target + config_get target "$cfg" target + target="${target%%/}/" + [ "$path" != "${path##$target}" ] && echo "${target%%/}" + } + local mpath + config_load fstab + for mpath in "$@"; do + config_foreach __procd_check_mount mount "$mpath" + done + ) | sort -u +} + +_procd_add_restart_mount_trigger() { + _procd_add_action_mount_trigger restart "$@" +} + +_procd_add_reload_mount_trigger() { + _procd_add_action_mount_trigger reload "$@" +} + _procd_add_raw_trigger() { json_add_array _procd_add_array_data "$1" @@ -452,7 +524,10 @@ _procd_send_signal() { _procd_status() { local service="$1" local instance="$2" - local data + local data state + local n_running=0 + local n_stopped=0 + local n_total=0 json_init [ -n "$service" ] && json_add_string name "$service" @@ -467,10 +542,29 @@ _procd_status() { fi [ -n "$instance" ] && instance="\"$instance\"" || instance='*' - if [ -z "$(echo "$data" | jsonfilter -e '$['"$instance"']')" ]; then - echo "unknown instance $instance"; return 4 + + for state in $(jsonfilter -s "$data" -e '$['"$instance"'].running'); do + n_total=$((n_total + 1)) + case "$state" in + false) n_stopped=$((n_stopped + 1)) ;; + true) n_running=$((n_running + 1)) ;; + esac + done + + if [ $n_total -gt 0 ]; then + if [ $n_running -gt 0 ] && [ $n_stopped -eq 0 ]; then + echo "running" + return 0 + elif [ $n_running -gt 0 ]; then + echo "running ($n_running/$n_total)" + return 0 + else + echo "not running" + return 5 + fi else - echo "running"; return 0 + echo "unknown instance $instance" + return 4 fi } @@ -560,8 +654,12 @@ _procd_wrapper \ procd_add_raw_trigger \ procd_add_config_trigger \ procd_add_interface_trigger \ + procd_add_mount_trigger \ procd_add_reload_trigger \ procd_add_reload_interface_trigger \ + procd_add_action_mount_trigger \ + procd_add_reload_mount_trigger \ + procd_add_restart_mount_trigger \ procd_open_trigger \ procd_close_trigger \ procd_open_instance \ |
