.titleBar { margin-bottom: 5px!important; }

Erweiterter callmonitor

Dieses Thema im Forum "FRITZ!Box Fon: Modifikationen" wurde erstellt von buehmann, 7 Aug. 2005.

  1. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #1 buehmann, 7 Aug. 2005
    Zuletzt bearbeitet: 25 Feb. 2006
    Hallo zusammen,

    der Callmonitor aus mod-0.57 war mir zu unflexibel; deswegen habe ich ihn auf meine Bedürfnisse angepasst: Das Ergebnis gibt es unten im Anhang. Vielleicht kann noch jemand von euch es gebrauchen.

    Weil ich von der Mod-Reihe m4.* auf den ds-mod umgestiegen bin (und weil dieser Thread eh schon viel zu lang ist :)), geht die Entwicklung als Paket für den ds-mod auf einer eigenen Seite weiter.


    Was neu ist:
    • Die Konfigurationsdatei callmonitors.listeners ähnelt jetzt der von cron:
      • Jede Aktion ist abhängig von zwei Mustern (extended regular expressions), die auf Quell- und Ziel-Rufnummer passen müssen. Damit lassen sich z.B. bestimmte Anrufer anders (oder auch woanders) signalisieren.
        Code:
        #Quelle      Ziel    Aktion
        ^01239876$   ^       dboxpopup dbox1
        ^(0162|089)  ^SIP1$  dboxmessage dbox2
      • Bei der 7050 ist auch ein ausgehender Anruf (oder nur das Hörer-Abnehmen) mit ISDN-Telefonen ein eingehender Anruf ("IncomingCall from NT:"); diese Anrufe werden standardmäßig ignoriert, können aber über "NT:" (nur solche) oder "*:" (alle Anrufe) explizit überprüft werden.
        Code:
        NT:^123$  ^  foo
        *:^456    ^  bar
      • Als Aktionen sind nicht nur einzelne Wörter (Funktionsnamen) erlaubt, sondern beliebige Shell-Kommandos mit Argumenten, Pipes, Umleitungen, Variablenersetzungen etc. (MSISDN, CALLER und CALLED stehen als Umgebungsvariablen zur Verfügung):
        Code:
        ^  ^  dreammessage --port=8080 --password="sesame" "$(date) Anruf von $MSISDN"
        ^  ^  echo "$CALLER -> $CALLED" >> /var/tmp/calls
        
    • Bei Nachrichten an Dbox, Dreambox und Co. können Benutzername und Passwort angegeben werden (Wunsch von Erkan).
    • Das Verschicken von Nachrichten per GET-Request macht ein recht allgemeines "getmsg", das sich um den Zusammenbau der Nachricht inklusive URL-Kodierung kümmert. Das ersetzt die verschieden ownmessage-Funktionen und OWNGET.
      Code:
      # Usage: getmsg [OPTION]... <HOST> <url-template> [<message>]...
      #        getmsg [OPTION]... -t <url-template> <host> [<message>]...
      # Send a message in a simple HTTP GET request.
      #
      #   -t, --template=FORMAT  use this printf-style template to build the URL,
      #                          all following messages are URL-encoded and filled
      #                          into this template
      #   -p, --port=PORT        use a special target port (default 80)
      #   -w, --timeout=SECONDS  set connect timeout (default 3)
      #   -v, --virtual=VIRT     use a different virtual host (default HOST)
      #   -U, --user=USER        user for basic authorization
      #   -P, --password=PASS    password for basic authorization
      
      Code:
      ^123  ^SIP2$  getmsg myserver '/cgi-bin/mail?subject=%s&body=%s' "Anruf von $MSISDN" "$CALLER" -U ich -P geheim
    Die Funktionen dboxpopup, dboxmessage, dreammessage und yac habe ich mangels Ausrüstung nur grob getestet (sie benutzen jetzt "getmsg"). Es wäre toll, wenn jemand von euch Feedback geben könnte, ob sie noch funktionieren. (Gilt natürlich auch für den Rest.)

    Viel Spaß damit,

    buehmann

    Achtung beim Umstieg von alten Versionen des callmonitors:
    • Die Aktion "etherwake" als alternative Schreibweise für "etherwakes" gibt es nicht mehr. Sollen also die ETHERWAKES-Zeilen in der debug.cfg ausgewertet werden: auf das "s" achten.
     

    Anhänge:

  2. fritzchen

    fritzchen Aktives Mitglied

    Registriert seit:
    29 Dez. 2004
    Beiträge:
    813
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    coole Sache,

    bin im Moment nicht in der Lage die Änderungen einzubauen, aber erlaube mir trotzdem eine Frage:

    Ist es damit vielleicht auch möglich, die ausgehenden Rufe mit dem Callmonitor zu erfassen? Du hast schon geschrieben, dass die 7050 am s0 auch ausgehende Rufe als eingehende behandelt, allerdings leider ohne die gerufene Rufnummer zu übermitteln...

    Bei nächster Gelegenheit werde ich Deine Veränderungen testen, wird aber wohl ein paar Tage dauern
     
  3. olistudent

    olistudent IPPF-Urgestein

    Registriert seit:
    19 Okt. 2004
    Beiträge:
    14,756
    Zustimmungen:
    1
    Punkte für Erfolge:
    0
    Beruf:
    Softwareentwickler
    Ort:
    Kaiserslautern
    Wow, da muss ich mich erst mal reinarbeiten. :mrgreen:
    Könnte mal jemand ein Tutorial mit allen Möglichkeiten schreiben, bevor ich da den Durchblick haben...
    Nein ausgehende Rufe können damit nicht erfasst werden.

    Danke, Oliver
     
  4. wichard

    wichard IPPF-Promi

    Registriert seit:
    16 Juni 2005
    Beiträge:
    6,954
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    Aachen
    Das sieht ja äußerst interessant aus... Testen ist zwar im Moment nicht möglich (Zeitproblem), werde ich aber sicher irgendwann nachholen.

    Eine Frage aber vorab: Je nach Anbieter scheitern die Reverse Lookups der Telefonnummer daran, daß die Ländervorwahl per Clip mit übertragen wird (z.B. bei web.de kommt als Clip-Information für einen eingehenden Ruf die 0049241xxxxxx an). Kann man das mit Hilfe von Regular Expressions nicht zu einer "normalen" Rufnummer umbauen, für die der Lookup dann funktioniert?

    Danke an die wirklichen Experten hier,
    Wichard
     
  5. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Das stimmt nur zur Hälfte: Wenn man erst abhebt und dann wählt, kommt in der Ausgabe von telefon erst etwas Anonymes, später dann jede einzelne Ziffer (ziemlich schwer, das dann zu erfassen):
    Code:
    IncomingCall from NT: ID 0, caller: "8472934" called: ""
    Dial_NT: ID 1 dialed(0)
    Dial_NT: ID 1 dialed(8)
    ...
    
    Wenn man allerdings am ISDN-Telefon erst die Rufnummer vorbereitet und dann wählt/abhebt (so mache ich es eigentlich immer), kommt auch die Nummer im Ganzen bei der Box an:
    Code:
    IncomingCall from NT: ID 0, caller: "8472934" called: "083729473842"
    Dieser zweite Fall lässt sich mit meinem callmonitor einfach behandeln.
     
  6. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Stimmt, gilt auch in der anderen Richtung: Wenn ich recht überlege, werden Ortsgespräche bei mir ohne Ortsvorwahl angezeigt. (Obwohl ich gerade nicht nachvollziehen kann, ob die wirklich so reinkommen oder von der Box schon "nachbearbeitet" sind.)
    Normal heißt für dasoertliche.de nur mit Ortsvorwahl. Also müsste man die einfach bei Rufnummern hinzufügen, die nicht mit 0 beginnen, und bei Nummern, die mit 0049 beginnen, das durch 0 ersetzen. Gibt es noch andere Varianten von übertragenen Nummern? Sonst baue ich das mal ein ...
     
  7. wichard

    wichard IPPF-Promi

    Registriert seit:
    16 Juni 2005
    Beiträge:
    6,954
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    Aachen
    Eingehende Ortsgespräche hatte ich bisher tatsächlich nur auf dem altmodischen Festnetz, dort kommt CLIP bei mir korrekt im Callmonitor an. Mein einziger Wunsch bisher ist also die Ersetzung 0049 -> 0. :wink:

    Danke vorab!
    Wichard
     
  8. fritzchen

    fritzchen Aktives Mitglied

    Registriert seit:
    29 Dez. 2004
    Beiträge:
    813
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    bei mir sendet gmx immer die nummer so: 49221123456 - also ohne 00

    ein paar Fragen:
    die beiden Dateien kommen wahrscheinlich in den Ordner addon?

    wird die bisherige callmonitor.sh noch benötigt?

    kann ich den callmonitor in der debug.cfg konfigurieren?
    wenn ja, wie?

    vielleicht kannst Du ein kleines Beispiel machen, meintwegen gerne für das senden an einen Webserver www.irgendwo.net???

    Besten Dank im Voraus!
     
  9. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Hmm, hab ich doch fast gedacht, dass es so einfach und einheitlich nicht ist ... :-/ Am besten packe ich die Nummerntransformation mal in eine eigene Funktion, dann kann sie jeder auf seine Situation anpassen.

    callmonitor entspricht/ist callmonitor.sh; wenn du die beiden Dateien über mod-0.57 installieren willst, solltest du sie wieder zu callmonitor.sh zurückbenennen, denn dort wird in den Startskripten /usr/bin/callmonitor.sh referenziert.
    callmonitor.out sollte später unter /usr/lib oder /usr/bin liegen, damit sie gefunden wird. (Man kann auch eine Version in /var/tmp ablegen; zum Experimentieren oder um einzelne Funktionen zu überschreiben.)
    Ja, indem du dort die Datei /var/tmp/callmonitor.listeners erstellst mit deiner Liste von Regeln drin (siehe oben).
    Oben gibt es schon eine Beispielzeile für den Webserver myserver. Vielleicht sagst du genauer, was du erreichen möchtest; dann kann ich dir auch ein spezielles Beispiel geben.
     
  10. fritzchen

    fritzchen Aktives Mitglied

    Registriert seit:
    29 Dez. 2004
    Beiträge:
    813
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    besten dank für die schnelle Antwort, ich sehe etwas klarer.

    Ich suche ganz konkret nach der Zeile in der debug.cfg um Anrufernummer und angerufene Nummer an meinen Webserver zu übermitteln. Das soll allerdings für alle Anrufe gemacht werden, nicht nur für manche Anrufe.

    so:???
    Code:
     
    getmsg [url]www.xyz.net[/url]  '/call.php?called=%s&nr=%s' "Anruf von $MSISDN" "$CALLER"
    
    oder so:?????
    Code:
     
    * * getmsg [url]www.xyz.net[/url]  '/call.php?called=%s&nr=%s' "Anruf von $MSISDN" "$CALLER"
    
     
  11. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    So. Die ersten beiden Felder müssen Regular Expressions sein; da ist es für etwas, das auf alles passen soll, am einfachsten, "^" zu nehmen, das passt auf den Anfang eines Strings (und den hat jeder).
    Code:
    ^  ^  getmsg [url]www.xyz.net[/url]  '/call.php?called=%s&nr=%s' "Anruf von $MSISDN" "$CALLER"
    Die Zeile muss dann in /var/tmp/callmonitor.listeners landen; also könnte in deiner debug.cfg sowas stehen:
    Code:
    cat <<\END >> /var/tmp/callmonitor.listeners
    ^  ^  getmsg [url]www.xyz.net[/url]  '/call.php?called=%s&nr=%s' "Anruf von $MSISDN" "$CALLER"
    END
    Worauf du vielleicht noch achten solltest: MSISDN ist die Nummer des Anrufers, CALLED die des Angerufenen; CALLER ist der Name des Anrufers (oder wie MSISDN, wenn man ohne Reverse-Lookup arbeitet). (Die Namensgebung ist etwas unglücklich, finde ich, aber ich habe sie beibehalten.) Bei dir würde also momentan der Name des Anrufers als Parameter "nr" in deinem PHP-Skript ankommen.
     
  12. Erkan

    Erkan Guest

    Hi buehmann,

    erstmal danke, dass Du Dir wirklich die Arbeit gemacht hast :)

    Habe Deine beiden Dateien UNVERÄNDERT im mod-0.57 ersetzt und ein Image erstellt. In der debug.cfg habe ich unmittelbar vor der Zeile "IP dreammessage" die Variablen 'USER=root' und 'PASS=xxxxx' eingefügt. Leider kommt keine Message rüber. Weder wenn HTTP-Auth in der dreambox deaktiviert noch aktiviert ist.

    Ist noch etwas anzupassen?
     
  13. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Es werden keine Variablen USER oder PASS in der debug.cfg ausgewertet. Du kannst die direkt beim Aufruf von dreammessage angeben (man könnte ja viele Server mit verschiedenen Passwörtern haben); probier mal das zum Testen direkt von der Kommandozeile aus:
    Code:
    . /usr/bin/callmonitor.out # die Funktionen importieren
    dreammessage --user='bla' --password='blupp' deinebox
     
  14. Erkan

    Erkan Guest

    OK, das funktioniert so weit.
    Bedeutet also, dass der Teil in der callmonitor.out bereits user und passwort enthalten soll - so ungefähr:
    Code:
    dreammessage() {
        getmsg -t "/cgi-bin/xmessage?timeout=15&caption=Telefonanruf&body=%s" --user='bla' --password='blubb' "$@"
    }
    
    Liege ich da richtig? Wenn ja, dann ist das nicht so toll. Besser wäre, wenn man die Daten in der debug.cfg hinterlegen könnte, sonst muss ja für jede Box ein eigenes Image erstellt werden.
     
  15. buehmann

    buehmann Aktives Mitglied

    Registriert seit:
    11 Juni 2005
    Beiträge:
    1,810
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Nein, es ist keine gute Idee, die Funktion dreammessage zu ändern; einen Grund hast du schon genannt. (Ein anderer wäre, das du Probleme bekommst, wenn du deine zweite Dreambox einrichten willst.) Du nimmst einfach die funktionierende Zeile von oben und schreibst die in die callmonitors.listeners, davor dann noch in zwei Spalten die Muster für eingehende und ausgehende Nummer, fertig. (Das "Schreiben in callmonitors.listeners" machst du natürlich indirekt über die debug.cfg; vgl. meine Antwort oben für fritzchen.)
     
  16. Erkan

    Erkan Guest

    Krieg hier bald die Krise ... bin ich wirklich SO doof !?

    Habe nun folgendes in der debug.cfg:
    Code:
    cat <<EOP > /var/tmp/callmonitor.listeners
    #Quelle         Ziel            Aktion
    ^               ^               dreammessage --user='root' --password='xxxxxxxxxx' 192.168.178.10
    ^017xxxxxxx8    ^40xxx1         etherwake
    #192.168.178.26 dboxmessage
    #192.168.178.26 dboxpopup
    #[url]www.somwhere.net[/url] ownmessage [url]www.somewhere.net[/url]
    EOP
    
    Aber Meldung kommt null ... zumindest müsste doch ein PopUp mit Titel "Telefonanruf" kommen!
     
  17. Imsadi

    Imsadi Neuer User

    Registriert seit:
    6 Aug. 2005
    Beiträge:
    16
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    Moin,

    um die Sache jetzt mal komplett verrückt zu machen...

    Ich nutze einen VDR (auf Linux Basis) und möchte die
    Daten vom VDR aus auslesen, sobald ein Anruf eingeht und das
    ganze dann auf dem TV ausgeben per svdrpsend.pl.

    Wie kann ich die Daten aus der Fritzbox auslesen bzw. über
    welchen Port ? Einen yac listener auf consolen Basis gibt es wohl
    noch nicht ?

    Gruss
    Imsadi
     
  18. wichard

    wichard IPPF-Promi

    Registriert seit:
    16 Juni 2005
    Beiträge:
    6,954
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    Aachen
    Box schon neu gestartet nach Änderung der debug.cfg? Sonst wird diese nicht neu eingelesen -> Änderungen noch nicht wirksam.
     
  19. Erkan

    Erkan Guest

    Also so doof bin ich nun nicht ;) Nicht falsch verstehen! Ich würde auch das Einfachste nachfragen, denn oft liegt hier der Hund begraben :)
    Aber ja ... mir ist klar, dass die callmonitor.listeners erst beim Neustart geschrieben wird. Hilft aber auch nichts.

    Du meinst also auch dass das so passen müsste, oder? Ist es eigentlich egal, ob man TABS oder Leerzeichen als Spaltentrenner benutzt (bei ^ ^)?
     
  20. wichard

    wichard IPPF-Promi

    Registriert seit:
    16 Juni 2005
    Beiträge:
    6,954
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    Ort:
    Aachen
    OK, einen Versuch war's wert. Meist hilft dieser Tipp sowieso nur bei Leuten, die nicht in der Lage wären, das Image selbst zusammenzubauen :wink:

    Neuer Versuch; Hast Du ethereal oder vergleichbares auf dem Rechner? Dann könntest Du mal die IP Deines Rechners anstelle der der Box angeben, den Netzwerkverkehr capturen und gucken, ob die FBF überhaupt was schickt, ob also der Fehler in der Fritz- oder der Dreambox liegt. (Firewall am PC für den Test mal kurz abschalten!)

    HTH,
    Wichard