ubuntuusers.de

Dispacher-Skript

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 22.04 (Jammy Jellyfish)
Antworten |

CarstenHa

Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 142

Hallo liebes Forum,

ich würde gerne mit einem Dispacher-Skript quasi eine Weiche für eth0 einbauen. Wenn Router erkannt wird, dann baue normale LAN-Verbindung auf. Wenn nicht, dann Link-local Verbindung. Dazu habe ich folgendes Skript im Ordner

1
/etc/NetworkManager/dispatcher.d/pre-up.d/

erstellt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/bash

INTERFACE=$1
ACTION=$2

if [ "$INTERFACE" == "eth0" ] && [ "$ACTION" == "pre-up" ]; then

   # Router-Ping
   ping -c 1 192.168.178.1 &>/dev/null
   if [ $? -eq 0 ]; then
    nmcli con up mylan
   else
    # Link-Local-Verbindung
    nmcli con up myadhoc
   fi
 
fi

root-Rechte (755) sind gesetzt. WLAN-Verbindung (für den Ping) ist aktiv. Leider funktioniert das nicht. Seht ihr den Fehler?

Viele Grüße

Carsten

weholei

Anmeldungsdatum:
7. Februar 2019

Beiträge: 857

Wohnort: Mittelfranken

entschuldigung, falscher Beitrag,

wollte lastmod "liken"

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13212

Ohne mich jetzt ins Detail zu vertiefen, wäre meine Vermutung dass Du ein logisches Problem hast: meines Wissens benötigt der ping ein vollständig konfiguriertes Interface, damit seine ICMP-Pakete geroutet werden können. Aber das Interface ist ja noch nicht oben. Vermutlich musst Du das Skript beim Event "up" laufen lassen.

Übrigens: Die String-Vergleiche in Zeile 6 sollten nur ein Gleichheitszeichen haben. Man kann auch noch vereinfachen, indem man den ping direkt als Bedingung ausführt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/bin/sh

INTERFACE=$1
ACTION=$2

if [ "$INTERFACE" = "eth0" -a "$ACTION" = "pre-up" ]; then

  # Router-Ping
  if ping -c 1 192.168.178.1 >/dev/null 2>&1; then
    nmcli con up mylan
  else
    # Link-Local-Verbindung
    nmcli con up myadhoc
  fi
fi

CarstenHa

(Themenstarter)
Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 142

weholei schrieb:

entschuldigung, falscher Beitrag,

wollte lastmod "liken"

👍 😀

CarstenHa

(Themenstarter)
Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 142

rklm schrieb:

Ohne mich jetzt ins Detail zu vertiefen, wäre meine Vermutung dass Du ein logisches Problem hast: meines Wissens benötigt der ping ein vollständig konfiguriertes Interface, damit seine ICMP-Pakete geroutet werden können. Aber das Interface ist ja noch nicht oben. Vermutlich musst Du das Skript beim Event "up" laufen lassen.

Ich dachte, das das Ping eventuell über die aktive WLAN-Schnittstelle geht, wenn eth0 noch nicht oben ist. Geht das Ping in dem Skript denn ausschließlich über eth0?

Übrigens: Die String-Vergleiche in Zeile 6 sollten nur ein Gleichheitszeichen haben.

Warum soll man denn dafür die Dash nutzen? Ich hatte darüber auch schon in dem Wiki-Artikel gelesen. Welche Gründe sprechen denn gegen die Bash?

Gruß

Carsten

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9743

Wohnort: Münster

Siehe Artikel NetworkManager/Dispatcher:

pre-up funktioniert nur unter unter Beachtung spezieller Bedingungen.

Selbst wenn Dein Skript wie beabsichtigt aufgerufen wird, wäre es eine Endlosschleife, denn ein Befehl wie

nmcli connection up mylan 

ruft es ja erneut auf.

Wie man einen wie von Dir gewünschten Schalter baut, zeigt das 4. Beispiel im Artikel, den Du natürlich anpassen musst.

Beachte auch: Nach Aktivierung einer Ethernet-Schnittstelle zum Router wird die WLAN-Schnittstelle zum selben Route deaktiviert.

CarstenHa

(Themenstarter)
Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 142

kB schrieb:

Selbst wenn Dein Skript wie beabsichtigt aufgerufen wird, wäre es eine Endlosschleife, denn ein Befehl wie

nmcli connection up mylan 

ruft es ja erneut auf.

Hmm, ich dachte, ich würde eine Dispacher-Lösung finden aber wahrscheinlich ist in meinem Fall eine entsprechende udev-Regel doch der bessere Weg. Ich werde mal ein bisschen rumprobieren ...

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13212

CarstenHa schrieb:

rklm schrieb:

Übrigens: Die String-Vergleiche in Zeile 6 sollten nur ein Gleichheitszeichen haben.

Warum soll man denn dafür die Dash nutzen? Ich hatte darüber auch schon in dem Wiki-Artikel gelesen. Welche Gründe sprechen denn gegen die Bash?

Mehr Overhead. Und die sh implementiert den POSIX-Standard - Skripte sind also tendenziell leichter zu portieren.

Übrigens ist mit einfachen eckigen Klammern auch in der bash ein einzelnes Gleichheitszeichen der richtige Operator (siehe die Ausgabe von help test in einer bash). Die bash meckert einfach nur nicht, wenn man zwei verwendet.

CarstenHa

(Themenstarter)
Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 142

Ich habe jetzt eine super Lösung gefunden. Hintergrund ist, das ich eine Fallback-Option haben will, wenn der Raspi mal nicht im Heimnetz angeschlossen ist. Dann soll eth0 jetzt die Link-local-Funktion von eth1 "übernehmen". eth1 ist ein Netzwerkstick der nur im Heimnetz angeschlossen ist.

In meine crontab habe ich eingetragen:

1
@reboot ~/.local/bin/ethswitch

ethswitch:

1
2
3
4
5
6
7
#!/bin/bash

while [ "$(nmcli networking connectivity)" != "full" ]; do
 sleep 10
done

[ -z "$(nmcli d | grep '^eth1')" ] && sudo nmcli con up myadhoc_eth0

Jetzt prüft er einfach bei jedem Booten ob der Stick angeschlossen ist und wenn nicht, aktiviert er die link-local-Verbindung für eth0. Funktioniert prima.

Vielen Dank an Alle 😀

Gruß

Carsten

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13212

CarstenHa schrieb:

Jetzt prüft er einfach bei jedem Booten ob der Stick angeschlossen ist und wenn nicht, aktiviert er die link-local-Verbindung für eth0. Funktioniert prima.

Ein schönes Beispiel dafür, dass die Lösung ganz anders aussehen kann, als man am Anfang dachte.

CarstenHa

(Themenstarter)
Avatar von CarstenHa

Anmeldungsdatum:
1. Mai 2020

Beiträge: 142

rklm schrieb:

Ein schönes Beispiel dafür, dass die Lösung ganz anders aussehen kann, als man am Anfang dachte.

In der Tat. Nachdem man so ziemlich alles an Möglichkeiten abgeklappert hat ... 🤣 Und dabei hatte ich das schon mal ausprobiert und dachte, ob ich nicht vielleicht noch eine andere Lösung finde (und dabei bin ich dann in der Schleife hängengeblieben). Gut das es Euch gibt, die einen da wieder raus holen 👍

Antworten |