(gelöst) HttpUtils Close method funktioniert nicht

Begonnen von Pseudex, 12 März 2018, 10:07:55

Vorheriges Thema - Nächstes Thema

Pseudex

Das müsste wahrscheinlich in den Entwicklungsbereich aber da darf ich leider nicht schreiben.

Gestern habe ich ein FHEM Update gemacht und dann war der Webserver nicht mehr zu erreichen.
Auch das Backup des fhem/FHEM ordners hat nicht geholfen.
Erst habe ich Modul für Modul ausgetauscht. Jedoch lief es mit keinem. Als ich den ganzen Ordner aus dem Backup wiederhergestellt habe, lief es leider auch nicht.
Demnach könnte es auch an einem apt-get update/upgrade liegen.

Die Zeile 75 im HttpUtils.pm macht ärger.
$hash->{conn}->close() if(defined($hash->{conn}));

wenn ich fhem als debug starte (sudo -u fhem perl fhem.pl -d fhem.cfg), dann kommt irgendwann das im log
Can't call method "close" without a package or object reference at FHEM/HttpUtils.pm line 82, <FH> line 20596.
Es ist nicht immer an der gleichen Stelle und ich habe auch schon versucht alle Module abzuklemmen, die möglicherweise HTTP nutzen. Das hat leider auch nichts gebracht.
Erst als ich Zeile 75 testweise auskommentiert habe, lief der Server wieder.

nun habe ich Zeile 75 dadurch ersetzt. Leider bin ich kein perl Profi und stütze mich auf diesen Beitrag: stackoverflow

  if(defined($hash->{conn}))
  {
    if( my $ref = eval { $hash->{conn}->can( 'close' ) } )
    {
      $hash->{conn}->close();
    }       
  }
  #$hash->{conn}->close() if(defined($hash->{conn}));


Das ist meine Perl installation auf meinem debian/stretch RPI2

perl -V
Summary of my perl5 (revision 5 version 24 subversion 1) configuration:

  Platform:
    osname=linux, osvers=3.16.0, archname=arm-linux-gnueabihf-thread-multi-64int
    uname='linux localhost 3.16.0 #1 smp debian 3.16.0 armv7l gnulinux '
    config_args='-Dusethreads -Duselargefiles -Dcc=arm-linux-gnueabihf-gcc -Dcpp=arm-linux-gnueabihf-cpp -Dld                                                =arm-linux-gnueabihf-gcc -Dccflags=-DDEBIAN -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -fdebug-prefix-map=/build/                                                perl-2qnUZW/perl-5.24.1=. -fstack-protector-strong -Wformat -Werror=format-security -Dldflags= -Wl,-z,relro -                                                Dlddlflags=-shared -Wl,-z,relro -Dcccdlflags=-fPIC -Darchname=arm-linux-gnueabihf -Dprefix=/usr -Dprivlib=/us                                                r/share/perl/5.24 -Darchlib=/usr/lib/arm-linux-gnueabihf/perl/5.24 -Dvendorprefix=/usr -Dvendorlib=/usr/share                                                /perl5 -Dvendorarch=/usr/lib/arm-linux-gnueabihf/perl5/5.24 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/shar                                                e/perl/5.24.1 -Dsitearch=/usr/local/lib/arm-linux-gnueabihf/perl/5.24.1 -Dman1dir=/usr/share/man/man1 -Dman3d                                                ir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dusesitecustomize                                                 -Duse64bitint -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio                                                 -Uusenm -Ui_libutil -Uversiononly -DDEBUGGING=-g -Doptimize=-O2 -dEs -Duseshrplib -Dlibperl=libperl.so.5.24.                                                1'

rudolfkoenig

ZitatDas müsste wahrscheinlich in den Entwicklungsbereich aber da darf ich leider nicht schreiben.
Laut Maintainer gehoert das Problem nach Automatisierung.

Deine Code-Aenderung behebt zwar die Symptome, nicht aber die Ursache, und das interessiert mich, da ich nur ungern Probleme unter dem Teppich kehre.

Koenntest du einen Versuch mit "attr global stacktrace" machen?
Evtl. hilft auch hier die Zeilen vor der Fehlermeldung zu zeigen.

Pseudex

#2
vielen Dank für die Antwort.
ich hab den stacktrace eingebaut, aber leider ist der output nicht sehr ergiebig.
Ich teste jetzt nochmal, indem ich wirklich ein Objekt nach dem anderen deaktiviere zu dem ich httputils im log finde.
Update zum Test: hat leider nichts gebracht. steht jetzt kein HttpUtils mehr im Logfile. habe sogar einige Objekte löschen müssen.

Das steht dann in der shell. Zeile 82 ist das Original: $hash->{conn}->close() if(defined($hash->{conn}));

sudo -u fhem perl fhem.pl -d fhem.cfg > debug_fhem_httputils.txt
Can't call method "close" without a package or object reference at FHEM/HttpUtils.pm line 82.


das sind die letzten Einträge im Log.
2018.03.14 19:30:32 4: Tankstelle.PT1: GetUpdate called (update)
2018.03.14 19:30:32 4: Tankstelle.PT1: update timer modified: will call GetUpdate in 900.0 seconds at 2018-03-14 19:45:32
2018.03.14 19:30:32 4: Tankstelle.PT1: AddToQueue adds update, initial queue len: 0
2018.03.14 19:30:32 5: Tankstelle.PT1: AddToQueue adds type update to URL https://creativecommons.tankerkoenig.de/json/prices.php?ids=2415b49b-8f4a-419c-6330-5da2e01ca682&apikey=03d0e025-462f-5d73-e6fe-2e6ff22332dc, no data, no headers, retry 0
2018.03.14 19:30:32 5: Tankstelle.PT1: HandleSendQueue called, qlen = 1
2018.03.14 19:30:32 4: Tankstelle.PT1: HandleSendQueue sends request type update to URL https://creativecommons.tankerkoenig.de/json/prices.php?ids=2415b49b-8f4a-419c-6330-5da2e01ca682&apikey=03d0e025-462f-5d73-e6fe-2e6ff22332dc, No Data, No Header,
timeout 2
2018.03.14 19:30:32 5: HttpUtils url=https://creativecommons.tankerkoenig.de/json/prices.php?ids=2415b49b-8f4a-419c-6330-5da2e01ca682&apikey=03d0e025-462f-5d73-e6fe-2e6ff22332dc
2018.03.14 19:30:32 5: IP: creativecommons.tankerkoenig.de -> 188.68.35.147
2018.03.14 19:30:32 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 ->REMOTE: 1
2018.03.14 19:30:32 4: FRITZBOX FritzBox: API_Check_Run.757 FRITZBOX modul runs in remote mode.
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 ->WEBCM: 0
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.777 API webcm does not exist (404 Not Found)
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 ->LUAQUERY: 1
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.789 API luaQuery found but responded with: 403 Forbidden
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 ->TR064: 1
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.801 API TR-064 found.
2018.03.14 19:30:33 4: FRITZBOX FritzBox: TR064_Init.4446 Open TR-064 connection and ask for security port
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 ->SECPORT: 49443
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.806 TR-064-SecurePort is 49443.
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.828 Created m3u file './www/images/FritzBox.m3u'.
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 ->M3U_LOCAL: ./www/images/FritzBox.m3u
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.836 Try to get my IP address.
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.843 Try to get a FHEMWEB port.
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.855 Try to get 'http://192.168.192.137:8083/fhem/images/FritzBox.m3u'
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.858 Failed to get 'http://192.168.192.137:8083/fhem/images/FritzBox.m3u': 500 Can't connect to 192.168.192.137:8083
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 ->M3U_URL: unknown
2018.03.14 19:30:33 5: FRITZBOX FritzBox: API_Check_Run.870 Read 'jason_boxinfo'
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 box_model: FRITZ!Box 7580
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 box_oem: avm
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 box_fwVersion: 153.06.92
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 ->TELNET: 0
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.926 Could not open telnet connection to fritz.box: Connection refused
2018.03.14 19:30:33 5: FRITZBOX FritzBox: Readout_Add_Reading.2025 ->APICHECKED: 1
2018.03.14 19:30:33 4: FRITZBOX FritzBox: API_Check_Run.940 Captured 14 values
2018.03.14 19:30:33 5: FRITZBOX FritzBox: API_Check_Run.941 Handover to main process (219): ->REMOTE|1|->WEBCM|0|->LUAQUERY|1|->TR064|1|->SECPORT|49443|->M3U_LOCAL|./www/images/FritzBox.m3u|->M3U_URL|unknown|box_model|FRITZ!Box 7580|box_oem|avm|box_fwVersion|153.06.92|->TELNET|0|->APICHECKED|1|readoutTime|1.00


hier ist z.B. die Definition von Tankstelle.PT1. Das ist ein einfaches HTTPMOD und ich habe es schon versucht in der fhem.cfg zu deaktivieren. Leider ohne Erfolg.

defmod Tankstelle.PT1 HTTPMOD https://creativecommons.tankerkoenig.de/json/prices.php?ids=2415b49b-8f4a-419c-6330-5da2e01ca682&apikey= 900
attr Tankstelle.PT1 devStateIcon open:hue_room_carport@green closed:hue_room_carport@grey
attr Tankstelle.PT1 enableControlSet 1
attr Tankstelle.PT1 event-on-change-reading prices_.*
attr Tankstelle.PT1 event-on-update-reading prices_.*_status
attr Tankstelle.PT1 extractAllJSON 1
attr Tankstelle.PT1 group Tankstelle.PT1
attr Tankstelle.PT1 room Notitz
attr Tankstelle.PT1 stateFormat prices_2415b49b-8f4a-419c-6330-5da2e01ca682_status
attr Tankstelle.PT1 webCmd start

rudolfkoenig

Ich habe HttpUtils modifiziert, dein Code uebernommen, im Fehlerfall wird aber ein stacktrace protokolliert.
Kannst du es bitte probieren?

Pseudex

danke.
Ich glaube nun haben wir den Wurm gefunden.


2018.03.14 21:29:40 1: stacktrace:
2018.03.14 21:29:40 1:     main::HttpUtils_Close               called by FHEM/HttpUtils.pm (371)
2018.03.14 21:29:40 1:     main::__ANON__                      called by FHEM/HttpUtils.pm (215)
2018.03.14 21:29:40 1:     main::HttpUtils_gethostbyname       called by FHEM/HttpUtils.pm (419)
2018.03.14 21:29:40 1:     main::HttpUtils_Connect             called by FHEM/HttpUtils.pm (868)
2018.03.14 21:29:40 1:     main::HttpUtils_NonblockingGet      called by ./FHEM/98_EDIPLUG.pm (559)
2018.03.14 21:29:40 1:     main::EDIPLUG_Get                   called by ./FHEM/98_EDIPLUG.pm (179)
2018.03.14 21:29:40 1:     main::EDIPLUG_GetUpdate             called by fhem.pl (3105)
2018.03.14 21:29:40 1:     main::HandleTimeout                 called by fhem.pl (634)

rudolfkoenig

Die Ursache: Ediplug initialisiert $hash->{conn} mit "", was sehr zurueckhaltend formuliert nicht erwuenscht ist.
Wenn zusaetzlich bei der DNS-Aufloesung was schiefgeht, dann kommt zu diese Fehlermeldung/Abbruch.

Kannst du bitte den EDIPLUG Maintainer auf diese Tatsache aufmerksam machen, indem du im Bereich "Sonstige Systeme" ein Thema oeffnest?

Pseudex

Nach dem maintainer habe ich mich schon umgeschaut. Leider hat er keine Zeit mehr für das Modul und hat es nach contrib verschoben.

Ich habe im Code mal Zeile 138 auskommentiert und getestet.
Etwas weiter unten im Modul beim get hat er auch schon mehrere dieser Überschreibungen mit "" auskommentiert.

Auf dem ersten Blick funktioniert das Modul und ich habe auch keinen Stacktrace Eintrag im Log dazu gefunden.
Die Steckdose lässt sich noch schalten und auch die Werte können noch gelesen werden.

98_EDIPLUG.pm

Zeile 138:
    #$hash->{conn}       = "";


sub EDIPLUG_Define($$) {
    my ($hash, $def) = @_;
    my @a = split("[ \t][ \t]*", $def);
    return "wrong syntax: define <name> EDIPLUG <IP or FQDN>" if(int(@a) != 3);

    $hash->{NAME}  = $a[0];
    $hash->{host}  = $a[2];

    if( !defined( $attr{$a[0]}{interval} ) ) { $attr{$a[0]}{interval} = "60"}
    $hash->{INTERVAL}   = $attr{$a[0]}{interval};

    if( !defined( $attr{$a[0]}{user} ) ) { $attr{$a[0]}{user} = "admin"}
    $hash->{user}       = $attr{$a[0]}{user};

    if( !defined( $attr{$a[0]}{password} ) ) { $attr{$a[0]}{password} = "1234"}
    $hash->{pwd}        = $attr{$a[0]}{password};

    if( !defined( $attr{$a[0]}{model} ) ) { $attr{$a[0]}{model} = "unknow"}
    $hash->{MODEL}      = $attr{$a[0]}{model};

    if( !defined($attr{$a[0]}{'read-only'} ) ) { $attr{$a[0]}{'read-only'} = "0"}

    $hash->{POWER}           = "?";
    $hash->{LASTCMD}         = "";
    $hash->{helper}{current} = "";
    $hash->{helper}{power}   = "";

    # for non blocking HTTP Get

    $hash->{port} = "10000";
    $hash->{url} = "http://$hash->{user}:$hash->{pwd}\@$hash->{host}:$hash->{port}/smartplug.cgi";
    $hash->{callback}   = \&EDIPLUG_Read;
    $hash->{timeout}    = 2;
    $hash->{code}       = "";
    $hash->{httpheader} = "";
    #$hash->{conn}       = "";
    $hash->{data}       = "";
    $hash->{".firststart"}    = 1;

    readingsSingleUpdate($hash, "state", "defined",0);

    for (my $i=0; $i<8; $i++) { $hash->{helper}{"list"}[$i] = ""; } # einer mehr als Tage :)

    RemoveInternalTimer($hash);
    InternalTimer(gettimeofday()+5, "EDIPLUG_GetUpdate", $hash, 0);
    #EDIPLUG_Get($hash,$hash->{NAME},"info");
    return undef;
}