Leerzeichen in function/shellscript bei PRESENCE [patch]

Begonnen von henryk, 14 Oktober 2013, 10:35:09

Vorheriges Thema - Nächstes Thema

henryk

Moin,

das aktuelle Argument-Parsing für PRESENCE (PRESENCE_Define) ist sehr einfach gehalten und lässt insbesondere keine Leerzeichen in den Argumenten zu. Das bedeutet, dass die Funktionalität vom function-Mode etwas eingeschränkt ist. Ich hab das split() durch einen regulären Ausdruck ersetzt und den Rest der Funktion entsprechend umgeschrieben. Das sollte jetzt wesentlich exakter dem entsprechen was gewollt war.

Es gibt noch ein gotcha: Semikolons in einer function müssen doppelt escaped werden (also ;;;; wann immer man ; will: einmal für das define-Kommando, dann noch einmal beim Ausführen der Funktion), ich bin mir nicht sicher inwiefern da eine automatische Lösung gewollt ist.

--
Henryk Plötz
Grüße aus Berlin

Markus Bloch

Hallo Henryk,

bei dem Modus "function" und "shellscript" wird die split-Funktion nicht verwendet, sondern die Parameter mit der folgenden Regexp ermittelt:


elsif($a[2] =~ /(shellscript|function)/)
    {
if($def =~ /(\S+) \w+ (\S+) ["']{0,1}(.+?)['"]{0,1}\s*(\d*)\s*(\d*)$/s)
    {
   
$hash->{MODE} = $2;
$hash->{helper}{call} = $3;
$hash->{TIMEOUT_NORMAL} = ($4 ne "" ? $4 : 30);
$hash->{TIMEOUT_PRESENT} = ($5 ne "" ? $5 : 30);


Das ist extra so gewählt, damit Leerzeichen wie bei:

define test PRESENCE shellscript "echo 1" 30 60

korrekt erkannt werden.

Bei mir funktioniert das prima.

Mit den Semikolons hast du allerdings recht.

Was funktioniert denn bei dir nicht genau?

Gruß
Markus
Developer für Module: YAMAHA_AVR, YAMAHA_BD, FB_CALLMONITOR, FB_CALLLIST, PRESENCE, Pushsafer, LGTV_IP12, version

aktives Mitglied des FHEM e.V. (Technik)

henryk

Moin,

Zitat von: Markus Bloch am 15 Oktober 2013, 20:03:21
bei dem Modus "function" und "shellscript" wird die split-Funktion nicht verwendet, sondern die Parameter mit der folgenden Regexp ermittelt:

Ja, wie das gedacht war hab ich gesehen, nur funktioniert das nicht so, weil es falsch ist. Durch

if(defined($a[2]) and defined($a[3]) and not defined($a[7]))

wird die weitere Verarbeitung bereits unterbunden, wenn mehr als 7 Teile nach dem split() entstanden sind. Das ist falsch in zwei Richtungen: Dein Beispiel funktioniert zwar, und manche andere auch, aber ein function mit mehr als einem Leerzeichen im Körper wird abgelehnt. Umgekehrt würde eine Definition für lan-ping, local-bluetooth und fritzbox mit einem Leerzeichen zu viel auch akzeptiert (und das überschüssige am Ende ignoriert). Die 7 in "not defined($a[7])" wird nur bei lan-bluetooth erreicht, für die anderen drei müsste da 6 stehen, und für function/shellscript ist das gar nicht anwendbar.

Daher mein Patch, der alle diese Probleme repariert und noch mehr: Jeder der Modi akzeptiert jetzt nur noch genau was ihm zusteht. Bei function/shellscript hab ich auch repariert dass es "foo' akzeptieren würde (also eine " zum Öffnen und eine ' zum Schliessen, beides muss jetzt der gleiche Anführungszeichentyp sein).

Zitat von: Markus Bloch am 15 Oktober 2013, 20:03:21
Was funktioniert denn bei dir nicht genau?

Jede function mit zwei Leerzeichen oder mehr wird abgelehnt. Konkret will ich grade meine bisherige Konstruktion der Anwesenheitserkennung mit at und dummy durch presence ersetzen. Meine Definition (die erst mit meinem Patch funktioniert) ist:

define presence_test PRESENCE function { my $ip = "192.168.2.110";;;; my $pingtest = 1;;;; my $repeat = 3;;;; while($pingtest == 1 && $repeat-- > 0) { local $SIG{CHLD}='';;;; system("arping -c 2 -w 5 $ip > /dev/null 2> /dev/null");;;; $pingtest = $? >> 8;;;; } return $pingtest?0:1;;;; }

(da sind offensichtlich geringfügig mehr als zwei Leerzeichen drin, viele davon sind auch inhaltlich wichtig und konnte ich nicht einfach weglassen :))

--
Henryk Plötz
Grüße aus Berlin