Root/package/procd/files/procd.sh

1# procd API:
2#
3# procd_open_service(name, [script]):
4# Initialize a new procd command message containing a service with one or more instances
5#
6# procd_close_service()
7# Send the command message for the service
8#
9# procd_open_instance([name]):
10# Add an instance to the service described by the previous procd_open_service call
11#
12# procd_set_param(type, [value...])
13# Available types:
14# command: command line (array).
15# env: environment variable (passed to the process)
16# data: arbitrary name/value pairs for detecting config changes (table)
17# file: configuration files (array)
18# netdev: bound network device (detects ifindex changes)
19#
20# No space separation is done for arrays/tables - use one function argument per command line argument
21#
22# procd_close_instance():
23# Complete the instance being prepared
24#
25# procd_kill(service, [instance]):
26# Kill a service instance (or all instances)
27#
28
29. $IPKG_INSTROOT/usr/share/libubox/jshn.sh
30
31_PROCD_SERVICE=
32
33_procd_call() {
34    local old_cb
35
36    json_set_namespace procd old_cb
37    "$@"
38    json_set_namespace $old_cb
39}
40
41_procd_wrapper() {
42    while [ -n "$1" ]; do
43        eval "$1() { _procd_call _$1 \"\$@\"; }"
44        shift
45    done
46}
47
48_procd_ubus_call() {
49    local cmd="$1"
50
51    ubus call service "$cmd" "$(json_dump)"
52    json_cleanup
53}
54
55_procd_open_service() {
56    local name="$1"
57    local script="$2"
58
59    _PROCD_SERVICE="$name"
60    _PROCD_INSTANCE_SEQ=0
61
62    json_init
63    json_add_string name "$name"
64    [ -n "$script" ] && json_add_string script "$script"
65    json_add_object instances
66}
67
68_procd_close_service() {
69    json_close_object
70    _procd_ubus_call set
71}
72
73_procd_add_array_data() {
74    while [ -n "$1" ]; do
75        json_add_string "" "$1"
76        shift
77    done
78}
79
80_procd_add_array() {
81    json_add_array "$1"
82    shift
83    _procd_add_array_data "$@"
84    json_close_array
85}
86
87_procd_add_table_data() {
88    while [ -n "$1" ]; do
89        local var="${1%%=*}"
90        local val="${1#*=}"
91        [[ "$1" == "$val" ]] && val=
92        json_add_string "$var" "$val"
93        shift
94    done
95}
96
97_procd_add_table() {
98    json_add_object "$1"
99    shift
100    _procd_add_table_data "$@"
101    json_close_object
102}
103
104_procd_open_instance() {
105    local name="$1"; shift
106
107    _PROCD_INSTANCE_SEQ="$(($_PROCD_INSTANCE_SEQ + 1))"
108    name="${name:-instance$_PROCD_INSTANCE_SEQ}"
109    json_add_object "$name"
110}
111
112_procd_set_param() {
113    local type="$1"; shift
114
115    case "$type" in
116        env|data)
117            _procd_add_table "$type" "$@"
118        ;;
119        command|netdev|file)
120            _procd_add_array "$type" "$@"
121        ;;
122        nice)
123            json_add_int "$type" "$1"
124        ;;
125    esac
126}
127
128_procd_append_param() {
129    local type="$1"; shift
130
131    json_select "$type"
132    case "$type" in
133        env|data)
134            _procd_add_table_data "$@"
135        ;;
136        command|netdev|file)
137            _procd_add_array_data "$@"
138        ;;
139    esac
140    json_select ..
141}
142
143_procd_close_instance() {
144    json_close_object
145}
146
147_procd_add_instance() {
148    _procd_open_instance
149    _procd_set_command "$@"
150    _procd_close_instance
151}
152
153_procd_kill() {
154    local service="$1"
155    local instance="$2"
156
157    json_init
158    [ -n "$service" ] && json_add_string service "$service"
159    [ -n "$instance" ] && json_add_string instance "$instance"
160    _procd_ubus_call delete
161}
162
163_procd_wrapper \
164    procd_open_service \
165    procd_close_service \
166    procd_add_instance \
167    procd_open_instance \
168    procd_close_instance \
169    procd_set_param \
170    procd_append_param \
171    procd_kill
172

Archive Download this file



interactive