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