OpenWrt – Diff between revs 2 and 3

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 2 Rev 3
1 #!/bin/sh 1 #!/bin/sh
2   2  
3 CFG=/etc/board.json 3 CFG=/etc/board.json
4   4  
5 . /usr/share/libubox/jshn.sh 5 . /usr/share/libubox/jshn.sh
6   6  
7 [ -s $CFG ] || /bin/board_detect || exit 1 7 [ -s $CFG ] || /bin/board_detect || exit 1
8 [ -s /etc/config/network -a -s /etc/config/system ] && exit 0 8 [ -s /etc/config/network -a -s /etc/config/system ] && exit 0
9   9  
10 generate_static_network() { 10 generate_static_network() {
11 uci -q batch <<-EOF 11 uci -q batch <<-EOF
12 delete network.loopback 12 delete network.loopback
13 set network.loopback='interface' 13 set network.loopback='interface'
14 set network.loopback.ifname='lo' 14 set network.loopback.ifname='lo'
15 set network.loopback.proto='static' 15 set network.loopback.proto='static'
16 set network.loopback.ipaddr='127.0.0.1' 16 set network.loopback.ipaddr='127.0.0.1'
17 set network.loopback.netmask='255.0.0.0' 17 set network.loopback.netmask='255.0.0.0'
-   18 delete network.globals
-   19 set network.globals='globals'
-   20 set network.globals.ula_prefix='auto'
18 EOF 21 EOF
19 [ -e /proc/sys/net/ipv6 ] && { -  
20 uci -q batch <<-EOF -  
21 delete network.globals -  
22 set network.globals='globals' -  
23 set network.globals.ula_prefix='auto' -  
24 EOF -  
25 } -  
26   22  
27 if json_is_a dsl object; then 23 if json_is_a dsl object; then
28 json_select dsl 24 json_select dsl
29 if json_is_a atmbridge object; then 25 if json_is_a atmbridge object; then
30 json_select atmbridge 26 json_select atmbridge
31 local vpi vci encaps payload nameprefix 27 local vpi vci encaps payload nameprefix
32 json_get_vars vpi vci encaps payload nameprefix 28 json_get_vars vpi vci encaps payload nameprefix
33 uci -q batch <<-EOF 29 uci -q batch <<-EOF
34 delete network.atm 30 delete network.atm
35 set network.atm='atm-bridge' 31 set network.atm='atm-bridge'
36 set network.atm.vpi='$vpi' 32 set network.atm.vpi='$vpi'
37 set network.atm.vci='$vci' 33 set network.atm.vci='$vci'
38 set network.atm.encaps='$encaps' 34 set network.atm.encaps='$encaps'
39 set network.atm.payload='$payload' 35 set network.atm.payload='$payload'
40 set network.atm.nameprefix='$nameprefix' 36 set network.atm.nameprefix='$nameprefix'
41 EOF 37 EOF
42 json_select .. 38 json_select ..
43 fi 39 fi
44   40  
45 if json_is_a modem object; then 41 if json_is_a modem object; then
46 json_select modem 42 json_select modem
47 local type annex firmware tone xfer_mode 43 local type annex firmware tone xfer_mode
48 json_get_vars type annex firmware tone xfer_mode 44 json_get_vars type annex firmware tone xfer_mode
49 uci -q batch <<-EOF 45 uci -q batch <<-EOF
50 delete network.dsl 46 delete network.dsl
51 set network.dsl='dsl' 47 set network.dsl='dsl'
52 set network.dsl.annex='$annex' 48 set network.dsl.annex='$annex'
53 set network.dsl.firmware='$firmware' 49 set network.dsl.firmware='$firmware'
54 set network.dsl.tone='$tone' 50 set network.dsl.tone='$tone'
55 set network.dsl.xfer_mode='$xfer_mode' 51 set network.dsl.xfer_mode='$xfer_mode'
56 EOF 52 EOF
57 json_select .. 53 json_select ..
58 fi 54 fi
59 json_select .. 55 json_select ..
60 fi 56 fi
61 } 57 }
62   58  
63 addr_offset=2 59 addr_offset=2
64 generate_network() { 60 generate_network() {
65 local ifname macaddr protocol type ipaddr netmask 61 local ifname macaddr protocol type ipaddr netmask
66   62  
67 json_select network 63 json_select network
68 json_select "$1" 64 json_select "$1"
69 json_get_vars ifname macaddr protocol ipaddr netmask 65 json_get_vars ifname macaddr protocol ipaddr netmask
70 json_select .. 66 json_select ..
71 json_select .. 67 json_select ..
72   68  
73 [ -n "$ifname" ] || return 69 [ -n "$ifname" ] || return
74   70  
75 # force bridge for multi-interface devices (and lan) 71 # force bridge for multi-interface devices (and lan)
76 case "$1:$ifname" in 72 case "$1:$ifname" in
77 *\ * | lan:*) type="bridge" ;; 73 *\ * | lan:*) type="bridge" ;;
78 esac 74 esac
79   75  
80 uci -q batch <<-EOF 76 uci -q batch <<-EOF
81 delete network.$1 77 delete network.$1
82 set network.$1='interface' 78 set network.$1='interface'
83 set network.$1.type='$type' 79 set network.$1.type='$type'
84 set network.$1.ifname='$ifname' 80 set network.$1.ifname='$ifname'
85 set network.$1.proto='none' 81 set network.$1.proto='none'
86 EOF 82 EOF
87   83  
88 [ -n "$macaddr" ] && uci -q batch <<-EOF 84 [ -n "$macaddr" ] && uci -q batch <<-EOF
89 delete network.$1_dev 85 delete network.$1_dev
90 set network.$1_dev='device' 86 set network.$1_dev='device'
91 set network.$1_dev.name='$ifname' 87 set network.$1_dev.name='$ifname'
92 set network.$1_dev.macaddr='$macaddr' 88 set network.$1_dev.macaddr='$macaddr'
93 EOF 89 EOF
94   90  
95 case "$protocol" in 91 case "$protocol" in
96 static) 92 static)
97 local ipad 93 local ipad
98 case "$1" in 94 case "$1" in
99 lan) ipad=${ipaddr:-"192.168.1.1"} ;; 95 lan) ipad=${ipaddr:-"192.168.1.1"} ;;
100 *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;; 96 *) ipad=${ipaddr:-"192.168.$((addr_offset++)).1"} ;;
101 esac 97 esac
102   98  
103 netm=${netmask:-"255.255.255.0"} 99 netm=${netmask:-"255.255.255.0"}
104   100  
105 uci -q batch <<-EOF 101 uci -q batch <<-EOF
106 set network.$1.proto='static' 102 set network.$1.proto='static'
107 set network.$1.ipaddr='$ipad' 103 set network.$1.ipaddr='$ipad'
108 set network.$1.netmask='$netm' 104 set network.$1.netmask='$netm'
-   105 set network.$1.ip6assign='60'
109 EOF 106 EOF
110 [ -e /proc/sys/net/ipv6 ] && uci set network.$1.ip6assign='60' -  
111 ;; 107 ;;
112   108  
113 dhcp) 109 dhcp)
114 # fixup IPv6 slave interface if parent is a bridge 110 # fixup IPv6 slave interface if parent is a bridge
115 [ "$type" = "bridge" ] && ifname="br-$1" 111 [ "$type" = "bridge" ] && ifname="br-$1"
116   -  
117 uci set network.$1.proto='dhcp' -  
118 [ -e /proc/sys/net/ipv6 ] && { 112  
-   113 uci -q batch <<-EOF
119 uci -q batch <<-EOF 114 set network.$1.proto='dhcp'
120 delete network.${1}6 115 delete network.${1}6
121 set network.${1}6='interface' 116 set network.${1}6='interface'
122 set network.${1}6.ifname='$ifname' 117 set network.${1}6.ifname='$ifname'
123 set network.${1}6.proto='dhcpv6' 118 set network.${1}6.proto='dhcpv6'
124 EOF -  
125 } 119 EOF
126 ;; 120 ;;
127   121  
128 pppoe) 122 pppoe)
129 uci -q batch <<-EOF 123 uci -q batch <<-EOF
130 set network.$1.proto='pppoe' 124 set network.$1.proto='pppoe'
131 set network.$1.username='username' 125 set network.$1.username='username'
132 set network.$1.password='password' 126 set network.$1.password='password'
-   127 set network.$1.ipv6='1'
-   128 delete network.${1}6
-   129 set network.${1}6='interface'
-   130 set network.${1}6.ifname='@${1}'
-   131 set network.${1}6.proto='dhcpv6'
133 EOF 132 EOF
134 [ -e /proc/sys/net/ipv6 ] && { -  
135 uci -q batch <<-EOF -  
136 set network.$1.ipv6='1' -  
137 delete network.${1}6 -  
138 set network.${1}6='interface' -  
139 set network.${1}6.ifname='@${1}' -  
140 set network.${1}6.proto='dhcpv6' -  
141 EOF -  
142 } -  
143 ;; 133 ;;
144 esac 134 esac
145 } 135 }
146   136  
147 generate_switch_vlans_ports() { 137 generate_switch_vlans_ports() {
148 local switch="$1" 138 local switch="$1"
149 local port ports role roles num attr val 139 local port ports role roles num attr val
150   140  
151 # 141 #
152 # autogenerate vlans 142 # autogenerate vlans
153 # 143 #
154   144  
155 if json_is_a roles array; then 145 if json_is_a roles array; then
156 json_get_keys roles roles 146 json_get_keys roles roles
157 json_select roles 147 json_select roles
158   148  
159 for role in $roles; do 149 for role in $roles; do
160 json_select "$role" 150 json_select "$role"
161 json_get_vars ports 151 json_get_vars ports
162 json_select .. 152 json_select ..
163   153  
164 uci -q batch <<-EOF 154 uci -q batch <<-EOF
165 add network switch_vlan 155 add network switch_vlan
166 set network.@switch_vlan[-1].device='$switch' 156 set network.@switch_vlan[-1].device='$switch'
167 set network.@switch_vlan[-1].vlan='$role' 157 set network.@switch_vlan[-1].vlan='$role'
168 set network.@switch_vlan[-1].ports='$ports' 158 set network.@switch_vlan[-1].ports='$ports'
169 EOF 159 EOF
170 done 160 done
171   161  
172 json_select .. 162 json_select ..
173 fi 163 fi
174   164  
175   165  
176 # 166 #
177 # write port specific settings 167 # write port specific settings
178 # 168 #
179   169  
180 if json_is_a ports array; then 170 if json_is_a ports array; then
181 json_get_keys ports ports 171 json_get_keys ports ports
182 json_select ports 172 json_select ports
183   173  
184 for port in $ports; do 174 for port in $ports; do
185 json_select "$port" 175 json_select "$port"
186 json_get_vars num 176 json_get_vars num
187   177  
188 if json_is_a attr object; then 178 if json_is_a attr object; then
189 json_get_keys attr attr 179 json_get_keys attr attr
190 json_select attr 180 json_select attr
191 uci -q batch <<-EOF 181 uci -q batch <<-EOF
192 add network switch_port 182 add network switch_port
193 set network.@switch_port[-1].device='$switch' 183 set network.@switch_port[-1].device='$switch'
194 set network.@switch_port[-1].port=$num 184 set network.@switch_port[-1].port=$num
195 EOF 185 EOF
196   186  
197 for attr in $attr; do 187 for attr in $attr; do
198 json_get_var val "$attr" 188 json_get_var val "$attr"
199 uci -q set network.@switch_port[-1].$attr="$val" 189 uci -q set network.@switch_port[-1].$attr="$val"
200 done 190 done
201 json_select .. 191 json_select ..
202 fi 192 fi
203 json_select .. 193 json_select ..
204 done 194 done
205   195  
206 json_select .. 196 json_select ..
207 fi 197 fi
208 } 198 }
209   199  
210 generate_switch() { 200 generate_switch() {
211 local key="$1" 201 local key="$1"
212 local vlans 202 local vlans
213   203  
214 json_select switch 204 json_select switch
215 json_select "$key" 205 json_select "$key"
216 json_get_vars enable reset blinkrate cpu_port 206 json_get_vars enable reset blinkrate cpu_port
217   207  
218 uci -q batch <<-EOF 208 uci -q batch <<-EOF
219 add network switch 209 add network switch
220 set network.@switch[-1].name='$key' 210 set network.@switch[-1].name='$key'
221 set network.@switch[-1].reset='$reset' 211 set network.@switch[-1].reset='$reset'
222 set network.@switch[-1].enable_vlan='$enable' 212 set network.@switch[-1].enable_vlan='$enable'
223 set network.@switch[-1].blinkrate='$blinkrate' 213 set network.@switch[-1].blinkrate='$blinkrate'
224 EOF 214 EOF
225   215  
226 generate_switch_vlans_ports "$1" 216 generate_switch_vlans_ports "$1"
227   217  
228 json_select .. 218 json_select ..
229 json_select .. 219 json_select ..
230 } 220 }
231   221  
232   222  
233 generate_static_system() { 223 generate_static_system() {
234 uci -q batch <<-EOF 224 uci -q batch <<-EOF
235 delete system.@system[0] 225 delete system.@system[0]
236 add system system 226 add system system
237 set system.@system[-1].hostname='OpenWrt' 227 set system.@system[-1].hostname='OpenWrt'
238 set system.@system[-1].timezone='UTC' 228 set system.@system[-1].timezone='UTC'
239 set system.@system[-1].ttylogin='0' 229 set system.@system[-1].ttylogin='0'
240 set system.@system[-1].log_size='64' 230 set system.@system[-1].log_size='64'
241 set system.@system[-1].urandom_seed='0' 231 set system.@system[-1].urandom_seed='0'
242   232  
243 delete system.ntp 233 delete system.ntp
244 set system.ntp='timeserver' 234 set system.ntp='timeserver'
245 set system.ntp.enabled='1' 235 set system.ntp.enabled='1'
246 set system.ntp.enable_server='0' 236 set system.ntp.enable_server='0'
247 add_list system.ntp.server='0.openwrt.pool.ntp.org' 237 add_list system.ntp.server='0.openwrt.pool.ntp.org'
248 add_list system.ntp.server='1.openwrt.pool.ntp.org' 238 add_list system.ntp.server='1.openwrt.pool.ntp.org'
249 add_list system.ntp.server='2.openwrt.pool.ntp.org' 239 add_list system.ntp.server='2.openwrt.pool.ntp.org'
250 add_list system.ntp.server='3.openwrt.pool.ntp.org' 240 add_list system.ntp.server='3.openwrt.pool.ntp.org'
251 EOF 241 EOF
252   242  
253 if json_is_a system object; then 243 if json_is_a system object; then
254 json_select system 244 json_select system
255 local hostname 245 local hostname
256 if json_get_var hostname hostname; then 246 if json_get_var hostname hostname; then
257 uci -q set "system.@system[-1].hostname=$hostname" 247 uci -q set "system.@system[-1].hostname=$hostname"
258 fi 248 fi
259   249  
260 if json_is_a ntpserver array; then 250 if json_is_a ntpserver array; then
261 local keys key 251 local keys key
262 json_get_keys keys ntpserver 252 json_get_keys keys ntpserver
263 json_select ntpserver 253 json_select ntpserver
264 uci -q delete "system.ntp.server" 254 uci -q delete "system.ntp.server"
265   255  
266 for key in $keys; do 256 for key in $keys; do
267 local server 257 local server
268 if json_get_var server "$key"; then 258 if json_get_var server "$key"; then
269 uci -q add_list "system.ntp.server=$server" 259 uci -q add_list "system.ntp.server=$server"
270 fi 260 fi
271 done 261 done
272 json_select .. 262 json_select ..
273 fi 263 fi
274 json_select .. 264 json_select ..
275 fi 265 fi
276 } 266 }
277   267  
278 generate_rssimon() { 268 generate_rssimon() {
279 local key="$1" 269 local key="$1"
280 local cfg="rssid_$key" 270 local cfg="rssid_$key"
281 local refresh threshold 271 local refresh threshold
282   272  
283 json_select rssimon 273 json_select rssimon
284 json_select "$key" 274 json_select "$key"
285 json_get_vars refresh threshold 275 json_get_vars refresh threshold
286 json_select .. 276 json_select ..
287 json_select .. 277 json_select ..
288   278  
289 uci -q batch <<-EOF 279 uci -q batch <<-EOF
290 delete system.$cfg 280 delete system.$cfg
291 set system.$cfg='rssid' 281 set system.$cfg='rssid'
292 set system.$cfg.dev='$key' 282 set system.$cfg.dev='$key'
293 set system.$cfg.refresh='$refresh' 283 set system.$cfg.refresh='$refresh'
294 set system.$cfg.threshold='$threshold' 284 set system.$cfg.threshold='$threshold'
295 EOF 285 EOF
296 } 286 }
297   287  
298 generate_led() { 288 generate_led() {
299 local key="$1" 289 local key="$1"
300 local cfg="led_$key" 290 local cfg="led_$key"
301   291  
302 json_select led 292 json_select led
303 json_select "$key" 293 json_select "$key"
304 json_get_vars name sysfs type trigger default 294 json_get_vars name sysfs type trigger default
305   295  
306 uci -q batch <<-EOF 296 uci -q batch <<-EOF
307 delete system.$cfg 297 delete system.$cfg
308 set system.$cfg='led' 298 set system.$cfg='led'
309 set system.$cfg.name='$name' 299 set system.$cfg.name='$name'
310 set system.$cfg.sysfs='$sysfs' 300 set system.$cfg.sysfs='$sysfs'
311 set system.$cfg.trigger='$trigger' 301 set system.$cfg.trigger='$trigger'
312 set system.$cfg.default='$default' 302 set system.$cfg.default='$default'
313 EOF 303 EOF
314   304  
315 case "$type" in 305 case "$type" in
316 gpio) 306 gpio)
317 local gpio inverted 307 local gpio inverted
318 json_get_vars gpio inverted 308 json_get_vars gpio inverted
319 uci -q batch <<-EOF 309 uci -q batch <<-EOF
320 set system.$cfg.trigger='gpio' 310 set system.$cfg.trigger='gpio'
321 set system.$cfg.gpio='$gpio' 311 set system.$cfg.gpio='$gpio'
322 set system.$cfg.inverted='$inverted' 312 set system.$cfg.inverted='$inverted'
323 EOF 313 EOF
324 ;; 314 ;;
325   315  
326 netdev) 316 netdev)
327 local device mode 317 local device mode
328 json_get_vars device mode 318 json_get_vars device mode
329 uci -q batch <<-EOF 319 uci -q batch <<-EOF
330 set system.$cfg.trigger='netdev' 320 set system.$cfg.trigger='netdev'
331 set system.$cfg.mode='$mode' 321 set system.$cfg.mode='$mode'
332 set system.$cfg.dev='$device' 322 set system.$cfg.dev='$device'
333 EOF 323 EOF
334 ;; 324 ;;
335   325  
336 usb) 326 usb)
337 local device 327 local device
338 json_get_vars device 328 json_get_vars device
339 uci -q batch <<-EOF 329 uci -q batch <<-EOF
340 set system.$cfg.trigger='usbdev' 330 set system.$cfg.trigger='usbdev'
341 set system.$cfg.interval='50' 331 set system.$cfg.interval='50'
342 set system.$cfg.dev='$device' 332 set system.$cfg.dev='$device'
343 EOF 333 EOF
344 ;; 334 ;;
345   335  
346 usbport) 336 usbport)
347 local ports port 337 local ports port
348 json_get_values ports ports 338 json_get_values ports ports
349 uci set system.$cfg.trigger='usbport' 339 uci set system.$cfg.trigger='usbport'
350 for port in $ports; do 340 for port in $ports; do
351 uci add_list system.$cfg.port=$port 341 uci add_list system.$cfg.port=$port
352 done 342 done
353 ;; 343 ;;
354   344  
355 rssi) 345 rssi)
356 local iface minq maxq offset factor 346 local iface minq maxq offset factor
357 json_get_vars iface minq maxq offset factor 347 json_get_vars iface minq maxq offset factor
358 uci -q batch <<-EOF 348 uci -q batch <<-EOF
359 set system.$cfg.trigger='rssi' 349 set system.$cfg.trigger='rssi'
360 set system.$cfg.iface='rssid_$iface' 350 set system.$cfg.iface='rssid_$iface'
361 set system.$cfg.minq='$minq' 351 set system.$cfg.minq='$minq'
362 set system.$cfg.maxq='$maxq' 352 set system.$cfg.maxq='$maxq'
363 set system.$cfg.offset='$offset' 353 set system.$cfg.offset='$offset'
364 set system.$cfg.factor='$factor' 354 set system.$cfg.factor='$factor'
365 EOF 355 EOF
366 ;; 356 ;;
367   357  
368 switch) 358 switch)
369 local port_mask speed_mask mode 359 local port_mask speed_mask
370 json_get_vars port_mask speed_mask mode 360 json_get_vars port_mask speed_mask
371 uci -q batch <<-EOF 361 uci -q batch <<-EOF
372 set system.$cfg.port_mask='$port_mask' 362 set system.$cfg.port_mask='$port_mask'
373 set system.$cfg.speed_mask='$speed_mask' 363 set system.$cfg.speed_mask='$speed_mask'
374 set system.$cfg.mode='$mode' -  
375 EOF 364 EOF
376 ;; 365 ;;
377   366  
378 portstate) 367 portstate)
379 local port_state 368 local port_state
380 json_get_vars port_state 369 json_get_vars port_state
381 uci -q batch <<-EOF 370 uci -q batch <<-EOF
382 set system.$cfg.port_state='$port_state' 371 set system.$cfg.port_state='$port_state'
383 EOF 372 EOF
384 ;; 373 ;;
385   374  
386 timer|oneshot) 375 timer|oneshot)
387 local delayon delayoff 376 local delayon delayoff
388 json_get_vars delayon delayoff 377 json_get_vars delayon delayoff
389 uci -q batch <<-EOF 378 uci -q batch <<-EOF
390 set system.$cfg.trigger='$type' 379 set system.$cfg.trigger='$type'
391 set system.$cfg.delayon='$delayon' 380 set system.$cfg.delayon='$delayon'
392 set system.$cfg.delayoff='$delayoff' 381 set system.$cfg.delayoff='$delayoff'
393 EOF 382 EOF
394 ;; 383 ;;
395 esac 384 esac
396   385  
397 json_select .. 386 json_select ..
398 json_select .. 387 json_select ..
399 } 388 }
400   389  
401 generate_gpioswitch() { 390 generate_gpioswitch() {
402 local cfg="$1" 391 local cfg="$1"
403   392  
404 json_select gpioswitch 393 json_select gpioswitch
405 json_select "$cfg" 394 json_select "$cfg"
406 local name pin default 395 local name pin default
407 json_get_vars name pin default 396 json_get_vars name pin default
408 uci -q batch <<-EOF 397 uci -q batch <<-EOF
409 delete system.$cfg 398 delete system.$cfg
410 set system.$cfg='gpio_switch' 399 set system.$cfg='gpio_switch'
411 set system.$cfg.name='$name' 400 set system.$cfg.name='$name'
412 set system.$cfg.gpio_pin='$pin' 401 set system.$cfg.gpio_pin='$pin'
413 set system.$cfg.value='$default' 402 set system.$cfg.value='$default'
414 EOF 403 EOF
415 json_select .. 404 json_select ..
416 json_select .. 405 json_select ..
417 } 406 }
418   407  
419 json_init 408 json_init
420 json_load "$(cat ${CFG})" 409 json_load "$(cat ${CFG})"
421   410  
422 if [ ! -s /etc/config/network ]; then 411 if [ ! -s /etc/config/network ]; then
423 touch /etc/config/network 412 touch /etc/config/network
424 generate_static_network 413 generate_static_network
425   414  
426 json_get_keys keys network 415 json_get_keys keys network
427 for key in $keys; do generate_network $key; done 416 for key in $keys; do generate_network $key; done
428   417  
429 json_get_keys keys switch 418 json_get_keys keys switch
430 for key in $keys; do generate_switch $key; done 419 for key in $keys; do generate_switch $key; done
431 fi 420 fi
432   421  
433 if [ ! -s /etc/config/system ]; then 422 if [ ! -s /etc/config/system ]; then
434 touch /etc/config/system 423 touch /etc/config/system
435 generate_static_system 424 generate_static_system
436   425  
437 json_get_keys keys rssimon 426 json_get_keys keys rssimon
438 for key in $keys; do generate_rssimon $key; done 427 for key in $keys; do generate_rssimon $key; done
439   428  
440 json_get_keys keys gpioswitch 429 json_get_keys keys gpioswitch
441 for key in $keys; do generate_gpioswitch $key; done 430 for key in $keys; do generate_gpioswitch $key; done
442   431  
443 json_get_keys keys led 432 json_get_keys keys led
444 for key in $keys; do generate_led $key; done 433 for key in $keys; do generate_led $key; done
445 fi 434 fi
446 uci commit 435 uci commit
447   436