base-files: uci-defaults-new, config_generate: refactor code and drop old vlans
[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 [ -f $CFG ] || exit 1
8
9 generate_static_network() {
10         uci -q batch <<-EOF
11                 delete network.loopback
12                 set network.loopback='interface'
13                 set network.loopback.ifname='lo'
14                 set network.loopback.proto='static'
15                 set network.loopback.ipaddr='127.0.0.1'
16                 set network.loopback.netmask='255.0.0.0'
17                 delete network.globals
18                 set network.globals='globals'
19                 set network.globals.ula_prefix='auto'
20         EOF
21 }
22
23 generate_network() {
24         local ifname macaddr type
25
26         json_select network
27                 json_select "$1"
28                         json_get_vars ifname macaddr
29                 json_select ..
30         json_select ..
31
32         [ -n "$ifname" ] || return
33
34         # force bridge for multi-interface devices (and lan)
35         case "$1:$ifname" in
36                 *\ * | lan:*) type="bridge" ;;
37         esac
38
39         uci -q batch <<-EOF
40                 delete network.$1
41                 set network.$1='interface'
42                 set network.$1.type='$type'
43                 set network.$1.ifname='$ifname'
44                 set network.$1.proto='none'
45                 set network.$1.macaddr='$macaddr'
46         EOF
47
48         case "$1" in
49                 lan)
50                         uci -q batch <<-EOF
51                                 set network.$1.proto='static'
52                                 set network.$1.ipaddr='192.168.1.1'
53                                 set network.$1.netmask='255.255.255.0'
54                                 set network.$1.ip6assign='60'
55                         EOF
56                 ;;
57                 wan)
58                         uci -q batch <<-EOF
59                                 set network.$1.proto='dhcp'
60                                 delete network.wan6
61                                 set network.wan6='interface'
62                                 set network.wan6.type='$type'
63                                 set network.wan6.ifname='$ifname'
64                                 set network.wan6.proto='dhcpv6'
65                         EOF
66                 ;;
67         esac
68 }
69
70 generate_switch_vlans_ports() {
71         local switch="$1"
72         local port ports role roles num attr val
73
74         #
75         # autogenerate vlans
76         #
77
78         json_get_keys roles roles
79         json_select roles
80
81         for role in $roles; do
82                 json_select "$role"
83                         json_get_vars ports
84                 json_select ..
85
86                 uci -q batch <<-EOF
87                         add network switch_vlan
88                         set network.@switch_vlan[-1].device='$switch'
89                         set network.@switch_vlan[-1].vlan='$role'
90                         set network.@switch_vlan[-1].ports='$ports'
91                 EOF
92         done
93
94         json_select ..
95
96
97         #
98         # write port specific settings
99         #
100
101         json_get_keys ports ports
102         json_select ports
103
104         for port in $ports; do
105                 json_select "$port"
106                         json_get_vars num
107
108                         if json_is_a attr object; then
109                                 json_get_keys attr attr
110                                 json_select attr
111                                         uci -q batch <<-EOF
112                                                 add network switch_port
113                                                 set network.@switch_port[-1].device='$switch'
114                                                 set network.@switch_port[-1].port=$num
115                                         EOF
116
117                                         for attr in $attr; do
118                                                 json_get_var val "$attr"
119                                                 uci -q set network.@switch_port[-1].$attr="$val"
120                                         done
121                                 json_select ..
122                         fi
123                 json_select ..
124         done
125
126         json_select ..
127 }
128
129 generate_switch() {
130         local key="$1"
131         local vlans
132
133         json_select switch
134         json_select "$key"
135         json_get_vars enable reset blinkrate cpu_port
136
137         uci -q batch <<-EOF
138                 add network switch
139                 set network.@switch[-1].name='$key'
140                 set network.@switch[-1].reset='$reset'
141                 set network.@switch[-1].enable_vlan='$enable'
142                 set network.@switch[-1].blinkrate='$blinkrate'
143         EOF
144
145         generate_switch_vlans_ports "$1"
146
147         json_select ..
148         json_select ..
149 }
150
151 generate_rssimon() {
152         local key="$1"
153         local cfg="rssid_$key"
154         local refresh threshold
155
156         json_select rssimon
157         json_select "$key"
158         json_get_vars refresh threshold
159         json_select ..
160         json_select ..
161
162         uci -q batch <<-EOF
163                 delete system.$cfg
164                 set system.$cfg='rssid'
165                 set system.$cfg.dev='$key'
166                 set system.$cfg.refresh='$refresh'
167                 set system.$cfg.threshold='$threshold'
168         EOF
169 }
170
171 generate_led() {
172         local key="$1"
173         local cfg="led_$key"
174
175         json_select led
176         json_select "$key"
177         json_get_vars name sysfs type trigger default
178
179         uci -q batch <<-EOF
180                 delete system.$cfg
181                 set system.$cfg='led'
182                 set system.$cfg.name='$name'
183                 set system.$cfg.sysfs='$sysfs'
184                 set system.$cfg.trigger='$trigger'
185                 set system.$cfg.default='$default'
186         EOF
187
188         case "$type" in
189                 gpio)
190                         local gpio inverted
191                         json_get_vars gpio inverted
192                         uci -q batch <<-EOF
193                                 set system.$cfg.trigger='gpio'
194                                 set system.$cfg.gpio='$gpio'
195                                 set system.$cfg.inverted='$inverted'
196                         EOF
197                 ;;
198
199                 netdev)
200                         local device
201                         json_get_vars device
202                         uci -q batch <<-EOF
203                                 set system.$cfg.trigger='netdev'
204                                 set system.$cfg.mode='link tx rx'
205                                 set system.$cfg.dev='$device'
206                         EOF
207                 ;;
208
209                 usb)
210                         local device
211                         json_get_vars device
212                         uci -q batch <<-EOF
213                                 set system.$cfg.trigger='usbdev'
214                                 set system.$cfg.interval='50'
215                                 set system.$cfg.dev='$device'
216                         EOF
217                 ;;
218
219                 rssi)
220                         local iface minq maxq offset factor
221                         json_get_vars iface minq maxq offset factor
222                         uci -q batch <<-EOF
223                                 set system.$cfg.trigger='rssi'
224                                 set system.$cfg.iface='rssid_$iface'
225                                 set system.$cfg.minq='$minq'
226                                 set system.$cfg.maxq='$maxq'
227                                 set system.$cfg.offset='$offset'
228                                 set system.$cfg.factor='$factor'
229                         EOF
230                 ;;
231
232                 switch)
233                         local port_mask
234                         json_get_vars port_mask
235                         uci -q batch <<-EOF
236                                 set system.$cfg.port_mask='$port_mask'
237                         EOF
238                 ;;
239         esac
240
241         json_select ..
242         json_select ..
243 }
244
245 json_init
246 json_load "$(cat ${CFG})"
247
248 generate_static_network
249
250 json_get_keys keys network
251 for key in $keys; do generate_network $key; done
252
253 json_get_keys keys switch
254 for key in $keys; do generate_switch $key; done
255
256 json_get_keys keys rssimon
257 for key in $keys; do generate_rssimon $key; done
258
259 json_get_keys keys led
260 for key in $keys; do generate_led $key; done
261
262 uci commit