From patchwork Tue Dec 9 08:48:44 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jeremy Rosen X-Patchwork-Id: 418977 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from whitealder.osuosl.org (whitealder.osuosl.org [140.211.166.138]) by ozlabs.org (Postfix) with ESMTP id 299931400EA for ; Tue, 9 Dec 2014 19:50:51 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id 1118391944; Tue, 9 Dec 2014 08:50:50 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nGQewP5cgbc9; Tue, 9 Dec 2014 08:50:47 +0000 (UTC) Received: from ash.osuosl.org (ash.osuosl.org [140.211.166.34]) by whitealder.osuosl.org (Postfix) with ESMTP id A84A991924; Tue, 9 Dec 2014 08:50:47 +0000 (UTC) X-Original-To: buildroot@lists.busybox.net Delivered-To: buildroot@osuosl.org Received: from whitealder.osuosl.org (whitealder.osuosl.org [140.211.166.138]) by ash.osuosl.org (Postfix) with ESMTP id C2FC31C1FC1 for ; Tue, 9 Dec 2014 08:50:46 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by whitealder.osuosl.org (Postfix) with ESMTP id BD075917A5 for ; Tue, 9 Dec 2014 08:50:46 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from whitealder.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id K2TJzxCb5ypK for ; Tue, 9 Dec 2014 08:50:44 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mail-wi0-f174.google.com (mail-wi0-f174.google.com [209.85.212.174]) by whitealder.osuosl.org (Postfix) with ESMTPS id AEAF891776 for ; Tue, 9 Dec 2014 08:50:40 +0000 (UTC) Received: by mail-wi0-f174.google.com with SMTP id h11so7076615wiw.13 for ; Tue, 09 Dec 2014 00:50:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:mime-version:content-type :content-transfer-encoding; bh=fzg1NCJt3HnLYavOcPUgBvElQiKfsKtu3GswaX6brf4=; b=DJEbWvMj9Ut2Gs8VEmUrhIQ1K0zYJxE5zRRYYZGtwLX8eZya2ByW7IGw/k7h3uCYu3 +8Rw36w2fWmvi4oE7/gK2gaJ10f08Vj4DoAXlUeTQGBq+irksUP8wPTmwuMq8C0bf9VD sqR/X3FW1NPQHBfw0GWxKW9xf0JxNFMWP+gtzzZPhkAhIi/75REaNt0Hp0P8AQwFjV82 mlXAGqbDr865B0OxQ9457zoEBpQM5Y6YtYFiXn+SfXsNpOLzijUtJY+g3crPzp0EjGJ4 +k3fensXXBKM8LXlD2iELQkRYugXLaG7kfyr55TI6cJrnGOVx5tSx3fToqskFmPed8cJ +jvA== X-Received: by 10.194.121.167 with SMTP id ll7mr2916625wjb.26.1418115038952; Tue, 09 Dec 2014 00:50:38 -0800 (PST) Received: from pcrosen.daviel.openwide.fr. ([193.56.60.161]) by mx.google.com with ESMTPSA id et4sm826553wjd.15.2014.12.09.00.50.37 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 09 Dec 2014 00:50:38 -0800 (PST) From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Rosen?= To: buildroot@busybox.net Date: Tue, 9 Dec 2014 09:48:44 +0100 Message-Id: <1418114924-18826-1-git-send-email-jeremy.rosen@openwide.fr> X-Mailer: git-send-email 2.1.3 MIME-Version: 1.0 Subject: [Buildroot] [PATCH v5 1/1] set simple network setup via the system configuration submenu X-BeenThere: buildroot@busybox.net X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: Discussion and development of buildroot List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: buildroot-bounces@busybox.net Sender: "buildroot" This patch allows the setup of simple /etc/network/interfaces (or /etc/systemd/network/80-buildroot.network if networkd is enabled) via the configuration menus instead of using an overlay * supports disabling the interface * supports manual ipv4 configuration * supports dhcp configuration Signed-off-by: Jérémy Rosen --- This patch is here to avoid having to do an overlay for the most common cases (ipv4 with fixed IP or DHCP) This is reduced to the bare minimum to cover the most common case. Anything more complex can be done by using overlays instead. I have not added the option to (de)activate persistant naming when networkd is enabled because it logically belongs to the networkd package and not to the simple network configuration --- v5: * remove use of "let" which is not supported by all shells v4: * correctly create /etc/systemd/networkd * rework logic to simplify a bit v3 : * rename the script to a more generic name * reorganized script to separate param verification from generation * quoted params properly to protect against faulty params * removed /etc/network/interfaces from skeleton * reorganized options in configuration menu * added networkd configuration support v2 : * moved to TARGET_FINALIZE * removed support for lo. It should always be on. * reworked default parameters --- support/scripts/generate-network-config.sh | 132 +++++++++++++++++++++++++++++ system/Config.in | 60 +++++++++++++ system/skeleton/etc/network/interfaces | 4 - system/system.mk | 5 ++ 4 files changed, 197 insertions(+), 4 deletions(-) create mode 100755 support/scripts/generate-network-config.sh delete mode 100644 system/skeleton/etc/network/interfaces diff --git a/support/scripts/generate-network-config.sh b/support/scripts/generate-network-config.sh new file mode 100755 index 0000000..31156c4 --- /dev/null +++ b/support/scripts/generate-network-config.sh @@ -0,0 +1,132 @@ +#!/bin/sh + +#extract our parameters from the config file +# see comment in support/scripts/mkusers at to why we can't simply source +for PARAM in \ + BR2_PACKAGE_SYSTEMD_NETWORKD \ + BR2_SIMPLE_NETWORK_NONE \ + BR2_SIMPLE_NETWORK_IPV4_DHCP \ + BR2_SIMPLE_NETWORK_IPV4_MANUAL \ + ; do +TMP=$(sed -r -e "/^$PARAM=(.*)$/!d;" -e 's//\1/;' $BR2_CONFIG) +export $PARAM=$TMP +done + +for PARAM in \ + BR2_SIMPLE_NETWORK_NAME \ + BR2_SIMPLE_NETWORK_IPV4_ADDRESS \ + BR2_SIMPLE_NETWORK_IPV4_NETMASK \ + BR2_SIMPLE_NETWORK_IPV4_BROADCAST \ + BR2_SIMPLE_NETWORK_IPV4_GATEWAY \ + ; do +TMP=$(sed -r -e "/^$PARAM=\"(.*)\"$/!d;" -e 's//\1/;' $BR2_CONFIG) +export $PARAM="$TMP" +done + +check_configuration () +{ + if [ -z "$BR2_SIMPLE_NETWORK_NONE" ] ; then + if [ -z "$BR2_SIMPLE_NETWORK_NAME" ] ; then + echo ERROR no name specified for first network interface + exit 1 + fi + if [ "$BR2_SIMPLE_NETWORK_IPV4_MANUAL" ] ; then + if [ -z "$BR2_SIMPLE_NETWORK_IPV4_ADDRESS" ] ; then + echo ERROR BR2_SIMPLE_NETWORK_IPV4_ADDRESS not set 1>&2 + exit 1 + fi + if [ -z "$BR2_SIMPLE_NETWORK_IPV4_NETMASK" ] ; then + echo ERROR BR2_SIMPLE_NETWORK_IPV4_NETMASK not set 1>&2 + exit 1 + fi + OLDIFS="$IFS"; IFS=. + for dec in $BR2_SIMPLE_NETWORK_IPV4_NETMASK ; do + case $dec in + 255 | 254 | 252 |248 | 240 |224 | 192 | 128 | 0 );; + *) echo "Error: $BR2_SIMPLE_NETWORK_IPV4_NETMASK is not a correct NETMASK" 1>&2; exit 1 ;; + esac + done + IFS="$OLDIFS" + fi + fi +} + +do_generate_interfaces () +{ + echo "# interface file auto-generated by buildroot" + echo + echo "auto lo" + echo "iface lo inet loopback" + echo + + if [ -z "$BR2_SIMPLE_NETWORK_NONE" ] ; then + echo "auto $BR2_SIMPLE_NETWORK_NAME" + if [ "$BR2_SIMPLE_NETWORK_IPV4_DHCP" ] ; then + echo "iface $BR2_SIMPLE_NETWORK_NAME inet dhcp" + elif [ "$BR2_SIMPLE_NETWORK_IPV4_MANUAL" ] ; then + echo "iface $BR2_SIMPLE_NETWORK_NAME inet static" + echo " address $BR2_SIMPLE_NETWORK_IPV4_ADDRESS" + echo " netmask $BR2_SIMPLE_NETWORK_IPV4_NETMASK" + + if [ "$BR2_SIMPLE_NETWORK_IPV4_BROADCAST" ] ; then + echo " broadcast $BR2_SIMPLE_NETWORK_IPV4_BROADCAST" + fi + if [ "$BR2_SIMPLE_NETWORK_IPV4_GATEWAY" ] ; then + echo " gateway $BR2_SIMPLE_NETWORK_IPV4_GATEWAY" + fi + fi + fi +} + +do_generate_network_service () +{ + if [ "$BR2_SIMPLE_NETWORK_NONE" ] ; then + return + fi + echo "[Match]" + echo "Name=$BR2_SIMPLE_NETWORK_NAME" + echo + echo "[Network]" + echo "Description=buildroot-configured interface" + if [ $BR2_SIMPLE_NETWORK_IPV4_DHCP ] ; then + echo "DHCP=v4" + elif [ $BR2_SIMPLE_NETWORK_IPV4_MANUAL ] && \ + [ "$BR2_SIMPLE_NETWORK_IPV4_ADDRESS" != "0.0.0.0" ] ; then + nbits=0 + OLDIFS="$IFS"; IFS=. + for dec in $BR2_SIMPLE_NETWORK_IPV4_NETMASK ; do + case $dec in + 255) nbits = $((nbits+=8));; + 254) nbits = $((nbits+=7));; + 252) nbits = $((nbits+=6));; + 248) nbits = $((nbits+=5));; + 240) nbits = $((nbits+=4));; + 224) nbits = $((nbits+=3));; + 192) nbits = $((nbits+=2));; + 128) nbits = $((nbits+=1));; + esac + done + IFS="$OLDIFS" + + if [ "$BR2_SIMPLE_NETWORK_IPV4_GATEWAY" ] ; then + echo "Gateway=$BR2_SIMPLE_NETWORK_IPV4_GATEWAY" + echo + fi + echo "[Address]" + echo "Address=$BR2_SIMPLE_NETWORK_IPV4_ADDRESS/$nbits" + if [ "$BR2_SIMPLE_NETWORK_IPV4_BROADCAST" ] ; then + echo "Broadcast=$BR2_SIMPLE_NETWORK_IPV4_BROADCAST" + fi + fi +} + +check_configuration +mkdir -p $TARGET_DIR/etc/network/ +rm -f -- $TARGET_DIR/etc/systemd/network/80-buildroot.network +if [ "$BR2_PACKAGE_SYSTEMD_NETWORKD" ] ; then + echo > $TARGET_DIR/etc/network/interfaces + mkdir -p $TARGET_DIR/etc/systemd/network/ + do_generate_network_service > $TARGET_DIR/etc/systemd/network/80-buildroot.network +else + do_generate_interfaces > $TARGET_DIR/etc/network/interfaces +fi diff --git a/system/Config.in b/system/Config.in index 39f27c7..46f2014 100644 --- a/system/Config.in +++ b/system/Config.in @@ -324,6 +324,66 @@ config BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW endif # BR2_ROOTFS_SKELETON_DEFAULT +choice + prompt 'Simple network configuration' + default BR2_SIMPLE_NETWORK_NONE + help + buildroot will create a simple network configuration for a network + interface. This will generate the corresponding lines in + /etc/network/interfaces which is used by ifupdown. + + The simple network configuration only supports a single network + interface using a static or DHCP-allocated IPv4 address. If you + need something more complicate, create your own configuration file + in the BR2_ROOTFS_OVERLAY. + +config BR2_SIMPLE_NETWORK_NONE + bool "No configured network interface" + help + Do not configure the network interface, only configure the + loopback device + +config BR2_SIMPLE_NETWORK_IPV4_DHCP + bool "IPv4 with DHCP" + help + Use DHCP to configure this interface using the IPv4 protocol + +config BR2_SIMPLE_NETWORK_IPV4_MANUAL + bool "IPv4 with static IP address" + help + Configure IPv4 by specifying each parameter separately + +endchoice + +if !BR2_SIMPLE_NETWORK_NONE + +config BR2_SIMPLE_NETWORK_NAME + string "name of the physical network interface" + default "eth0" + help + The name used to recognise the network interface as reported + by the kernel + +if BR2_SIMPLE_NETWORK_IPV4_MANUAL +config BR2_SIMPLE_NETWORK_IPV4_ADDRESS + string "IP Address of the network interface" + default "0.0.0.0" + +config BR2_SIMPLE_NETWORK_IPV4_NETMASK + string "Netmask of the network interface" + default "255.255.255.255" + +config BR2_SIMPLE_NETWORK_IPV4_BROADCAST + string "Broadcast Address of the network interface" + +config BR2_SIMPLE_NETWORK_IPV4_GATEWAY + string "Address of the gateway for the network interface" + +endif # BR2_SIMPLE_NETWORK_IPV4_MANUAL + +endif # !BR2_SIMPLE_NETWORK_NONE + + config BR2_TARGET_TZ_INFO bool "Install timezone info" # No timezone for musl; only for uClibc or (e)glibc. diff --git a/system/skeleton/etc/network/interfaces b/system/skeleton/etc/network/interfaces deleted file mode 100644 index 218b82c..0000000 --- a/system/skeleton/etc/network/interfaces +++ /dev/null @@ -1,4 +0,0 @@ -# Configure Loopback -auto lo -iface lo inet loopback - diff --git a/system/system.mk b/system/system.mk index e4a3160..bb933f6 100644 --- a/system/system.mk +++ b/system/system.mk @@ -38,6 +38,11 @@ ifneq ($(TARGET_GENERIC_ROOT_PASSWD),) TARGETS += host-mkpasswd endif +define SIMPLE_NETWORK + $(TOPDIR)/support/scripts/generate-network-config.sh $(TARGET_DIR) +endef +TARGET_FINALIZE_HOOKS += SIMPLE_NETWORK + ifeq ($(BR2_ROOTFS_SKELETON_DEFAULT),y) define SYSTEM_ROOT_PASSWD