Erweiterter callmonitor

buehmann

Aktives Mitglied
Mitglied seit
11 Jun 2005
Beiträge
1,810
Punkte für Reaktionen
0
Punkte
36
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

  • callmonitor-2005-08-07-2.zip
    4 KB · Aufrufe: 354
  • callmonitor-2005-08-28.zip
    4.5 KB · Aufrufe: 747
Zuletzt bearbeitet:
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
 
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
 
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
 
frage schrieb:
Du hast schon geschrieben, dass die 7050 am s0 auch ausgehende Rufe als eingehende behandelt, allerdings leider ohne die gerufene Rufnummer zu übermitteln...
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.
 
wichard schrieb:
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).
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.)
Kann man das mit Hilfe von Regular Expressions nicht zu einer "normalen" Rufnummer umbauen, für die der Lookup dann funktioniert?
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 ...
 
buehmann schrieb:
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 ...

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
 
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!
 
frage schrieb:
bei mir sendet gmx immer die nummer so: 49221123456 - also ohne 00
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.

die beiden Dateien kommen wahrscheinlich in den Ordner addon? wird die bisherige callmonitor.sh noch benötigt?
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.)
kann ich den callmonitor in der debug.cfg konfigurieren? wenn ja, wie?
Ja, indem du dort die Datei /var/tmp/callmonitor.listeners erstellst mit deiner Liste von Regeln drin (siehe oben).
vielleicht kannst Du ein kleines Beispiel machen, meintwegen gerne für das senden an einen Webserver www.irgendwo.net???
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.
 
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"
 
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.
 
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?
 
Erkan schrieb:
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.
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
 
buehmann schrieb:
probier mal das zum Testen direkt von der Kommandozeile aus:
Code:
. /usr/bin/callmonitor.out # die Funktionen importieren
dreammessage --user='bla' --password='blupp' deinebox

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.
 
Erkan schrieb:
Code:
dreammessage --user='bla' --password='blupp' deinebox
OK, das funktioniert so weit.
Bedeutet also, dass der Teil in der callmonitor.out bereits user und passwort enthalten soll
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.)
 
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!
 
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
 
Erkan schrieb:
Aber Meldung kommt null ... zumindest müsste doch ein PopUp mit Titel "Telefonanruf" kommen!

Box schon neu gestartet nach Änderung der debug.cfg? Sonst wird diese nicht neu eingelesen -> Änderungen noch nicht wirksam.
 
wichard schrieb:
Erkan schrieb:
Aber Meldung kommt null ... zumindest müsste doch ein PopUp mit Titel "Telefonanruf" kommen!

Box schon neu gestartet nach Änderung der debug.cfg? Sonst wird diese nicht neu eingelesen -> Änderungen noch nicht wirksam.

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 ^ ^)?
 
Erkan schrieb:
Also so doof bin ich nun nicht ;)

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
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.