summaryrefslogtreecommitdiffstats
path: root/src/connections/ethernet-iproute
diff options
context:
space:
mode:
authorJames Rayner <james@archlinux.org>2009-08-07 16:23:45 +0200
committerJames Rayner <james@archlinux.org>2009-08-07 16:23:45 +0200
commit54e39849f1e60eb043f9d8f0904acf3c79d96a1c (patch)
tree9c10a01ea0ba58d31b3ab8282ead767da49264d3 /src/connections/ethernet-iproute
parentf7168ae05837a24060b41511be6e4626cb26828a (diff)
downloadnetctl-54e39849f1e60eb043f9d8f0904acf3c79d96a1c.tar.gz
netctl-54e39849f1e60eb043f9d8f0904acf3c79d96a1c.tar.xz
Patch from Jim Pryor
Diffstat (limited to 'src/connections/ethernet-iproute')
-rw-r--r--src/connections/ethernet-iproute214
1 files changed, 167 insertions, 47 deletions
diff --git a/src/connections/ethernet-iproute b/src/connections/ethernet-iproute
index 1a4a6e4..8ecabe8 100644
--- a/src/connections/ethernet-iproute
+++ b/src/connections/ethernet-iproute
@@ -1,85 +1,102 @@
#! /bin/bash
+
+##################################
+##
+# /usr/lib/network/connections/ethernet-iproute
+##
+##################################
+
+. /etc/rc.conf
+. /etc/rc.d/functions
. /usr/lib/network/network
-error()
-{
- err_append "$*"
- ip addr flush $INTERFACE &>/dev/null
- quirk "nodown" || ip link set $INTERFACE down &>/dev/null
+report_iproute() {
+ report_"$@"
+ ethernet_control "$INTERFACE" down
exit 1
}
ethernet_up() {
- load_profile $1
+ load_profile "$1"
- if [[ ! -e /sys/class/net/$INTERFACE ]]; then
- if ! echo "$INTERFACE"|grep ":"; then
- error "Interface $INTERFACE does not exist"
+ if [[ ! -e "/sys/class/net/$INTERFACE" ]]; then
+ if ! echo "$INTERFACE" | fgrep -q ":"; then
+ report_iproute fail "Interface $INTERFACE does not exist."
fi
fi
- ip link set $INTERFACE up
- sleep 1
+ report_debug ethernet_iproute_up ifup
+ ethernet_control "$INTERFACE" up
+ sleep 3
- if ip link show $INTERFACE|grep -q "NO-CARRIER"; then
- err_append "No connection"
- return 1
+ # if ! ethernet_query "$INTERFACE" address; then...
+ if ip link show dev "$INTERFACE" | fgrep -q "NO-CARRIER"; then # JP: shouldn''t we include the "dev"?
+ report_iproute fail "No connection."
fi
-
- if checkyesno ${AUTH8021X:-no}; then
- . ${SUBR_DIR}/8021x
+
+ if checkyesno "${AUTH8021X:-no}"; then
+ . "$SUBR_DIR/8021x"
[[ -z "$WPA_CONF" ]] && WPA_CONF="/etc/wpa_supplicant.conf"
[[ -z "$WPA_OPTS" ]] && WPA_OPTS="-Dwired"
-
+ report_debug ethernet_iproute_up start_wpa "$INTERFACE" "$WPA_CONF" "$WPA_OPTS"
start_wpa "$INTERFACE" "$WPA_CONF" "$WPA_OPTS"
if ! wpa_check "$INTERFACE"; then
- ip link set $INTERFACE down
+ ethernet_control "$INTERFACE" forcedown # JP: forcedown ignores the nodown quirk, matching
+ # what was already here in the code...do we in fact want to ignore
+ # the nodown quirk here?
return 1
fi
fi
- case $IP in
+ case "$IP" in
dhcp)
# Clear remaining pid files.
- rm -f /var/run/dhcpcd-${INTERFACE}.{pid,cache} >/dev/null 2>&1
-
+ rm -f "/var/run/dhcpcd-$INTERFACE".{pid,cache} >/dev/null 2>&1
# If using own dns, tell dhcpcd to NOT replace resolv.conf
[[ -n "$DNS" ]] && DHCP_OPTIONS="-C resolv.conf $DHCP_OPTIONS"
-
- if ! dhcpcd -qL -t ${DHCP_TIMEOUT:-10} $DHCP_OPTIONS $INTERFACE; then
- error "DHCP IP lease attempt failed"
+
+ #if ! dhcpcd -qL -t "${DHCP_TIMEOUT:-10}" $DHCP_OPTIONS "$INTERFACE" >/dev/null 2>&1; then
+ report_debug ethernet_iproute_up dhcpcd -qL -t "${DHCP_TIMEOUT:-10}" $DHCP_OPTIONS "$INTERFACE"
+ dhcpcd -qL -t "${DHCP_TIMEOUT:-10}" $DHCP_OPTIONS "$INTERFACE" 2>&1 | report_iproute debug $(cat)
+ if [[ "$PIPESTATUS" -ne 0 ]]; then
+ report_iproute fail "Couldn't get DHCP IP lease."
fi
;;
static)
if [[ -n "$ADDR" ]]; then
- if ! ip addr add ${ADDR}/24 brd + dev $INTERFACE; then
- error "Could not configure interface"
+ report_debug ethernet_iproute_up ip addr add "$ADDR/24" brd + dev "$INTERFACE"
+ if ! ip addr add "$ADDR/24" brd + dev "$INTERFACE"; then
+ report_iproute fail "Couldn't configure $INTERFACE interface."
fi
fi
if [[ -n "$GATEWAY" ]]; then
- if ! ip route add default via $GATEWAY; then
- error "Adding gateway failed"
+ report_debug ethernet_iproute_up ip route add default via "$GATEWAY"
+ if ! ip route add default via "$GATEWAY"; then
+
+ report_iproute fail "Couldn't add gateway $GATEWAY."
fi
fi
;;
*)
- error "Profile error: IP must be either 'dhcp' or 'static'"
+ report_iproute err "Profile error: must be either IP=dhcp or IP=static."
;;
esac
if [[ -n "$IPCFG" ]]; then
for line in "${IPCFG[@]}"; do
- if ! ip $line; then
- error "Could not configure interface"
+ report_debug ethernet_iproute_up ip "$line"
+ if ! ip "$line"; then
+ report_iproute fail "Couldn't configure $INTERFACE interface ($line)."
fi
done
fi
- # Set hostname
+ # set the hostname
if [[ -n "$HOSTNAME" ]]; then
- if ! hostname $HOSTNAME; then
- error "Cannot set hostname"
+ report_debug ethernet_iproute_up hostname "$HOSTNAME"
+ if ! hostname "$HOSTNAME"; then
+ report_iproute fail "Couldn't set hostname."
fi
fi
@@ -89,29 +106,132 @@ ethernet_up() {
[[ -n "$DOMAIN" ]] && echo "domain $DOMAIN" >>/etc/resolv.conf
[[ -n "$SEARCH" ]] && echo "search $SEARCH" >>/etc/resolv.conf
- if [[ -n "$DNS" ]]; then
- for dns in ${DNS[@]}; do
- echo "nameserver $dns" >>/etc/resolv.conf
- done
- fi
+ for dns in "${DNS[@]}"; do
+ echo "nameserver $dns" >>/etc/resolv.conf
+ done
fi
+
+ # successfully running a new profile; erase any suspended profiles on this interface
+ local iface="$INTERFACE"
+ find "$STATE_DIR/suspend/" -maxdepth 1 -type f -printf '%f\n' \
+ | while read prof; do
+ # the pipe to "while read" will create a subshell, so sourced variables will already be in a sandbox
+ # we just need to clear INTERFACE which is all we care about
+ unset INTERFACE
+ . "$STATE_DIR/suspend/$prof"
+ if [[ "$iface" == "$INTERFACE" ]]; then
+ rm "$STATE_DIR/suspend/$prof"
+ fi
+ done
+
return 0
}
ethernet_down() {
- load_profile $1
+ load_profile "$1"
- if [[ "$IP" == "dhcp" ]]; then
- if [[ -f /var/run/dhcpcd-${INTERFACE}.pid ]]; then
- dhcpcd -qx $INTERFACE
+ if [[ "$IP" == dhcp ]]; then
+ if [[ -f "/var/run/dhcpcd-$INTERFACE.pid" ]]; then
+ report_debug ethernet_iproute_down dhcpcd -qx "$INTERFACE"
+ dhcpcd -qx "$INTERFACE" >/dev/null 2>&1
fi
fi
- ip addr flush $INTERFACE
- quirk "nodown" || ip link set $INTERFACE down
+ report_debug ethernet_iproute_down if_down
+ ethernet_control "$INTERFACE" down
+}
+
+# CONNECTION_query $INTERFACE [ profile | enabled (i.e. not rfkill-ed) | active (i.e. ifup'd) | associated | address ]
+ethernet_query() {
+ local INTERFACE="$1" REQUEST="$2"
+ # report_debug ethernet_iproute_query "$@"
+ case "$REQUEST" in
+
+ profile)
+ # return code = 1 if iface is available to be used
+ # return code = 0 if unavailable (disabled, or in use by another profile or by external config)
+ # echo "" | "disabled" | "external" | PROFILE_NAME
+ if [[ ! -f "$STATE_DIR/interfaces/$INTERFACE" ]]; then
+ # interface is up but has no registered profile
+ if ethernet_query "$INTERFACE" address; then
+ set_iface up "$INTERFACE" external
+ echo "external"
+ return 0
+ fi
+ # no ip address, count as inactive
+ # should we ifconfig iface down? no, may be up for a reason
+ return 1
+
+ else # interface is up and thinks it's running a profile
+ . "$STATE_DIR/interfaces/$INTERFACE" # these files should only contain a PROFILE=... statement
+ case "$PROFILE" in
+ external)
+ echo "external"
+ return 0
+ ;;
+ disabled) # shouldn't happen for non-wireless interfaces, but leaving this here in case...
+ # iface should be down if it's disabled
+ ethernet_control "$INTERFACE" down
+ echo "disabled"
+ return 0
+ ;;
+ *)
+ ( # use subshell to prevent overwriting currently loaded profile
+ . "$STATE_DIR/profiles/$PROFILE"
+ if ! ethernet_query "$INTERFACE" address; then
+ report_warn "INTERFACE $INTERFACE is inactive; no longer being controlled by $PROFILE"
+ set_profile down "$PROFILE"
+ exit 1
+ else
+ echo "$PROFILE" # associated with loaded profile
+ exit 0
+ fi
+ )
+ # return $?
+ ;;
+ esac
+ fi
+ ;;
+
+ active)
+ ip -o link show dev "$INTERFACE" | egrep -qw '^[^>]*,UP' # man ip is inconsistent about whether to use "dev"
+ # cat /sys/class/net/wlan0/carrier >/dev/null # gives err if iface inactive, 0 if up but not connected to network, 1 if connected
+ ;;
+
+ address)
+ test -n "$(ip -o addr show dev "$INTERFACE" | sed -n '2p')"
+ # ip link show dev "$INTERFACE" | fgrep -q "NO-CARRIER"
+ ;;
+
+ *) return 1 ;;
+ esac
+}
+
+# CONNECTION_control $INTERFACE [ up | down | forcedown | enable | disable ]
+ethernet_control() {
+ local INTERFACE="$1" ACTION="$2"
+ #report_debug ethernet_iproute_control "$@"
+ case "$ACTION" in
+ up)
+ ip link set dev "$INTERFACE" up 2>/dev/null # man ip is inconsistent about whether to use "dev"
+ ethernet_query "$INTERFACE" active
+ ;;
+ down|forcedown)
+ ip addr flush dev "$INTERFACE" &>/dev/null
+ if [[ "$2" = forcedown ]] || ! quirk nodown; then
+ ip link set dev "$INTERFACE" down &>/dev/null # man ip is inconsistent about whether to use "dev"
+ fi
+ ;;
+ *) return 1
+ ;;
+ esac
+}
+ethernet_verify() {
+ local INTERFACE="$1"
+ # do nothing
}
-ethernet_$1 $2
+ethernet_$1 "$2" "$3"
exit $?
# vim: set ts=4 et sw=4: