| 1 | #!/bin/sh
|
|---|
| 2 | find_name()
|
|---|
| 3 | {
|
|---|
| 4 | for ifname in lan wan wifi ${ifnames}; do
|
|---|
| 5 | IFTYPE="${ifname}"
|
|---|
| 6 | eval "IFPROTO=\"\${${IFTYPE}_proto}\""
|
|---|
| 7 | eval "IFACE=\"\${${IFTYPE}_ifname}\""
|
|---|
| 8 | case "$IFPROTO" in
|
|---|
| 9 | ""|none);;
|
|---|
| 10 | static|dhcp)
|
|---|
| 11 | [ "${IFACE}" = "$INTERFACE" ] && return 0
|
|---|
| 12 | [ "${IFACE%%[0-9]*}" = "br" ] && {
|
|---|
| 13 | eval "ifs=\"\${${IFTYPE}_ifnames}\""
|
|---|
| 14 | for part in $ifs; do
|
|---|
| 15 | [ "$part" = "$INTERFACE" ] && return 0
|
|---|
| 16 | done
|
|---|
| 17 | }
|
|---|
| 18 | ;;
|
|---|
| 19 | pppoa)
|
|---|
| 20 | [ "$INTERFACE" = "atm0" \
|
|---|
| 21 | -a -x /sbin/ifup.${IFPROTO} ] && return 0
|
|---|
| 22 | ;;
|
|---|
| 23 | *)
|
|---|
| 24 | eval "device=\"\${${IFTYPE}_device}\""
|
|---|
| 25 | [ "$device" = "$INTERFACE" \
|
|---|
| 26 | -a -x /sbin/ifup.${IFPROTO} ] && return 0
|
|---|
| 27 | ;;
|
|---|
| 28 | esac
|
|---|
| 29 | done
|
|---|
| 30 | IFACE=""
|
|---|
| 31 | IFTYPE=""
|
|---|
| 32 | IFPROTO=""
|
|---|
| 33 | return 255
|
|---|
| 34 | }
|
|---|
| 35 |
|
|---|
| 36 | do_ifup() {
|
|---|
| 37 | if="$3"
|
|---|
| 38 | eval "if_proto=\"\${${2}_proto}\""
|
|---|
| 39 |
|
|---|
| 40 | pidfile=/var/run/${if}.pid
|
|---|
| 41 | [ -f $pidfile ] && $DEBUG kill $(cat $pidfile)
|
|---|
| 42 |
|
|---|
| 43 | case "$1" in
|
|---|
| 44 | static)
|
|---|
| 45 | eval "ip=\"\${${2}_ipaddr}\""
|
|---|
| 46 | eval "ip6=\"\${${2}_ip6addr}\""
|
|---|
| 47 | eval "netmask=\"\${${2}_netmask}\""
|
|---|
| 48 | eval "gateway=\"\${${2}_gateway}\""
|
|---|
| 49 | eval "dns=\"\${${2}_dns}\""
|
|---|
| 50 | eval "static_route=\"\${${2}_static_route}\""
|
|---|
| 51 |
|
|---|
| 52 | $DEBUG ifconfig $if $ip ${netmask:+netmask $netmask} broadcast + up
|
|---|
| 53 | [ -n "$ip6" ] && $DEBUG ifconfig $if add $ip6
|
|---|
| 54 |
|
|---|
| 55 | [ -n "$static_route" ] && {
|
|---|
| 56 | for route in $static_route; do
|
|---|
| 57 | if [ "$(echo $route | cut -d \/ -f2)" != "32" ];
|
|---|
| 58 | then
|
|---|
| 59 | route add -net $(echo $route | cut -d \/ -f1) netmask $(echo $route | cut -d \/ -f1) dev $if
|
|---|
| 60 | else
|
|---|
| 61 | route add -host $(echo $route | cut -d \/ -f1) dev $if
|
|---|
| 62 | fi
|
|---|
| 63 | done
|
|---|
| 64 | }
|
|---|
| 65 |
|
|---|
| 66 | ${gateway:+$DEBUG route add default gw $gateway}
|
|---|
| 67 |
|
|---|
| 68 | [ -f /tmp/resolv.conf ] || {
|
|---|
| 69 | debug "# --- creating /tmp/resolv.conf ---"
|
|---|
| 70 | for ns in $dns; do
|
|---|
| 71 | echo "nameserver $ns" >> /tmp/resolv.conf
|
|---|
| 72 | done
|
|---|
| 73 | }
|
|---|
| 74 |
|
|---|
| 75 | env -i ACTION="ifup" INTERFACE="${2}" PROTO=static /sbin/hotplug "iface" &
|
|---|
| 76 | ;;
|
|---|
| 77 | dhcp)
|
|---|
| 78 | eval "ip=\"\${${2}_ipaddr}\""
|
|---|
| 79 | eval "netmask=\"\${${2}_netmask}\""
|
|---|
| 80 | eval "hostname=\"\${${2}_hostname}\""
|
|---|
| 81 |
|
|---|
| 82 | $DEBUG ifconfig $if $ip ${netmask:+netmask $netmask} broadcast + up
|
|---|
| 83 |
|
|---|
| 84 | args="-i $if ${ip:+-r $ip} -b -p $pidfile"
|
|---|
| 85 | hostname="${hostname%%.*}"
|
|---|
| 86 | args="$args${hostname:+ -H $hostname}"
|
|---|
| 87 | [ "$if_proto" = "pptp" ] && args="$args -n -q" || args="$args -R &"
|
|---|
| 88 | ${DEBUG:-eval} "udhcpc $args"
|
|---|
| 89 | # hotplug events are handled by /usr/share/udhcpc/default.script
|
|---|
| 90 | ;;
|
|---|
| 91 | *)
|
|---|
| 92 | if [ -x "/sbin/ifup.$1" ]; then
|
|---|
| 93 | ( $DEBUG . /sbin/ifup.$1 ${2} $3 )
|
|---|
| 94 | fi
|
|---|
| 95 | ;;
|
|---|
| 96 | esac
|
|---|
| 97 | }
|
|---|
| 98 |
|
|---|
| 99 | do_register()
|
|---|
| 100 | {
|
|---|
| 101 | [ -z "$IFTYPE" -o -z "$IFPROTO" ] && {
|
|---|
| 102 | find_name || {
|
|---|
| 103 | case "${INTERFACE%%[0-9]*}" in
|
|---|
| 104 | wds)
|
|---|
| 105 | for ifname in lan wifi; do
|
|---|
| 106 | eval "if=\"\${${ifname}_ifname}\""
|
|---|
| 107 | [ -z "$IFPROTO" ] && [ "$if" = "br0" ] && {
|
|---|
| 108 | eval "IFPROTO=\"\${${2}_proto}\""
|
|---|
| 109 | IFTYPE="${tmp}"
|
|---|
| 110 | }
|
|---|
| 111 | done
|
|---|
| 112 | [ -z "$IFPROTO" ] && return 0
|
|---|
| 113 | ;;
|
|---|
| 114 | atm)
|
|---|
| 115 | for tmp in lan wan wifi ${ifnames}; do
|
|---|
| 116 | eval "if_proto=\"\${${2}_proto}\""
|
|---|
| 117 | [ "$if_proto" = "pppoa" ] && {
|
|---|
| 118 | do_ifup "pppoa" "$tmp" "$INTERFACE"
|
|---|
| 119 | return 0
|
|---|
| 120 | }
|
|---|
| 121 | done
|
|---|
| 122 | ;;
|
|---|
| 123 | *)
|
|---|
| 124 | return 0
|
|---|
| 125 | ;;
|
|---|
| 126 | esac
|
|---|
| 127 | }
|
|---|
| 128 | }
|
|---|
| 129 |
|
|---|
| 130 | case "${INTERFACE%%[0-9]*}" in
|
|---|
| 131 | ppp|atm);;
|
|---|
| 132 | *)
|
|---|
| 133 | eval "mac=\"\${${IFTYPE}_hwaddr}\""
|
|---|
| 134 | ${mac:+$DEBUG ifconfig $INTERFACE down hw ether $mac}
|
|---|
| 135 | ;;
|
|---|
| 136 | esac
|
|---|
| 137 |
|
|---|
| 138 | eval "if=\"\${${IFTYPE}_ifname}\""
|
|---|
| 139 | if [ "${if%%[0-9]}" = "br" ]; then
|
|---|
| 140 | if_valid "$INTERFACE" && {
|
|---|
| 141 | ifconfig "$if" 2>&- >&- || {
|
|---|
| 142 | eval "stp=\"\${${IFTYPE}_stp}\""
|
|---|
| 143 | $DEBUG brctl addbr "$if"
|
|---|
| 144 | $DEBUG brctl setfd "$if" 0
|
|---|
| 145 | $DEBUG brctl stp "$if" "${stp:-0}"
|
|---|
| 146 | }
|
|---|
| 147 |
|
|---|
| 148 | if [ "$INTERFACE" != "$if" ]; then
|
|---|
| 149 | $DEBUG ifconfig "$INTERFACE" 0.0.0.0 up
|
|---|
| 150 | $DEBUG brctl addif "$if" "$INTERFACE"
|
|---|
| 151 | $DEBUG ifconfig "$INTERFACE" allmulti
|
|---|
| 152 | else
|
|---|
| 153 | do_ifup "$IFPROTO" "$IFTYPE" "$if"
|
|---|
| 154 | fi
|
|---|
| 155 | }
|
|---|
| 156 | else
|
|---|
| 157 | [ "${INTERFACE%%[0-9]*}" = "ppp" ] || do_ifup "$IFPROTO" "$IFTYPE" "$if"
|
|---|
| 158 | fi
|
|---|
| 159 | }
|
|---|
| 160 |
|
|---|
| 161 | do_unregister() {
|
|---|
| 162 | [ -z "$IFTYPE" -o -z "$IFPROTO" ] && {
|
|---|
| 163 | find_name || return 0
|
|---|
| 164 | }
|
|---|
| 165 |
|
|---|
| 166 | [ "${IFACE%%[0-9]*}" = "br" ] && {
|
|---|
| 167 | if [ "$INTERFACE" != "$IFACE" ]; then
|
|---|
| 168 | brctl delif "$IFACE" "$INTERFACE" 2>&- >&-
|
|---|
| 169 | else
|
|---|
| 170 | brctl delbr "$IFACE" 2>&- >&-
|
|---|
| 171 | fi
|
|---|
| 172 | }
|
|---|
| 173 |
|
|---|
| 174 | case "$IFPROTO" in
|
|---|
| 175 | pppoe|pppoa|pptp)
|
|---|
| 176 | killall pppd 2>&- >&-
|
|---|
| 177 | ;;
|
|---|
| 178 | dhcp)
|
|---|
| 179 | [ -f /var/run/${INTERFACE}.pid ] && kill "$(cat /var/run/${INTERFACE}.pid)" 2>&- >&-
|
|---|
| 180 | ;;
|
|---|
| 181 | esac
|
|---|
| 182 |
|
|---|
| 183 | [ "${INTERFACE%%[0-9]*}" = "atm" ] || ifconfig "$INTERFACE" 0.0.0.0 down 2>&-
|
|---|
| 184 | }
|
|---|
| 185 |
|
|---|
| 186 | case "$ACTION" in
|
|---|
| 187 | add|register) do_register;;
|
|---|
| 188 | remove|unregister) do_unregister;;
|
|---|
| 189 | esac
|
|---|