base-files: uci-defaults-new, config_generate: allow force tagged cpu ports
[openwrt.git] / package / base-files / files / lib / functions / uci-defaults-new.sh
1 #!/bin/ash
2
3 CFG=/etc/board.json
4
5 . /usr/share/libubox/jshn.sh
6
7 json_select_array() {
8         local _json_no_warning=1
9
10         json_select "$1"
11         [ $? = 0 ] && return
12
13         json_add_array "$1"
14         json_close_array
15
16         json_select "$1"
17 }
18
19 json_select_object() {
20         local _json_no_warning=1
21
22         json_select "$1"
23         [ $? = 0 ] && return
24
25         json_add_object "$1"
26         json_close_object
27
28         json_select "$1"
29 }
30
31 _ucidef_set_interface() {
32         local name="$1"
33         local iface="$2"
34
35         json_select_object "$name"
36         json_add_string ifname "${iface%%.*}"
37         [ "$iface" = "${iface%%.*}" ] || json_add_boolean create_vlan 1
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_ports() {
118         local name="$1"; shift
119         local port num role dev idx tag
120
121         json_select_object switch
122         json_select_object "$name"
123         json_select_array ports
124
125         for port in "$@"; do
126                 case "$port" in
127                         [0-9]*@*)
128                                 num="${port%%@*}"
129                                 dev="${port##*@}"
130                                 tag=0
131                                 [ "${num%t}" != "$num" ] && {
132                                         num="${num%t}"
133                                         tag=1
134                                 }
135                         ;;
136                         [0-9]*:*:[0-9]*)
137                                 num="${port%%:*}"
138                                 idx="${port##*:}"
139                                 role="${port#[0-9]*:}"; role="${role%:*}"
140                         ;;
141                         [0-9]*:*)
142                                 num="${port%%:*}"
143                                 role="${port##*:}"
144                         ;;
145                 esac
146
147                 if [ -n "$num" ] && [ -n "$dev$role" ]; then
148                         json_add_object
149                         json_add_int num "$num"
150                         [ -n "$dev" ] && json_add_string device "$dev"
151                         [ -n "$tag" ] && json_add_boolean need_tag "$tag"
152                         [ -n "$role" ] && json_add_string role "$role"
153                         [ -n "$idx" ] && json_add_int index "$idx"
154                         json_close_object
155                 fi
156
157                 unset num dev role idx tag
158         done
159
160         json_select ..
161         json_select ..
162         json_select ..
163 }
164
165 ucidef_add_switch_port_attr() {
166         local name="$1"
167         local port="$2"
168         local key="$3"
169         local val="$4"
170         local ports i num
171
172         json_select_object switch
173         json_select_object "$name"
174
175         json_get_keys ports ports
176         json_select_array ports
177
178         for i in $ports; do
179                 json_select "$i"
180                 json_get_var num num
181
182                 if [ -n "$num" ] && [ $num -eq $port ]; then
183                         json_select_object attr
184
185                         case "$val" in
186                                 [0-9]) json_add_int "$key" "$val" ;;
187                                 *) json_add_string "$key" "$val" ;;
188                         esac
189
190                         json_select ..
191                 fi
192
193                 json_select ..
194         done
195
196         json_select ..
197         json_select ..
198         json_select ..
199 }
200
201 ucidef_add_switch_vlan() {
202         local name="$1"
203         local vlan="$2"
204         local ports="$3"
205         local cpu_port=''
206
207         case "$vlan" in
208         1)      vlan=lan;;
209         2)      vlan=wan;;
210         *)      vlan=vlan$vlan;;
211         esac
212
213         json_select_object switch
214         json_select_object "$name"
215         json_select_object vlans
216
217         json_add_array "$vlan"
218         for p in $ports; do
219                 if [ ${p%t} != $p ]; then
220                         cpu_port=$p
221                 else
222                         json_add_int "" $p
223                 fi
224         done
225         json_close_array
226
227         json_select ..
228         [ -n "$cpu_port" ] && json_add_int cpu_port "$cpu_port"
229         json_select ..
230         json_select ..
231 }
232
233 ucidef_set_interface_macaddr() {
234         local network="$1"
235         local macaddr="$2"
236
237         json_select_object network
238
239         json_select "$network"
240         [ $? -eq 0 ] || {
241                 json_select ..
242                 return
243         }
244
245         json_add_string macaddr "$macaddr"
246         json_select ..
247
248         json_select ..
249 }
250
251 ucidef_set_led_netdev() {
252         local cfg="led_$1"
253         local name="$2"
254         local sysfs="$3"
255         local dev="$4"
256
257         json_select_object led
258
259         json_select_object "$1"
260         json_add_string name "$name"
261         json_add_string type netdev
262         json_add_string sysfs "$sysfs"
263         json_add_string device "$dev"
264         json_select ..
265
266         json_select ..
267 }
268
269 ucidef_set_led_usbdev() {
270         local cfg="led_$1"
271         local name="$2"
272         local sysfs="$3"
273         local dev="$4"
274
275         json_select_object led
276
277         json_select_object "$1"
278         json_add_string name "$name"
279         json_add_string type usb
280         json_add_string sysfs "$sysfs"
281         json_add_string device "$dev"
282         json_select ..
283
284         json_select ..
285 }
286
287 ucidef_set_led_wlan() {
288         local cfg="led_$1"
289         local name="$2"
290         local sysfs="$3"
291         local trigger="$4"
292
293         json_select_object led
294
295         json_select_object "$1"
296         json_add_string name "$name"
297         json_add_string type trigger
298         json_add_string sysfs "$sysfs"
299         json_add_string trigger "$trigger"
300         json_select ..
301
302         json_select ..
303 }
304
305 ucidef_set_led_switch() {
306         local cfg="led_$1"
307         local name="$2"
308         local sysfs="$3"
309         local trigger="$4"
310         local port_mask="$5"
311
312         json_select_object led
313
314         json_select_object "$1"
315         json_add_string name "$name"
316         json_add_string type switch
317         json_add_string sysfs "$sysfs"
318         json_add_string trigger "$trigger"
319         json_add_string port_mask "$port_mask"
320         json_select ..
321
322         json_select ..
323 }
324
325 ucidef_set_led_default() {
326         local cfg="led_$1"
327         local name="$2"
328         local sysfs="$3"
329         local default="$4"
330
331         json_select_object led
332
333         json_select_object "$1"
334         json_add_string name "$name"
335         json_add_string sysfs "$sysfs"
336         json_add_string default "$default"
337         json_select ..
338
339         json_select ..
340 }
341
342 ucidef_set_led_gpio() {
343         local cfg="led_$1"
344         local name="$2"
345         local sysfs="$3"
346         local gpio="$4"
347         local inverted="$5"
348
349         json_select_object led
350
351         json_select_object "$1"
352         json_add_string type gpio
353         json_add_string name "$name"
354         json_add_string sysfs "$sysfs"
355         json_add_string trigger "$trigger"
356         json_add_int gpio "$gpio"
357         json_add_boolean inverted "$inverted"
358         json_select ..
359
360         json_select ..
361 }
362
363 ucidef_set_led_rssi() {
364         local cfg="led_$1"
365         local name="$2"
366         local sysfs="$3"
367         local iface="$4"
368         local minq="$5"
369         local maxq="$6"
370         local offset="$7"
371         local factor="$8"
372
373         json_select_object led
374
375         json_select_object "$1"
376         json_add_string type rssi
377         json_add_string name "$name"
378         json_add_string iface "$iface"
379         json_add_string sysfs "$sysfs"
380         json_add_string minq "$minq"
381         json_add_string maxq "$maxq"
382         json_add_string offset "$offset"
383         json_add_string factor "$factor"
384         json_select ..
385
386         json_select ..
387 }
388
389 ucidef_set_rssimon() {
390         local dev="$1"
391         local refresh="$2"
392         local threshold="$3"
393
394         json_select_object rssimon
395
396         json_select_object "$dev"
397         [ -n "$refresh" ] && json_add_int refresh "$refresh"
398         [ -n "$threshold" ] && json_add_int threshold "$threshold"
399         json_select ..
400
401         json_select ..
402
403 }
404
405 board_config_update() {
406         json_init
407         [ -f ${CFG} ] && json_load "$(cat ${CFG})"
408 }
409
410 board_config_flush() {
411         json_dump -i > /tmp/.board.json
412         mv /tmp/.board.json ${CFG}
413 }