From patchwork Fri Mar 3 18:24:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Emil Velikov via arch-projects X-Patchwork-Id: 55 Return-Path: Delivered-To: patchwork@archlinux.org Received: from nymeria.archlinux.org by nymeria.archlinux.org (Dovecot) with LMTP id +eLUHfG0uVjsJAAAtiB/HQ for ; Fri, 03 Mar 2017 19:24:49 +0100 Received: from nymeria.archlinux.org (localhost.localdomain [127.0.0.1]) by nymeria.archlinux.org (Postfix) with ESMTP id 690D640924; Fri, 3 Mar 2017 19:24:48 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on nymeria.archlinux.org X-Spam-Level: X-Spam-Status: No, score=-4.3 required=2.5 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,RCVD_IN_DNSWL_MED shortcircuit=no autolearn=unavailable autolearn_force=no version=3.4.1 Received: from luna.archlinux.org (luna.archlinux.org [IPv6:2a01:4f8:160:3033::2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by nymeria.archlinux.org (Postfix) with ESMTPS; Fri, 3 Mar 2017 19:24:48 +0100 (CET) Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id 2467E2CCCE; Fri, 3 Mar 2017 18:24:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=archlinux.org; s=luna2; t=1488565488; bh=mv9yr6zfIfLaoOCLQuCDdoJitVUgjuVNdhO148ARYRY=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc; b=Ek4nKh+bMBULSgQYVdCY0+kBES8qCXxkMoi9AT8vHCelWHB9ak+qyF6mSAjowlEtp PC3RtkzuYkvW8t7XWlfo7UjjvXQF1jIRFj3D+rBV1ExfqF522YR8j8R3EL+MbN1VDK CRWNPNWYyarwWQAMPvwpAaVuCQPL4DAL8tdMNJb5JL7CXcY8pMs0JeyZe4b4EndpwR SihyJh1sYwzgaPsAFaUxAXgtn6hl0WIoMz8iUiXVLIARyiLvYvAk399+FwOIrUarh+ KhSAwq5kalcrq0MfyZ/Hl7RzLHCEiaF7CGbL9xCPmsvwLlNORjZOtY/VtwyrYF9n0l m1Qu5tBGHcsfHwc8zIeL1uaugZKyxmnWBPgGEJcE7tCxSWLLLzttJpaPaCCxqblLZZ 8hKzZLqxvIYYCH9wKjfK25CmHTr/JF5tnkhmwC2/jJX7QPLJ4muj+BEw8RKQMLgeFx DcNn0vtQ9P6G2Z2qG0T2vBJJAhAHYi5OaXxXTRMGL8go/Wa2qoEw7yhMqvNJ5LEO0l 9JpEwFAeGJA8Hpw+Is/8uR+SszRed+uDBasEKJ256joR34pbm7toazYXtPutKXHgSZ mmxV//CZ0ZpOm1NR8m0MN1alkvtjbkcIx9AELjbxX5N/7+awNbjglwLb6ckLvAW/rg CtSUhpDtazRAg5Keoxvv6ONM= Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id 7E8C32CCBD for ; Fri, 3 Mar 2017 18:24:46 +0000 (UTC) Received: from nymeria.archlinux.org (nymeria.archlinux.org [IPv6:2a00:1828:2000:547::2]) by luna.archlinux.org (Postfix) with ESMTPS for ; Fri, 3 Mar 2017 18:24:46 +0000 (UTC) Received: from nymeria.archlinux.org (localhost.localdomain [127.0.0.1]) by nymeria.archlinux.org (Postfix) with ESMTP id 002A74091E for ; Fri, 3 Mar 2017 19:24:45 +0100 (CET) Received: from mail-wm0-x242.google.com (mail-wm0-x242.google.com [IPv6:2a00:1450:400c:c09::242]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by nymeria.archlinux.org (Postfix) with ESMTPS for ; Fri, 3 Mar 2017 19:24:44 +0100 (CET) Received: by mail-wm0-x242.google.com with SMTP id m70so4375462wma.1 for ; Fri, 03 Mar 2017 10:24:44 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-disposition:user-agent; bh=25ZEFAVO3VEThdZusgfIh6A2MJc0jkostKLZKzVP/3U=; b=UkNTDo8TJrLSk+Xz0ecj2jKwyRP/RE2j+0nugHwt+I68Rp231/y72BN4FwV/lELteo BNN2w2xi51r/AUDYlx+g9dsVXarvrYwNpVu2hgXWN70vsPfYmARXHIpA5zYe3rQ68i4z w7uus8H9RGw+XCgwICcDPaZ6T9GWnYSqKyr7mAZvm6WLqeKtVF1tiuRcWNJAfw3WX7VZ lL529C+JlQ4IJvbyFs2TvP0sxLIEvk1FfDXsv6Y65pATq/nlTKwmcFgrz87Q3kb8zJz/ qhN6Mz+vLqCPQgqBBriEpXfIjhewi/JSTPFXhFz36mMv0EQ1H35NgpcFeAwra5ZZqbDb /RMQ== X-Gm-Message-State: AMke39mqDu5qZ5q/TDjOgAfYcpbnHVYwOvBy3V2v11J13z+loMz64MVcDwlA8Ad8EbpbSA== X-Received: by 10.28.29.138 with SMTP id d132mr4075050wmd.40.1488565483917; Fri, 03 Mar 2017 10:24:43 -0800 (PST) Received: from Mindship-03 (ip5653397a.direct-adsl.nl. [86.83.57.122]) by smtp.gmail.com with ESMTPSA id m139sm7029307wma.2.2017.03.03.10.24.43 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Mar 2017 10:24:43 -0800 (PST) Date: Fri, 3 Mar 2017 19:24:37 +0100 To: arch-projects@archlinux.org Message-ID: <20170303182437.GA5498@Mindship-03> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.8.0 (2017-02-23) Subject: [arch-projects] [netctl][PATCH 3/3] Factor out network interface utilities X-BeenThere: arch-projects@archlinux.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Arch Linux projects development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Jouke Witteveen via arch-projects Reply-To: Arch Linux projects development discussion Cc: Jouke Witteveen Errors-To: arch-projects-bounces@archlinux.org Sender: "arch-projects" X-UID: 128 Status: X-Keywords: Content-Length: 10057 --- 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/ Here, 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/ Here, 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 . /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'"