[arch-projects] [netctl][PATCH 3/3] Factor out network interface utilities

Jouke Witteveen j.witteveen at gmail.com
Fri Mar 3 18:24:37 UTC 2017


---
 Makefile                   |  2 +-
 src/lib/auto.action        |  2 ++
 src/lib/connections/README |  1 +
 src/lib/dhcp/README        |  1 +
 src/lib/globals            |  5 +---
 src/lib/interface          | 65 ++++++++++++++++++++++++++++++++++++++++++++++
 src/lib/network            | 55 ++-------------------------------------
 src/netctl-auto            | 17 +++++-------
 src/wifi-menu              | 12 ++++-----
 9 files changed, 85 insertions(+), 75 deletions(-)
 create mode 100644 src/lib/interface

diff --git a/Makefile b/Makefile
index e9f7fa8..34d3956 100644
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ install:
 	install -m644 docs/examples/* $(DESTDIR)/etc/netctl/examples/
 	# Libs
 	install -d $(DESTDIR)/usr/lib/netctl/{connections,dhcp}
-	install -m644 src/lib/{globals,ip,rfkill,wpa} $(DESTDIR)/usr/lib/netctl/
+	install -m644 src/lib/{globals,interface,ip,rfkill,wpa} $(DESTDIR)/usr/lib/netctl/
 	install -m644 src/lib/connections/* $(DESTDIR)/usr/lib/netctl/connections/
 	install -m644 src/lib/dhcp/* $(DESTDIR)/usr/lib/netctl/dhcp/
 	install -m755 src/lib/{auto.action,network} $(DESTDIR)/usr/lib/netctl/
diff --git a/src/lib/auto.action b/src/lib/auto.action
index 66d13b0..31e089f 100755
--- a/src/lib/auto.action
+++ b/src/lib/auto.action
@@ -1,6 +1,7 @@
 #! /bin/bash
 
 . /usr/lib/netctl/globals
+. "$SUBR_DIR/interface"
 . "$SUBR_DIR/ip"
 
 export INTERFACE="$1"
@@ -10,6 +11,7 @@ Profile="$3"
 export ACTION="$4"
 
 load_profile "$Profile"
+load_interface_config "$INTERFACE"
 
 case $ACTION in
   CONNECT)
diff --git a/src/lib/connections/README b/src/lib/connections/README
index 10282fe..eb2c29f 100644
--- a/src/lib/connections/README
+++ b/src/lib/connections/README
@@ -22,6 +22,7 @@ available. The readily sourced files are:
 
   /usr/lib/netctl/network
   /usr/lib/netctl/globals
+  /usr/lib/netctl/interface
   /etc/netctl/<profile>
 
 Here, <profile> is the profile file specifying the desired network
diff --git a/src/lib/dhcp/README b/src/lib/dhcp/README
index 87a0669..e231b46 100644
--- a/src/lib/dhcp/README
+++ b/src/lib/dhcp/README
@@ -22,6 +22,7 @@ The readily sourced files are:
 
   /usr/lib/netctl/network
   /usr/lib/netctl/globals
+  /usr/lib/netctl/interface
   /etc/netctl/<profile>
 
 Here, <profile> is the profile file specifying the desired network
diff --git a/src/lib/globals b/src/lib/globals
index ac3ae66..3caae2f 100644
--- a/src/lib/globals
+++ b/src/lib/globals
@@ -109,7 +109,7 @@ list_profiles() {
     find -L "$PROFILE_DIR/" -maxdepth 1 -type f -not -name '.*' -not -name '*~' -not -name $'*\n*' -not -name '*.action' -not -name '*.conf' -not -name '*.service' -printf "%f\n"
 }
 
-## Sources all hooks, a profile and any interface hook
+## Sources all hooks and a profile (but no interface configuration)
 # $1: profile name
 load_profile() {
     local hook
@@ -126,9 +126,6 @@ load_profile() {
     if [[ ! -r "${Connection:+$SUBR_DIR/connections/$Connection}" ]]; then
         exit_error "Profile '$1' does not specify a valid connection"
     fi
-    if [[ -x "$PROFILE_DIR/interfaces/$Interface" ]]; then
-        source "$PROFILE_DIR/interfaces/$Interface"
-    fi
     source "$SUBR_DIR/connections/$Connection"
 }
 
diff --git a/src/lib/interface b/src/lib/interface
new file mode 100644
index 0000000..2ebf81e
--- /dev/null
+++ b/src/lib/interface
@@ -0,0 +1,65 @@
+## /usr/lib/netctl/globals needs to be sourced before this file
+
+
+## Load interface configuration, if present
+# $1: interface name
+load_interface_config() {
+    local config_file="$PROFILE_DIR/interfaces/$1"
+    if [[ -x $config_file ]]; then
+        source "$config_file"
+    fi
+}
+
+## Check if a string represents a network interface
+# $1: potential interface name
+is_interface() {
+    # Strip any old school alias specifier
+    [[ -d "/sys/class/net/${1%%:?*}" ]]
+}
+
+## Add an interface
+# $1: interface type
+# $2: interface name
+# $3: interface link (optional)
+# $4...: additional arguments
+interface_add() {
+    local type="$1" name="$2" link="$3"
+    do_debug ip link add ${link:+link "$link"} name "$name" type "$type" "${@:4}" $LinkOptions || return
+    load_interface_config "$name"
+}
+
+## Delete an interface
+# $1: interface name
+interface_delete() {
+    bring_interface_down "$1"
+    ip link delete "$1"
+}
+
+## Check if an interface is up
+# $1: interface name
+interface_is_up() {
+    local flags
+    read flags < "/sys/class/net/${1%%:?*}/flags"
+    # IFF_UP is defined as 0x1 in linux/if.h
+    (( flags & 0x1 ))
+}
+
+## Activate an interface
+# $1: interface name
+bring_interface_up() {
+    local interface=$1
+    ip link set dev "$interface" up &>/dev/null
+    timeout_wait "${TimeoutUp:-5}" 'interface_is_up "$interface"'
+}
+
+## Deactivate an interface
+# $1: interface name
+bring_interface_down() {
+    local interface=$1
+    ip link set dev "$interface" down &>/dev/null
+    # We reuse the up timeout (down normally is faster)
+    timeout_wait "${TimeoutUp:-5}" '! interface_is_up "$interface"'
+}
+
+
+# vim: ft=sh ts=4 et sw=4:
diff --git a/src/lib/network b/src/lib/network
index e068bc8..9c88c9c 100755
--- a/src/lib/network
+++ b/src/lib/network
@@ -1,61 +1,9 @@
 #! /bin/bash
 
 . /usr/lib/netctl/globals
+. "$SUBR_DIR/interface"
 
 
-## Check if a string represents a network interface
-# $1: potential interface name
-is_interface() {
-    # Strip any old school alias specifier
-    [[ -d "/sys/class/net/${1%%:?*}" ]]
-}
-
-## Add an interface
-# $1: interface type
-# $2: interface name
-# $3: interface link (optional)
-# $4...: additional arguments
-interface_add() {
-    local type="$1" name="$2" link="$3"
-    do_debug ip link add ${link:+link "$link"} name "$name" type "$type" "${@:4}" $LinkOptions || return
-    if [[ -x "$PROFILE_DIR/interfaces/$name" ]]; then
-        source "$PROFILE_DIR/interfaces/$name"
-    fi
-}
-
-## Delete an interface
-# $1: interface name
-interface_delete() {
-    bring_interface_down "$1"
-    ip link delete "$1"
-}
-
-## Check if an interface is up
-# $1: interface name
-interface_is_up() {
-    local flags
-    read flags < "/sys/class/net/${1%%:?*}/flags"
-    # IFF_UP is defined as 0x1 in linux/if.h
-    (( flags & 0x1 ))
-}
-
-## Activate an interface
-# $1: interface name
-bring_interface_up() {
-    local interface=$1
-    ip link set dev "$interface" up &>/dev/null
-    timeout_wait "${TimeoutUp:-5}" 'interface_is_up "$interface"'
-}
-
-## Deactivate an interface
-# $1: interface name
-bring_interface_down() {
-    local interface=$1
-    ip link set dev "$interface" down &>/dev/null
-    # We reuse the up timeout (down normally is faster)
-    timeout_wait "${TimeoutUp:-5}" '! interface_is_up "$interface"'
-}
-
 ## Indicate that the network stack for the profile is up
 network_ready() {
     if ! is_yes "${WaitOnline:-no}" && ! is_yes "${NETWORK_READY:-no}"; then
@@ -82,6 +30,7 @@ if [[ $# -eq 2 && $1 == @(start|stop) ]]; then
     # Expose the profile name
     Profile=$2
     load_profile "$Profile"
+    load_interface_config "$Interface"
 elif [[ $# -ne 1 || $1 != "wait-online" ]]; then
     exit_error "Usage: $0 {start|stop|wait-online} [profile]"
 fi
diff --git a/src/netctl-auto b/src/netctl-auto
index ff017b0..f49273b 100755
--- a/src/netctl-auto
+++ b/src/netctl-auto
@@ -2,8 +2,9 @@
 # Contributed by: Sebastian Wicki <gandro at gmx.net>
 
 . /usr/lib/netctl/globals
-. "$SUBR_DIR/wpa"
+. "$SUBR_DIR/interface"
 . "$SUBR_DIR/rfkill"
+. "$SUBR_DIR/wpa"
 
 : ${ACTIOND:=wpa_actiond -p /run/wpa_supplicant}
 : ${ACTION_SCRIPT:=$SUBR_DIR/auto.action}
@@ -200,11 +201,8 @@ start() {
     local interface="$1"
     local pidfile="$STATE_DIR/wpa_actiond-$interface.pid"
 
-    if wpa_is_active "$interface"; then
-        exit_error "The interface ($interface) is already in use"
-    fi
-    if [[ -x "$PROFILE_DIR/interfaces/$interface" ]]; then
-        source "$PROFILE_DIR/interfaces/$interface"
+    if interface_is_up "$interface"; then
+        exit_error "The interface '$interface' is already up"
     fi
     if [[ $RFKill ]]; then
         rf_enable "$interface" "$RFKill" || return 1
@@ -240,6 +238,7 @@ start() {
             return 0
         fi
         wpa_stop "$interface"
+        bring_interface_down "$interface"
     fi
     return 1
 }
@@ -251,11 +250,8 @@ stop() {
     local pidfile="$STATE_DIR/wpa_actiond-$interface.pid"
 
     [[ -e "$pidfile" ]] && kill "$(< "$pidfile")"
-    if [[ -x "$PROFILE_DIR/interfaces/$interface" ]]; then
-        source "$PROFILE_DIR/interfaces/$interface"
-    fi
     timeout_wait 1 '! wpa_is_active "$interface"' || wpa_stop "$interface"
-    ip link set dev "$interface" down
+    bring_interface_down "$interface"
     [[ $RFKill ]] && rf_disable "$interface" "$RFKill"
     return 0
 }
@@ -286,6 +282,7 @@ case $# in
             exit_error "Use 'systemctl $1 netctl-auto@$2' to $1 netctl-auto."
         fi
         ensure_root "$(basename "$0")"
+        load_interface_config "$2"
         "$1" "$2";;
       *)
         exit_error "$(usage)";;
diff --git a/src/wifi-menu b/src/wifi-menu
index bafefc4..65fddd6 100755
--- a/src/wifi-menu
+++ b/src/wifi-menu
@@ -1,8 +1,9 @@
 #! /bin/bash
 
 . /usr/lib/netctl/globals
-. "$SUBR_DIR/wpa"
+. "$SUBR_DIR/interface"
 . "$SUBR_DIR/rfkill"
+. "$SUBR_DIR/wpa"
 
 
 usage() {
@@ -231,15 +232,12 @@ if [[ -z "$INTERFACE" ]]; then
     fi
     INTERFACE=${INTERFACE:15:-10}
     report_debug "Using interface '$INTERFACE'"
+elif ! is_interface "$INTERFACE"; then
+    exit_error "No such interface: $INTERFACE"
 fi
-if [[ -x "$PROFILE_DIR/interfaces/$INTERFACE" ]]; then
-    source "$PROFILE_DIR/interfaces/$INTERFACE"
-fi
+load_interface_config "$INTERFACE"
 
 cd /  # We do not want to spawn anything that can block unmounting
-if [[ ! -d "/sys/class/net/$INTERFACE" ]]; then
-    exit_error "No such interface: $INTERFACE"
-fi
 if [[ "$RFKill" && "$(rf_status "$INTERFACE" "$RFKill")" ]]; then
     if ! rf_enable "$INTERFACE" "$RFKill"; then
         exit_error "Could not unblock transmission on interface '$INTERFACE'"
-- 
2.12.0


More information about the arch-projects mailing list