7a97a8dd0f91938e549bdc423039b1d41e27ee91
[openwrt/openwrt.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 json_is_a roles array; then
37 json_get_keys roles roles
38 json_select roles
39
40 for role in $roles; do
41 json_select "$role"
42 json_get_vars ports device
43 json_select ..
44
45 if [ "$device" = "$lan_if" ]; then
46 swconfig dev $name set reset $reset
47 swconfig dev $name set enable_vlan $enable
48 swconfig dev $name vlan $role set ports "$ports"
49 swconfig dev $name set apply
50 fi
51 done
52
53 json_select ..
54 fi
55
56 json_select ..
57 json_select ..
58 }
59
60 preinit_config_board() {
61 /bin/board_detect /tmp/board.json
62
63 [ -f "/tmp/board.json" ] || return
64
65 . /usr/share/libubox/jshn.sh
66
67 json_init
68 json_load "$(cat /tmp/board.json)"
69
70 json_select network
71 json_select "lan"
72 json_get_vars ifname
73 json_select ..
74 json_select ..
75
76 [ -n "$ifname" ] || return
77
78 # only use the first one
79 ifname=${ifname%% *}
80
81 if [ -x /sbin/swconfig ]; then
82 # configure the switch, if present
83
84 json_get_keys keys switch
85 for key in $keys; do
86 preinit_config_switch $key $ifname
87 done
88 else
89 # trim any vlan ids
90 ifname=${ifname%\.*}
91 fi
92
93 pi_ifname=$ifname
94
95 preinit_ip_config $pi_ifname
96 }
97
98 preinit_ip() {
99 [ "$pi_preinit_no_failsafe" = "y" ] && return
100
101 # if the preinit interface isn't specified and ifname is set in
102 # preinit.arch use that interface
103 if [ -z "$pi_ifname" ]; then
104 pi_ifname=$ifname
105 fi
106
107 if [ -n "$pi_ifname" ]; then
108 preinit_ip_config $pi_ifname
109 elif [ -d "/etc/board.d/" ]; then
110 preinit_config_board
111 fi
112
113 preinit_net_echo "Doing Lede Preinit\n"
114 }
115
116 preinit_ip_deconfig() {
117 [ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
118 local netdev vid
119
120 netdev=${pi_ifname%\.*}
121 vid=${pi_ifname#*\.}
122
123 if [ "$vid" = "$netdev" ]; then
124 vid=
125 fi
126
127 ip -4 address flush dev $pi_ifname
128 ip link set dev $netdev down
129
130 if [ -n "$vid" ]; then
131 ip link delete $pi_ifname
132 fi
133 }
134 }
135
136 preinit_net_echo() {
137 [ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && {
138 {
139 [ "$pi_preinit_net_messages" = "y" ] || {
140 [ "$pi_failsafe_net_message" = "true" ] &&
141 [ "$pi_preinit_no_failsafe_netmsg" != "y" ]
142 }
143 } && netmsg $pi_broadcast "$1"
144 }
145 }
146
147 preinit_echo() {
148 preinit_net_echo $1
149 echo $1
150 }
151
152 pi_indicate_preinit() {
153 set_state preinit
154 }
155
156 boot_hook_add preinit_main preinit_ip
157 boot_hook_add preinit_main pi_indicate_preinit