919aac88d364c9c7696c88320eea1f104ed080e3
[openwrt.git] / package / base-files / files / lib / functions / uci-defaults-new.sh
1 #!/bin/ash
2
3 CFG=/etc/board.json
4
5 . /lib/functions.sh
6 . /usr/share/libubox/jshn.sh
7
8 json_select_array() {
9         local _json_no_warning=1
10
11         json_select "$1"
12         [ $? = 0 ] && return
13
14         json_add_array "$1"
15         json_close_array
16
17         json_select "$1"
18 }
19
20 json_select_object() {
21         local _json_no_warning=1
22
23         json_select "$1"
24         [ $? = 0 ] && return
25
26         json_add_object "$1"
27         json_close_object
28
29         json_select "$1"
30 }
31
32 _ucidef_set_interface() {
33         local name="$1"
34         local iface="$2"
35         local proto="$3"
36
37         json_select_object "$name"
38         json_add_string ifname "$iface"
39
40         if ! json_is_a protocol string; then
41                 case "$proto" in
42                         static|dhcp|none) : ;;
43                         *)
44                                 case "$name" in
45                                         lan) proto="static" ;;
46                                         wan) proto="dhcp" ;;
47                                         *) proto="none" ;;
48                                 esac
49                         ;;
50                 esac
51
52                 json_add_string protocol "$proto"
53         fi
54
55         json_select ..
56 }
57
58 ucidef_set_board_id() {
59         json_select_object model
60         json_add_string id "$1"
61         json_select ..
62 }
63
64 ucidef_set_model_name() {
65         json_select_object model
66         json_add_string name "$1"
67         json_select ..
68 }
69
70 ucidef_set_interface_lan() {
71         json_select_object network
72         _ucidef_set_interface lan "$@"
73         json_select ..
74 }
75
76 ucidef_set_interface_wan() {
77         json_select_object network
78         _ucidef_set_interface wan "$@"
79         json_select ..
80 }
81
82 ucidef_set_interfaces_lan_wan() {
83         local lan_if="$1"
84         local wan_if="$2"
85
86         json_select_object network
87         _ucidef_set_interface lan "$lan_if"
88         _ucidef_set_interface wan "$wan_if"
89         json_select ..
90 }
91
92 _ucidef_add_switch_port() {
93         # inherited: $num $device $need_tag $role $index $prev_role
94         # inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
95
96         n_ports=$((n_ports + 1))
97
98         json_select_array ports
99                 json_add_object
100                         json_add_int num "$num"
101                         [ -n "$device"   ] && json_add_string  device   "$device"
102                         [ -n "$need_tag" ] && json_add_boolean need_tag "$need_tag"
103                         [ -n "$role"     ] && json_add_string  role     "$role"
104                         [ -n "$index"    ] && json_add_int     index    "$index"
105                 json_close_object
106         json_select ..
107
108         # record pointer to cpu entry for lookup in _ucidef_finish_switch_roles()
109         [ -n "$device" ] && {
110                 export "cpu$n_cpu=$n_ports"
111                 n_cpu=$((n_cpu + 1))
112         }
113
114         # create/append object to role list
115         [ -n "$role" ] && {
116                 json_select_array roles
117
118                 if [ "$role" != "$prev_role" ]; then
119                         json_add_object
120                                 json_add_string role "$role"
121                                 json_add_string ports "$num"
122                         json_close_object
123
124                         prev_role="$role"
125                         n_vlan=$((n_vlan + 1))
126                 else
127                         json_select_object "$n_vlan"
128                                 json_get_var port ports
129                                 json_add_string ports "$port $num"
130                         json_select ..
131                 fi
132
133                 json_select ..
134         }
135 }
136
137 _ucidef_finish_switch_roles() {
138         # inherited: $name $n_cpu $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
139         local index role roles num device need_tag port ports
140
141         json_select switch
142                 json_select "$name"
143                         json_get_keys roles roles
144                 json_select ..
145         json_select ..
146
147         for index in $roles; do
148                 eval "port=\$cpu$(((index - 1) % n_cpu))"
149
150                 json_select switch
151                         json_select "$name"
152                                 json_select ports
153                                         json_select "$port"
154                                                 json_get_vars num device need_tag
155                                         json_select ..
156                                 json_select ..
157
158                                 if [ $n_vlan -gt $n_cpu -o ${need_tag:-0} -eq 1 ]; then
159                                         num="${num}t"
160                                         device="${device}.${index}"
161                                 fi
162
163                                 json_select roles
164                                         json_select "$index"
165                                                 json_get_vars role ports
166                                                 json_add_string ports "$ports $num"
167                                                 json_add_string device "$device"
168                                         json_select ..
169                                 json_select ..
170                         json_select ..
171                 json_select ..
172
173                 json_select_object network
174                         local devices
175
176                         json_select_object "$role"
177                                 # attach previous interfaces (for multi-switch devices)
178                                 json_get_var devices ifname
179                                 if ! list_contains devices "$device"; then
180                                         devices="${devices:+$devices }$device"
181                                 fi
182                         json_select ..
183
184                         _ucidef_set_interface "$role" "$devices"
185                 json_select ..
186         done
187 }
188
189 ucidef_add_switch() {
190         local name="$1"; shift
191         local port num role device index need_tag prev_role
192         local cpu0 cpu1 cpu2 cpu3 cpu4 cpu5
193         local n_cpu=0 n_vlan=0 n_ports=0
194
195         json_select_object switch
196                 json_select_object "$name"
197                         json_add_boolean enable 1
198                         json_add_boolean reset 1
199
200                         for port in "$@"; do
201                                 case "$port" in
202                                         [0-9]*@*)
203                                                 num="${port%%@*}"
204                                                 device="${port##*@}"
205                                                 need_tag=0
206                                                 [ "${num%t}" != "$num" ] && {
207                                                         num="${num%t}"
208                                                         need_tag=1
209                                                 }
210                                         ;;
211                                         [0-9]*:*:[0-9]*)
212                                                 num="${port%%:*}"
213                                                 index="${port##*:}"
214                                                 role="${port#[0-9]*:}"; role="${role%:*}"
215                                         ;;
216                                         [0-9]*:*)
217                                                 num="${port%%:*}"
218                                                 role="${port##*:}"
219                                         ;;
220                                 esac
221
222                                 if [ -n "$num" ] && [ -n "$device$role" ]; then
223                                         _ucidef_add_switch_port
224                                 fi
225
226                                 unset num device role index need_tag
227                         done
228                 json_select ..
229         json_select ..
230
231         _ucidef_finish_switch_roles
232 }
233
234 ucidef_add_switch_attr() {
235         local name="$1"
236         local key="$2"
237         local val="$3"
238
239         json_select_object switch
240                 json_select_object "$name"
241
242                 case "$val" in
243                         true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;
244                         [0-9]) json_add_int "$key" "$val" ;;
245                         *) json_add_string "$key" "$val" ;;
246                 esac
247
248                 json_select ..
249         json_select ..
250 }
251
252 ucidef_add_switch_port_attr() {
253         local name="$1"
254         local port="$2"
255         local key="$3"
256         local val="$4"
257         local ports i num
258
259         json_select_object switch
260         json_select_object "$name"
261
262         json_get_keys ports ports
263         json_select_array ports
264
265         for i in $ports; do
266                 json_select "$i"
267                 json_get_var num num
268
269                 if [ -n "$num" ] && [ $num -eq $port ]; then
270                         json_select_object attr
271
272                         case "$val" in
273                                 true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;
274                                 [0-9]) json_add_int "$key" "$val" ;;
275                                 *) json_add_string "$key" "$val" ;;
276                         esac
277
278                         json_select ..
279                 fi
280
281                 json_select ..
282         done
283
284         json_select ..
285         json_select ..
286         json_select ..
287 }
288
289 ucidef_set_interface_macaddr() {
290         local network="$1"
291         local macaddr="$2"
292
293         json_select_object network
294
295         json_select "$network"
296         [ $? -eq 0 ] || {
297                 json_select ..
298                 return
299         }
300
301         json_add_string macaddr "$macaddr"
302         json_select ..
303
304         json_select ..
305 }
306
307 ucidef_set_led_netdev() {
308         local cfg="led_$1"
309         local name="$2"
310         local sysfs="$3"
311         local dev="$4"
312
313         json_select_object led
314
315         json_select_object "$1"
316         json_add_string name "$name"
317         json_add_string type netdev
318         json_add_string sysfs "$sysfs"
319         json_add_string device "$dev"
320         json_select ..
321
322         json_select ..
323 }
324
325 ucidef_set_led_usbdev() {
326         local cfg="led_$1"
327         local name="$2"
328         local sysfs="$3"
329         local dev="$4"
330
331         json_select_object led
332
333         json_select_object "$1"
334         json_add_string name "$name"
335         json_add_string type usb
336         json_add_string sysfs "$sysfs"
337         json_add_string device "$dev"
338         json_select ..
339
340         json_select ..
341 }
342
343 ucidef_set_led_wlan() {
344         local cfg="led_$1"
345         local name="$2"
346         local sysfs="$3"
347         local trigger="$4"
348
349         json_select_object led
350
351         json_select_object "$1"
352         json_add_string name "$name"
353         json_add_string type trigger
354         json_add_string sysfs "$sysfs"
355         json_add_string trigger "$trigger"
356         json_select ..
357
358         json_select ..
359 }
360
361 ucidef_set_led_switch() {
362         local cfg="led_$1"
363         local name="$2"
364         local sysfs="$3"
365         local trigger="$4"
366         local port_mask="$5"
367
368         json_select_object led
369
370         json_select_object "$1"
371         json_add_string name "$name"
372         json_add_string type switch
373         json_add_string sysfs "$sysfs"
374         json_add_string trigger "$trigger"
375         json_add_string port_mask "$port_mask"
376         json_select ..
377
378         json_select ..
379 }
380
381 ucidef_set_led_default() {
382         local cfg="led_$1"
383         local name="$2"
384         local sysfs="$3"
385         local default="$4"
386
387         json_select_object led
388
389         json_select_object "$1"
390         json_add_string name "$name"
391         json_add_string sysfs "$sysfs"
392         json_add_string default "$default"
393         json_select ..
394
395         json_select ..
396 }
397
398 ucidef_set_led_gpio() {
399         local cfg="led_$1"
400         local name="$2"
401         local sysfs="$3"
402         local gpio="$4"
403         local inverted="$5"
404
405         json_select_object led
406
407         json_select_object "$1"
408         json_add_string type gpio
409         json_add_string name "$name"
410         json_add_string sysfs "$sysfs"
411         json_add_string trigger "$trigger"
412         json_add_int gpio "$gpio"
413         json_add_boolean inverted "$inverted"
414         json_select ..
415
416         json_select ..
417 }
418
419 ucidef_set_led_ide() {
420         local cfg="led_$1"
421         local name="$2"
422         local sysfs="$3"
423
424         json_select_object led
425
426         json_select_object "$1"
427         json_add_string name "$name"
428         json_add_string sysfs "$sysfs"
429         json_add_string trigger ide-disk
430         json_select ..
431
432         json_select ..
433 }
434
435 ucidef_set_led_timer() {
436         local cfg="led_$1"
437         local name="$2"
438         local sysfs="$3"
439         local delayon="$4"
440         local delayoff="$5"
441
442         json_select_object led
443
444         json_select_object "$1"
445         json_add_string type timer
446         json_add_string name "$name"
447         json_add_string sysfs "$sysfs"
448         json_add_int delayon "$delayon"
449         json_add_int delayoff "$delayoff"
450         json_select ..
451
452         json_select ..
453 }
454
455 ucidef_set_led_rssi() {
456         local cfg="led_$1"
457         local name="$2"
458         local sysfs="$3"
459         local iface="$4"
460         local minq="$5"
461         local maxq="$6"
462         local offset="$7"
463         local factor="$8"
464
465         json_select_object led
466
467         json_select_object "$1"
468         json_add_string type rssi
469         json_add_string name "$name"
470         json_add_string iface "$iface"
471         json_add_string sysfs "$sysfs"
472         json_add_string minq "$minq"
473         json_add_string maxq "$maxq"
474         json_add_string offset "$offset"
475         json_add_string factor "$factor"
476         json_select ..
477
478         json_select ..
479 }
480
481 ucidef_set_rssimon() {
482         local dev="$1"
483         local refresh="$2"
484         local threshold="$3"
485
486         json_select_object rssimon
487
488         json_select_object "$dev"
489         [ -n "$refresh" ] && json_add_int refresh "$refresh"
490         [ -n "$threshold" ] && json_add_int threshold "$threshold"
491         json_select ..
492
493         json_select ..
494
495 }
496
497 board_config_update() {
498         json_init
499         [ -f ${CFG} ] && json_load "$(cat ${CFG})"
500 }
501
502 board_config_flush() {
503         json_dump -i > /tmp/.board.json
504         mv /tmp/.board.json ${CFG}
505 }