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