[Gelöst] xml Parser ohne Freetz

disorganizer

Neuer User
Mitglied seit
14 Mai 2010
Beiträge
115
Punkte für Reaktionen
4
Punkte
18
Gibt es für die Fritzbox ohne Freetz eigentlich einen XML-Parser den man von einem shellscript aus verwenden kann um XML-Files auszuwerten?

Oder in Freetz so das man diesen als Binary auf der ungefreetzten Box verwenden kann?
 
Zuletzt bearbeitet:
Ich weiß ehrlich gesagt nicht, was Du Dir unter einem XML-Parser vorstellst, "den man von einem Shellscript aus verwenden kann", aber ein Programm, mit dem man XML-Files "auswerten" kann, gibt es in freetz - xsltproc. Seit r8640 kann man dieses auch statisch linken, so dass Du es auch auf einer ungefreetzten Box verwenden kannst.

p.s. Für einfache Aufgaben könnten schon grep/sed/awk ausreichen.
 
Das hängt damit zusammen.
Eventuell würde ein solcher ja ausreichen um auch das phonebook auszuwerten.
Es geht im Prinzip dabei darum das fritzbox phonebook zum umzuwandeln das man es z.B. für Cisco Phones als Phonebook verwenden kann.

Was bedeutet "statisch linken" genau bzw wie bekomme ich das in Freetz gemacht?
 
Was bedeutet "statisch linken" genau bzw wie bekomme ich das in Freetz gemacht?
Vereinfacht gesagt bedeutet das, dass Du ein Binary bekommst, welches von keiner weiteren Library (Datei) abhängt. D.h. es reicht dieses eine Binary zu nehmen und es auf die Box zu kopieren, Du brauchst kein freetz zu installieren und sonst keine weitere Datei zu kopieren.

Ich kenne das Format des Telefonbuchs nicht wirklich, denke aber, dass es so einfach ist, dass man Dein Problem auch mit grep/sed/awk lösen kann.

p.s. Eine andere Frage: muss das Ganze wirklich auf der Box geschehen, kann man nicht die xml-Datei auf den PC kopieren und sie dort umwandeln? grep/sed/awk werden als Ersatz für einen echten Parser deswegen akzeptiert, weil sie die Resoursen der Box schonen werden und das Ganze ermöglichen, ohne dass man zusätzliche Binaries auf die Box kopieren muss, aber auf dem PC hat man das Problem nicht und kann alles mögliche verwenden.
 
Warum fängst Du dann hier einen neuen Thread an?
Man nennt so was glaube ich Fehler. Und die sind menschlich.
Dazu ist das Thema hier spezifischer. Zumindest rede ich mir so den Fehler schön.

Vereinfacht gesagt bedeutet das, dass Du ein Binary bekommst, welches von keiner weiteren Library (Datei) abhängt. D.h. es reicht dieses eine Binary zu nehmen und es auf die Box zu kopieren, Du brauchst kein freetz zu installieren und sonst keine weitere Datei zu kopieren.
Die Frage war eher so zu verstehen: Wie mache ich das bei Freetz statisch?

Ich kenne das Format des Telefonbuchs nicht wirklich, denke aber, dass es so einfach ist, dass man Dein Problem auch mit grep/sed/awk lösen kann.
Problem ist das es alles in einer Zeile steht. Ich habe das nicht wirklich hinbekommen (wie gesagt mit meinen bescheidenen Kenntnissen). Aber ja, das wäre mir auch am liebsten.

muss das Ganze wirklich auf der Box geschehen
Wäre gut, da das ganze Live passieren soll oder automatisch ein mal pro Tag. Sonst könnte ich das auch manuell umwandeln.
Ein PC soll nicht unbedingt immer an sein dafür (Stichwort Stromverbrauch).
 
Hast Du denn ein Beispiel dafür, wie die Datei aussieht? Mit sed kann man eine Menge machen.
Wenn einem danach ist, könnte man vermutlich einen kompletten XML-Parser in Shell-Skript schreiben, aber häufig reicht es auch schon, eine bestimmte Teilmenge lesen zu können.
 
Schaut doch bitte mal in den Thread Contact Conversion Wizard.
Die Leute da haben das XML-Telefonbuch der FritzBox offensichtlich komplett analysiert.
Vielleicht muss man dann das Rad nicht neu erfinden.

Joe
 

Anhänge

  • fbpb2cisco.sh.bz2
    497 Bytes · Aufrufe: 12
Zuletzt bearbeitet:
WOW. Das Script funktioniert (ohne Telefonbuchauswahl zwar, aber dennoch).
Einzig am ende bleibt noch ein
<contact><category/><person><realName>ISDN/DECT Rundruf</realName></person><tele
phony><number>50</number></telephony><services/><setup/><mod_time>66</mod_time><
uniqueid>4</uniqueid></contact>
übrig. Das kann ich ja aber mit grep wegbekommen :)

Wenn es nicht zu unverschämt ist... Könntest du den Erklärbär spielen für das Script?

Du definierst die Patterns oben für die 3 möglichen Eintragsvarianten (1 Nummer, 2 Nummern, 3 Nummern am Realname).
Danach definierst du die Ausgabe so das daraus 3 Einträge werden.

Aber erklär mir mal die Anderen Zeilen :)

EDIT:
Zu früh gefreut.
Das Script wirft einige Telefonnumern durcheinander. Mal schauen ob ich ein Muster herausfinde.
 
Zuletzt bearbeitet:
Könntest Du mir bitte Dein Telefonbuch (obfuscated) zur Verfügung stellen, d.h. cat /var/flash/phonebook > irgendeinName.xml und dann alle Namen und Nummern durch Dummies ersetzen, ohne jedoch an der Struktur der Datei, etwas zu ändern (d.h. keine neuen Newlines, die vorhanden auch bitte nicht entfernen). Ich versuche das Skript so anzupassen, dass es auch mit Deinem Telefonbuch umgehen kann und dann erkläre bei Bedarf Zeile für Zeile was es macht ;-)

Mein Telefonbuch enthält nur so um die 30 Einträge, sodass es nicht wirklich zum Testen geeignet ist.

Falls es Dir zu viel Aufwand ist, alles zu obfuscaten, kannst die Datei mir auch per PN zukommen lassen. Ich verspreche, sie wirklich nur zum Testen zu verwenden und danach sofort zu löschen ;-)
 
Zuletzt bearbeitet:
Habe es soweit auch selbst hinbekommen nachdem ich das Script verstanden habe :)
Anbei nun das "upgedatete" Script.

Im Prinzip war es nur das dort auch noch
Code:
<contact
modified="0">
Vorkommt und am ende noch ein
Code:
<contact><category /><person><realName>ISDN/DECT Rundruf</realName></person><telephony><number>50</number></telephony><services /><setup /><mod_time>66</mod_time><uniqueid>4</uniqueid></contact>
Welches von der box sinnigerweise nicht als intern markiert wird.
Der Eintrag wird von meinem "mod" nun erkannt idem ich zusätzlich noch Nummern ohne Numer-Type eintrage.
Geht bestimmt eleganter, aber geht :)

Was noch fehlt ist die phonebooks zu filtern.
Also z.B. nur das zu berücksichtigen was zwischen
Code:
<phonebook owner="1" name="xxxxx">
und
Code:
</phonebook>
steht. Man könnte das ja als Übergabeparameter machen (den Phonebooknamen) und wenn keiner angegeben wurde alles nehmen.

Wenn noch interesse besteht kann ich dir das Phonebook auch schicken.

EDIT:
Version 2.01 noch mit einem gefixten minibug (50 wurde beim Rundrufeintrag nich als Dial sondern als Type ausgegeben)
EDIT2:
Todo wäre auch noch ÄÖÜ zu ersetzen durch die passenden Codes für Cisco oder Ae usw.

EDIT3:
Es werden immer noch ein paar Telefonnummern ausgelassen.
Ich versuch den Fehler zu finden, wenn nicht schicke ich dir einfach mal die phonebook im original zu.

Wenn man per pdb --export eine /tmp/pbd.export erstellt sind die internen nummer übrigens (Inklusive DECT Rundruf) alle weg.
Diese wäre auch weg wenn man das Phonebook selektiert, denn diese sind in einem eigenen Phonebook mit owner 255 gespeichert.
 

Anhänge

  • fbpb2cisco2.01.sh.zip
    595 Bytes · Aufrufe: 4
Zuletzt bearbeitet:
Kleine aber Feine Änderungen am script:
1) pbd --export
Erzeugt die temporäre Datei (ohne interne nummern).
==> ein paar Greps weniger
2) Telefonbuchunterstützung
Wird ein Telefonbuchname als Parameter an das Script übergeben dann wird nur das angegebene Telefonbuch ausgegeben.
3) Fehler in SED contact regex behoben

Also mit meinem exportierten Telefonbuch geht es jetzt.
 

Anhänge

  • fbpb2cisco2.02.zip
    654 Bytes · Aufrufe: 8
Duch das Script von dir habe ich extrem viel über SED gelernt :) Deswegen nochmal ein extra tnx.
 
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.