netifd: enable coredumps again
[openwrt.git] / package / system / 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 #     respawn info: array with 3 values $restart_timeout $fail_hreshold $max_fail
16 #     env: environment variable (passed to the process)
17 #     data: arbitrary name/value pairs for detecting config changes (table)
18 #     file: configuration files (array)
19 #     netdev: bound network device (detects ifindex changes)
20 #     limits: resource limits (passed to the process)
21 #
22 #   No space separation is done for arrays/tables - use one function argument per command line argument
23 #
24 # procd_close_instance():
25 #   Complete the instance being prepared
26 #
27 # procd_kill(service, [instance]):
28 #   Kill a service instance (or all instances)
29 #
30
31 . $IPKG_INSTROOT/usr/share/libubox/jshn.sh
32
33 _PROCD_SERVICE=
34
35 _procd_call() {
36         local old_cb
37
38         json_set_namespace procd old_cb
39         "$@"
40         json_set_namespace $old_cb
41 }
42
43 _procd_wrapper() {
44         while [ -n "$1" ]; do
45                 eval "$1() { _procd_call _$1 \"\$@\"; }"
46                 shift
47         done
48 }
49
50 _procd_ubus_call() {
51         local cmd="$1"
52
53         ubus call service "$cmd" "$(json_dump)"
54         json_cleanup
55 }
56
57 _procd_open_service() {
58         local name="$1"
59         local script="$2"
60
61         _PROCD_SERVICE="$name"
62         _PROCD_INSTANCE_SEQ=0
63
64         json_init
65         json_add_string name "$name"
66         [ -n "$script" ] && json_add_string script "$script"
67         json_add_object instances
68 }
69
70 _procd_close_service() {
71         json_close_object
72         service_triggers
73         _procd_ubus_call set
74 }
75
76 _procd_add_array_data() {
77         while [ -n "$1" ]; do
78                 json_add_string "" "$1"
79                 shift
80         done
81 }
82
83 _procd_add_array() {
84         json_add_array "$1"
85         shift
86         _procd_add_array_data "$@"
87         json_close_array
88 }
89
90 _procd_add_table_data() {
91         while [ -n "$1" ]; do
92                 local var="${1%%=*}"
93                 local val="${1#*=}"
94                 [[ "$1" == "$val" ]] && val=
95                 json_add_string "$var" "$val"
96                 shift
97         done
98 }
99
100 _procd_add_table() {
101         json_add_object "$1"
102         shift
103         _procd_add_table_data "$@"
104         json_close_object
105 }
106
107 _procd_open_instance() {
108         local name="$1"; shift
109
110         _PROCD_INSTANCE_SEQ="$(($_PROCD_INSTANCE_SEQ + 1))"
111         name="${name:-instance$_PROCD_INSTANCE_SEQ}"
112         json_add_object "$name"
113 }
114
115 _procd_open_trigger() {
116         json_add_array "triggers"
117 }
118
119 _procd_open_validate() {
120         json_add_array "validate"
121 }
122
123 _procd_set_param() {
124         local type="$1"; shift
125
126         case "$type" in
127                 env|data|limits)
128                         _procd_add_table "$type" "$@"
129                 ;;
130                 command|netdev|file|respawn)
131                         _procd_add_array "$type" "$@"
132                 ;;
133                 nice)
134                         json_add_int "$type" "$1"
135                 ;;
136         esac
137 }
138
139 _procd_add_config_trigger() {
140         json_add_array
141         _procd_add_array_data "$1"
142         shift
143
144         json_add_array
145         _procd_add_array_data "if"
146
147         json_add_array
148         _procd_add_array_data "eq" "package" "$1"
149         shift
150         json_close_array
151
152         json_add_array
153         _procd_add_array_data "run_script" "$@"
154         json_close_array
155
156         json_close_array
157
158         json_close_array
159 }
160
161 _procd_add_reload_trigger() {
162         local script=$(readlink "$initscript")
163         local name=$(basename ${script:-$initscript})
164
165         _procd_open_trigger
166         _procd_add_config_trigger "config.change" $1 /etc/init.d/$name reload
167         _procd_close_trigger
168 }
169
170 _procd_add_validation() {
171         _procd_open_validate
172         $@
173         _procd_close_validate
174 }
175
176 _procd_append_param() {
177         local type="$1"; shift
178
179         json_select "$type"
180         case "$type" in
181                 env|data|limits)
182                         _procd_add_table_data "$@"
183                 ;;
184                 command|netdev|file|respawn)
185                         _procd_add_array_data "$@"
186                 ;;
187         esac
188         json_select ..
189 }
190
191 _procd_close_instance() {
192         json_close_object
193 }
194
195 _procd_close_trigger() {
196         json_close_array
197 }
198
199 _procd_close_validate() {
200         json_close_array
201 }
202
203 _procd_add_instance() {
204         _procd_open_instance
205         _procd_set_param command "$@"
206         _procd_close_instance
207 }
208
209 _procd_kill() {
210         local service="$1"
211         local instance="$2"
212
213         json_init
214         [ -n "$service" ] && json_add_string name "$service"
215         [ -n "$instance" ] && json_add_string instance "$instance"
216         _procd_ubus_call delete
217 }
218
219 uci_validate_section()
220 {
221         local package="$1"
222         local type="$2"
223         local name="$3"
224         local error
225         shift; shift; shift
226         local result=`/sbin/validate_data "$package" "$type" "$name" "$@" 2> /dev/null`
227         error=$?
228         eval "$result"
229         [ "$error" = "0" ] || `/sbin/validate_data "$package" "$type" "$name" "$@" 1> /dev/null`
230         return $error
231 }
232
233 _procd_wrapper \
234         procd_open_service \
235         procd_close_service \
236         procd_add_instance \
237         procd_add_config_trigger \
238         procd_add_reload_trigger \
239         procd_open_trigger \
240         procd_close_trigger \
241         procd_open_instance \
242         procd_close_instance \
243         procd_set_param \
244         procd_append_param \
245         procd_add_validation \
246         procd_kill