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