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