Problem mit libfreetz und dem ctlmgr

olistudent

IPPF-Urgestein
Mitglied seit
19 Okt 2004
Beiträge
14,787
Punkte für Reaktionen
13
Punkte
38
Um zu verhindern, dass der ctlmgr unsere passwd überschreibt patchen wir jede rc.S mit dem Aufruf der libfreetz (export LD_PRELOAD="libfreetz.so.1.0.0). Dieser Aufruf gilt jedoch nur für die Startskripte. Wenn der ctlmgr über die Kommandozeile oder über das avm-firewall Paket neu startet wird, dann ist diese Variable nicht gesetzt und die passwd ist leer.

Wo könnte man die Variable sinnvollerweise hinzufügen? env.cache? .profile?

Gruß
Oliver
 
Ich bin für ein Wrapper-Skript. Umbenennen von ctlmgr nach ctlmgr.bin, und ein Skript für ctlmgr
Code:
#!/bin/sh
export LD_PRELOAD=libfreetz.so.1.0.0
exec /usr/bin/ctlmgr
Dann muß man sich keine Sorgen mehr machen, auch wenn man das Programm von Hand aufruft.
 
Ich hätte eine andere Lösungsidee: uClibc patchen und libfreetz immer preloaden, egal ob es in LD_PRELOAD steht oder nicht. Spricht was dagegen?

Edit: müssen dann natürlich alle download-toolchains updaten.
 
Zuletzt bearbeitet:
Dagegen spricht zum einen, daß die Lösung nicht sehr elegant ist, und zum anderen, daß die Library für alle Programme in den Speicher geladen wird, ob sie gebraucht wird oder nicht. Das passiert vermutlich jetzt auch schon, wenn LD_PRELOAD in rc.S gesetzt wird.

Im Skript sollte man natürlich noch die Parameter übergeben ("$@").
 
daß die Library für alle Programme in den Speicher geladen wird, ob sie gebraucht wird oder nicht.
Aber ist es nicht im Grunde das, was wir wollen? Wenn irgendein Programm irgendwas an passwd ändern möchte, dann soll es gefälligst die Funktionen aus libfreetz dafür nutzen. libfreetz immer zu preloaden, ist aus meiner Sicht der einfachste Weg, um dies sicherzustellen. Außerdem ist es eine shared-Library, also ist es auch kein Problem, wenn es alle für Programme geladen wird, denn effektiv wird es nur einmal geladen.
 
Wenn irgendein Programm irgendwas an passwd ändern möchte, dann soll es gefälligst die Funktionen aus libfreetz dafür nutzen.
Es gibt kein anderes Programm, das diese Funktion aufrufen würde. Es handelt sich bei dieser Funktion nicht um eine Neu-Implementierung der Standard-Funktionen zum Ändern von Passwörtern, sondern um eine spezielle Funktion von AVM, die nur im ctlmgr aufgerufen wird.

Was den Speicherplatz betrifft, so ist es zwar nicht viel, aber trotzdem unnötig. Auch das Laden einer Shared Library verbraucht Speicher.
 
Auch wenn mir die Idee mit dem "festen" LD_PRELOAD besser gefällt habe ich der Einfachheit halber versucht Ralf's Vorschlag umzusetzen.
http://freetz.org/attachment/ticket/61/ctlmgr_wrapper.patch

Code:
Index: patches/101-ctlmgr_wrapper.sh
===================================================================
--- patches/101-ctlmgr_wrapper.sh	(revision 0)
+++ patches/101-ctlmgr_wrapper.sh	(revision 0)
@@ -0,0 +1,11 @@
+[ "$FREETZ_LIB_libfreetz" == "y" ] || return 0
+
+mv "$FILESYSTEM_MOD_DIR/usr/bin/ctlmgr" "$FILESYSTEM_MOD_DIR/usr/bin/ctlmgr.bin"
+cat << 'EOF' >> "$FILESYSTEM_MOD_DIR/usr/bin/ctlmgr"
+#!/bin/sh
+export LD_PRELOAD=libfreetz.so.1.0.0
+export CTLMGR_BINARY="/usr/bin/ctlmgr.bin"
+exec $CTLMGR_BINARY "$@"
+EOF
+
+chmod 755 "$FILESYSTEM_MOD_DIR/usr/bin/ctlmgr"
Index: patches/101-libfreetz.sh
===================================================================
--- patches/101-libfreetz.sh	(revision 6726)
+++ patches/101-libfreetz.sh	(working copy)
@@ -1,12 +0,0 @@
-[ "$FREETZ_LIB_libfreetz" == "y" ] || return 0
-
-file=${FILESYSTEM_MOD_DIR}/etc/init.d/S01-head
-if [ -e $file ]; then
-	echo1 "patching /etc/init.d/S01-head"
-else
-	file=${FILESYSTEM_MOD_DIR}/etc/init.d/rc.S
-	echo1 "patching /etc/init.d/rc.s"
-fi
-
-modsed 's/export PATH runlevel prevlevel.*$/LD_PRELOAD="libfreetz.so.1.0.0"\ \
-export PATH runlevel prevlevel LD_PRELOAD/' $file

Gruß
Oliver
 
Sofern es sich wirklich um keine Standardfunktion handelt, finde ich Ralfs Vorschlag völlig ausreichend.

(Was bewirkt das Weglassen/ Hinzufügen von "export" ?)
 
Zuletzt bearbeitet:
export macht die Variable auch in Subshells usw. verfügbar. Für das LD_PRELOAD muss man das machen, für die Variable, die nur im Skript selbst verwendet wird nicht.

Gruß
Oliver
 
Danke :) .............
 
Passt!

Hoffe du hast den Felsbrocken nicht aufn Kopp gekriegt.
Hab wie im ric schon erwähnt die r6735 geflashed. Die passwd überlebt nun sowohl reboots als auch Änderungen im AVM-Firewall package.
Von meiner Seite aus schaut das gut aus. Inwieweit das nu nur ein "dirty hack" ist, oder ob das so passt müsst ihr entscheiden.
Zumindest erfüllt es erstmal den Zweck :p
 
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.