2f50cd6bfdf543c6f4590a43fdded72505b3e6a1
[openwrt/openwrt.git] / package / base-files / files / lib / functions / uci-defaults.sh
1 #!/bin/ash
2
3 . /lib/functions.sh
4 . /usr/share/libubox/jshn.sh
5
6 json_select_array() {
7 local _json_no_warning=1
8
9 json_select "$1"
10 [ $? = 0 ] && return
11
12 json_add_array "$1"
13 json_close_array
14
15 json_select "$1"
16 }
17
18 json_select_object() {
19 local _json_no_warning=1
20
21 json_select "$1"
22 [ $? = 0 ] && return
23
24 json_add_object "$1"
25 json_close_object
26
27 json_select "$1"
28 }
29
30 ucidef_set_interface() {
31 local network=$1; shift
32
33 [ -z "$network" ] && return
34
35 json_select_object network
36 json_select_object "$network"
37
38 while [ -n "$1" ]; do
39 local opt=$1; shift
40 local val=$1; shift
41
42 [ -n "$opt" -a -n "$val" ] || break
43
44 json_add_string "$opt" "$val"
45 done
46
47 if ! json_is_a protocol string; then
48 case "$network" in
49 lan) json_add_string protocol static ;;
50 wan) json_add_string protocol dhcp ;;
51 *) json_add_string protocol none ;;
52 esac
53 fi
54
55 json_select ..
56 json_select ..
57 }
58
59 ucidef_set_board_id() {
60 json_select_object model
61 json_add_string id "$1"
62 json_select ..
63 }
64
65 ucidef_set_model_name() {
66 json_select_object model
67 json_add_string name "$1"
68 json_select ..
69 }
70
71 ucidef_set_compat_version() {
72 json_select_object system
73 json_add_string compat_version "${1:-1.0}"
74 json_select ..
75 }
76
77 ucidef_set_interface_lan() {
78 ucidef_set_interface "lan" ifname "$1" protocol "${2:-static}"
79 }
80
81 ucidef_set_interface_wan() {
82 ucidef_set_interface "wan" ifname "$1" protocol "${2:-dhcp}"
83 }
84
85 ucidef_set_interfaces_lan_wan() {
86 local lan_if="$1"
87 local wan_if="$2"
88
89 ucidef_set_interface_lan "$lan_if"
90 ucidef_set_interface_wan "$wan_if"
91 }
92
93 ucidef_set_bridge_device() {
94 json_select_object bridge
95 json_add_string name "${1:switch0}"
96 json_select ..
97 }
98
99 ucidef_set_bridge_mac() {
100 json_select_object bridge
101 json_add_string macaddr "${1}"
102 json_select ..
103 }
104
105 ucidef_set_network_device_mac() {
106 json_select_object "network-device"
107 json_select_object "${1}"
108 json_add_string macaddr "${2}"
109 json_select ..
110 json_select ..
111 }
112
113 _ucidef_add_switch_port() {
114 # inherited: $num $device $need_tag $want_untag $role $index $prev_role
115 # inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
116
117 n_ports=$((n_ports + 1))
118
119 json_select_array ports
120 json_add_object
121 json_add_int num "$num"
122 [ -n "$device" ] && json_add_string device "$device"
123 [ -n "$need_tag" ] && json_add_boolean need_tag "$need_tag"
124 [ -n "$want_untag" ] && json_add_boolean want_untag "$want_untag"
125 [ -n "$role" ] && json_add_string role "$role"
126 [ -n "$index" ] && json_add_int index "$index"
127 json_close_object
128 json_select ..
129
130 # record pointer to cpu entry for lookup in _ucidef_finish_switch_roles()
131 [ -n "$device" ] && {
132 export "cpu$n_cpu=$n_ports"
133 n_cpu=$((n_cpu + 1))
134 }
135
136 # create/append object to role list
137 [ -n "$role" ] && {
138 json_select_array roles
139
140 if [ "$role" != "$prev_role" ]; then
141 json_add_object
142 json_add_string role "$role"
143 json_add_string ports "$num"
144 json_close_object
145
146 prev_role="$role"
147 n_vlan=$((n_vlan + 1))
148 else
149 json_select_object "$n_vlan"
150 json_get_var port ports
151 json_add_string ports "$port $num"
152 json_select ..
153 fi
154
155 json_select ..
156 }
157 }
158
159 _ucidef_finish_switch_roles() {
160 # inherited: $name $n_cpu $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
161 local index role roles num device need_tag want_untag port ports
162
163 json_select switch
164 json_select "$name"
165 json_get_keys roles roles
166 json_select ..
167 json_select ..
168
169 for index in $roles; do
170 eval "port=\$cpu$(((index - 1) % n_cpu))"
171
172 json_select switch
173 json_select "$name"
174 json_select ports
175 json_select "$port"
176 json_get_vars num device need_tag want_untag
177 json_select ..
178 json_select ..
179
180 if [ ${need_tag:-0} -eq 1 -o ${want_untag:-0} -ne 1 ]; then
181 num="${num}t"
182 device="${device}.${index}"
183 fi
184
185 json_select roles
186 json_select "$index"
187 json_get_vars role ports
188 json_add_string ports "$ports $num"
189 json_add_string device "$device"
190 json_select ..
191 json_select ..
192 json_select ..
193 json_select ..
194
195 json_select_object network
196 local devices
197
198 json_select_object "$role"
199 # attach previous interfaces (for multi-switch devices)
200 json_get_var devices ifname
201 if ! list_contains devices "$device"; then
202 devices="${devices:+$devices }$device"
203 fi
204 json_select ..
205 json_select ..
206
207 ucidef_set_interface "$role" ifname "$devices"
208 done
209 }
210
211 ucidef_set_ar8xxx_switch_mib() {
212 local name="$1"
213 local type="$2"
214 local interval="$3"
215
216 json_select_object switch
217 json_select_object "$name"
218 json_add_int ar8xxx_mib_type $type
219 json_add_int ar8xxx_mib_poll_interval $interval
220 json_select ..
221 json_select ..
222 }
223
224 ucidef_add_switch() {
225 local name="$1"; shift
226 local port num role device index need_tag prev_role
227 local cpu0 cpu1 cpu2 cpu3 cpu4 cpu5
228 local n_cpu=0 n_vlan=0 n_ports=0
229
230 json_select_object switch
231 json_select_object "$name"
232 json_add_boolean enable 1
233 json_add_boolean reset 1
234
235 for port in "$@"; do
236 case "$port" in
237 [0-9]*@*)
238 num="${port%%@*}"
239 device="${port##*@}"
240 need_tag=0
241 want_untag=0
242 [ "${num%t}" != "$num" ] && {
243 num="${num%t}"
244 need_tag=1
245 }
246 [ "${num%u}" != "$num" ] && {
247 num="${num%u}"
248 want_untag=1
249 }
250 ;;
251 [0-9]*:*:[0-9]*)
252 num="${port%%:*}"
253 index="${port##*:}"
254 role="${port#[0-9]*:}"; role="${role%:*}"
255 ;;
256 [0-9]*:*)
257 num="${port%%:*}"
258 role="${port##*:}"
259 ;;
260 esac
261
262 if [ -n "$num" ] && [ -n "$device$role" ]; then
263 _ucidef_add_switch_port
264 fi
265
266 unset num device role index need_tag want_untag
267 done
268 json_select ..
269 json_select ..
270
271 _ucidef_finish_switch_roles
272 }
273
274 ucidef_add_switch_attr() {
275 local name="$1"
276 local key="$2"
277 local val="$3"
278
279 json_select_object switch
280 json_select_object "$name"
281
282 case "$val" in
283 true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;
284 [0-9]) json_add_int "$key" "$val" ;;
285 *) json_add_string "$key" "$val" ;;
286 esac
287
288 json_select ..
289 json_select ..
290 }
291
292 ucidef_add_switch_port_attr() {
293 local name="$1"
294 local port="$2"
295 local key="$3"
296 local val="$4"
297 local ports i num
298
299 json_select_object switch
300 json_select_object "$name"
301
302 json_get_keys ports ports
303 json_select_array ports
304
305 for i in $ports; do
306 json_select "$i"
307 json_get_var num num
308
309 if [ -n "$num" ] && [ $num -eq $port ]; then
310 json_select_object attr
311
312 case "$val" in
313 true|false) [ "$val" != "true" ]; json_add_boolean "$key" $? ;;
314 [0-9]) json_add_int "$key" "$val" ;;
315 *) json_add_string "$key" "$val" ;;
316 esac
317
318 json_select ..
319 fi
320
321 json_select ..
322 done
323
324 json_select ..
325 json_select ..
326 json_select ..
327 }
328
329 ucidef_set_interface_macaddr() {
330 local network="$1"
331 local macaddr="$2"
332
333 ucidef_set_interface "$network" macaddr "$macaddr"
334 }
335
336 ucidef_set_label_macaddr() {
337 local macaddr="$1"
338
339 json_select_object system
340 json_add_string label_macaddr "$macaddr"
341 json_select ..
342 }
343
344 ucidef_add_atm_bridge() {
345 local vpi="$1"
346 local vci="$2"
347 local encaps="$3"
348 local payload="$4"
349 local nameprefix="$5"
350
351 json_select_object dsl
352 json_select_object atmbridge
353 json_add_int vpi "$vpi"
354 json_add_int vci "$vci"
355 json_add_string encaps "$encaps"
356 json_add_string payload "$payload"
357 json_add_string nameprefix "$nameprefix"
358 json_select ..
359 json_select ..
360 }
361
362 ucidef_add_adsl_modem() {
363 local annex="$1"
364 local firmware="$2"
365
366 json_select_object dsl
367 json_select_object modem
368 json_add_string type "adsl"
369 json_add_string annex "$annex"
370 json_add_string firmware "$firmware"
371 json_select ..
372 json_select ..
373 }
374
375 ucidef_add_vdsl_modem() {
376 local annex="$1"
377 local tone="$2"
378 local xfer_mode="$3"
379
380 json_select_object dsl
381 json_select_object modem
382 json_add_string type "vdsl"
383 json_add_string annex "$annex"
384 json_add_string tone "$tone"
385 json_add_string xfer_mode "$xfer_mode"
386 json_select ..
387 json_select ..
388 }
389
390 ucidef_set_led_ataport() {
391 _ucidef_set_led_trigger "$1" "$2" "$3" ata"$4"
392 }
393
394 _ucidef_set_led_common() {
395 local cfg="led_$1"
396 local name="$2"
397 local sysfs="$3"
398
399 json_select_object led
400
401 json_select_object "$1"
402 json_add_string name "$name"
403 json_add_string sysfs "$sysfs"
404 }
405
406 ucidef_set_led_default() {
407 local default="$4"
408
409 _ucidef_set_led_common "$1" "$2" "$3"
410
411 json_add_string default "$default"
412 json_select ..
413
414 json_select ..
415 }
416
417 ucidef_set_led_gpio() {
418 local gpio="$4"
419 local inverted="$5"
420
421 _ucidef_set_led_common "$1" "$2" "$3"
422
423 json_add_string trigger "$trigger"
424 json_add_string type gpio
425 json_add_int gpio "$gpio"
426 json_add_boolean inverted "$inverted"
427 json_select ..
428
429 json_select ..
430 }
431
432 ucidef_set_led_ide() {
433 _ucidef_set_led_trigger "$1" "$2" "$3" disk-activity
434 }
435
436 ucidef_set_led_netdev() {
437 local dev="$4"
438 local mode="${5:-link tx rx}"
439
440 _ucidef_set_led_common "$1" "$2" "$3"
441
442 json_add_string type netdev
443 json_add_string device "$dev"
444 json_add_string mode "$mode"
445 json_select ..
446
447 json_select ..
448 }
449
450 ucidef_set_led_oneshot() {
451 _ucidef_set_led_timer $1 $2 $3 "oneshot" $4 $5
452 }
453
454 ucidef_set_led_portstate() {
455 local port_state="$4"
456
457 _ucidef_set_led_common "$1" "$2" "$3"
458
459 json_add_string trigger port_state
460 json_add_string type portstate
461 json_add_string port_state "$port_state"
462 json_select ..
463
464 json_select ..
465 }
466
467 ucidef_set_led_rssi() {
468 local iface="$4"
469 local minq="$5"
470 local maxq="$6"
471 local offset="${7:-0}"
472 local factor="${8:-1}"
473
474 _ucidef_set_led_common "$1" "$2" "$3"
475
476 json_add_string type rssi
477 json_add_string name "$name"
478 json_add_string iface "$iface"
479 json_add_string minq "$minq"
480 json_add_string maxq "$maxq"
481 json_add_string offset "$offset"
482 json_add_string factor "$factor"
483 json_select ..
484
485 json_select ..
486 }
487
488 ucidef_set_led_switch() {
489 local trigger_name="$4"
490 local port_mask="$5"
491 local speed_mask="$6"
492 local mode="$7"
493
494 _ucidef_set_led_common "$1" "$2" "$3"
495
496 json_add_string trigger "$trigger_name"
497 json_add_string type switch
498 json_add_string mode "$mode"
499 json_add_string port_mask "$port_mask"
500 json_add_string speed_mask "$speed_mask"
501 json_select ..
502
503 json_select ..
504 }
505
506 _ucidef_set_led_timer() {
507 local trigger_name="$4"
508 local delayon="$5"
509 local delayoff="$6"
510
511 _ucidef_set_led_common "$1" "$2" "$3"
512
513 json_add_string type "$trigger_name"
514 json_add_string trigger "$trigger_name"
515 json_add_int delayon "$delayon"
516 json_add_int delayoff "$delayoff"
517 json_select ..
518
519 json_select ..
520 }
521
522 ucidef_set_led_timer() {
523 _ucidef_set_led_timer $1 $2 $3 "timer" $4 $5
524 }
525
526 _ucidef_set_led_trigger() {
527 local trigger_name="$4"
528
529 _ucidef_set_led_common "$1" "$2" "$3"
530
531 json_add_string trigger "$trigger_name"
532 json_select ..
533
534 json_select ..
535 }
536
537 ucidef_set_led_usbdev() {
538 local dev="$4"
539
540 _ucidef_set_led_common "$1" "$2" "$3"
541
542 json_add_string type usb
543 json_add_string device "$dev"
544 json_select ..
545
546 json_select ..
547 }
548
549 ucidef_set_led_usbhost() {
550 _ucidef_set_led_trigger "$1" "$2" "$3" usb-host
551 }
552
553 ucidef_set_led_usbport() {
554 local obj="$1"
555 local name="$2"
556 local sysfs="$3"
557 shift
558 shift
559 shift
560
561 _ucidef_set_led_common "$obj" "$name" "$sysfs"
562
563 json_add_string type usbport
564 json_select_array ports
565 for port in "$@"; do
566 json_add_string port "$port"
567 done
568 json_select ..
569 json_select ..
570
571 json_select ..
572 }
573
574 ucidef_set_led_wlan() {
575 _ucidef_set_led_trigger "$1" "$2" "$3" "$4"
576 }
577
578 ucidef_set_rssimon() {
579 local dev="$1"
580 local refresh="$2"
581 local threshold="$3"
582
583 json_select_object rssimon
584
585 json_select_object "$dev"
586 [ -n "$refresh" ] && json_add_int refresh "$refresh"
587 [ -n "$threshold" ] && json_add_int threshold "$threshold"
588 json_select ..
589
590 json_select ..
591 }
592
593 ucidef_add_gpio_switch() {
594 local cfg="$1"
595 local name="$2"
596 local pin="$3"
597 local default="${4:-0}"
598
599 json_select_object gpioswitch
600 json_select_object "$cfg"
601 json_add_string name "$name"
602 json_add_string pin "$pin"
603 json_add_int default "$default"
604 json_select ..
605 json_select ..
606 }
607
608 ucidef_set_hostname() {
609 local hostname="$1"
610
611 json_select_object system
612 json_add_string hostname "$hostname"
613 json_select ..
614 }
615
616 ucidef_set_ntpserver() {
617 local server
618
619 json_select_object system
620 json_select_array ntpserver
621 for server in "$@"; do
622 json_add_string "" "$server"
623 done
624 json_select ..
625 json_select ..
626 }
627
628 board_config_update() {
629 json_init
630 [ -f ${CFG} ] && json_load "$(cat ${CFG})"
631
632 # auto-initialize model id and name if applicable
633 if ! json_is_a model object; then
634 json_select_object model
635 [ -f "/tmp/sysinfo/board_name" ] && \
636 json_add_string id "$(cat /tmp/sysinfo/board_name)"
637 [ -f "/tmp/sysinfo/model" ] && \
638 json_add_string name "$(cat /tmp/sysinfo/model)"
639 json_select ..
640 fi
641 }
642
643 board_config_flush() {
644 json_dump -i -o ${CFG}
645 }