base-files: preinit: also config switch when no port roles defined
[openwrt/staging/lynxis.git] / package / base-files / files / lib / preinit / 10_indicate_preinit
1 #!/bin/sh
2 # Copyright (C) 2006 OpenWrt.org
3 # Copyright (C) 2010 Vertical Communications
4
5 preinit_ip_config() {
6 local netdev vid
7
8 netdev=${1%\.*}
9 vid=${1#*\.}
10
11 if [ "$vid" = "$netdev" ]; then
12 vid=
13 fi
14
15 grep -q "$netdev" /proc/net/dev || return
16
17 if [ -n "$vid" ]; then
18 ip link add link $netdev name $1 type vlan id $vid
19 fi
20
21 ip link set dev $netdev up
22 ip -4 address add $pi_ip/$pi_netmask broadcast $pi_broadcast dev $1
23 }
24
25 preinit_config_switch() {
26 local role roles ports device enable reset
27
28 local name=$1
29 local lan_if=$2
30
31 json_select switch
32 json_select $name
33
34 json_get_vars enable reset
35
36 if [ "$reset" -eq "1" ]; then
37 swconfig dev $name set reset
38 fi
39 swconfig dev $name set enable_vlan $enable
40
41 if json_is_a roles array; then
42 json_get_keys roles roles
43 json_select roles
44
45 for role in $roles; do
46 json_select "$role"
47 json_get_vars ports device
48 json_select ..
49
50 if [ "$device" = "$lan_if" ]; then
51 swconfig dev $name vlan $role set ports "$ports"
52 fi
53 done
54
55 json_select ..
56 fi
57
58 swconfig dev $name set apply
59
60 json_select ..
61 json_select ..
62 }
63
64 preinit_config_board() {
65 /bin/board_detect /tmp/board.json
66
67 [ -f "/tmp/board.json" ] || return
68
69 . /usr/share/libubox/jshn.sh
70
71 json_init
72 json_load "$(cat /tmp/board.json)"
73
74 json_select network
75 json_select "lan"
76 json_get_vars ifname
77 json_select ..
78 json_select ..
79
80 [ -n "$ifname" ] || return
81
82 # only use the first one
83 ifname=${ifname%% *}
84
85 if [ -x /sbin/swconfig ]; then
86 # configure the switch, if present
87
88 json_get_keys keys switch
89 for key in $keys; do
90 preinit_config_switch $key $ifname
91 done
92 else
93 # trim any vlan ids
94 ifname=${ifname%\.*}
95 fi
96
97 pi_ifname=$ifname
98
99 preinit_ip_config $pi_ifname
100 }
101
102 preinit_ip() {
103 [ "$pi_preinit_no_failsafe" = "y" ] && return
104
105 # if the preinit interface isn't specified and ifname is set in
106 # preinit.arch use that interface
107 if [ -z "$pi_ifname" ]; then
108 pi_ifname=$ifname
109 fi
110
111 if [ -n "$pi_ifname" ]; then
112 preinit_ip_config $pi_ifname
113 elif [ -d "/etc/board.d/" ]; then
114 preinit_config_board
115 fi
116
117 preinit_net_echo "Doing OpenWrt Preinit\n"
118 }
119
120 preinit_ip_deconfig() {
121 [ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
122 local netdev vid
123
124 netdev=${pi_ifname%\.*}
125 vid=${pi_ifname#*\.}
126
127 if [ "$vid" = "$netdev" ]; then
128 vid=
129 fi
130
131 ip -4 address flush dev $pi_ifname
132 ip link set dev $netdev down
133
134 if [ -n "$vid" ]; then
135 ip link delete $pi_ifname
136 fi
137 }
138 }
139
140 preinit_net_echo() {
141 [ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
142 {
143 [ "$pi_preinit_net_messages" = "y" ] || {
144 [ "$pi_failsafe_net_message" = "true" ] &&
145 [ "$pi_preinit_no_failsafe_netmsg" != "y" ]
146 }
147 } && netmsg $pi_broadcast "$1"
148 }
149 }
150
151 pi_indicate_preinit() {
152 set_state preinit
153 }
154
155 boot_hook_add preinit_main preinit_ip
156 boot_hook_add preinit_main pi_indicate_preinit