summaryrefslogtreecommitdiff
path: root/package/base-files/files/bin/config_generate
blob: 7bec566f3f7957ec915a8c77be4c110bc2aa9503 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#!/bin/sh

CFG=/etc/board.json

. /usr/share/libubox/jshn.sh

[ -f $CFG ] || exit 1

generate_static_network() {
	uci -q batch <<EOF
delete network.loopback
set network.loopback='interface'
set network.loopback.ifname='lo'
set network.loopback.proto='static'
set network.loopback.ipaddr='127.0.0.1'
set network.loopback.netmask='255.0.0.0'
delete network.globals
set network.globals='globals'
set network.globals.ula_prefix='auto'
EOF
}

next_vlan=3
generate_network() {
	local vlan

	json_select network
	json_select $1
	json_get_vars ifname create_vlan macaddr
	json_select ..
	json_select ..

	[ -n "$ifname" ] || return
	[ "$create_vlan" -eq 1 ] && case $1 in
	lan) vlan=1;;
	wan) vlan=2;;
	*)
		vlan=$next_vlan
		next_vlan=$((next_vlan + 1))
		;;
	esac
	[ -n "$vlan" ] && ifname=${ifname}.${vlan}
	uci -q batch <<EOF
delete network.$1
set network.$1='interface'
set network.$1.ifname='$ifname'
set network.$1.force_link=1
set network.$1.proto='none'
set network.$1.macaddr='$macaddr'
EOF

	case $1 in
	lan) uci -q batch <<EOF
set network.$1.type='bridge'
set network.$1.proto='static'
set network.$1.ipaddr='192.168.1.1'
set network.$1.netmask='255.255.255.0'
set network.$1.ip6assign='60'
EOF
		;;
	wan) uci -q batch <<EOF
set network.$1.proto='dhcp'
delete network.wan6
set network.wan6='interface'
set network.wan6.ifname='$ifname'
set network.wan6.proto='dhcpv6'
EOF
		;;
	esac
}

generate_switch_vlan() {
	local device=$1
	local vlan=$2
	local cpu_port=$3

	case $vlan in
	lan)	vlan=1;;
	wan)	vlan=2;;
	*)	vlan=${vlan##vlan};;
	esac

	json_select vlans
	json_select $2
	json_get_values ports
	json_select ..
	json_select ..

	uci -q batch <<EOF
add network switch_vlan
set network.@switch_vlan[-1].device='$device'
set network.@switch_vlan[-1].vlan='$vlan'
set network.@switch_vlan[-1].ports='$ports ${cpu_port}t'
EOF
}

generate_switch() {
	local key=$1
	local vlans

	json_select switch
	json_select $key
	json_get_vars enable reset blinkrate cpu_port

	uci -q batch <<EOF
add network switch
set network.@switch[-1].name='$key'
set network.@switch[-1].reset='$reset'
set network.@switch[-1].enable_vlan='$enable'
set network.@switch[-1].blinkrate='$blinkrate'
EOF
	[ -n "$cpu_port" ] && {
		json_get_keys vlans vlans
		for vlan in $vlans; do generate_switch_vlan $1 $vlan $cpu_port; done
	}
	json_select ..
	json_select ..
}

generate_led() {
	local key=$1
	local cfg="led_$key"

	json_select led
	json_select $key
	json_get_vars name sysfs type trigger device interface default
	json_select ..
	json_select ..

	uci -q batch <<EOF
delete system.$cfg
set system.$cfg='led'
set system.$cfg.name='$name'
set system.$cfg.sysfs='$sysfs'
set system.$cfg.dev='$device'
set system.$cfg.trigger='$trigger'
set system.$cfg.port_mask='$port_mask'
set system.$cfg.default='$default'
EOF
	case $type in
	netdev)
		uci -q batch <<EOF
set system.$cfg.trigger='netdev'
set system.$cfg.mode='link tx rx'
EOF
	;;

	usb)
		uci -q batch <<EOF
set system.$cfg.trigger='usbdev'
set system.$cfg.interval='50'
EOF
	;;

	esac
}

json_init
json_load "$(cat ${CFG})"

generate_static_network

json_get_keys keys network
for key in $keys; do generate_network $key; done

json_get_keys keys switch
for key in $keys; do generate_switch $key; done

json_get_keys keys led
for key in $keys; do generate_led $key; done

uci commit