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

Status
Für weitere Antworten geschlossen.

thc

Neuer User
Mitglied seit
15 Sep 2005
Beiträge
112
Punkte für Reaktionen
0
Punkte
16
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
 
Zuletzt bearbeitet:
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:
 
/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.
 
Zuletzt bearbeitet:
/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
 
/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.
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
/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.
 
Zuletzt bearbeitet:
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
 
Hallo,

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

:beerdigu:
 
Status
Für weitere Antworten geschlossen.
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.