Handhabung des UI-Moduls voipstat [veraltet]/ von foncalls.lua

Es sieht immer noch so aus wie am Anfang. Ich kann aber nicht berichten ob das funktioniert oder nicht, denn ich kann es nicht ausführen , egal welcher Interpreter.

Code:
root@fritz:/var/media/ftp# ./voipcheck.lua
-sh: ./voipcheck.lua: not found

Edit: Im Moment sieht das so aus, aber ist alles geraten, genausogut könnte man das von einem Grundschüler schreiben lassen:
Code:
#! /bin/luavar
while true do
    local line = io.read("*line");
   local count,
   require "foncalls"
   local calls = foncalls.get_activecalls()
   if #calls > 0 then
   count = #calls
   io.stdout:write(count);
   print ( "Ja");
   end
   else
   print ("Nein");
   end
   
   --voipcheck.lua
 
Zuletzt bearbeitet:
Ob das SHEBANG funktioniert kannst du im Vorfeld testen, indem du das Skript (im aktuellen Verzeichnis) so aufrufst: luavar voipcheck.lua
 
Das läuft anscheinend durch:
Code:
root@fritz:/var# luavar voipcheck.lua
root@fritz:/var#
Wie erwartet passiert aber erstmal nichts.
 
Das "require" zeigt, so wie es da steht, auf eine Datei im selben Verzeichnis, liegt die da auch wirklich ?
( Oder gibt es einen Suchpfad für LUA Inkludes ? )
Wenn nicht, vollständige Pfadangabe für "foncalls" in "require" probieren.
 
Danke sehr für die Hilfe, ich habe das erstmal angepasst.
Weiterhin erhalte ich beim Versuch die Datei ausführen:
Code:
root@fritz:/var# ./voipcheck.lua
-sh: ./voipcheck.lua: not found
Anmerken möchte ich allerdings dass in update.lua, die ja in einem anderen Verzeichnis als foncalls.lua liegt, aufgerufen wird, ohne dass vorher der exakte Pfad spezifiert ist.
 
Wenn man schon auf der Box ist, kann man das "foncalls.lua"-Module von AVM verwenden, dort gibt es eine Funktion "get_activecalls".
Ich wollte von webcm auf lua umstellen und mein erster Berührungspunkt mit dieser Sprache gestaltet sich schwierig. ;)
Hab die Github Beispiele durchgesehen, danke dafür.

Welchen Pfad erwartet "require"?
Und warum scheitert der komplett simple Code, sobald ich require einkommentiere?
Meldungen scheinen von dem Interpreter irgendwie nicht zu kommen (Aufruf über /bin/luavar).
Kenne mich mit Shellprogrammierung aus, leider nicht mit lua bis jetzt.

Code:
#!/bin/luavar

-- require"/usr/lua/foncalls.lua"

        io.stdout:write("1","\n");

        io.stdout:write("0","\n");

Auch folgende Varianten funktionieren nicht:
-- require"foncalls"
-- require"/usr/lua/foncalls"
-- require"foncalls.lua"
-- require"usr.lua.foncalls"

Etwas peinlich sicher. :rolleyes:
 
  • Like
Reaktionen: CaptainMorgan
Ich war jetzt das WE über mal gar nicht online (so drei Tage selbstverordnete Abstinenz, weil mir jemand einreden wollte, ich wäre "internetsüchtig" - mich würde wirklich mal interessieren, ob der dem Tischler auch erklärt, der wäre hammersüchtig, weil er die Finger an 5 Tagen in der Woche nicht davon lassen kann) - daher habe ich etwas den Faden verloren.

Als "Anleitung", wie man das mit der "/bin/luavar" benutzen kann, sollten doch eigentlich die Beispiele im Repository dienen können ... die benutzen ja auch "print"-Statements, so daß man tatsächlich sieht, daß/ob sie ausgeführt werden. So eines müßte man ja nur mal nehmen und kopieren ... schon sind die Unklarheiten bzgl. des richtigen SheBang Geschichte.

Das "luavar"-Binary läßt sich jedenfalls (m.W., ich habe es zumndest nicht hinbekommen) nicht direkt aufrufen unter Angabe einer Datei mit Lua-Statements ... das habe ich auch irgendwo mal dazugeschrieben. Ich konnte auch nicht wirklich auf Parameter von der Kommandozeile aus dem Lua-Text zugreifen ... ein weiterer Grund, warum ich das bisher nur so eingesetzt habe, daß es von der "exec()"-Funktion des Kernels direkt aufgerufen wird (und dazu muß das über das SheBang erfolgen).

Ansonsten setzt "luavar" m.W. selbst den richtigen Suchpfad für Lua-Module (der dürfte einkompiliert sein) ... das folgende Skript (hier zum ersten Mal erwähnt) funktioniert jedenfalls bei mir (113.06.92, soeben geprüft):
Code:
#! /bin/luavar
txtlib = require("libluatextdb")
while true do
        local line = io.read("*line");
        if (line == nil) then
                break;
        end
        local text = txtlib.get_text(line);
        print(text);
end
Da dort auch kein Pfad angegeben ist, wird die Bibliothek wohl über den internen Pfad gefunden.

Hier wäre das (generelle) "Handbuch" zum "require" (und zu Lua im Allgemeinen, wenn man ins Inhaltsverzeichnis schaut): https://www.lua.org/pil/8.1.html - wenn man das Modul hinterher benutzen will, weist man es eben einer Variablen zu (die verschiedenen Formen des Aufrufs sind irgendwo im Internet dokumentiert).

Das Interface von "luavar" ist auch nicht so ganz komplett (siehe Parameter-Handling und "Aufrufmöglichkeiten") und es ist auch nicht klar, welche Lua-Version AVM verwendet.

Es wäre denkbar, daß sich die "foncalls.lua" tatsächlich nicht ohne weiteres per "require" einbinden läßt ... mangels Fehlernachrichten (aus "luavar" heraus) ist das schwer zu testen (gegen echte Syntax-Fehler hilft aber eine eigene Lua-Version auf der Box, die Freetz-Toolchain kann z.B. eine generieren), wo es klemmt.

Da wären noch genug Abhängigkeiten und Konstrukte in der "foncalls.lua" denkbar, die das Einbinden verhindern könnten ... dann muß man eben direkt auf die "libcallloglua" zurückgreifen:
Code:
#! /bin/luavar
calllog = require("libcallloglua")
calls = calllog.GetAll(15)
print(#calls)
Die "15" hinter dem "GetAll" wird bei AVM durch "typemask" aus den möglichen Definitionen im Textformat zusammengebastelt (siehe foncalls.lua) ... wer alle Anrufe haben will (also die "Anrufliste", die aber die aktiven nicht enthält), setzt einfach eine "7" ein.

Das oben liefert jedenfalls eine "0", wenn kein Anruf läuft ... ob es auch "1" (bis "n") liefert, wenn ein Telefonat aktiv ist, habe ich nicht selbst getestet - als "Anregung" für weitere eigene Experimente sollte das (auch in Kombination mit der "update.lua") ausreichen.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: CaptainMorgan
Ich habe keine Literaturquellen dafür, aber wenn ich mir die Beispiele von PeterPawn oder die update.lua so anschaue, kommt mir der Gedanke das "--" in LUA Kommentarzeilen markiert.
Aus dem selben Grund denke ich auch das require"foncalls" ausreicht, und "luavar" das ganze regelt. Aber es antwortet bestimmt noch jemand der das ganze sicher weiß.
EDIT: PeterPawn war schneller - und gründlicher

EDIT2:
Das verwenden von libcallloglua scheint schneller und einfacher zu sein.
Habe das von PeterPawn gegeben Beispiel während eines Anrufs getestet, Ergebns:
Code:
root@fritz:/var/media/ftp# luavar TEST.lua
1
Wenn "calllog.GetAll(7):
Code:
root@fritz:/var/media/ftp# luavar TEST.lua
399
Das deckt sich ja mir der Angabe von AVM das nur 400 Anrufe gespeichert werden.
 
Zuletzt bearbeitet:
Update:
Momentan läuft die Implemtierung von libcallloglua.so mal im Selbstversuch. In der Konsole funktioniert es sehr gut.
Ich habe noch einige weitere Versuche gestartet, aber aus welchem Grund auch immer schaffe ich es nicht foncalls.get_activecalls() zu verwenden.
Weder das hier (genau wie in update.lua):
Code:
#! /bin/luavar
require"foncalls"
local calls = foncalls.get_activecalls()
print(#calls)

noch sowas hier
Code:
#! /bin/luavar
calllog = require("foncalls")
calls = calllog.GetAll(15)
print(#calls)
geben mir die Null aus, damit hab mir dann auch das Testen während eines Anrufs gespart. Da foncalls.lua ja verwendet wird, muss der Fehler irgendwo bei mir liegen. Ich werde weiter probieren, aber vielleicht springt es ja jemandem ins Auge.


...
Die "15" hinter dem "GetAll" wird bei AVM durch "typemask" aus den möglichen Definitionen im Textformat zusammengebastelt (siehe foncalls.lua) ... wer alle Anrufe haben will (also die "Anrufliste", die aber die aktiven nicht enthält), setzt einfach eine "7" ein.
...
Diese Sache verwirrt mich: In foncalls.lua werden als als mögliche "specifier" Sachen wie 'active' oder 'all' genannt, deren Funktion ich offensichtlich noch nicht überprüfen konnte, wegen obigen Hindernissen.
Oder hat das ganze etwas mit den "lazytables" zu tun?
Um die ursprünglichen Funktionalitäten von Fritz!Load wiederherzustellen wäre es wünschenswert auch z.B. die Nummer des Telefonats auszulesen.
Ich habe libcallloglua.so mal extrahiert um zu schauen ob und wenn wie das damit möglich ist, leider ist die Datei bereits kompiliert (vermute ich), deshalb mit allem was ich so installiert habe nicht lesbar.
 
Die Funktion "GetAll()" der (binären !) Bibliothek "libcallloglua.so" erwartet eine Bit-Maske, mit der angegeben wird, welche Daten man von ihr erwartet.
Code:
local call_types={
  enum={'in','fail','rejected','out','in_active','out_active'},
  bitmask={
    ["in"]=tonumber("0001",2),
    fail=tonumber("0010",2),
    rejected=tonumber("0010",2),
    out=tonumber("0100",2),
    all=tonumber("0111",2),
    active=tonumber("1000",2)
  }
}
"fail" und "rejected" sind offenbar dasselbe (zumindest bei dieser Version der Bibliothek, vielleicht will AVM hier ja irgendwann mal genauer werden) und die Maske gibt offenbar "die Richtung" der zurückzugebenden Anrufe vor. Der Wert für "all" ist dann die (Bit-)Summe der vorhergehenden Werte und offenbar legt Bit 3 (i.d.R. nummeriert man die Bits von rechts nach links mit 0 bis 7 durch, entsprechend der Potenz im Dualsystem) fest, ob dabei die beendeten oder die laufenden Anrufe berücksichtigt werden sollen.

Damit ergibt dann "alle beendeten Anrufe, egal welche Richtung/welches Ergebnis" eben die "7" (das ist binär "0111" in dezimal) und "15" (binär "1111") sind dann die aktiven Anrufe, ungeachtet der Richtung.

Im Endeffekt abstrahiert also AVM hier noch einmal von dieser Bitmaske und gibt den unterschiedlichen Richtungen und "Zuständen" einen Text als Namen mit. Erstens ist das sicherlich (in der "foncalls.lua") leichter zu lesen und zweitens ermöglicht es auch eine Änderung in der "libcallloglua.so", bei der nur diese Definitionen angepaßt werden müssen, weil der Rest durch die anderen Funktionen gekapselt wird und nur an dieser einen Stelle eben die Zeichenketten für die Anzeigen und die Pfade zu den Icons für die Anrufe festgelegt werden.

Mit der "lazy table" mit dem Namen "calllog" aus #27 hast Du doch bereits eine Tabelle mit den laufenden Anrufen und allen ihren "Eigenschaften". Wenn Du für einen laufenden Anruf weitere Informationen aus der Table lesen willst, kannst Du das genau so machen, wie es in der "update.lua" gezeigt wird oder auch in der "foncalls_list.lua" bei der Anzeige der Anrufliste.

Das, was da bisher nach #27 ausgegeben wird (#calls), ist ja die Anzahl der "Zeilen" in der Tabelle ... entweder Du suchst Dir die Namen der "Spalten" aus anderen Lua-Dateien zusammen und fragst nur gezielt den interessanten Wert ab oder Du läßt einfach mal zum Test für jede Zeile über die Spalten iterieren (das macht z.B. "queries.lua" ja auch so, da wäre wieder das Beispiel) und gibst dabei den Namen der Spalte und den Wert aus.

Später kannst Du dann für Deinen konkreten Bedarf aus den vorhandenen Spalten die passende für eine Anzeige bei FRITZ!Load aussuchen und nur noch diese abfragen/ausgeben, wenn die Anzahl der aktiven Anrufe (bzw. der Zeilen in Deiner Tabelle) größer Null ist.

EDIT:
Wegen der längeren Pause von meiner Seite hier mal ein Beispiel, wie man u.a. die laufenden Anrufe ermitteln könnte ... nach der Anzahl der Anrufe in der ersten Zeile, wird für jeden Anruf eine Liste aller vorhandenen "properties" ausgegeben, wobei die Werte in Hochkommata eingeschlossen werden und so (wenn nicht irgendeiner der Werte selbst ein Hochkomma enthält, was man ggf. mit einer Substitution noch abfangen sollte) jede Zeile auch dafür geeignet ist, in Shell-Code direkt mit einem "eval"-Statement als Variablenzuweisung Anwendung zu finden. Diese Variablen kann man dann in der Schleife (das wäre natürlich "außen herum" irgendein "while read line; do eval $line; done" oder so ähnlich) verwenden. Ändert man die "15" in eine "7", ergibt das die Liste aller Anrufe ... und zwar bereits für die Verarbeitung in Shell-Code aufbereitet, was "xmllint" oder ähnliches dann überflüssig macht. Wie man das als Parameter auf der Kommandozeile festlegen könnte, weiß ich leider auch nicht ... ggf. könnte man das über eine Environment-Variable abfragen (oder wieder über STDIN bereitstellen, wobei das hier wohl weniger paßt).
Code:
#! /bin/luavar
calllog=require("libcallloglua")
calls = calllog.GetAll(15)
print(#calls)
if #calls > 0 then
        for i, call in ipairs(calls) do
                io.stdout:write("index=",i,"\t")
                for k, v in pairs(call) do
                        io.stdout:write(k,"='",v,"'\t")
                end
                io.stdout:write("\n")
        end
end
 
Zuletzt bearbeitet:
  • Like
Reaktionen: rolex0815
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.