[fli4l] Hilfe für Skript-?==?utf-8?Q?Logik

K. Dreier usenetforum at gmx.net
Di Feb 21 09:52:09 CET 2017


Hallo,

ich brauch mal eure Hilfe, da ich eventuell einen Denkfehler habe.

Das folgende ist Teile eines Skripts, welches mir je nach Zustand von im
Netzwerk (nicht) verbundenen Geräten eine WLAN-Steckdose ein- oder
ausschaltet.
Das funktioniert gut - bis auf die Tatsache, daß sich die
WLAN-Steckdose mitten in der Nacht (willkürlich) einschaltet, obwohl
alle Geräte ("device1" oder "device2") offline sind. :-o Doofe Sache,
da das so eingeschaltete Gerät Geräusche von sich gibt... Auch
schaltet es sich unmotiviert mal ab, obwohl Geräte online sind.

Das Problem ist also wohl der Teil, in dem der Zustand von device1 oder
device2 abgefragt und gesetzt wird (alle Variablen sind an anderer
Stelle des Skripts definiert, wo relevant):

# check for devices and set variable according to their status
exists=$(grep -c -i "100% packet loss" "/data/ping_${device1}.txt")
# either ping unsuccessful and /device1.online does not exist:
if [ $exists -gt 0 ] && [ ! -e /var/run/arping.stat/$device1.online ] ;
then # wenn auch nur eine der beiden Bedingungen _nicht_ zutrifft, ist
das Gerät online, davon ausgehend, daß "/device1.online" wirklich nur
existiert, wenn das Gerät verbunden ist
	device1_online="false"
elif [ $exists = 0 ] || [ -e /var/run/arping.stat/$device1.online ] ;
then
	device1_online="true"
fi

Ich habe im Rahmen von all dem gemerkt, daß die Info in /arping.stat
sehr unzuverlässig ist. So verschwindet "device1.online" immer wieder
(sieht man auch eine Meldung im Log), obwohl das Gerät definitiv mit
dem Netz verbunden ist. Daß es online ist, sieht man auch daran, daß
die Info zum Ping das Gerät gleichzeitig nicht als offline zeigt.

Deswegen habe ich beide Aspekte in die Logik eingebracht. Nur: scheinbar
führt der Teil
elif [ $exists = 0 ] || [ -e /var/run/arping.stat/$device1.online ] ;
then
in seiner konkreten Ausgestaltung dazu, daß warum auch immer der Status
mitten in der Nacht (völlig willkürlich) auf online="true" gesetzt
wird, womit dann das Gerät anspringt.
Ich kann mir nicht vorstellen, daß der Teil mit "$exists = 0" das
Problem ist, denn wenn ein Gerät offline ist, dann ist der Ping
negativ. Punkt. Ich traue nach dem Erlebten somit der Info /arping.stat
nicht.
Meine Idee ist also, diesen Teil einfach so auszugestalten:
elif [ $exists = 0 ] ; then
[...]

Damit überprüfe ich für den Online-Zustand lediglich den Ping. Seht
ihr hier irgendwo noch einen anderen Denkfehler von mir?

Der weitere Teil ist dann:
if [ $device1_online = "true" ] || [ $device2_online = "true" ] ; then #
es langt, wenn eines der Geräte online ist
if [ $edimax_status != "on" ] ; then # Status wurde an anderer Stelle
abgefragt
(WLAN-Steckdose einschalten)
fi
elif [ $device1_online != "true" ] && [ $device2_online != "true" ] ;
then # keines der beiden Geräte darf hier online sein
if [ $edimax_status != "off" ] ; then
(WLAN-Steckdose ausschalten)
fi
fi

Das sollte doch passen, oder?

Natürlich kann ich das Skript mit z.B. seiner Einschalt-Aktion während
der Nacht "stillegen", jedoch löst das das Problem nicht, daß auch
tagsüber die _Ausschalt_-Aktion eintritt, obwohl relevante Geräte
online sind.

Danke für ein Feedback,

Gruß
Klaus


Mehr Informationen über die Mailingliste Fli4L