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