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

Adrian Schmutzler mail at adrianschmutzler.de
Fr Apr 12 17:12:55 CEST 2019


Hallo Fabian,

aus aktuellem Anlass habe ich mir den Patch nochmal aus einem etwas anderen Blickwinkel angesehen.

> +	config_load network
> +	config_foreach remove_vlan switch_vlan
> +
> +	config_load gateway
> +	config_foreach add_vlan vlan

Ich habe erst länger rumüberlegt, ob man das irgendwie hinkriegt, ohne alles zu löschen und neu zu schreiben. Da man bei dir aber variabel neue VLANs definieren kann, geht es glaube ich nur so.

Hier besteht jetzt das Problem mit dem SWITCHDEV. Wenn man das nicht aus network.* auslesen möchte, gibt es mehrere Möglichkeiten:

1. Das Switch ist im uci noch da. Switch gibt es bei uns immer nur eines. D.h. auch ohne Namen kann ich mit network. at switch[0] arbeiten.
Leider kriegt man mit uci bei dieser Syntax den Namen der section nur mit viel Murks:
DEV=$(uci show network. at switch[0] | grep "=switch" |  sed "s#network.\([^=]*\)=switch.*#\1#")
Finde ich nicht so geil.
Allerdings brauchen wir den Namen des ethX gar nicht, denn:

2. Das Switch enthält den Namen des Hardware-Device (?) unter network. at switch[0].name (beim 1043v2 z.B. „ag71xx-mdio.0“).
Da uns keiner zwingt, die switch_vlans zu benennen, und wenn wir alle alten gelöscht haben (hierzu müsste man dann remove_vlan ändern), können wir dann
      swvlan=$(uci add network switch_vlan)
      uci set network.$swvlan.device="$(uci get network. at switch[0].name)"
      uci set network.$swvlan.vlan="$vlan"
      uci set network.$swvlan.ports="$CPUPORT $ports"
Und schon sind wir unabhängig von fff-network. Das ginge so btw auch mit der OpenWrt Standardconfig, die benennen übrigens ihre switch_vlan Einträge auch nicht.
Nebenbei ist der Code trotzdem schlank.

Mit dieser Lösung wären wir unabhängig von irgendwelchen spezifischen Informationen über das Gerät, solange es ein Switch hat.

Für den CPUPORT würde ich jetzt wie bereits an anderer Stelle erwähnt einfach das Skript aus meinem Patchset sourcen und fertig.

Würde dann wohl so aussehen:
+. /lib/functions/fff/cpuport
+
+configure() {
+	add_vlan() {
+		local vlan="$1"
+		local device="$(uci get network. at switch[0].name)"
+		local ports="$(uci get gateway.$vlan.ports)"
+
+		local name="$(uci add network 'switch_vlan')"
+		uci set network.$name.device="$device"
+		uci set network.$name.vlan="$vlan"
+		uci set network.$name.ports="$CPUPORT $ports"
+	}
+
+	remove_vlan() {
+		local name="$1"
+
+		# remove switch_vlan
+		uci del network.$name
+	}
+
+	config_load network
+	config_foreach remove_vlan switch_vlan
+
+	config_load gateway
+	config_foreach add_vlan vlan
+}

Ich finde es zwar durchaus blöd, erst alle switch_vlan platt zu machen, aber in meinen Augen ist die allgemeinere Lösung erstrebenswerter. Zudem wird das Skript in der Praxis ja sehr selten laufen, also ist das Löschen auch von der Speicherbelastung marginal.

Grüße

Adrian

-------------- 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/20190412/5c0f98b5/attachment.sig>


Mehr Informationen über die Mailingliste franken-dev