Closed bufemc closed 4 years ago
Hallo,
ich glaube ich kenne den "Fehler": Ich vermute, es liegt am "socket timeout".
In der PHP.ini ist der Wert standardmäßig auf default_socket_timeout = 60
gesetzt. Das erschien mir aber für das Lauschen auf den Callmonitor-Port viel zu lang (1 Minute) Daher setzt das Script zur Laufzeit den timeout herunter auf eine Sekunde:
stream_set_timeout ($fbSocket, 1);
.
Bei mir funktioniert es mit diesem maximal niedrigen Wert. Ich hatte aber auch schon mal Aussetzer in diesem Zusammenhang (da war die Schleife aber noch etwas anders codiert*).
Setzt doch bitte einmal in der functions.php in Zeile 27 den Wert auf 10:
stream_set_timeout ($fbSocket, 10);
Wenn es dann läuft, kannst Du ja testweise den Wert soweit reduzieren, bis es gerade noch läuft. Wenn es das ist, was hilft, dann würde ich das zukünftig über die config per Parameter änderbar machen.
Hallo, habe es versuchsweise sogar auf 60 gesetzt, aber keine Aenderung. Die Fehlermeldung bleibt die Gleiche. Um es einzugrenzen muss man ggf. den Fall noch enger ziehen? Hab grad leider nix zum Debuggen da, was nimmt man da heute? Bin schon laenger raus aus PHP.. gibt es gute freie Tools wie PyCharm fuer Python?
Was ich noch an der config aenderte war blackForeign auf false zu setzen, sowie die blacklist auf 2 (experimentales 3. Telefonbuch, leer, das 1. ist das normale, das 2. bestand schon) - aber ich glaube das ist es nicht..
PS: in der true loop ist kein sleep, sprich der Router wird pausenlos "attackiert", koennte es ggf. ein DDOS-Schutz sein? Naja, rate ziemlich im Dunklen, man vergebe mir ;-)
Setze ich vor die IP ein "https://" ändert sich das Verhalten:
C:\xampp\htdocs\fbcallrouter>php fbcallrouter run
Starting FRITZ!Box call router...
PHP Notice: Undefined offset: 0 in C:\xampp\htdocs\fbcallrouter\vendor\blacksenator\fritzsoap\src\fritzsoap.php on line 212
Notice: Undefined offset: 0 in C:\xampp\htdocs\fbcallrouter\vendor\blacksenator\fritzsoap\src\fritzsoap.php on line 212
PHP Notice: Trying to get property 'location' of non-object in C:\xampp\htdocs\fbcallrouter\vendor\blacksenator\fritzsoap\src\fritzsoap.php on line 212
Notice: Trying to get property 'location' of non-object in C:\xampp\htdocs\fbcallrouter\vendor\blacksenator\fritzsoap\src\fritzsoap.php on line 212
PHP Notice: Undefined offset: 0 in C:\xampp\htdocs\fbcallrouter\vendor\blacksenator\fritzsoap\src\fritzsoap.php on line 213
Notice: Undefined offset: 0 in C:\xampp\htdocs\fbcallrouter\vendor\blacksenator\fritzsoap\src\fritzsoap.php on line 213
PHP Notice: Trying to get property 'service' of non-object in C:\xampp\htdocs\fbcallrouter\vendor\blacksenator\fritzsoap\src\fritzsoap.php on line 213
Notice: Trying to get property 'service' of non-object in C:\xampp\htdocs\fbcallrouter\vendor\blacksenator\fritzsoap\src\fritzsoap.php on line 213
Error: HTTP (Could not connect to host)! Could not ... from/to FRITZ!Box
PHP Fatal error: Uncaught TypeError: Return value of blacksenator\callrouter\callrouter::getPhonebookList() must be of the type string, null returned in C:\xampp\htdocs\fbcallrouter\src\callrouter\callrouter.php:123
Stack trace:
#0 C:\xampp\htdocs\fbcallrouter\src\functions.php(14): blacksenator\callrouter\callrouter->getPhonebookList()
#1 C:\xampp\htdocs\fbcallrouter\src\RunCommand.php(25): blacksenator\callRouter(Array)
#2 C:\xampp\htdocs\fbcallrouter\vendor\symfony\console\Command\Command.php(255): blacksenator\RunCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#3 C:\xampp\htdocs\fbcallrouter\vendor\symfony\console\Application.php(987): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#4 C:\xampp\htdocs\fbcallrouter\vendor\symfony\console\Application.php(255): Symfony\Component\Console\Application->doRunCommand(Object(blacksenator\RunCommand), O in C:\xampp\htdocs\fbcallrouter\src\callrouter\callrouter.php on line 123
Fatal error: Uncaught TypeError: Return value of blacksenator\callrouter\callrouter::getPhonebookList() must be of the type string, null returned in C:\xampp\htdocs\fbcallrouter\src\callrouter\callrouter.php:123
Stack trace:
#0 C:\xampp\htdocs\fbcallrouter\src\functions.php(14): blacksenator\callrouter\callrouter->getPhonebookList()
#1 C:\xampp\htdocs\fbcallrouter\src\RunCommand.php(25): blacksenator\callRouter(Array)
#2 C:\xampp\htdocs\fbcallrouter\vendor\symfony\console\Command\Command.php(255): blacksenator\RunCommand->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#3 C:\xampp\htdocs\fbcallrouter\vendor\symfony\console\Application.php(987): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#4 C:\xampp\htdocs\fbcallrouter\vendor\symfony\console\Application.php(255): Symfony\Component\Console\Application->doRunCommand(Object(blacksenator\RunCommand), O in C:\xampp\htdocs\fbcallrouter\src\callrouter\callrouter.php on line 123
BTW, dennoch schoenes Projekt bzw. Idee! ColdCalls sind absolut nervtoetend..
Koennte es noch iwie mit meiner PHP Config zusammenhaengen? Habe default PHP von apachefriends, PHP Version 7.4.6, und lediglich die soap extension aktiviert, weil es so aussah als sei der Rest schon aktiviert.. Die 7490 verwendet FRITZ!OS: 07.12
Lass uns mal strukturiert vorgehen:
Habe mir zwischendurch mein Logging angesehen und festgestellt, dass da auch irgendwas völlig krumm ist... Die Test auf dem Entwicklungs-PC sahen gut aus. Auf dem RasbPi war jetzt aber nach ein paar Tagen der Prozess nur noch mit refresh des TB beschäftigt. Ich habe das geändert und zum Test habe ich (hart) den Zyklus für den Refrsh des TB (whitelist) auf 60 sec. gestellt und zwischendurch inbound und outbound telefoniert. Alles lief fehlerfrei und wurde sauber geloggt. Daher werde ich das jetzt mal aktualisierend hochladen.
So sieht das jetzt bei mir im Logging aus:
09.06.2020 12:33:04 => Initialization: phonebook (whitelist) loaded; next refresh: 10.06.2020 12:33:04 09.06.2020 12:33:04 => Guarding started: listen to FRITZ!Box call monitor. 09.06.2020 12:33:52 => CALL IN from number 01777** to MSN 91 09.06.2020 12:33:52 => Number 01777** found in phonebook #0 09.06.2020 12:33:54 => DISCONNECT 09.06.2020 12:34:21 => CALL OUT 09.06.2020 12:34:29 => DISCONNECT
2. Das mit dem https:// macht mich stutzig - kann aber schlecht sagen, ob es damit zusamenhängt oder aber eine andere Baustelle ist. Hat der User, den Du verwendest auf der FRITZ!Box eigentlich TR064 Rechte? https://github.com/BlackSenator/carddav2fb/wiki/Konfiguration-f%C3%BCr-TR-064-Zugriff-in-der-FRITZ!Box Das, was ich anhand der Fehlermeldung sehen kann, ist, dass schon die Initialisierung dieser library auf die Bretter geht. Dabei werden als allererstes aus der FRITZ!Box die frei zugänglichen(!) XML-Dateien für Services/Actions ausgelesen. Und das scheitert offenbar mit "https://" Du kannst ja mal testen, ob du die von deinem Browser erreichst: a) http://fritz.box:49000/tr64desc.xml b) https://fritz.box:49443/tr64desc.xml
Am besten wir diskutieren das weitere direkt per Mail (Adresse findet sich in den scripten) dann wird das hier nicht zu ausufernd unübersichtlich...
TR064 ist scheinbar aktiviert, wobei der Text hierzu in der FB inzw. anders aussieht. Aber es gibt nach wie vor eine Checkbox und die ist an.
Einen extra Benutzer habe ich dafuer NOCH nicht angelegt, ich nahm an dieser dslf-Dingens ist der Standard-User der immer geht mit dem Router Passwort.
Aber wo wir ggf. weiterkommen: http://IP:49000/tr64desc.xml => funktioniert http://IP:49443/tr64desc.xml => tut NICHT
Also doch einen extra Benutzer anlegen, oder was koennte hier schief sein?
Wenn du den Port 49443 ansprichst, dann musst du auch https:// nehmen
Extra Benutzer angelegt, alles zugelassen bis auf VPN und NAS, eingetragen in die config, das https:// wieder raus, Verhalten aber wie zuvor, sprich die urspruengliche Fehlermeldung in functions.php Zeile 32. Da es demnach nicht der User ist, loesche ich ihn nun wieder und benutze den Standard-Benutzer.
Wenn ich Port 49443 (klar, der https Port, war wohl noch zu wenig Kaffee) anspreche mit https:// kommt immerhin raus dass wohl was mit dem Zertifikat krumm laeuft:
NET::ERR_CERT_AUTHORITY_INVALID
"Dieser Server konnte nicht beweisen, dass er "IP" ist. Sein Sicherheitszertifikat wird vom Betriebssystem Ihres Computers als nicht vertrauenswürdig eingestuft. Mögliche Gründe sind eine fehlerhafte Konfiguration oder ein Angreifer, der Ihre Verbindung abfängt."
Ja, das mit dem Zertifikat hat damit nix zu tun. Dein Browser meckert nur, weil die Box kein validiertes Zertifikat für SSL-Zugang hat (das ist aber ein generelles AVM Thema). Du kannst aber per Ausnahme da drauf - bist ja in deinem Netz und willst was von deinem Server... Wesentlich ist, dass Du auf die XML-Files zugreifen kannst.
Wie gesagt: lass uns die Diskussion/Fehlersuche direkt per E-Mail weiterführen (Adresse im Script)
Habe Dir eben noch meine php.ini und meine Ausgabe fuer http://"ip":49000/tr64desc.xml (aber ohne UDN Eintraege, die habe ich geloescht) geschickt. Damit sollte der Fehlerteufel ggf. noch besser einkreisbar sein.
fritzsoap.php Zeile 161: $xml = @simplexml_load_file($xmlFile);
laedt Sachen, die auf meiner Fritzbox auch via Browser einen 404 liefern zB: http://IP:49000/GPMDevDesc.xml
Ergo ich musste in fritzsoap.php einiges auskommentieren, sind bestimmte Dinge davon zwingend?:
const SERVICE_DESCRIPTIONS = [ // see: https://boxmatrix.info/wiki/XML-Files ('*desc.xml (static)')
'tr64desc.xml',
'igddesc.xml',
'avmnexusdesc.xml',
'fboxdesc.xml',
# 'GPMDevDesc.xml',
'igd2desc.xml',
#'MediaRendererDevDesc.xml',
'MediaServerDevDesc.xml',
#'onlinestoredesc.xml',
#'satipdesc.xml',
#'TMediaCenterDevDesc.xml',
#'usbdesc.xml',
];
Laut https://boxmatrix.info/wiki/XML-Files wird z.B.
Rest habe ich nicht geguckt.. Mein naiver Vorschlag ist ggf. die tr64desc Liste die man vom Router bekommt abzugleichen was es gibt und was nicht, und wenn was zwingendes fehlt mit Meldung abzubrechen.
PS: Weil da ein @ davor steht duerfte das eigentlich gar keinen Fehler werfen bzw man muesste danach wohl nochmal gucken was in $xml drin steht. Schau ich morgen noch mal rein..
OKAY, irgendwie laeuft es oder "etwas" jetzt. Keine Fehlermeldungen mehr, nur: Starting FRITZ!Box call router... Resource id #118On guard...
Wer auch diesen Fehler erst mal bekommt: callrouter.php Line 107: Warning: stream_socket_client(): unable to connect to IP:1012 (Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte.
die Loesung ist: Steht schon in der README, aber habs uebersehen: den Callmonitor aktivieren, s.a. https://www.janrufmonitor.de/foren/topic/immer-wieder-probleme-mit-port-1012-mit-fritzbox-7490-und-6490/
Damit die FRITZ!Box Fon Hardware mit jAnrufmonitor kommunizieren kann, muss die Ziffernfolge #96*5* auf einem Telefon, das an die FRITZ!Box angeschlossen ist, gewählt werden. Die FRITZ!Box schaltet nun für die Überwachung frei und es sollte ein positiver Bestätigungston zu hören sein.
Um die Überwachung wieder zu deaktivieren, wählen Sie die Ziffernfolge #96*4*.
Mist.. hatte einen Testanruf gemacht, aber nicht abgenommen, neuer Fehler tauchte auf:
callrouter.php L285 - parseCallString .. undefined offset: 5
Die $line war: "09.06.20 20:29:24;DISCONNECT;1;0; "
Ergo sieht es so aus als wen die zwei letzten Parameter $intern und $device entweder nicht gesetzt sind.. oder es geht was anderes schief, da ja scheinbar der String mit einem newLine endet.
Hab nun einen Brechpunkt direkt reingehauen wo $line replaced wird und offenbar muesste man ggf. einfach die Disconnects nur anders parsen oder ignorieren, da anfangs reinkommt und ohne Probleme geparsed werden kann:
"09.06.20 20:44:05;CALL;1;13;<abgehende Nummer>;<angerufene Nummer>;SIP1;
"
Das mit dem NewLine vor dem " ist demnach nur ein Schoenheitsfehler.. Als schnellen Hack hab ich nun einfach bei Line 34 in functions.php geaendert:
if ($newLine != null && strpos($newLine, 'DISCONNECT') === false) { .. }
Nun bleibt noch das Prob das permanent laufen zu lassen, nen RaspberryPi hab ich hier rumfliegen, entweder v2 oder v3.. aber ewig nix damit gemacht ;)
Habe mal etwas nachgeforscht.. bin offenbar nicht der Einzige mit Fritzbox die bei Auflegen einige Parameter auslaesst, hier ein Post von 2012, gefunden auf https://forum.fhem.de/index.php?topic=8942.15 :
18.11.12 00:13:06;RING;0;;;SIP1; 18.11.12 00:13:26;DISCONNECT;0;0;
Nun ist die Frage, ob man das Disconnect (= aufgelegt) denn loggen oder ignorieren moechte. Offenbar loggst Du alles Andere als "RING" im else Zweig:
} else {
$type = $values['type'] == 'CALL' ? 'CALL OUT' : $values['type'];
$callrouter->setLogging($type);
}
Sprich, man muesste wohl die parseCallString Methode aufpaeppeln, dass sie auch fuer weniger gelieferte Parameter funktioniert.
Habe Deinen Code adaptiert, damit er auch mit weniger Parametern umgehen kann, und einen PR (siehe unten) erstellt. Habe das auch hier lokal getestet (Anrufen, Klingeln lassen, Auflegen) und es hat funktioniert.
/**
* parse a string from callmonitor socket output
* e.g.: "01.01.20 10:10:10;RING;0;01701234567;987654;SIP0;\r\n"
* or with less parameters: "18.11.12 00:13:26;DISCONNECT;0;0;\r\n"
*
* @param string $line
* @return array $result
*/
public function parseCallString(string $line): array
{
$line = str_replace(';\\r\\n', '', $line); // eliminate CR
$params = explode(';', $line);
return [
'timestamp' => $params[0],
'type' => $params[1],
'conID' => $params[2],
'extern' => $params[3],
'intern' => (isset($params[4])) ? $params[4] : "",
'device' => (isset($params[5])) ? $params[5] : ""
];
}
As documentation is everything: the changes above were included in commit 287e95c41a769723437f6fc98608dbc835f80548
Vorweg: bin nicht so der PHP-Fan, eher in Python zu Hause.
Vorweg: Composer installiert, dies hier wie beschrieben mit composer installiert, config.php angepasst, eine 7490 die nur via IP erreichbar ist (also nicht via fritz.box) soll angesteuert werden. In der php.ini musste ich noch die soap extension aktivieren. Wenn ich nun aufrufe:
php fbcallrouter run
werde ich aber geflutet mit staendig der gleichen Ausgabe:
Warning: fgets() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\fbcallrouter\src\functions.php on line 32 PHP Warning: fgets() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\fbcallrouter\src\functions.php on line 32
Ggf. ist es ja nur was Triviales, wie gesagt, meine Zeit in PHP ist etwas her ;)
Gibt es ggf. einen simplen Aufruf der einfach nur testet, ob die Verbindung mit Fritz klappt?