FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: Christoph Morrison am 11 Mai 2020, 02:44:41

Titel: Fehlerhafter Regex zieht FHEM in den Abgrund
Beitrag von: Christoph Morrison am 11 Mai 2020, 02:44:41
Es ist spät/früh und man sollte aufpassen was man tut:

DOELSEIF
(
            [out.seat_covers.dummy:state] eq q{on}
        and ["out.irigation.valves.channel.(?:[01])"":state] eq "on"
)
(
    msg Die Bewässerung auf der Südseite ist aktiviert und die Bezüge sind draußen!
)


Das ist ein Ausschnitt aus einem fehlerhaften DOIF, da sind zwei " hintereinander, wo nur eins sein sollte (Danke, IDE).
Das führte zu folgendem Log und FHEM starb.


2020.05.11 02:39:25.056 1: ERROR evaluating my $TYPE='Global';my $EVTPART1='out.seat_covers.alert';my $EVENT='MODIFIED out.seat_covers.alert';my $EVTPART0='MODIFIED';my $NAME='global';my $SELF='general.system.changelog.system';{fhem("trigger $SELF change: ".lc("$EVENT"))}: Unmatched ( in regex; marked by <-- HERE in m/^global$|^general.weather.station.sensor_5.rainfall$|out.irigation.valves.channel.( <-- HERE ?|^out.seat_covers.dummy$|^general.weather.forecast.buienradar$/ at ./FHEM/98_DOIF.pm line 2529.

2020.05.11 02:39:25.056 3: general.system.changelog.system return value: Unmatched ( in regex; marked by <-- HERE in m/^global$|^general.weather.station.sensor_5.rainfall$|out.irigation.valves.channel.( <-- HERE ?|^out.seat_covers.dummy$|^general.weather.forecast.buienradar$/ at ./FHEM/98_DOIF.pm line 2529.

Unmatched ( in regex; marked by <-- HERE in m/^global$|^general.weather.station.sensor_5.rainfall$|out.irigation.valves.channel.( <-- HERE ?|^out.seat_covers.dummy$|^general.weather.forecast.buienradar$/ at ./FHEM/98_DOIF.pm line 2529.


Eher unschön, dass FHEM dann stirbt. Habt ihr eine Idee, wie man sowas abfangen könnte?
Titel: Antw:Fehlerhafter Regex zieht FHEM in den Abgrund
Beitrag von: rudolfkoenig am 11 Mai 2020, 09:39:18
notify (und 10 weitere Module) prueft bei der Definition per perlSyntaxCheck(), ob der Ausdruck Syntaxfehler enthaelt.

Die Funktion besteht im Wesentlichen aus eval { return; <perlcode> }, weiss nicht, ob was Vergleichbares bei DOIF gemacht wird bzw. machbar waere.