base-files: uci-defaults-new: properly quote variables
[openwrt.git] / package / base-files / files / lib / functions / uci-defaults-new.sh
1 #!/bin/ash
2
3 CFG=/etc/board.json
4
5 . /usr/share/libubox/jshn.sh
6
7 json_select_array() {
8         local _json_no_warning=1
9
10         json_select "$1"
11         [ $? = 0 ] && return
12
13         json_add_array "$1"
14         json_close_array
15
16         json_select "$1"
17 }
18
19 json_select_object() {
20         local _json_no_warning=1
21
22         json_select "$1"
23         [ $? = 0 ] && return
24
25         json_add_object "$1"
26         json_close_object
27
28         json_select "$1"
29 }
30
31 _ucidef_set_interface() {
32         local name="$1"
33         local iface="$2"
34
35         json_select_object "$name"
36         json_add_string ifname "${iface%%.*}"
37         [ "$iface" = "${iface%%.*}" ] || json_add_boolean create_vlan 1
38         json_select ..
39 }
40
41 ucidef_set_interface_loopback()
42 {
43         # stub
44         local a="$1"
45 }
46
47 ucidef_set_interface_lan() {
48         local lan_if="$1"
49
50         json_select_object network
51         _ucidef_set_interface lan $lan_if
52         json_select ..
53 }
54
55 ucidef_set_interface_wan() {
56         local wan_if="$1"
57
58         json_select_object network
59         _ucidef_set_interface wan $wan_if
60         json_select ..
61 }
62
63 ucidef_set_interfaces_lan_wan() {
64         local lan_if="$1"
65         local wan_if="$2"
66
67         json_select_object network
68         _ucidef_set_interface lan $lan_if
69         _ucidef_set_interface wan $wan_if
70         json_select ..
71 }
72
73 ucidef_add_switch() {
74         local name="$1"
75         local reset="$2"
76         local enable="$3"
77
78         json_select_object switch
79
80         json_select_object "$name"
81         json_add_boolean enable "$enable"
82         json_add_boolean reset "$reset"
83         json_select ..
84
85         json_select ..
86 }
87
88 ucidef_add_switch_attr() {
89         local name="$1"
90         local key="$2"
91         local val="$3"
92
93         json_select_object switch
94         json_select_object "$name"
95
96         case "$val" in
97                 [0-9]) json_add_int "$key" "$val" ;;
98                 *) json_add_string "$key" "$val" ;;
99         esac
100
101         json_select ..
102         json_select ..
103 }
104
105 ucidef_add_switch_ports() {
106         local name="$1"; shift
107         local port num role dev idx
108
109         json_select_object switch
110         json_select_object "$name"
111         json_select_array ports
112
113         for port in "$@"; do
114                 case "$port" in
115                         [0-9]*@*)
116                                 num="${port%%@*}"
117                                 dev="${port##*@}"
118                         ;;
119                         [0-9]*:*:[0-9]*)
120                                 num="${port%%:*}"
121                                 idx="${port##*:}"
122                                 role="${port#[0-9]*:}"; role="${role%:*}"
123                         ;;
124                         [0-9]*:*)
125                                 num="${port%%:*}"
126                                 role="${port##*:}"
127                         ;;
128                 esac
129
130                 if [ -n "$num" ] && [ -n "$dev$role" ]; then
131                         json_add_object
132                         json_add_int num "$num"
133                         [ -n "$dev" ] && json_add_string device "$dev"
134                         [ -n "$role" ] && json_add_string role "$role"
135                         [ -n "$idx" ] && json_add_int index "$idx"
136                         json_close_object
137                 fi
138
139                 unset num dev role idx
140         done
141
142         json_select ..
143         json_select ..
144         json_select ..
145 }
146
147 ucidef_add_switch_port_attr() {
148         local name="$1"
149         local port="$2"
150         local key="$3"
151         local val="$4"
152         local ports i num
153
154         json_select_object switch
155         json_select_object "$name"
156
157         json_get_keys ports ports
158         json_select_array ports
159
160         for i in $ports; do
161                 json_select "$i"
162                 json_get_var num num
163
164                 if [ -n "$num" ] && [ $num -eq $port ]; then
165                         json_select_object attr
166
167                         case "$val" in
168                                 [0-9]) json_add_int "$key" "$val" ;;
169                                 *) json_add_string "$key" "$val" ;;
170                         esac
171
172                         json_select ..
173                 fi
174
175                 json_select ..
176         done
177
178         json_select ..
179         json_select ..
180         json_select ..
181 }
182
183 ucidef_add_switch_vlan() {
184         local name="$1"
185         local vlan="$2"
186         local ports="$3"
187         local cpu_port=''
188
189         case $vlan in
190         1)      vlan=lan;;
191         2)      vlan=wan;;
192         *)      vlan=vlan$vlan;;
193         esac
194
195         json_select_object switch
196         json_select_object "$name"
197         json_select_object vlans
198
199         json_add_array "$vlan"
200         for p in $ports; do
201                 if [ ${p%t} != $p ]; then
202                         cpu_port=$p
203                 else
204                         json_add_int "" $p
205                 fi
206         done
207         json_close_array
208
209         json_select ..
210         [ -n "$cpu_port" ] && json_add_int cpu_port "$cpu_port"
211         json_select ..
212         json_select ..
213 }
214
215 ucidef_set_interface_macaddr() {
216         local network="$1"
217         local macaddr="$2"
218
219         json_select_object network
220
221         json_select "$network"
222         [ $? -eq 0 ] || {
223                 json_select ..
224                 return
225         }
226
227         json_add_string macaddr "$macaddr"
228         json_select ..
229
230         json_select ..
231 }
232
233 ucidef_set_led_netdev() {
234         local cfg="led_$1"
235         local name="$2"
236         local sysfs="$3"
237         local dev="$4"
238
239         json_select_object led
240
241         json_select_object "$1"
242         json_add_string name "$name"
243         json_add_string type netdev
244         json_add_string sysfs "$sysfs"
245         json_add_string device "$dev"
246         json_select ..
247
248         json_select ..
249 }
250
251 ucidef_set_led_interface() {
252         local name="$1"
253         local sysfs="$2"
254
255         json_select_object led
256
257         json_select_object "$1"
258         json_add_string name "$name"
259         json_add_string type interface
260         json_add_string sysfs "$sysfs"
261         json_add_string interface "$name"
262         json_select ..
263
264         json_select ..
265 }
266
267 ucidef_set_led_usbdev() {
268         local cfg="led_$1"
269         local name="$2"
270         local sysfs="$3"
271         local dev="$4"
272
273         json_select_object led
274
275         json_select_object "$1"
276         json_add_string name "$name"
277         json_add_string type usb
278         json_add_string sysfs "$sysfs"
279         json_add_string device "$dev"
280         json_select ..
281
282         json_select ..
283 }
284
285 ucidef_set_led_wlan() {
286         local cfg="led_$1"
287         local name="$2"
288         local sysfs="$3"
289         local trigger="$4"
290
291         json_select_object led
292
293         json_select_object "$1"
294         json_add_string name "$name"
295         json_add_string type trigger
296         json_add_string sysfs "$sysfs"
297         json_add_string trigger "$trigger"
298         json_select ..
299
300         json_select ..
301 }
302
303 ucidef_set_led_switch() {
304         local cfg="led_$1"
305         local name="$2"
306         local sysfs="$3"
307         local trigger="$4"
308         local port_mask="$5"
309
310         json_select_object led
311
312         json_select_object "$1"
313         json_add_string name "$name"
314         json_add_string type switch
315         json_add_string sysfs "$sysfs"
316         json_add_string trigger "$trigger"
317         json_add_string port_mask "$port_mask"
318         json_select ..
319
320         json_select ..
321 }
322
323 ucidef_set_led_default() {
324         local cfg="led_$1"
325         local name="$2"
326         local sysfs="$3"
327         local default="$4"
328
329         json_select_object led
330
331         json_select_object "$1"
332         json_add_string name "$name"
333         json_add_string sysfs "$sysfs"
334         json_add_string default "$default"
335         json_select ..
336
337         json_select ..
338 }
339
340 ucidef_set_led_rssi() {
341         local cfg="led_$1"
342         local name="$2"
343         local sysfs="$3"
344         local iface="$4"
345         local minq="$5"
346         local maxq="$6"
347         local offset="$7"
348         local factor="$8"
349
350         json_select_object led
351
352         json_select_object rssi
353         json_select_object "$1"
354         json_add_string name "$name"
355         json_add_string sysfs "$sysfs"
356         json_add_string minq "$minq"
357         json_add_string maxq "$maxq"
358         json_add_string offset "$offset"
359         json_add_string factor "$factor"
360         json_select ..
361         json_select ..
362
363         json_select ..
364 }
365
366 ucidef_set_rssimon() {
367         local dev="$1"
368         local refresh="$2"
369         local threshold="$3"
370
371         json_select_object led
372
373         json_select_object rssi
374         json_add_string type rssi
375         json_add_string dev "$dev"
376         json_add_string threshold "$threshold"
377         json_select ..
378
379         json_select ..
380
381 }
382
383 board_config_update() {
384         json_init
385         [ -f ${CFG} ] && json_load "$(cat ${CFG})"
386 }
387
388 board_config_flush() {
389         json_dump -i > /tmp/.board.json
390         mv /tmp/.board.json ${CFG}
391 }