[Buildroot] [PATCH v4] set simple network setup via the system configuration submenu
Jeremy Rosen
jeremy.rosen at openwide.fr
Fri Nov 28 15:23:17 UTC 2014
ping ? (now that next is opened....)
----- Mail original -----
> 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 <jeremy.rosen at openwide.fr>
> ---
>
> 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
> ---
> 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 | 133
> +++++++++++++++++++++++++++++
> system/Config.in | 60 +++++++++++++
> system/skeleton/etc/network/interfaces | 4 -
> system/system.mk | 5 ++
> 4 files changed, 198 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..91ff9ce
> --- /dev/null
> +++ b/support/scripts/generate-network-config.sh
> @@ -0,0 +1,133 @@
> +#!/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) let nbits+=8;;
> + 254) let nbits+=7;;
> + 252) let nbits+=6;;
> + 248) let nbits+=5;;
> + 240) let nbits+=4;;
> + 224) let nbits+=3;;
> + 192) let nbits+=2;;
> + 128) let nbits+=1;;
> + 0);;
> + 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 2465f79..3683edf 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
> --
> 2.1.1
>
>
More information about the buildroot
mailing list