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

HOWTO: callmonitor für VDR ohne FW-Mod mit FW>=14.04.01

Dieses Thema im Forum "FRITZ!Box Fon: Modifikationen" wurde erstellt von thc, 22 Feb. 2006.

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. thc

    thc Neuer User

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    99
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    #1 thc, 22 Feb. 2006
    Zuletzt bearbeitet: 12 März 2006
    Hallo zusammen,
    ich wollte mir auch einen Call-Monitor basteln, aber dabei die Firmware nicht antasten.
    Das Ergebnis stelle ich mal in den folgenden Beiträgen vor.
    Ich werde dabei für jede Datei einen Extra-Beitrag aufmachen, damit das Ganze übersichtlich bleibt.
    Gruß
    Claus

    Änderungen:
    2006-02-22 21:53 Fertig, Kommentare können gepostet werden.
    2006-02-23 22:09 Inverssuche nicht gespeicherter Nummern und Speicherung im csv-Format
    2006-02-28 20:10 Inverssuche überarbeitet
    2006-03-12 12:10 Log der debug.cfg, Antwort der Inverssuche geändert, Callback über FON1
     
  2. thc

    thc Neuer User

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    99
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    Vorbedingung sind
    1) ein telnet-Zugriff auf die FB.
    Die Beschreibung dazu gibts hier im Forum.
    2) Webspace, um die erforderlichen Dateien zum Abruf bereit zu stellen.
    Und jetzt die Dateien im Einzelnen:
     
  3. thc

    thc Neuer User

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    99
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    #3 thc, 22 Feb. 2006
    Zuletzt bearbeitet: 12 März 2006
    /var/flash/debug.cfg
    Code:
    # Starten des Telnet Daemons
    /usr/sbin/telnetd -l /sbin/ar7login &
    
    # Konfiguration
    # Lokales Verzeichnis (muss beschreibbar sein) in dem die Dateien liegen sollen
    LOCALDIR="/var/usr"
    DEBUGLOG="$LOCALDIR/debug.log"
    # Adresse des Servers von dem die Dateien nachgeladen werden
    SERVER="www.*.de"
    
    # Herunterladen von Dateien
    f_wget() {
    # Abholen vom Webserver
    CMD="wget http://$SERVER/fbf/$1"
    echo "$(date '+%F %T') $CMD" >> $DEBUGLOG
    $CMD
    # Test auf Erfolg
    [ -e ./$1 ] || return 1
    # Anpassen der Dateirechte
    chmod +x ./$1
    # Test auf Erfolg
    [ -x ./$1 ] || return 1
    }
    
    # Warten bis die FritzBox den Server erreichen kann
    while !(ping -c 1 $SERVER); do
      sleep 10
    done
    
    # In das lokale Verzeichnis wechseln
    mkdir $LOCALDIR || exit
    cd $LOCALDIR
    echo "$(date '+%F %T')" > $DEBUGLOG
    
    # allgemeine Dateien
    f_wget debug.cfg
    f_wget wget.sh
    
    # netcat zur Kommunikation mit anderen Hosts
    f_wget nc || exit
    
    # multid fuer Status online/offline
    f_wget multid.cfg || exit
    f_wget multid.sh || exit
    CMD="$LOCALDIR/multid.cfg"
    echo "$(date '+%F %T') $CMD" >> $DEBUGLOG
    $CMD &
    
    # call-message fuer VDR u.a.
    f_wget telefon.cfg || exit
    f_wget telefon.sh || exit
    CMD="$LOCALDIR/telefon.cfg"
    echo "$(date '+%F %T') $CMD" >> $DEBUGLOG
    $CMD &
    
    # EOF 
    Diese Datei muss nach /var/flash/debug.cfg gespeichert werden, damit sie bei jedem Start ausgeführt wird.
    Ich habe als lokales Verzeichnis /var/usr/ genommen, weil in /var/tmp schon Dateien aus der originalen FW liegen.
    So habe ich alles an einem Platz.
     
  4. thc

    thc Neuer User

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    99
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    /var/usr/telefon.cfg
    Code:
    #!/bin/sh
    # Variablen
    PGM="telefon"
    LOCALDIR="/var/usr"
    # Tests
    [ -x $LOCALDIR/$PGM.sh ] || exit
    # Aktivieren
    echo -n "" > $LOCALDIR/$PGM.log
    ln -sf $LOCALDIR/$PGM.sh /var/calllog
    # EOF 
    
    Seit der letzten FW-Version ruft der telefon-Daemon für eingehende Anrufe eine /var/calllog auf, wenn es sie denn gibt.
    Falls hier jemand von AVM mitliest: Bitte in Zukunft auch für ausgehende Anrufe aufrufen und in $4 den Weg mitgeben: POTS oder SIP->POTS oder SIP->SIP
     
  5. thc

    thc Neuer User

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    99
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    #5 thc, 22 Feb. 2006
    Zuletzt bearbeitet: 12 März 2006
    /var/usr/telefon.sh
    Code:
    #!/bin/sh
    # Variablen
    PGM="telefon"
    LOCALDIR="/var/usr"
    HOST="192.168.178.2"
    PORT="60000"
    CALLBACK_MSN="123456"
    # Test
    if [ "$1" = "test" ]; then
      shift 1
      LOCALDIR="."
    fi
    # Protokoll
    echo "$(date '+%F %T') $# $*" >> $LOCALDIR/$PGM.log
    # Ermittlung des Anrufers
    if [ "$1" = "" ]; then
      CALLER="0"
    else
      CALLER="$1"
    fi
    shift 1
    # Meldung absenden
    echo -e "$PGM $CALLER $*" > $LOCALDIR/$PGM.msg
    cat $LOCALDIR/$PGM.msg | $LOCALDIR/nc -w 1 $HOST $PORT &
    # ggfs. Callback ausloesen
    [ "$1" = "$CALLBACK_MSN" ] || exit
    echo "ATD$CALLER" > $LOCALDIR/$PGM.atd
    cat $LOCALDIR/$PGM.atd | $LOCALDIR/nc -w 1 localhost 1011 &
    # EOF 
    
    Unsere FB steht netzwerktechnisch vor dem LAN, das von einem IPCOP abgeschottet wird. Die Clients, die was anzeigen sollen, sind im LAN, dafür muss jeder Port auf dem IPCOP einzeln freigegeben werden. Deshalb habe ich auf dem Homeserver im LAN einen netcat-basierten Kommunikations-Daemon laufen (CMD=$(netcat -l -p 60000);case $CMD in ... -> Aktion), der über einen einzigen Port alles abwickelt.
    Genauso kann man/frau natürlich auch hier schon den Client (VDR/Dreambox/JFritz etc.) direkt ansteuern. Infos dazu gibts in den entsprechenden Threads.
    Ich ändere lediglich den ersten Parameter auf 0, wenn er leer ist, damit die Anzahl immer stimmt, und reiche ansonsten alle Informationen an den Homeserver unverändert weiter, damit der die Sachen aufbereitet.
    Als Erweiterung wir bei einem eingehenden Anruf auf der MSN 123456 ein Callback ausgelöst, d.h. der Anrufer wird von der FBF angerufen und nach dem Abheben mit FON1 verbunden.
    Fon1 ist seinerseits direkt mit dem analogen Eingang der FBF verbunden und löst eine Durchwahl aus. Nach Eingabe der PIN erhält man dann den Wählton der FBF und kann eine Nebenstelle anrufen oder sich eine Amtsleitung geben lassen.
     
  6. thc

    thc Neuer User

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    99
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    #6 thc, 22 Feb. 2006
    Zuletzt bearbeitet: 23 Feb. 2006
    Kommunikations-Daemon auf dem Homeserver
    Code:
    #!/bin/sh
    
    function f_telefon() {
    shift 1
    /usr/local/sbin/nc-telefon.sh $*
    }
    
    function f_main() {
    CMD="$(netcat -l -p 60000)"
    case "$CMD" in
    telefon*)
      f_telefon $CMD
      ;;
    *)
      sleep 1
      ;;
    esac
    return 0
    }
    
    while [ true ]; do
      f_main || break
    done
    
    Der macht natürlich noch viel mehr, das habe ich aber hier weggelassen.
    Wichtig ist, dass er auf Port 60000 die Info entgegen nimmt und dann die eigentlichen Parameter aus der /var/calllog an das Skript weiter reicht.
     
  7. thc

    thc Neuer User

    Registriert seit:
    15 Sep. 2005
    Beiträge:
    99
    Zustimmungen:
    0
    Punkte für Erfolge:
    6
    #7 thc, 22 Feb. 2006
    Zuletzt bearbeitet: 12 März 2006
    /usr/local/sbin/nc-telefon.sh
    Code:
    #!/bin/sh
    #
    # /usr/local/sbin/nc-telefon.sh
    #
    # Call-Info Fritz!Box
    #
    # Variablen
    BASENAME="$(basename $0)"
    DIRNAME="$(dirname $0)"
    CLIPFILE="$DIRNAME/nc-telefon.csv"
    # Programme
    FGREP="$(which fgrep)"
    NETCAT="$(which netcat)"
    SED="$(which sed)"
    WGET="$(which wget)"
    
    # Funktion zum Verteilen der Meldungen
    f_mesg() {
    # Tests
    [ "$1" ] || return 1
    [ "$2" ] && SLEEP="$2" || SLEEP="0"
    # Protokoll
    echo "$1" | logger -i -t $BASENAME
    # an VDR
    HOSTS="vdr-az vdr-wz"
    for Host in $HOSTS; do
      (sleep $SLEEP ; echo -e "MESG $1\nQUIT" | $NETCAT -w 1 $Host 2001 >/dev/null 2>&1) &
    done
    # an Hosts mit traymessage
    HOSTS="notebook studio"
    for Host in $HOSTS; do
      (sleep $SLEEP ; echo "GET /@$1 HTTP/1.0" | $NETCAT -w 1 $Host 23232 >/dev/null 2>&1) &
    done
    }
    
    # Protokoll
    LOGGER="$(which logger)"
    [ -x $LOGGER ] || exit
    echo "$*" | $LOGGER -i -t $BASENAME
    
    # Vorabtests
    PGMS="fgrep netcat sed wget"
    for Pgm in $PGMS; do
      if [ ! -x $(which $Pgm) ]; then
        echo "$Pgm nicht gefunden" | $LOGGER -i -t $BASENAME
        exit
      fi
    done
    [ -e $CLIPFILE ] || touch $CLIPFILE
    chmod 777 $CLIPFILE
    
    # Anrufer in $CLIPFILE suchen
    if [ "$1" = "0" ]; then
      CALLER="unbekannt"
    else
      CLIP="$(cat $CLIPFILE 2>/dev/null | $FGREP $1;)"
      if [ "$CLIP" ]; then
        CALLER="$(echo $CLIP | $SED -e s/.*$1\;// | $SED -e s/\;.*//)"
      else
        CALLER=""
      fi
    fi 
    
    # Angerufener
    CALLED="$2"
    
    # Leitung
    case "$3" in
    SIP*)
      PORT="Internet"
      ;;
    *)
      PORT="$3"
      ;;
    esac
    
    # Meldungen absetzen
    f_mesg "$PORT $1 $CALLER"
    [ "$CALLER" != "" ] && exit
    
    # Suche von bisher unbekannten Telefonnummern
    case "$1" in
    0) exit ;; # keine Rufnummer uebermittelt
    00*) exit ;; # Ausland
    [^0]*) exit ;; # keine Null am Anfang
    *[^0-9]*) exit ;; # irgendwo keine Ziffer
    esac
    
    # Inverssuche
    HTMFILE="/tmp/telefon.htm"
    rm -rf $HTMFILE
    OPT="--output-file=/dev/null --output-document=$HTMFILE --tries=3 --timeout=10"
    SRV="http://www.dasoertliche.de"
    URI="DB4Web/es/oetb2suche/home.htm?main=Antwort&s=2&SKN=2&kw_invers=$1"
    $WGET $OPT $SRV/$URI
    
    # Auswertung des Aufrufs
    TMPFILE="/tmp/telefon.txt"
    cat $HTMFILE | $SED \
    -e '/<class="blb"[[:space:]]\+href="home.htm/!d' \
    -e 's#<br>#; #g' \
    -e 's#<[^>]*># #g' \
    -e 's#[[:space:]]\+# #g' \
    -e 's#^ ##' \
    -e 's# $##' \
    -e 's# ;#;#g' \
    > $TMPFILE 
    # 1. Alles bis auf die Treffer-Tabelle loeschen
    # 2. alle Zeilenwechsel durch Semikolon plus Leerzeichen ersetzen
    # 3. alle Tags durch Leerzeichen ersetzen
    # 4. alle doppelten Leerzeichen durch einfache ersetzen
    # 5. alle Leerzeichen am Anfang loeschen
    # 6. alle Leerzeichen am Ende loeschen
    # 7. alle Leerzeichen vor Semikolon loeschen
    
    # Treffer in $CLIPFILE aufnehmen
    [ -s $TMPFILE ] || exit
    CLIP="$(date +%F);$1;$(cat $TMPFILE)"
    echo "$CLIP" > $TMPFILE
    cat $CLIPFILE >> $TMPFILE
    cat $TMPFILE > $CLIPFILE
    
    # und den Kunden mitteilen
    CALLER="$(echo $CLIP | $SED -e s/[^\;]*\;//)"
    f_mesg "$CALLER" 5
    
    # EOF
    
    Hier passiert die Aufbereitung der Informationen für den VDR und traymessage.
    In der $CLIPFILE können als Cache im csv-Format Datum;Nummer;Name;Adresse die bekannten Telefonnummern hinterlegt werden.
    vdr-xy heissen unser VDR's und müssen natürlich durch den Namen oder die IP des tatsächlich vorhandenen ersetzt werden.
     
  8. DK9JH

    DK9JH Neuer User

    Registriert seit:
    13 Juni 2006
    Beiträge:
    142
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Hallo thc,

    meine Frage hat nur in technischer Hinsicht mit Deinem Callmonitor zu tun.

    Wenn man schreibt: echo "ATD**9" | nc 127.0.0.1 1011
    wird ein Rundruf an alle Telefone von Telefon 1 ausgelöst. Telefon 1 klingelt dann nicht und auf den anderen wird über Clip "Telefon 1" angezeigt.

    Gibt es die Möglichkeit, den Befehl so zu gestalten, dass nicht vom Telefon1 sondern von einem anderen (z.B. ISDN mit Rufnummer 51) der Rundruf gestartet wird? Dann könnte ich nämlich den Text "Haustür" per Clip übermitteln.

    Wäre toll, wenn Du mir weiter helfen könntest.

    Leider habe ich trotz intensiver Suche im WEB und hier nichts passendes zu diesem Thema gefunden.

    Viele Grüße und besten Dank im Voraus

    DK9JH
     
  9. frank_m24

    frank_m24 IPPF-Urgestein

    Registriert seit:
    20 Aug. 2005
    Beiträge:
    17,571
    Zustimmungen:
    1
    Punkte für Erfolge:
    36
    Ort:
    Niederrhein
    Hallo,

    ich glaube nicht, dass hier nach 2 Jahren noch was passiert. Deshalb lassen wir den Thread mal in Frieden ruhen.

    :beerdigu:
     
Status des Themas:
Es sind keine weiteren Antworten möglich.