base-files: uci-defaults-new, config_generate: refactor code and drop old vlans
[librecmc/librecmc.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
36         json_select_object "$name"
37         json_add_string ifname "$iface"
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_port() {
118         # inherited: $num $device $need_tag $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 "$role"     ] && json_add_string  role     "$role"
129                         [ -n "$index"    ] && json_add_int     index    "$index"
130                 json_close_object
131         json_select ..
132
133         # record pointer to cpu entry for lookup in _ucidef_finish_switch_roles()
134         [ -n "$device" ] && {
135                 export "cpu$n_cpu=$n_ports"
136                 n_cpu=$((n_cpu + 1))
137         }
138
139         # create/append object to role list
140         [ -n "$role" ] && {
141                 json_select_array roles
142
143                 if [ "$role" != "$prev_role" ]; then
144                         json_add_object
145                                 json_add_string role "$role"
146                                 json_add_string ports "$num"
147                         json_close_object
148
149                         prev_role="$role"
150                         n_vlan=$((n_vlan + 1))
151                 else
152                         json_select_object "$n_vlan"
153                                 json_get_var port ports
154                                 json_add_string ports "$port $num"
155                         json_select ..
156                 fi
157
158                 json_select ..
159         }
160 }
161
162 _ucidef_finish_switch_roles() {
163         # inherited: $name $n_cpu $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
164         local index role roles num device need_tag port ports
165
166         json_select switch
167                 json_select "$name"
168                         json_get_keys roles roles
169                 json_select ..
170         json_select ..
171
172         for index in $roles; do
173                 eval "port=\$cpu$(((index - 1) % n_cpu))"
174
175                 json_select switch
176                         json_select "$name"
177                                 json_select ports
178                                         json_select "$port"
179                                                 json_get_vars num device need_tag
180                                         json_select ..
181                                 json_select ..
182
183                                 if [ $n_vlan -gt $n_cpu -o ${need_tag:-0} -eq 1 ]; then
184                                         num="${num}t"
185                                         device="${device}.${index}"
186                                 fi
187
188                                 json_select roles
189                                         json_select "$index"
190                                                 json_get_vars role ports
191                                                 json_add_string ports "$ports $num"
192                                                 json_add_string device "$device"
193                                         json_select ..
194                                 json_select ..
195                         json_select ..
196                 json_select ..
197
198                 json_select_object network
199                         json_select_object "$role"
200                                 # attach previous interfaces (for multi-switch devices)
201                                 local prev_device; json_get_var prev_device ifname
202                                 if ! list_contains prev_device "$device"; then
203                                         device="${prev_device:+$prev_device }$device"
204                                 fi
205                                 json_add_string ifname "$device"
206                         json_select ..
207                 json_select ..
208         done
209 }
210
211 ucidef_add_switch_ports() {
212         local name="$1"; shift
213         local port num role device index need_tag prev_role
214         local cpu0 cpu1 cpu2 cpu3 cpu4 cpu5
215         local n_cpu=0 n_vlan=0 n_ports=0
216
217         json_select_object switch
218         json_select_object "$name"
219
220         for port in "$@"; do
221                 case "$port" in
222                         [0-9]*@*)
223                                 num="${port%%@*}"
224                                 device="${port##*@}"
225                                 need_tag=0
226                                 [ "${num%t}" != "$num" ] && {
227                                         num="${num%t}"
228                                         need_tag=1
229                                 }
230                         ;;
231                         [0-9]*:*:[0-9]*)
232                                 num="${port%%:*}"
233                                 index="${port##*:}"
234                                 role="${port#[0-9]*:}"; role="${role%:*}"
235                         ;;
236                         [0-9]*:*)
237                                 num="${port%%:*}"
238                                 role="${port##*:}"
239                         ;;
240                 esac
241
242                 if [ -n "$num" ] && [ -n "$device$role" ]; then
243                         _ucidef_add_switch_port
244                 fi
245
246                 unset num device role index need_tag
247         done
248
249         json_select ..
250         json_select ..
251
252         _ucidef_finish_switch_roles
253 }
254
255 ucidef_add_switch_port_attr() {
256         local name="$1"
257         local port="$2"
258         local key="$3"
259         local val="$4"
260         local ports i num
261
262         json_select_object switch
263         json_select_object "$name"
264
265         json_get_keys ports ports
266         json_select_array ports
267
268         for i in $ports; do
269                 json_select "$i"
270                 json_get_var num num
271
272                 if [ -n "$num" ] && [ $num -eq $port ]; then
273                         json_select_object attr
274
275                         case "$val" in
276                                 [0-9]) json_add_int "$key" "$val" ;;
277                                 *) json_add_string "$key" "$val" ;;
278                         esac
279
280                         json_select ..
281                 fi
282
283                 json_select ..
284         done
285
286         json_select ..
287         json_select ..
288         json_select ..
289 }
290
291 ucidef_set_interface_macaddr() {
292         local network="$1"
293         local macaddr="$2"
294
295         json_select_object network
296
297         json_select "$network"
298         [ $? -eq 0 ] || {
299                 json_select ..
300                 return
301         }
302
303         json_add_string macaddr "$macaddr"
304         json_select ..
305
306         json_select ..
307 }
308
309 ucidef_set_led_netdev() {
310         local cfg="led_$1"
311         local name="$2"
312         local sysfs="$3"
313         local dev="$4"
314
315         json_select_object led
316
317         json_select_object "$1"
318         json_add_string name "$name"
319         json_add_string type netdev
320         json_add_string sysfs "$sysfs"
321         json_add_string device "$dev"
322         json_select ..
323
324         json_select ..
325 }
326
327 ucidef_set_led_usbdev() {
328         local cfg="led_$1"
329         local name="$2"
330         local sysfs="$3"
331         local dev="$4"
332
333         json_select_object led
334
335         json_select_object "$1"
336         json_add_string name "$name"
337         json_add_string type usb
338         json_add_string sysfs "$sysfs"
339         json_add_string device "$dev"
340         json_select ..
341
342         json_select ..
343 }
344
345 ucidef_set_led_wlan() {
346         local cfg="led_$1"
347         local name="$2"
348         local sysfs="$3"
349         local trigger="$4"
350
351         json_select_object led
352
353         json_select_object "$1"
354         json_add_string name "$name"
355         json_add_string type trigger
356         json_add_string sysfs "$sysfs"
357         json_add_string trigger "$trigger"
358         json_select ..
359
360         json_select ..
361 }
362
363 ucidef_set_led_switch() {
364         local cfg="led_$1"
365         local name="$2"
366         local sysfs="$3"
367         local trigger="$4"
368         local port_mask="$5"
369
370         json_select_object led
371
372         json_select_object "$1"
373         json_add_string name "$name"
374         json_add_string type switch
375         json_add_string sysfs "$sysfs"
376         json_add_string trigger "$trigger"
377         json_add_string port_mask "$port_mask"
378         json_select ..
379
380         json_select ..
381 }
382
383 ucidef_set_led_default() {
384         local cfg="led_$1"
385         local name="$2"
386         local sysfs="$3"
387         local default="$4"
388
389         json_select_object led
390
391         json_select_object "$1"
392         json_add_string name "$name"
393         json_add_string sysfs "$sysfs"
394         json_add_string default "$default"
395         json_select ..
396
397         json_select ..
398 }
399
400 ucidef_set_led_gpio() {
401         local cfg="led_$1"
402         local name="$2"
403         local sysfs="$3"
404         local gpio="$4"
405         local inverted="$5"
406
407         json_select_object led
408
409         json_select_object "$1"
410         json_add_string type gpio
411         json_add_string name "$name"
412         json_add_string sysfs "$sysfs"
413         json_add_string trigger "$trigger"
414         json_add_int gpio "$gpio"
415         json_add_boolean inverted "$inverted"
416         json_select ..
417
418         json_select ..
419 }
420
421 ucidef_set_led_rssi() {
422         local cfg="led_$1"
423         local name="$2"
424         local sysfs="$3"
425         local iface="$4"
426         local minq="$5"
427         local maxq="$6"
428         local offset="$7"
429         local factor="$8"
430
431         json_select_object led
432
433         json_select_object "$1"
434         json_add_string type rssi
435         json_add_string name "$name"
436         json_add_string iface "$iface"
437         json_add_string sysfs "$sysfs"
438         json_add_string minq "$minq"
439         json_add_string maxq "$maxq"
440         json_add_string offset "$offset"
441         json_add_string factor "$factor"
442         json_select ..
443
444         json_select ..
445 }
446
447 ucidef_set_rssimon() {
448         local dev="$1"
449         local refresh="$2"
450         local threshold="$3"
451
452         json_select_object rssimon
453
454         json_select_object "$dev"
455         [ -n "$refresh" ] && json_add_int refresh "$refresh"
456         [ -n "$threshold" ] && json_add_int threshold "$threshold"
457         json_select ..
458
459         json_select ..
460
461 }
462
463 board_config_update() {
464         json_init
465         [ -f ${CFG} ] && json_load "$(cat ${CFG})"
466 }
467
468 board_config_flush() {
469         json_dump -i > /tmp/.board.json
470         mv /tmp/.board.json ${CFG}
471 }