base-files: uci-defaults-new, config_generate: allow force tagged cpu ports
[openwrt/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 }