[Gelöst] Calllog und Wake-on-Call ab AVM 6.20

Danke, bin erst vor 30 Min. nach Hause gekommen. Tatsächlich liefen die scripte nicht, weil am Anfang durch einen Copy-Fehler die Zeilen nicht korrekt übernommen waren.
Also: wie unter #18 funktioniert es!
Vielen Dank auch an Peter!
Gruß

Seme
 
@Seme: Meine Antwort kommt zwar etwas zu spät aber freut mich, dass es auch bei dir jetzt läuft.
Ja, es ist eine VOIP Nummer und dank Peters Script braucht man jetzt zum Glück nicht mehr das SIPx voranstellen oder zu wissen. Die Nummer reicht, ob mit oder ohne Vorwahl ist aber glaube ich Provider abhängig, bei uns beiden mit 1und1 halt ohne :)

Gruß
Bonvie
 
Hallo Peter,
da ich das Script nun einige Wochen im Einsatz habe wollte ich mal hier meine überwiegend positive Erfahrungen darstellen. Ich konnte keine negativen Einflüsse auf die Performance oder ähnliches feststellen. Aus meiner Sicht läuft es wie gewünscht unbemerkt im Hintergrund.
:groesste:

Allerdings scheint es zweimal abgestützt zu sein, was sich darin äußert, das es nicht mehr aktiv im Speicher mit PS zu finden ist und die WakeOnCall nicht mehr funktioniert.
Dies ist mir einmal bei der Einrichtung eines VPN von FritzBox zu FritzBox passiert und einmal bei der Umschaltung von DSL auf VDSL.
Beide Aktionen sind sehr selten (wahrscheinlich sogar einmalig) aber trotzdem die Frage, ob es möglich ist das Script, sollte es nicht mehr aktiv sein, wieder zu starten.

Außer beim Reboot sollte das doch zielführend sein, oder?

Würdest du das in der debug.cfg implementieren und wenn wie?

Gruß
Bonvie
 
@bonvie:
Das ist etwas komplizierter zu realisieren. Angenommen, man überwacht es mit einer unabhängigen Instanz, dann einfach regelmäßig anhand der Prozessliste prüfen bzw. - da das Skript ja sein PID-File "pflegt" - aus dem PID-File (wenn es existiert) den Wert auslesen und prüfen, ob der Prozess noch existiert - in etwa so:
Code:
scriptname=callmonitor
if [ -f /var/run/$scriptname.pid ]; then
    if [ -L /proc/$(cat /var/run/$scriptname.pid)/fd/0 ]; then
        dead=0
    else # PID file still exists, but there's no associated process anymore
        dead=1
    fi
else # PID file deleted, usually the script is not running anymore
    dead=1
fi
if [ $dead -eq 0 ]; then
    echo "alive"
else
    echo "dead"
fi
Das oben stehende ist nur als Denkanstoß gedacht, nicht getestet und "nur so hingeschrieben" ... also eher nicht C&P geeignet, wenn ich einen Syntaxfehler o.ä. übersehen habe bzw. ich würde wahrscheinlich anstelle des direkten Symlink-Tests erst noch einen "IsDirectory"-Test für /proc/$PID machen, weil das die "saubere" Lösung wäre.

Wenn der Prozess tatsächlich beendet wird, weil das 'nc' ein EOF vom Socket erhält (das passiert dann, wenn der 'telefon'-Daemon aus irgendeinem Grund neu gestartet wird), dann könnte man natürlich im ursprünglichen Skript am Ende (nach dem rm für's PID-File) noch ein "sleep irgendwas" und einen anschließenden Neustart über den multid mit einem passenden "delay"-Kommando einbauen.

Das müßte dann aber am besten als "detached" laufen und richtet bei passend gewählten Einstellungen auch keinen weiteren Schaden an, da das "delay" natürlich bei nicht aktivem multid (z.B. bei der Ausführung von /var/post_install im Rahmen eines Reboots) wirkungslos bleibt. Trotzdem muß natürlich ein entsprechendes "sleep" vor dem "delay" sein, denn wenn tatsächlich der "telefon"-Daemon bei irgendwelchen Rekonfigurationen neu gestartet wird, dann ist das mit einiger Sicherheit beim "multid" auch der Fall (der "stirbt" schon beim Rekonfigurieren von VPN-Verbindungen - da muß man "long running scripts" auch entsprechend härten, wenn man über "delay" startet und nicht über einen cron-Daemon, weil man mit AVM-Busybox arbeitet) und dann stirbt der "delaystart"-Job (den könnte man auch mit einem passenden "msgsend multid delaystart ..." selbst einrichten, etwas anderes macht "delay" als Binary auch nicht) mit ihm.

Wenn man also eine Busybox mit crond-Support hat, kann man diese ja problemlos für alle möglichen regelmäßigen Jobs einspannen, dabei dann eben auch für die unabhängige Überwachung. Ansonsten muß man sich eben überlegen, wie man die Überwachung von Prozessen generell organisiert.

Ich habe bei fast allen Kunden auf der Box dafür ein Skript mit einer einzigen "sleep 5"-Schleife laufen, was anhand einer Parameter-Datei mit den zu überwachenden Prozessen (Binary-/Skript-Name, Prüfintervall, PID-File, Start-Parameter) in einem einzelnen "Monitor"-Prozess die anderen überwacht (in etwa so wie oben skizziert) und entsprechende Aktionen vornimmt. Das ist aber weder gut dokumentiert noch sehr allgemein gehalten, das Hinzufügen von neuen Prozessen (bzw. das Löschen von alten) ist auch Bestandteil eines größeren Helper-Skripts, das ich erst auseinandernehmen müßte. Daher will ich es nicht unbedingt zur Verfügung stellen - das ist im Moment mehr ein Beispiel, wie man es nicht machen sollte und die Zeit, um das mal richtig zu machen, fehlt bisher.

EDIT: Um das noch einmal zu verdeutlichen ... wenn man eine eigene Busybox hat und dort die "run service"-Applets (es gibt einige, die zu diesem Komplex gehören) zur Verfügung stehen, dann braucht man die ganze Monitor-Geschichte eigentlich nicht, da die "runsv"-Architektur ja genau auf solche Fälle ausgerichtet ist. Um die Wirkungsweise zu verstehen, ist eine Internet-Suche nach "man runsv" zu empfehlen, die Hilfe zum Applet ist da eher weniger üppig. Mit einem passenden run-Skript läßt sich ein Service immer wieder neu starten, solange sein Monitor-Prozess läuft ... bei vorhandenem finish-Skript kann man auch "Nachbereitung" betreiben und z.B. Protokoll-Dateien sichern/rotieren o.ä. - der Phantasie sind da keine Grenzen gesetzt, man sollte nur dafür sorgen, daß solche Geschichten dann beim Update (prepare_fwupgrade) und beim Neustart (post_install) nicht zu Kuddelmuddel führen und sie entsprechend mit stoppen, indem man diese Skripte passend modifiziert. Bei post_install ist das ganz leicht (liegt ja im beschreibbaren tmpfs unter /var), bei prepare_fwupgrade muß man auch nur eine einzige passende Zeile einfügen und das mache ich bei mir schon immer prophylaktisch am Anfang solcher "terminate"-Scripte - so in der Art: "[ -f my_file_name ] && . my_file_name", damit passiert auch nichts, wenn die Datei nicht existiert, man hat aber immer einen "Hook" zum Eingreifen.
 
Zuletzt bearbeitet:
Danke für die ausführliche Erklärung und gleich vorweg da bin ich noch nicht ganz durchgestiegen, dauert immer etwas länger bei mir in dieser Materie.
Ich hatte mir das eigentlich viel leichter vorgestellt.

Meine Überlegung ging in die Richtung, das EOF ja nur bedeutet, dass der NC aufhört und nicht abstürzt. D.h. der callmonitor wird "normal" beendet und kann mit einem Delay (wenn der 'telefon'-Daemon wieder aktiv ist) wieder gestartet werden. Deswegen hatte ich mir folgende Zeilen für die Debug.cfg überlegt.

Auch diese Zeilen sind noch ungetestet und nicht zum copy/paste geeignet.
Code:
runendless() {
while 1; do
    /var/media/ftp/callmonitor
    sleep 300
fi
}
delay -d 5 CMONITOR /bin/sh runendless

Spricht da etwas dagegen?
 
Spricht da etwas dagegen?
Gegen die Idee an sich nicht ... ist - mit geringen Abwandlungen - ja das, was ich mit dem "nach dem rm für das PID-File" auch als mögliche Lösung angedichtet hatte.

Leider funktioniert die konkrete Umsetzung - so, wie Du Dir das vorstellst - dann doch nicht. Der Aufruf von "/bin/sh" über "delay" benötigt eine Datei und keine innerhalb eines Skriptes definierte Funktion.

Aber Du kannst natürlich dann auch um den 'nc'-Aufruf in dem 'callmonitor'-Skript eine entsprechende Schleife drehen (das 'do' gehört natürlich zum 'nc' noch dazu, also alles ein Befehl von 44 bis 77 im ursprünglichen Skript aus #1). Ich würde allerdings aus reiner Gewohnheit noch eine Abbruchbedingung (z.B. ein kill-File) in die äußere Schleife einbauen ... aber das ist vermutlich nur übertriebener Ordnungssinn.
 
Dann müsste aber doch eine Ergänzung um die zwei Zeilen 79 und 80 auch reichen, oder?

Code:
75 	esac
76 	delay -d 0 $(unique_id) $runcmd TIME=$time ACTION=$action CONNECTION=$connection INTERNAL=$internal OUTGOING=$outgoing CALLED=$called CALLER=$caller DURATION=$duration
77 done
78 rm $pidfile 2>/dev/null

79 sleep 300
80 delay -d 5 CMONITOR /bin/sh /var/media/ftp/callmonitor

81 exit $rc
 
Dann müsste aber doch eine Ergänzung um die zwei Zeilen 79 und 80 auch reichen, oder?
Nein. Beim 'delay' muß die "ID" immer eindeutig sein. Da zu dem Zeitpunkt des nächsten 'delay' in Zeile 80 die vorherige Instanz noch läuft (das ist ja das gesamte Skript), würde das feste "CMONITOR" da nicht funktionieren ... deshalb auch der Aufruf mit $(unique_id) in der Schleife, damit da keine zwei Aufrufe mit derselben ID dabei sind.
 
Abend

Wenn ich das richtig verstanden habe; delay wird von multid ausgeführt.
Warum dann den delay nicht davon abhängig machen? (test $(pidof multid))
Wenn der multid nicht läuft, sind dann alle vorherigen delay ungültig/verschwunden?
 
Wenn ich das richtig verstanden habe; delay wird von multid ausgeführt.
Korrekt. 'delay' macht ein 'msgsend' an den 'multid' und der startet dann nach der eingestellten Verzögerung seinerseits den "Job" - erinnert ein wenig an das 'at'-Kommando, wobei das mit der Job-ID irgendwie nervig ist. Ein neuer Aufruf von 'delay' mit identischer ID führt nämlich doch nicht zur weiteren Verschiebung des Jobs (ich hätte geschworen, daß das tatsächlich mal so war, aber da habe ich mich wohl geirrt oder doch falsch getestet).

Warum dann den delay nicht davon abhängig machen? (test $(pidof multid))
Was erwartest Du davon? Wie willst Du reagieren, wenn der multid nicht vorhanden ist? Warten bis er da ist? Dann wäre das sicherlich denkbar ... aber bei "sleep 300" sollte der schon wieder da sein (um beim Einsatz bei bonvie zu bleiben).

Wenn der multid nicht läuft, sind dann alle vorherigen delay ungültig/verschwunden?
Ja, das ist leider so ... aber wenn man es weiß, kann man entsprechend vorbeugen und es gibt einfach keinen leichteren Weg, ein Skript "detached" zu starten und - wenn man will - gleich noch mit passender Verzögerung. Gilt natürlich nur für originale AVM-Firmware, ansonsten bietet die Busybox bessere Möglichkeiten, wie bereits angemerkt ...

Für ständige Loops ist das auch wirklich nur eine Notlösung, aber es verhindert zumindest, daß man da die unterschiedlichsten "sleep"-Prozesse hat, wenn man viele Aufgaben benötigt, die in Intervallen ausgeführt werden. Da der multid i.d.R. nur abgebrochen und neu gestartet wird, wenn sich auch irgendwas am dsld (und damit am Online-Status) ändert, ist /var/tmp/onlinechanged (wir sind immer noch bei originaler Firmware!) ein geeigneter Ort, um entsprechende Vorkehrungen zu treffen. Wenn man am Beginn mal die PID des multid irgendwo abgelegt hat, erkennt man auch Neustarts des multid recht gut - aber VPN-Rekonfiguration ist ein Problem, da dabei i.d.R. der Online-Status sich nicht ändert.

Am Ende macht das 'delay' nichts anderes, als eine Zeile analog zu folgendem Kommando über die IPC-Mechanismen an den 'multid' zu senden:
Code:
msgsend multid delaystart [I]ID[/I] [I]seconds[/I]:0 [I]command[/I]
Wofür die 0 nach dem Doppelpunkt gut ist, habe ich noch nicht ergründet.

Aber man kann so einen Job auch abbrechen:
Code:
msgsend multid delaystop [I]ID[/I]
Allerdings muß der betreffende Job dann garantiert auch schon ausgeführt werden, sonst endet das 'delaystop' in einem SIGSEGV und die Box startet in naher Zukunft neu.

Ich habe keine Idee, wo das tatsächlich in der Firmware heute noch zum Einsatz kommt, es gibt außer dem schon erwähnten 'delay'-Binary keine weitere Komponente in einer 7490-Firmware, wo das 'delaystart' noch irgendwie auftaucht. Die Suche nach purem "delay" ist natürlich wenig hilfreich, das kommt einfach zu oft vor ... ein probeweiser Austausch des 'delay'-Binary gegen ein Wrapper-Script brachte (vor längerer Zeit mal getestet) auch keine neuen Erkenntnisse.

Wie gesagt, die Busybox ist eigentlich immer die bessere Wahl ... wenn man eine eigene einsetzt. Da es hier (solange 'nc' bei AVM noch drin war) auch um die Lauffähigkeit out-of-the-box (bzw. mit so wenig Modifikationen wie möglich) ging, habe ich zum 'delay' gegriffen ... mache ich aber eben auch gerne, weil der Prozess automatisch "detached" läuft und die "Hänger" bei SSH-Sessions (nach dem Start von Diensten aus solchen Sitzungen) automatisch vermieden werden.
 
Zuletzt bearbeitet:
@Peter: Habe den callmonitor im Post #18 um eine Endlosschleife erweitert. Danke
 
Zuletzt bearbeitet:
Hi,

ich benötige auf meiner 7360SL nur ein angepasstes Calllog um die Anrufe auf meinem Samsung TV anzeigen zu lassen, muss ich dennoch das komplette Posting 18 durchgehen? Oder ist das nur für Wake-on-call relevant?
Im Detail handelt es sich um folgendes Calllog:

#! /bin/sh
DESTINATION=192.168.178.22
CALLEENUM=$2
CALLEE=$3
CALLERNUM=$1
CALLER=$5
IFS=" "
CALLDATE=`date +%Y-%m-%d`
CALLTIME=`date +%H:%M:%S`

# BUILD XML
soap="<?xml version=\"1.0\" encoding=\"utf-8\"?>
<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" >
<s:Body>
<u:AddMessage xmlns:u=\"urn:samsung.com:service:MessageBoxService:1\\\">
<MessageType>text/xml</MessageType>
<MessageID>'$(date +%H%M%S)'</MessageID>
<Message>
&lt;Category&gt;Incoming Call&lt;/Category&gt;
&lt;DisplayType&gt;Maximum&lt;/DisplayType&gt;
&lt;CallTime&gt;
&lt;Date&gt;$CALLDATE&lt;/Date&gt;
&lt;Time&gt;$CALLTIME&lt;/Time&gt;
&lt;/CallTime&gt;
&lt;Callee&gt;
&lt;Number&gt;$CALLEENUM&lt;/Number&gt;
&lt;Name&gt;$CALLEE&lt;/Name&gt;
&lt;/Callee&gt;
&lt;Caller&gt;
&lt;Number&gt;$CALLERNUM&lt;/Number&gt;
&lt;Name&gt;$CALLER&lt;/Name&gt;
&lt;/Caller&gt;
</Message>
</u:AddMessage>
</s:Body>
</s:Envelope>
"

# BUILD HTTP
CRchar=$(echo -e "\r")
message="POST /PMR/control/MessageBoxService HTTP/1.0 $CRchar
Content-Type: text/xml; charset=\"utf-8\" $CRchar
HOST: $DESTINATION $CRchar
Content-Length: $((${#soap}+0)) $CRchar
SOAPACTION: \"urn:samsung.com:service:MessageBoxService:1#AddMessage\"
Connection: close $CRchar
$CRchar
$soap"

# SEND MESSAGE TO TV
echo $message | /usr/bin/nc -w 1 $DESTINATION 52235
 
Hallo an alle,
nach dem Update auf 6.50 scheint das Script aus Post#18 Probleme zu haben. Für die Fehlersuche habe ich alle Echos aktiviert und das Script manuell gestartet. Es werden keine Fehler ausgegeben und das callmonitor.log sieht normal aus bzw. sagt das es einen WOL gesendet wird. Aktuell verwende ich BusyBox v1.21.1 (2013-07-08 10:56:01 CDT) multi-call binary.

Hat jemand noch eine Idee was schief gehen könnte ? :confused:
Code:
# cat /var/tmp/callmonitor.log
3181
14.12.15 08:22:12;RING;0;0xXxXxXxXxX;yYyYyYy;SIP1;
time=Mon Dec 14 08:22:12 CET 2015
action=RING
connID=0
internal number=
outgoing number=
called number=yYyYyYy
calling number=0xXxXxXxXxX
call duration=
14.12.2015  08:22:12  RING on yYyYyYy: send WOL to 00:01:xX:xX:xX:78 due call from 0xXxXxXxXxX
 unknown caller: 0xXxXxXxXxX
14.12.15 08:22:13;DISCONNECT;0;0;
time=Mon Dec 14 08:22:13 CET 2015
action=DISCONNECT
connID=0
internal number=
outgoing number=
called number=
calling number=
call duration=0
Danke und Gruß
Bonvie
 
Es gibt in der AVM-Firmware kein "ether-wake" mehr, das FRITZ!OS selbst löst das inzwischen ohne entsprechendes Binary. Also mußt Du Dir schon noch ein eigenes "ether-wake" mit in die Busybox einbauen lassen oder es als gesondertes Programm bereitstellen.
 
Hallo Peter,
das war schon wieder der passende Hinweis. Danke :p
Ich habe im Post #18 das Script /var/media/ftp/callmonitor_action nur an einer Stelle anpassen müssen.
von:
Code:
ether-wake -b -i lan $wakemac
nach
Code:
/var/media/ftp/busybox-mips ether-wake -b -i lan $wakemac

Danke
Bonvie
 
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.