[PATCH v2 3/3] gateway.d: Add scripts for network configuration

Adrian Schmutzler mail at adrianschmutzler.de
Mi Mär 20 16:25:31 CET 2019


Hallo,

auch hier: siehe unten:

> -----Original Message-----
> From: franken-dev [mailto:franken-dev-bounces at freifunk.net] On Behalf Of
> Fabian Bläse
> Sent: Montag, 18. März 2019 22:54
> To: franken-dev at freifunk.net
> Subject: [PATCH v2 3/3] gateway.d: Add scripts for network configuration
> 
> This adds scripts to configure vlan and client network.
> 
> This also adds sysctl settings to enable forwarding.
> 
> Signed-off-by: Fabian Bläse <fabian at blaese.de>
> ---
>  .../fff-gateway/files/etc/gateway.d/10-vlan   | 39 +++++++++++
>  .../files/etc/gateway.d/20-network-client     | 66 +++++++++++++++++++
>  .../files/etc/sysctl.d/60-fff-gateway.conf    |  5 ++
>  3 files changed, 110 insertions(+)
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/gateway.d/20-
> network-client
>  create mode 100644 src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-
> gateway.conf
> 
> diff --git a/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> new file mode 100644
> index 0000000..a8d64de
> --- /dev/null
> +++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/10-vlan
> @@ -0,0 +1,39 @@
> +configure() {
> +	add_vlan() {
> +		local vlan="$1"
> +		local ports=$(uci get gateway.$vlan.ports)
> +		local name="$SWITCHDEV"_$vlan
> +
> +		uci set network.$name='switch_vlan'
> +		uci set network.$name.device="$(uci get
> network.$SWITCHDEV.name)"
> +		uci set network.$name.vlan="$vlan"
> +		uci set network.$name.ports="$CPUPORT $ports"
> +	}
> +
> +	remove_vlan() {
> +		local name="$1"
> +
> +		local switchdev=$(echo $name | cut -d_ -f1)
> +		local vlan=$(echo $name | cut -d_ -f2)
> +
> +		# only remove vlans not present in gateway config
> +		if ! uci -q get gateway.$vlan > /dev/null; then
> +			# remove switch_vlan
> +			uci del network.$name
> +		fi
> +	}
> +
> +	config_load network
> +	config_foreach remove_vlan switch_vlan
> +
> +	config_load gateway
> +	config_foreach add_vlan vlan
> +}
> +
> +apply() {
> +	uci commit network
> +}
> +
> +revert() {
> +	uci revert network
> +}
> diff --git a/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
> b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
> new file mode 100644
> index 0000000..330be54
> --- /dev/null
> +++ b/src/packages/fff/fff-gateway/files/etc/gateway.d/20-network-client
> @@ -0,0 +1,66 @@
> +configure() {
> +	# ipaddr
> +	#remove old ipaddr
> +	uci -q del network.mesh.ipaddr
> +	#set new ipaddr
> +	if ipaddr=$(uci -q get gateway. at client[0].ipaddr); then
> +		for ip in $ipaddr; do
> +			uci add_list network.mesh.ipaddr=$ip
> +		done
> +	else
> +		echo "WARNING: No client ipaddr set!"
> +	fi

Ich würde hier lieber ip4addr statt ipaddr lesen. Mindestens in der warning (ggf. auch direkt "IPv4 address"), man könnte aber auch überlegen, ob man es "jetzt noch" generell macht: Man könnte z.B. auch in der gateway-config ip4addr als option verwenden. Hat dann den Nachteil, dass es nicht konsistent mit der network-config ist, wäre aber ggf. einfacher für den Nutzer.


> +	#put interface routes from set addresses into fff table
> +	uci set network.mesh.ip4table='fff'
> +
> +	# ip6addr
> +	#remove old ip6addr
> +	for ip in $(uci get network.mesh.ip6addr); do
> +		if echo "$ip" | grep -v -e "fdff:" -e "fe80::1/64" > /dev/null; then

Wo wird in der GW-Firmware die fe80::1 denn gesetzt? Bei V2 ist es in der configurehood:
https://github.com/adrianschmutzler/fff-firmware/blob/gwmod/src/packages/fff/fff-hoods/files/usr/sbin/configurehood#L57

> +			uci del_list network.mesh.ip6addr="$ip"
> +		fi
> +	done
> +	#set new ip6addr
> +	if ip6addr=$(uci -q get gateway. at client[0].ip6addr); then
> +		for ip in $ip6addr; do
> +			uci add_list network.mesh.ip6addr=$ip
> +		done
> +	else
> +		echo "WARNING: No client ip6addr set!"
> +	fi
> +	#put interface routes from set addresses into fff table
> +	uci set network.mesh.ip6table='fff'
> +
> +	# dhcp
> +	uci -q del dhcp.mesh.start
> +	uci -q del dhcp.mesh.limit
> +	if dhcp_start=$(uci -q get gateway. at client[0].dhcp_start); then
> +		uci set dhcp.mesh=dhcp
> +		uci set dhcp.mesh.interface=mesh
> +		uci set dhcp.mesh.start=$dhcp_start
> +		uci set dhcp.mesh.limit=$(uci -q get
> gateway. at client[0].dhcp_limit)

Im Prinzip muss man das Limit ja nicht setzen, dann würde der uci get ein Fehler werfen, der vom "-q" wiederum unterdrückt wird.

Das funktioniert zwar, besser verständlich wäre meines Erachtens aber so:

	if dhcp_start=$(uci -q get gateway. at client[0].dhcp_start); then
		uci set dhcp.mesh=dhcp
		uci set dhcp.mesh.interface=mesh
		uci set dhcp.mesh.start=$dhcp_start
		dhcp_limit=$(uci -q get gateway. at client[0].dhcp_limit) && uci set dhcp.mesh.limit=$dhcp_limit
	else
		echo "WARNING: No DHCP range start set!"
	fi

> +	else
> +		echo "WARNING: No DHCP range start and/or limit set!"
> +	fi
> +
> +	# set interface
> +	#remove all eth interfaces
> +	ifaces=$(uci get network.mesh.ifname | sed -e "s/ *eth\d\.\d//g" -e "s/
> *eth\d//g" -e "s/^ //")
> +	if vlan=$(uci -q get gateway. at client[0].vlan); then
> +		uci set network.mesh.ifname="${SWITCHDEV}.$vlan $ifaces"
> +	elif iface=$(uci -q get gateway. at client[0].iface); then
> +		uci set network.mesh.ifname="$iface $ifaces"
> +	else
> +		echo "WARNING: No Interface for client specified"

"interface" klein schreiben.

Wie schon zuvor festgestellt gefällt mir der Ansatz sehr gut, zumal ich das ja ohnehin in Funktionen zerstückeln wollte.

Beste Grüße

Adrian

> +	fi
> +}
> +
> +apply() {
> +	uci commit network
> +	uci commit dhcp
> +}
> +
> +revert() {
> +	uci revert network
> +	uci revert dhcp
> +}
> diff --git a/src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-gateway.conf
> b/src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-gateway.conf
> new file mode 100644
> index 0000000..62bda1b
> --- /dev/null
> +++ b/src/packages/fff/fff-gateway/files/etc/sysctl.d/60-fff-gateway.conf
> @@ -0,0 +1,5 @@
> +# Enable forwarding
> +net.ipv4.conf.all.forwarding=1
> +net.ipv4.ip_forward=1
> +net.ipv6.conf.all.forwarding=1
> +net.ipv6.conf.default.forwarding=1
> --
> 2.21.0
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : nicht verfügbar
Dateityp    : application/pgp-signature
Dateigröße  : 834 bytes
Beschreibung: nicht verfügbar
URL         : <https://{'listname': 'franken-dev-freifunk.net', 'hostname': 'lists.freifunk.net'}/pipermail/franken-dev-freifunk.net/attachments/20190320/99b4d5ff/attachment.sig>


Mehr Informationen über die Mailingliste franken-dev