[Info] Lost in translation ... oder wie man doch noch zu einer verständlichen Lua-Seite bei AVM kommt

PeterPawn

IPPF-Urgestein
Mitglied seit
10 Mai 2006
Beiträge
15,153
Punkte für Reaktionen
1,705
Punkte
113
Wer sich eingehender mit der AVM-Firmware auseinandersetzen will (das sollte man im "Modifikationen"-Unterforum ja unterstellen können), der muß früher oder später auch mal einen Blick in die ".lua"-Dateien wagen, die bei AVM seit einigen Jahren den serverseitigen Teil des GUI bilden.

Dabei stellt man dann sehr schnell fest, daß es einigermaßen schwer ist, dort den Durchblick zu bekommen und das liegt (meiner Meinung nach) an zwei Faktoren:
  1. Der Lua-Code ist in keinster Weise formatiert und nur sehr schwer lesbar, weil man Schachtelungen (in Lua ja immer mit einem "end" abgeschlossen) "auszählen" muß.
  2. Die Zeichenketten, die der Lokalisierung unterliegen (also Textschnipsel, die in die jeweils eingestellte GUI-Sprache zu übersetzen sind), sind dort eben nicht zu finden ... das macht es manchmal schon schwer, überhaupt die richtige Seite zu finden, weil man nicht einfach mit einem "grep" (o.ä.) in den gesamten Lua-Dateien nach einer Zeichenkette suchen lassen kann, die in der Seite auftaucht, die man sich genauer ansehen möchte - sie steht da i.d.R. ganz einfach nicht drin und wird erst bei der Interpretation der Seite aus der Sprach-DB eingefügt.
Dem ersten Punkt kann man noch mit einem "beautifier" zuleibe rücken, wobei ich bisher auch keinen vernünftig funktionierenden gefunden habe, der ("out of the box" zumindest) die Syntax der "server pages" (das ist das Einbetten von Lua-Code zwischen "<?lua ... ?>") beherrscht und gleichzeitig vernünftig einrücken kann ... zumindest keinen, der ohne zusätzlich IDE daherkommt (vermutlich arbeitet AVM mit einer solchen, die das beim Laden wenigstens halbwegs formatiert, denn sonst sind Fehler praktisch vorprogrammiert) bzw. mit den Mitteln, die auf der Box (oder einem kleineren Linux-System, wie einem RasPi mit Raspbian) zur Verfügung stehen, auskommen würde und nicht gleich noch eine Python- oder Java-Installation braucht.

Aber zu diesem Problem komme ich später noch einmal zurück ... jetzt widme ich mich erst mal dem zweiten.

Meines Wissens ist der genaue Aufbau des von AVM verwendeten Formats für die Sprach-DB (die m.E. von TI "geerbt" ist) nirgendwo dokumentiert und meine bisherigen Versuche, das Format "auf die Schnelle" zu verstehen, waren auch nicht von Erfolg gekrönt (Hilfe ist da durchaus willkommen).

Daher benutze ich schon seit langem eine FRITZ!Box mit FRITZ!OS, um die Lua-Seiten aus einer FRITZ!OS-Version wieder so mit den lokalisierten Zeichenketten zu versehen, daß man bei der Analyse auch versteht, was da geschieht. Der generelle Aufruf für die Benutzung der Sprach-DB aus Lua heraus, wurde auch von mir schon an anderen Stellen gezeigt (ich hatte das i.d.R. "dbtext.lua" genannt), aber das funktioniert so wie gezeigt natürlich nur dann, wenn (a) Firmware und Box zusammenpassen und man diesen Aufruf aus der richtigen Version macht (man kann so also keine englische Version auf einer deutschen Firmware erzeugen, weil die deutsche Firmware gar keine Sprach-DB für Englisch enthält) und (b) man überhaupt die passende FRITZ!Box für die zu untersuchende Firmware besitzt.

Daher wäre es schon irgendwie nett, wenn man eine einfache Möglichkeit hätte, sich eine beliebige Lua-Datei aus einer beliebigen Firmware für ein beliebiges Modell so "auflösen" zu lassen, daß dabei die Zeichenketten für die gewählte Sprache eingebaut werden, sofern es von AVM diese Sprache für die Firmware überhaupt gibt. Alles, was man dazu brauchen sollte (solange man das nicht außerhalb der Box nachbauen kann), ist irgendeine (halbwegs aktuelle) FRITZ!Box mit einem Shell-Zugang.

Genau das bietet das von mir neu eingecheckte Shell-Skript "get_page" ... es nimmt als Parameter den Namen einer Lua-Datei entgegen und löst die darin enthaltenen Lokalisierungen in die passenden Zeichenketten auf. Die dafür zu benutzende Sprach-DB ist entweder die aktuelle (wenn der zweite Parameter fehlt) oder man gibt als zweiten Parameter den Namen der Sprach-DB aus der Firmware an, aus der die Lua-Datei auch stammt - dabei hat man dann auch die Wahl der gewünschten Sprache, weil für jede Sprache bei AVM eine DB-Datei existiert.

Allerdings braucht man für die Benutzung dieses Skripts auch eine passende BusyBox ... denn um die Datenbank an der richtigen Stelle zu verlinken und dabei den Rest des FRITZ!OS auf der Box nicht zu stören/irritieren, arbeitet das Skript mit einem privaten Mount-Namespace und das dazu notwendige "unshare"-Applet gehört bei AVM nicht zur BusyBox und bei Freetz m.W. auch nicht. Ich weiß auch nicht sicher, ob das bei Freetz vor der Version 07.0x für die AVM-Firmware problemlos hinzugefügt werden kann und von der fehlenden "setns"-Funktion in der uClibc 0.9.33 nur das "nsenter"-Applet betroffen ist. Am besten nimmt man dafür einfach meine BusyBox aus dem "yf_bin"-Repository (die Version für 3.10.73-Systeme enthält auch den "setns"-Patch für die uClibc 0.9.33) und dann ist man auf der sicheren Seite.

Jedenfalls kann man sich damit dann jede Lua-Seite von AVM auch in einer lesbareren Form (zumindest was die Zeichenketten angeht) ausgeben lassen:
Code:
root@FB7490:/var/media/ftp/YourFritz $ get_page
Usage:

/var/media/ftp/root/bin/get_page <input_file> [ <language_database> ]

Replace all occurrences of localized strings in the specified file with the
text from specified language database. If no database was specified, the
current one (of the host, where this script is running) will be used.

This script has to be executed on a FRITZ!OS device, otherwise the embedded
Lua code will fail to translate the selector into a text message.
root@FB7490:/var/media/ftp/YourFritz $
Die originale Seite bei AVM sieht dann z.B. so aus (hier die Zeitzonen-Einstellung der internationalen 07.01 für die 7490):
Code:
root@FB7490:/var/media/ftp/YourFritz $ cat /var/media/ftp/system/FB7490/firmware/113.07.01-intl/usr/www/avme/system/timezone.lua
<?lua
g_page_type = "all"
g_page_title = ""
g_page_help = "hilfe_system_timezone.html"
dofile("../templates/global_lua.lua")
local timezone = core.lazytable({}, box.query, {
enabled = {"time:settings/tz_enabled"},
offset = {"time:settings/tz_offset"},
offset_minutes = {"time:settings/tz_offset_minutes"},
dst_enabled = {"time:settings/tz_dst_enabled"}
})
local offset_minutes = {
{id = "720", txt = [[{?9017:257?}]]},
{id = "660", txt = [[{?9017:110?}]]},
{id = "600", txt = [[{?9017:435?}]]},
{id = "570", txt = [[{?9017:994?}]]},
{id = "540", txt = [[{?9017:126?}]]},
{id = "480", txt = [[{?9017:492?}]]},
{id = "420", txt = [[{?9017:600?}]]},
{id = "360", txt = [[{?9017:470?}]]},
{id = "300", txt = [[{?9017:345?}]]},
{id = "270", txt = [[{?9017:398?}]]},
{id = "240", txt = [[{?9017:40?}]]},
{id = "210", txt = [[{?9017:227?}]]},
{id = "180", txt = [[{?9017:586?}]]},
{id = "150", txt = [[{?9017:907?}]]},
{id = "120", txt = [[{?9017:883?}]]},
{id = "60", txt = [[{?9017:923?}]]},
{id = "0", txt = [[{?9017:613?}]]},
{id = "-60", txt = [[{?9017:43?}]]},
{id = "-120", txt = [[{?9017:274?}]]},
{id = "-180", txt = [[{?9017:53?}]]},
{id = "-210", txt = [[{?9017:667?}]]},
{id = "-240", txt = [[{?9017:123?}]]},
{id = "-270", txt = [[{?9017:372?}]]},
{id = "-300", txt = [[{?9017:1866?}]]},
{id = "-330", txt = [[{?9017:233?}]]},
{id = "-345", txt = [[{?9017:203?}]]},
{id = "-360", txt = [[{?9017:229?}]]},
{id = "-390", txt = [[{?9017:616?}]]},
{id = "-420", txt = [[{?9017:655?}]]},
{id = "-480", txt = [[{?9017:559?}]]},
{id = "-525", txt = [[{?9017:909?}]]},
{id = "-540", txt = [[{?9017:554?}]]},
{id = "-570", txt = [[{?9017:879?}]]},
{id = "-585", txt = [[{?9017:926?}]]},
{id = "-600", txt = [[{?9017:812?}]]},
{id = "-630", txt = [[{?9017:341?}]]},
{id = "-660", txt = [[{?9017:713?}]]},
{id = "-690", txt = [[{?9017:938?}]]},
{id = "-720", txt = [[{?9017:185?}]]},
{id = "-765", txt = [[{?9017:313?}]]},
{id = "-780", txt = [[{?9017:760?}]]},
{id = "-825", txt = [[{?9017:882?}]]},
{id = "-840", txt = [[{?9017:706?}]]}
}
function write_options()
local default = "0"
if timezone.enabled then
default = timezone.offset_minutes
end
local option
for i, offset in ipairs(offset_minutes) do
option = html.option{value=offset.id, offset.txt}
option.selected = offset.id == default
option.write()
end
end
function write_checked(what)
if timezone[what] == "1" then
box.out([[ checked]])
end
end
if box.post.apply then
local saveset = {}
local anychange = false
local enabled = box.post.enabled and "1" or "0"
anychange = enabled ~= timezone.enabled
cmtable.add_var(saveset, "time:settings/tz_enabled", enabled)
local offset = box.post.offset or "0"
anychange = anychange or offset ~= timezone.offset_minutes
cmtable.add_var(saveset, "time:settings/tz_offset_minutes", offset)
local dst_enabled = box.post.dst_enabled and "1" or "0"
anychange = anychange or dst_enabled ~= timezone.dst_enabled
cmtable.add_var(saveset, "time:settings/tz_dst_enabled", dst_enabled)
local err, msg = box.set_config(saveset)
if err == 0 and anychange then
saveset = {}
webuicookie.set_action_allowed_time()
cmtable.add_var(saveset, webuicookie.vars())
box.set_config(saveset)
http.redirect(href.get("/reboot.lua"))
end
end
?>
<?include "templates/html_head.html" ?>
<style type="text/css">
</style>
<script type="text/javascript" src="/js/handlers.js"></script>
<script type="text/javascript">
ready.onReady(function(){
enableOnClick({inputName: "enabled", classString: "enableif_tzenabled"});
});
</script>
<?include "templates/page_head.html" ?>
<form name="mainform" method="POST" action="<?lua box.html(box.glob.script) ?>" class="extremwide">
<?lua href.default_submit('apply') ?>
<p>
{?9017:699?}
</p>
<div>
<input type="checkbox" id="uiEnabled" name="enabled" <?lua write_checked('enabled') ?>><label for="uiEnabled">{?9017:765?}</label>
</div>
<div class="formular">
<label for="uiOffset">
{?9017:629?}
</label>
<select name="offset" id="uiOffset" class="enableif_tzenabled">
<?lua write_options() ?>
</select>
</div>
<div class="formular">
<input type="checkbox" id="uiDst_enabled" name="dst_enabled" class="enableif_tzenabled" <?lua write_checked('dst_enabled') ?>><label for="uiDst_enabled">
{?9017:214?}
</label>
</div>
<br>
<strong>{?9017:808?}</strong>
<p>{?9017:255?}</p>
<div id="btn_form_foot">
<button type="submit" name="apply" id="uiApply">{?txtApply?}</button>
<button type="submit" name="cancel">{?txtCancel?}</button>
</div>
<input type="hidden" name="sid" value="<?lua box.html(box.glob.sid) ?>">
</form>
<?include "templates/page_end.html" ?>
<?include "templates/html_end.html" ?>
root@FB7490:/var/media/ftp/YourFritz $
und je nachdem, in welcher Sprache man sich das dann ausgeben läßt, sieht das Ergebnis dann so aus:
Code:
root@FB7490:/var/media/ftp/YourFritz $ get_page /var/media/ftp/system/FB7490/firmware/113.07.01-intl/usr/www/avme/system/timezone.lua /var/media/ftp/system/FB7490/firmware/113.07.01-intl/etc/htmltext_en.db
<?lua
g_page_type = "all"
g_page_title = ""
g_page_help = "hilfe_system_timezone.html"
dofile("../templates/global_lua.lua")
local timezone = core.lazytable({}, box.query, {
enabled = {"time:settings/tz_enabled"},
offset = {"time:settings/tz_offset"},
offset_minutes = {"time:settings/tz_offset_minutes"},
dst_enabled = {"time:settings/tz_dst_enabled"}
})
local offset_minutes = {
{id = "720", txt = [[GMT -12 hours]]},
{id = "660", txt = [[GMT -11 hours]]},
{id = "600", txt = [[GMT -10 hours]]},
{id = "570", txt = [[GMT -9.5 hours]]},
{id = "540", txt = [[GMT -9 hours]]},
{id = "480", txt = [[GMT -8 hours]]},
{id = "420", txt = [[GMT -7 hours]]},
{id = "360", txt = [[GMT -6 hours]]},
{id = "300", txt = [[GMT -5 hours]]},
{id = "270", txt = [[GMT -4.5 hours]]},
{id = "240", txt = [[GMT -4 hours]]},
{id = "210", txt = [[GMT -3.5 hours]]},
{id = "180", txt = [[GMT -3 hours]]},
{id = "150", txt = [[GMT -2.5 hours]]},
{id = "120", txt = [[GMT -2 hours]]},
{id = "60", txt = [[GMT -1 hour]]},
{id = "0", txt = [[]]},
{id = "-60", txt = [[GMT +1 hour]]},
{id = "-120", txt = [[GMT +2 hours]]},
{id = "-180", txt = [[GMT +3 hours]]},
{id = "-210", txt = [[GMT +3.5 hours]]},
{id = "-240", txt = [[GMT +4 hours]]},
{id = "-270", txt = [[GMT +4.5 hours]]},
{id = "-300", txt = [[GMT +5 hours]]},
{id = "-330", txt = [[GMT +5.5 hours]]},
{id = "-345", txt = [[GMT +5.75 hours]]},
{id = "-360", txt = [[GMT +6 hours]]},
{id = "-390", txt = [[GMT +6.5 hours]]},
{id = "-420", txt = [[GMT +7 hours]]},
{id = "-480", txt = [[GMT +8 hours]]},
{id = "-525", txt = [[GMT +8.75 hours]]},
{id = "-540", txt = [[GMT +9 hours]]},
{id = "-570", txt = [[GMT +9.5 hours]]},
{id = "-585", txt = [[GMT +9.75 hours]]},
{id = "-600", txt = [[GMT +10 hours]]},
{id = "-630", txt = [[GMT +10.5 hours]]},
{id = "-660", txt = [[GMT +11 hours]]},
{id = "-690", txt = [[GMT +11.5 hours]]},
{id = "-720", txt = [[GMT +12 hours]]},
{id = "-765", txt = [[GMT +12.75 hours]]},
{id = "-780", txt = [[GMT +13 hours]]},
{id = "-825", txt = [[GMT +13.75 hours]]},
{id = "-840", txt = [[GMT +14 hours]]}
}
function write_options()
local default = "0"
if timezone.enabled then
default = timezone.offset_minutes
end
local option
for i, offset in ipairs(offset_minutes) do
option = html.option{value=offset.id, offset.txt}
option.selected = offset.id == default
option.write()
end
end
function write_checked(what)
if timezone[what] == "1" then
box.out([[ checked]])
end
end
if box.post.apply then
local saveset = {}
local anychange = false
local enabled = box.post.enabled and "1" or "0"
anychange = enabled ~= timezone.enabled
cmtable.add_var(saveset, "time:settings/tz_enabled", enabled)
local offset = box.post.offset or "0"
anychange = anychange or offset ~= timezone.offset_minutes
cmtable.add_var(saveset, "time:settings/tz_offset_minutes", offset)
local dst_enabled = box.post.dst_enabled and "1" or "0"
anychange = anychange or dst_enabled ~= timezone.dst_enabled
cmtable.add_var(saveset, "time:settings/tz_dst_enabled", dst_enabled)
local err, msg = box.set_config(saveset)
if err == 0 and anychange then
saveset = {}
webuicookie.set_action_allowed_time()
cmtable.add_var(saveset, webuicookie.vars())
box.set_config(saveset)
http.redirect(href.get("/reboot.lua"))
end
end
?>
<?include "templates/html_head.html" ?>
<style type="text/css">
</style>
<script type="text/javascript" src="/js/handlers.js"></script>
<script type="text/javascript">
ready.onReady(function(){
enableOnClick({inputName: "enabled", classString: "enableif_tzenabled"});
});
</script>
<?include "templates/page_head.html" ?>
<form name="mainform" method="POST" action="<?lua box.html(box.glob.script) ?>" class="extremwide">
<?lua href.default_submit('apply') ?>
<p>
The time zone is set automatically as soon as the FRITZ!Box establishes an internet connection. To adjust the time zone setting manually, enable the option below and set the time difference from GMT (Greenwich Mean Time).
</p>
<div>
<input type="checkbox" id="uiEnabled" name="enabled" <?lua write_checked('enabled') ?>><label for="uiEnabled">Set the time zone manually</label>
</div>
<div class="formular">
<label for="uiOffset">
Enter your time zone relative to GMT:
</label>
<select name="offset" id="uiOffset" class="enableif_tzenabled">
<?lua write_options() ?>
</select>
</div>
<div class="formular">
<input type="checkbox" id="uiDst_enabled" name="dst_enabled" class="enableif_tzenabled" <?lua write_checked('dst_enabled') ?>><label for="uiDst_enabled">
Enable daylight saving time
</label>
</div>
<br>
<strong>Attention!</strong>
<p>If you change these settings, the FRITZ!Box will be restarted automatically to apply the settings.</p>
<div id="btn_form_foot">
<button type="submit" name="apply" id="uiApply">Apply</button>
<button type="submit" name="cancel">Cancel</button>
</div>
<input type="hidden" name="sid" value="<?lua box.html(box.glob.sid) ?>">
</form>
<?include "templates/page_end.html" ?>
<?include "templates/html_end.html" ?>
root@FB7490:/var/media/ftp/YourFritz $
oder auch so:
Code:
root@FB7490:/var/media/ftp/YourFritz $ get_page /var/media/ftp/system/FB7490/firmware/113.07.01-intl/usr/www/avme/system/timezone.lua /var/media/ftp/system/FB7490/firmware/113.07.01-intl/etc/htmltext_it.db
<?lua
g_page_type = "all"
g_page_title = ""
g_page_help = "hilfe_system_timezone.html"
dofile("../templates/global_lua.lua")
local timezone = core.lazytable({}, box.query, {
enabled = {"time:settings/tz_enabled"},
offset = {"time:settings/tz_offset"},
offset_minutes = {"time:settings/tz_offset_minutes"},
dst_enabled = {"time:settings/tz_dst_enabled"}
})
local offset_minutes = {
{id = "720", txt = [[GMT -12 ore]]},
{id = "660", txt = [[GMT -11 ore]]},
{id = "600", txt = [[GMT -10 ore]]},
{id = "570", txt = [[GMT -9,5 ore]]},
{id = "540", txt = [[GMT -9 ore]]},
{id = "480", txt = [[GMT -8 ore]]},
{id = "420", txt = [[GMT -7 ore]]},
{id = "360", txt = [[GMT -6 ore]]},
{id = "300", txt = [[GMT -5 ore]]},
{id = "270", txt = [[GMT -4,5 ore]]},
{id = "240", txt = [[GMT -4 ore]]},
{id = "210", txt = [[GMT -3,5 ore]]},
{id = "180", txt = [[GMT -3 ore]]},
{id = "150", txt = [[GMT -2,5 ore]]},
{id = "120", txt = [[GMT -2 ore]]},
{id = "60", txt = [[GMT -1 ora]]},
{id = "0", txt = [[]]},
{id = "-60", txt = [[GMT +1 ora]]},
{id = "-120", txt = [[GMT +2 ore]]},
{id = "-180", txt = [[GMT +3 ore]]},
{id = "-210", txt = [[GMT +3,5 ore]]},
{id = "-240", txt = [[GMT +4 ore]]},
{id = "-270", txt = [[GMT +4,5 ore]]},
{id = "-300", txt = [[GMT +5 ore]]},
{id = "-330", txt = [[GMT +5,5 ore]]},
{id = "-345", txt = [[GMT +5,75 ore]]},
{id = "-360", txt = [[GMT +6 ore]]},
{id = "-390", txt = [[GMT +6,5 ore]]},
{id = "-420", txt = [[GMT +7 ore]]},
{id = "-480", txt = [[GMT +8 ore]]},
{id = "-525", txt = [[GMT +8,75 ore]]},
{id = "-540", txt = [[GMT +9 ore]]},
{id = "-570", txt = [[GMT +9,5 ore]]},
{id = "-585", txt = [[GMT +9,75 ore]]},
{id = "-600", txt = [[GMT +10 ore]]},
{id = "-630", txt = [[GMT +10,5 ore]]},
{id = "-660", txt = [[GMT +11 ore]]},
{id = "-690", txt = [[GMT +11,5 ore]]},
{id = "-720", txt = [[GMT +12 ore]]},
{id = "-765", txt = [[GMT +12,75 ore]]},
{id = "-780", txt = [[GMT +13 ore]]},
{id = "-825", txt = [[GMT +13,75 ore]]},
{id = "-840", txt = [[GMT +14 ore]]}
}
function write_options()
local default = "0"
if timezone.enabled then
default = timezone.offset_minutes
end
local option
for i, offset in ipairs(offset_minutes) do
option = html.option{value=offset.id, offset.txt}
option.selected = offset.id == default
option.write()
end
end
function write_checked(what)
if timezone[what] == "1" then
box.out([[ checked]])
end
end
if box.post.apply then
local saveset = {}
local anychange = false
local enabled = box.post.enabled and "1" or "0"
anychange = enabled ~= timezone.enabled
cmtable.add_var(saveset, "time:settings/tz_enabled", enabled)
local offset = box.post.offset or "0"
anychange = anychange or offset ~= timezone.offset_minutes
cmtable.add_var(saveset, "time:settings/tz_offset_minutes", offset)
local dst_enabled = box.post.dst_enabled and "1" or "0"
anychange = anychange or dst_enabled ~= timezone.dst_enabled
cmtable.add_var(saveset, "time:settings/tz_dst_enabled", dst_enabled)
local err, msg = box.set_config(saveset)
if err == 0 and anychange then
saveset = {}
webuicookie.set_action_allowed_time()
cmtable.add_var(saveset, webuicookie.vars())
box.set_config(saveset)
http.redirect(href.get("/reboot.lua"))
end
end
?>
<?include "templates/html_head.html" ?>
<style type="text/css">
</style>
<script type="text/javascript" src="/js/handlers.js"></script>
<script type="text/javascript">
ready.onReady(function(){
enableOnClick({inputName: "enabled", classString: "enableif_tzenabled"});
});
</script>
<?include "templates/page_head.html" ?>
<form name="mainform" method="POST" action="<?lua box.html(box.glob.script) ?>" class="extremwide">
<?lua href.default_submit('apply') ?>
<p>
Il fuso orario si configura automaticamente quando viene stabilita una connessione Internet. Per impostare il fuso orario manualmente attivate l'opzione che segue e impostate la differenza rispetto a GMT.
</p>
<div>
<input type="checkbox" id="uiEnabled" name="enabled" <?lua write_checked('enabled') ?>><label for="uiEnabled">Impostare fuso orario manualmente</label>
</div>
<div class="formular">
<label for="uiOffset">
Indicate il vostro fuso orario rispetto a GMT:
</label>
<select name="offset" id="uiOffset" class="enableif_tzenabled">
<?lua write_options() ?>
</select>
</div>
<div class="formular">
<input type="checkbox" id="uiDst_enabled" name="dst_enabled" class="enableif_tzenabled" <?lua write_checked('dst_enabled') ?>><label for="uiDst_enabled">
Attivare ora legale
</label>
</div>
<br>
<strong>Attenzione!</strong>
<p>Se modificate queste impostazioni il FRITZ!Box si riavvia automaticamente per applicare le impostazioni.</p>
<div id="btn_form_foot">
<button type="submit" name="apply" id="uiApply">Applica</button>
<button type="submit" name="cancel">Annulla</button>
</div>
<input type="hidden" name="sid" value="<?lua box.html(box.glob.sid) ?>">
</form>
<?include "templates/page_end.html" ?>
<?include "templates/html_end.html" ?>
root@FB7490:/var/media/ftp/YourFritz $
Wie man das dann noch mit der Hilfe eines "beautifiers" (und zwar einem, der in Lua geschrieben ist und damit ggf. noch ein weiteres Lua-Binary braucht, aber keine Perl-, Python- oder Java-Installation auf der Box) in eine besser lesbare Form bringt, kommt demnächst ... und dafür reserviere ich mir auch den zweiten Beitrag in diesem Thread, damit ich das dann unmittelbar hier im Anschluß noch ausführen kann, ohne an das Zeichenlimit für einen Beitrag zu stoßen.

Jedenfalls kann man mit diesem Skript dann seiner Phantasie auch wieder freien Lauf lassen ... das geht vom Iterieren über alle vorhandenen Lua-Dateien in einem Verzeichnis bis zum "Webservice" auf einer ausgemusterten FRITZ!Box, der einem die Seiten anhand der ebenfalls übermittelten Sprach-DB passend übersetzt und ausgibt. Wobei die Sprach-DBs knapp 1 MB groß sind ... wer das also per "Webservice" automatisiert ersetzen lassen will für eine komplette Firmware, der sollte sich einen Mechanismus schaffen, bei dem die Sprach-DB nur ein einziges Mal hochgeladen werden muß und dann immer diese verwendet wird, bis man sie wieder durch eine andere ersetzt.

Wie weit die nun "modellspezifisch" sind, kann ich gar nicht genau sagen ... zumindest sind sie gerne mal versionsabhängig, weil immer wieder Messages dazukommen.

Jedenfalls viel Spaß beim Nachnutzen (falls es jemand brauchen kann) ... Anregungen für Verbesserungen sind auch willkommen (sofern man die dann auch diskutieren und hinterfragen darf).

Wenn jemand das DB-Format kennt und erklären kann, wäre das noch besser ... dann könnte man da nämlich auch Ersetzungen vornehmen und sogar eigene Nachrichten hinzufügen. Die "Indizes" in diese DB sind jedenfalls "konstant" (jedenfalls solange ich das verfolge) und ändern sich auch mit wechselndem Inhalt (sowohl von Nachrichten als auch der gesamten DB) nicht. Da bei AVM ja auch die Firmware derselben Version über mehrere Modelle i.d.R. identisch ist (bis hin zu diesen Lua-Dateien und den dort zu findenden "tags" für die Zeichenketten), kann das auch nicht modellspezifisch sein und damit haben die Indizes wohl nur noch wenig damit zu tun, an welcher Position innerhalb der DB eine Zeichenkette steht.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Fireball3
[ reserviert für die Beschreibung des Beautifiers, die irgendwann mal nachgereicht wird ... wer sich vorher schlau machen will, es handelt sich um eine Modifikation dieses hier: https://github.com/stravant/LuaMinify - nur versteht das Original halt die Server-Pages-Syntax kein Stück ]
 

Zurzeit aktive Besucher

Statistik des Forums

Themen
244,868
Beiträge
2,219,770
Mitglieder
371,584
Neuestes Mitglied
porcupine
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.