Telenet Fritzbox Frage

... deswegen solltes du nach dem Namen von "Javascriptfunktionen" oder sowas suchen ;-); aber passen sollte die Datei, wenn man z.B. nach "hintlist" sucht:

Code:
joerg@Ubuntu-11:~/freetz-trunk/7360/original/filesystem$ grep -r hintlist usr/www/
usr/www/ewetel/fon_num/fonbook_photo.lua:local ul = html.ul({class="hintlist"})
usr/www/ewetel/internet/kids_useredit.lua:html.ul{class="hintlist",
usr/www/ewetel/internet/umts_settings.lua:html.ul{class="hintlist",
usr/www/ewetel/internet/umts_settings.lua:html.ul{class="hintlist",
usr/www/ewetel/assis/internet_dsl.lua:html.ul{class="hintlist",
usr/www/ewetel/assis/internet_dsl.lua:html.ul{class="hintlist",
usr/www/ewetel/errors/ERR_NOT_FOUND:  ul.hintlist {
usr/www/ewetel/errors/ERR_NOT_FOUND:  ul.hintlist li {
usr/www/ewetel/errors/kids/ERR_NOT_FOUND:  ul.hintlist {
usr/www/ewetel/errors/kids/ERR_NOT_FOUND:  ul.hintlist li {
usr/www/ewetel/errors/kids/ERR_NOT_FOUND:        <ul class="hintlist">
usr/www/ewetel/errors/kids/ERR_NOT_ALLOWED:  ul.hintlist {
usr/www/ewetel/errors/kids/ERR_NOT_ALLOWED:  ul.hintlist li {
usr/www/ewetel/css/default/main.css:ul.hintlist a,
usr/www/ewetel/css/default/main.css:ul.hintlist {
usr/www/ewetel/css/default/main.css:ul.hintlist li {
usr/www/ewetel/lua/isphtml.lua:local ul=html.ul{class="hintlist"}
joerg@Ubuntu-11:~/freetz-trunk/7360/original/filesystem$
Wenn es das oben schon vermutete Cache-Problem im ctlmgr ist, hilft ein Neustart des Daemons (ich mache zur "Sicherheit" immer noch einen Sekundenschlaf mit rein ;-)):
ctlmgr -s; sleep 1; ctlmgr
 
# ctlmgr -s (zum beenden)
# ctlmgr (starten)

das war entscheident! danke!!! ich werde später wenn ich wieder zuhause bin noch testen ob ich das alles in die debug bekomme um es reboot fähig zu machen! danke

aber die url kann man nicht ändern oder? sprich statt http://multi.box:8182/blocked soll entweder die eingegebene seite kommen oder halt irgendetwas neutrales wenns sein muss auch nur google? :D
 
Zuletzt bearbeitet:
hm leider hat die änderung den reboot nicht überlebt. die debug.cfg ist leider leer..
wo ist der fehler?

Code:
vi /var/tmp/debug.cfg

##debug.cfg
mkdir /var/tmp/kids
cd /var/tmp/kids


cat << 'EOF' > /var/tmp/kids/ERR_NOT_FOUND
<!DOCTYPE html>
<html>

<body>
<p></p>

</body>
</html>
EOF

cp /var/tmp/kids/ERR_NOT_FOUND /var/tmp/kids/ERR_NOT_ALLOWED

mount -o bind /var/tmp/kids/ /var/html/errors/kids
ctlmgr -s
sleep 10
ctlmgr
##debug ende
cat /var/tmp/debug.cfg > /var/flash/debug.cfg
 
Zuletzt bearbeitet:
es führt kein weg an freetz vorbei oder? anscheind geht das mit der debug.cfg nicht mehr laut google :D
 
Leider musste ich um die FritzBox zu retten ein Recovery machen und habe jetzt
FRITZ!OS 06.03
Drauf..
 
Bei der funktioniert die debug.cfg auch (noch).
Hast du die Hinweise zu den /var/flash Dateien beachtet?
 
Bei der funktioniert die debug.cfg auch (noch).
Hast du die Hinweise zu den /var/flash Dateien beachtet?


so habe ich die befehle eingegeben auch in dieser reihenfolge

Code:
vi /var/tmp/debug.cfg

##debug.cfg
mkdir /var/tmp/kids
cd /var/tmp/kids


cat << 'EOF' > /var/tmp/kids/ERR_NOT_FOUND
<!DOCTYPE html>
<html>

<body>
<p></p>

</body>
</html>
EOF

cp /var/tmp/kids/ERR_NOT_FOUND /var/tmp/kids/ERR_NOT_ALLOWED

mount -o bind /var/tmp/kids/ /var/html/errors/kids
ctlmgr -s
sleep 10
ctlmgr
##debug ende
cat /var/tmp/debug.cfg > /var/flash/debug.cfg
 
Jetzt poste bitte mal die Ausgabe von: ls -la /var/flash/debug.cfg
Teste auch ob alles drinne steht mit: cat /var/flash/debug.cfg

Und schau auch mal in der /etc/init.d/rc.tail.sh ob folgender Inhalt vorhanden ist...
Code:
##########################################################################################
## user rc file
##########################################################################################
if [ -z "$CPU_NR" ] || [ "$CPU_NR" = "1" ] ; then
mknod /var/flash/debug.cfg c $tffs_major $((0x62))
if ! /usr/bin/checkempty /var/flash/debug.cfg 2>/dev/null; then
. /var/flash/debug.cfg
fi
fi
 
Zuletzt bearbeitet:
# ls -la /var/flash/debug.cfg
Code:
-rw-r--r--    1 root     root             6 Oct  9 11:38 /var/flash/debug.cfg


cat /var/flash/debug.cfg
inhalt erscheint wie es soll



rc.tail =

Code:
# cat /etc/init.d/rc.tail.sh
##########################################################################################
## Betriebsstundenzaehler & Watchdog
##########################################################################################
/bin/run_clock -c /dev/tffs -d
echo init-done >/dev/watchdog
#########################################################################
## Damit auch Oops zum Reboot fuehren
#########################################################################
echo 1 > /proc/sys/kernel/panic_on_oops
## spaeter wenn die tests vorbei sind
## rm -f /var/env
#########################################################################
## lade Powerinfo-Tabelle (fuer Energiemonitor)
#########################################################################
if [ -f /lib/modules/pm_info.in ]; then
cat /lib/modules/pm_info.in >/dev/avm_power
fi
#########################################################################
## set printk level to KERN_ERR
#########################################################################
echo "4" > /proc/sysrq-trigger
#########################################################################
## on-demand cpufreq-governor verwenden
#########################################################################
## echo MODE=speedstep_on >/dev/avm_power
if test -x /usr/bin/ethnator ; then
/usr/bin/ethnator -d /etc/init.d/linkdown.sh -u etc/init.d/linkup.sh
fi
#########################################################################
## cleanup - if running, stop debug (0 normal, 1 flush buffer)
#########################################################################
if `ps | grep -v grep | grep -q "cat /dev/debug"` ; then
echo Info: have to stop 'cat /dev/debug'.
echo AVMDBG_EOF 1 >/dev/debug
fi;
#########################################################################
## PTEST: warten, bis der laufenende WLAN-Lifetest beendet ist
#########################################################################
if [ -n "$PTEST_WAIT_PID" ] ; then
wait $PTEST_WAIT_PID
fi
#########################################################################
## modulemem: mit 'fork' <set_m_sleep> Minuten warten, bis alle module gestartet sind.
#########################################################################
if [ -x "/bin/set_modulemem" ] ; then
set_m_sleep=$((10*60))
nohup sh -c "echo \"\$0[\$\$]: ++++fork set_modulemen, sleep ${set_m_sleep}++++\" > /dev/console ; sleep ${set_m_sleep}; echo \"\$0[\$\$]: ++++do set_modulemen++++\" > /dev/console; /bin/set_modulemem;" &
fi
#########################################################################
exit 0
#
 
Zuletzt bearbeitet:
EWE Fritz!OS 6.03

Die Unterstützung für den Autostart der debug.cfg wurde aus der wohl eindeutig entfernt.
Sie existiert auch bei dir nicht, bis du sie mit dem Skript (cat) selber erstellt hast.
Denn normalerweise sieht die so aus...
Code:
crw-r--r--    1 root     root      243,  98 Jan  1  1970 /var/flash/debug.cfg
...also nix mit debug.cfg.

Tip: Mit der farbigen Ausgabe des ls Befehls siehst du das sofort: ls -la --color=auto /var/flash
 
Zuletzt bearbeitet:
also muss ich freetz installieren?...
habe beim versuchen mein fritzbox zu entbranden von ewetel zu einer normalen 7360 die vor ein paar tagen erst in eine reboot schleife gebracht und 3 tage gebraucht um sie zu retten :D (es ging nur wenn ich alle "unwichtigen" netzwerk adapter deaktiviert habe)
 
Eventuell, wenn entbrandet und sie sofort recovern tust, aber nur wenn sie keine provider_additive hat.

1. Auf AVM branden...
Code:
echo "firmware_version avm" > /proc/sys/urlader/environment
2. Kein Neustart, sondern recovern. (Fritz!OS 6.03 von AVM)

Ein Versuch macht klug. ;)
 
Zuletzt bearbeitet:
passiert nichts wenn ich das mache bleibt ewetel
 
passiert nichts wenn ich das mache bleibt ewetel
Was willst Du am Ende erreichen ? Eine Box, auf der Du andere Firmware installieren kannst oder reicht es Dir auch (mit etwas mehr Aufwand, aber ohne Modifikation der vorliegenden Firmware) in der gebrandeten Software eine debug.cfg ausführen zu können ?
 
ich möchte nur daten im /var/html/errors/kids ändern und es reboots überstehen lassen, der weg ist mir egal (der weg ist das ziel) :DD
 
der weg ist mir egal (der weg ist das ziel)
Die Firmware enthält in der Datei /etc/init.d/S44-hostname eine "command injection"-Schwachstelle. Diese läßt sich nicht extern ausnutzen, trotzdem beginnt AVM nach der Meldung dieses Problems mit seiner Behebung. Diese Stelle ist aber in der vorliegenden Firmware noch geeignet, eigene Kommandos in den Start-Prozess einzubauen.

Dazu muß nur in der ar7.cfg im "hostname"-Eintrag eine passende Zeichenkette abgelegt werden. Das Schema wäre:

hostname = "fritz.box$(...eigene_kommandos ...)";

Allerdings muß man beachten, daß diese Datei ziemlich früh im Bootprozess aufgerufen wird und es nicht unbedingt sinnvoll ist, dort bereits die Modifikationen am System vorzunehmen. Besser ist es, wenn man dort nur die Vorbereitungen trifft, damit die debug.cfg oder irgendein anderes benutzerdefiniertes Skript irgendwo wieder in den Bootprozess einbezogen wird. In etwa so:
Code:
n=97;v=/var/$n;mkconfigfile $v $n;zcat $v|sh;rm $v
Diese wenigen Zeichen (der Platz im "hostname"-Statement ist begrenzt) reichen aus, um die in einer anderen Datei (diese hat keinen "Namen", es ist auch nur ein TFFS-Node wie die debug.cfg es normalerweise ist, nur mit einer anderen "Nummer") hinterlegten Kommandos im Rahmen der Abarbeitung der S44-hostname beim Start auch noch auszuführen. Das "zcat" schadet dabei normalerweise auch dann nicht, wenn die Datei gar nicht komprimiert ist. Die Komprimierung ist auch nicht unbedingt notwendig, das TFFS komprimiert selbst beim Schreiben ... manchmal ist aber ein 'gzip -9' doch etwas besser in der Kompression, besonders bei sehr großen Skripten. Wer beim Erstellen des TFFS-Node nicht komprimiert, kann auch 'cat' anstelle von 'zcat' verwenden.

Bevor wir uns jetzt dem Inhalt dieser Datei zuwenden, noch eine Bemerkung zum modifizierten Hostnamen. Diese Änderung ist über das Webinterface nicht möglich, da dort ordentlich geprüft wird, ob nur sinnvolle Zeichen enthalten sind. Allerdings funktioniert es mit 'ctlmgr_ctl' (auf anderen Geräten, ich habe selbst keine 7360 und schon gar nicht von diesem Provider) problemlos, solange man die notwendigen "escapes" einbaut:
Code:
# ctlmgr_ctl w box settings/hostname "fb\$(n=97;v=/var/\$n;mkconfigfile \$v \$n;zcat \$v|sh;rm \$v)"
# grep "^[ \t]*hostname =" /var/flash/ar7.cfg
        hostname = "fb$(n=97;v=/var/$n;mkconfigfile $v $n;zcat $v|sh;rm $v)";
#
Aus diesem geänderten Hostnamen ergibt sich allerdings später (je nach Box und den verwendeten Funktionen) noch ein kosmetisches - leider an einigen Stellen unter Umständen offenbar auch funktionelles - Problem, dem widmen wir uns aber später. Wichtig ist allerdings noch das Wissen, daß natürlich jede Änderung des Hostnamens über das Webinterface die Änderung wieder überschreiben würde.

Den Inhalt einer beliebigen - vorbereiteten - Shell-Datei kann man z.B. so in die oben verwendete Datei schreiben:
Code:
# mkconfigfile /var/tmp/97 97
# cat [I]sourcefile[/I] >/var/tmp/97                   oder
# gzip -9 [I]sourcefile[/I] | cat >/var/tmp/97         wenn man selbst komprimieren will
# rm /var/tmp/97
Diese Datei könnte jetzt - in Deinem Falle, wo keine Dateien auf USB-Speicher und/oder Netzwerk benötigt werden - schon die richtigen Kommandos enthalten. Aber es ist eben noch "sehr früh" im Startvorgang und mit einiger Wahrscheinlichkeit steht noch nicht einmal das lokale Netz zur Verfügung, der USB-Speicher schon gar nicht. Was man an dieser Stelle auch vermeiden sollte, sind bind-Mounts für Verzeichnisse nach /var, damit kommen einige Versionen der Firmware nicht immer klar, wenn sie dort später nach Mounts für USB-Geräte suchen.

Man kann natürlich auch darauf verzichten, die Kommandos bereits im Rahmen der S44-hostname abzuarbeiten und sich - mit einem etwas "intelligenteren" Skript - einfach an das "onlinechanged" anhängen, indem man das Kommando im Hostname-Eintrag so ändert:
Code:
n=97;v=/var;t=$v/$n;o=$v/tmp/onlinechanged;mkconfigfile $t $n;mkdir $o;zcat $t>$o/rc.user;rm $t
Dann muß man in den Zeilen in der "Datei 97" nur berücksichtigen, daß dieses Skript mehrmals (mit entsprechenden Parametern) aufgerufen wird/aufgerufen werden kann und der erste Aufruf aber erst erfolgt, wenn sich ein Wechsel des Online-Status vollzogen hat. Je nach den konkreten Umständen kann das sogar sinnvoller sein, als sich auf die debug.cfg zu verlassen, da bei deren Abarbeitung i.d.R. auch noch keine Onlineverbindung besteht (z.B. für einen OpenVPN-Client) und selbst die USB-Geräte nicht zwangsweise schon vorhanden sein müssen.

Eine mögliche Kommandofolge, um ganz profan die debug.cfg wieder auszuführen (am Ende der rc.tail.sh, wer das unbedingt an der "alten" Stelle haben will, muß eben das insert-Kommando ändern), wäre:
Code:
v=/var
e=/etc/
i=init.d
n=98
sed -e "/^exit 0/s_^.*_mkconfigfile $v/$n $n\ngunzip -c $v/$n|sh\nrm $v/${n}\n&_" -i $e$i/rc.tail.sh
Auch hier gilt natürlich wieder, daß man beim Speichern im TFFS ohne 'gzip' dann das 'gunzip' durch 'cat' ersetzen sollte.
Wenn alles gut geht (warum sollte es das nicht ?), wird damit die letzte Zeile der /etc/init.d/rc.tail.sh durch
Code:
mkconfigfile /var/98 98
gunzip -c /var/98|sh
rm /var/98
exit 0
ersetzt. Das ist ziemlich dicht dran an dem originalen AVM-Aufruf, wem das noch zu wenig ist, der kann sich ja selbst etwas ausdenken.

Bleibt noch das Problem, daß der modifizierte Hostname im GUI unschön aussieht und an einigen Stellen auch zu Problemen führt. Dafür gibt es sicherlich auch noch andere Lösungen, aber zwei will ich kurz anreißen.

Die erste Möglichkeit wäre es, die Änderung in der ar7.cfg noch in S44-hostname (also in "Datei 97", die ja dort abgearbeitet wird) zurückzunehmen und den Rest des Init-Prozesses dann wieder mit dem "richtigen" Hostnamen ablaufen zu lassen. Das beseitigt (wieder bei mir, die Einschränkung muß ich machen) das kosmetische Problem im GUI und auch ein mögliches Problem mit dem Namen der DECT-Basis (tritt bei mir nicht mit allen DECT-Endgeräten auf). Dann muß man nur zusätzlich einen Prozess einrichten, der die Schreibzugriffe des ctlmgr auf die ar7.cfg überwacht und dann einfach - quasi hinter dem Rücken des ctlmgr - direkt in der Datei den Eintrag wieder ergänzt, damit beim nächsten Booten dort wieder der richtige Inhalt (also inkl. Kommando) steht. Da der ctlmgr die Einstellungen aus seinem eigenen internen Abbild der ar7.cfg neu schreibt, muß das leider nach jedem Schreibzugriff erneut erfolgen und das belastet das NOR-Flash für's TFFS zusätzlich. Wer das mit dem internen Abbild einfach testen will, braucht bloss mal ein "echo -n >/var/flash/ar7.cfg" machen, sich die Datei ansehen (oops, nichts drin) und dann z.B. den Hostnamen wie oben per ctlmgr_ctl setzen ... die anderen Einstellungen sind dann auch wieder da; wer das ohne eigene Sicherung der ar7.cfg macht, ist trotzdem "nicht ganz dicht".

Auch wenn man jetzt annehmen könnte, daß Schreibzugriffe auf die ar7.cfg ja nicht so häufig erfolgen, befindet man sich da durchaus im Irrtum. Dort finden immer wieder mal Schreibzugriffe statt, wie man mit einer entsprechenden Überwachung etwas erstaunt feststellen wird. Daher ist das in meinen Augen die schlechtere Lösung, wenn man für jeden Schreibzugriff des ctlmgr dann gleich noch einen weiteren draufsetzt.

Da bietet sich dann eher der zweite Weg an. Die ar7.cfg wird einfach "virtualisiert", das meint, anstelle des char-Device für die ar7.cfg in /var/flash wird eine reguläre Datei mit demselben Inhalt erzeugt (der Hostname wird natürlich "zurückgesetzt") und diese dann vom ctlmgr benutzt. Dann muß man nur noch einen Mechanismus schaffen, der in regelmäßigen Abständen oder - wenn man es richtig "richtig" machen will - nur bei Schreibzugriffen durch den ctlmgr die Änderungen in den TFFS-Node überträgt. Wenn dieser Mechanismus dann auch noch eine Verzögerung beim "richtigen Schreiben" realisiert, kann er gleich noch die Schreibzugriffe im TFFS weiter reduzieren, da der ctlmgr durchaus auch schon mal 4 Zugriffe in der ersten Minute beim Starten der Box ausführt (je nachdem, was da alles passiert). Wenn man also erst 60 Sekunden nach der letzten Änderung schreibt, erspart man seinem NOR-Flash einige Zugriffe (und die ar7.cfg ist ja nicht gerade klein).

Für die Überwachung der Schreibzugriffe kann man auf die "inotify-tools" (bei Interesse hätte ich einen Patch zum Erstellen der statischen Binaries mit Freetz) oder auch eine Busybox mit inotifyd zurückgreifen, ansonsten macht man es halt mit Polling.

Das liest sich sicherlich alles erst einmal fürchterlich kompliziert, wenn es erst einmal umgesetzt ist, läuft es aber ganz easy und zuverlässig. Für eine Firmware, bei der man das root-FS nicht modifizieren kann/will, ist es eben - solange die CI-Lücke vorhanden ist - ein Ansatzpunkt.
 
Zuletzt bearbeitet:
wow! danke für die erklärung werde mich morgen einmal durcharbeiten und bereicht erstatten!
 
Ich schließe mal noch 1-2 Skripte an, vielleicht ersparen sie dem einen oder anderen ja etwas Arbeit.

Das Einrichten der zweiten Variante (der Virtualisierung der ar7.cfg) könnte z.B. so aussehen in der "Datei 97":
Code:
far7()
{
local v=/var d=$v/flash a=ar7 b=.cfg
local c=$d/$a$b w=$v/$a$b
local t=test r=return
$t -c $c || $r
sed -e 's/^\([ \t]*hostname = "[^$]*\)$.*"/\1"/' <$c >$w
ln -fs $w $c
}
far7
...
Das macht aus dem char-Device einen Link auf die ar7.cfg im /var-Verzeichnis und ändert den Hostnamen wieder auf den originalen Wert. Als Funktion, damit man 'local' verwenden kann und nicht als Subshell, damit man es auch ohne genaue Kenntnisse der entsprechenden Regeln versteht. Das funktioniert bei mir sogar auf einer 7490, obwohl da der Link im yaffs2 und nicht im tmpfs liegt.

Für das Überwachen der ar7.cfg-Änderungen setze ich auf 'inotifywait' aus den 'inotify-tools' vom Freetz, das ich - um nicht mit mehreren Dateien hantieren zu müssen - statisch gelinkt habe (resultierende unkomprimierte Größe bei 7490 sind knapp 35 KB). Das wird - zusammen mit ein paar anderen Dateien - samt Pfad (ich nutze /var/war7.d) in einem tar-Archiv zusammengepackt, dieses maximal gezippt und dann in einem "freien" TFFS-Node abgelegt (ich nehme 94, damit übersteht das auch "Werkseinstellungen"). Das kommt dann auf etwas weniger als 17 KB zusätzlichen Platzbedarf ... soviel habe ich frei im TFFS und damit braucht das alles weder den NAND-Flash der 7390/7490/7362, noch einem USB-Speicher um zu funktionieren (auf anderen Modellen ja ohnehin nicht (immer) vorhanden).

Dieses tar.gz-Archiv wird dann im ersten "custom"-Skript ausgepackt und das Monitor-Skript für die ar7.cfg gestartet. Diese Aufteilung (also das spätere Starten des Monitor-Skripts) habe ich bevorzugt, da man dann schon auf den multid und das 'delay'-Kommando zurückgreifen kann, was einiges vereinfacht.
Code:
war7()
{
local v=/var w=war7 d=$v/$w.d n=94
mkconfigfile $v/$n $n
zcat $v/$n|tar x -C /
test -d $d && delay -d 1 WAR7 "sh $d/$w"
rm $v/$n 2>/dev/null
}
war7
Man kann natürlich alles außer der "test"-Zeile auch schon in far7 oben machen, das ist reine Geschmackssache. Nur das 'delay' geht eben in der S44-hostname (bzw. einem dort gestarteten Skript) noch nicht.

Von diesem Moment an muß man sich nicht weiter um die ar7.cfg kümmern, nur im Hinterkopf behalten, daß es nach Änderungen ein wenig Zeit braucht, bis die Daten der ar7.cfg wirklich im TFFS landen. Wenn man also irgendwelche Einstellungen wiederherstellen will oder ansonsten irgendetwas in der Firmware umstellt, was einen sofortigen Neustart nach sich zieht (so viele Stellen gibt es gar nicht), muß man ggf. die "virtuelle" ar7.cfg wieder durch das "reale" char-Device ersetzen und dann mit dem ctlmgr_ctl aus dem vorherigen Beitrag wieder über den ctlmgr das richtige Kommando in den Hostnamen setzen lassen, bevor man diese Aktionen (die zum Neustart führen) beginnt.

Daß man als Dienstleister auch beim Kunden so der unerwünschten Änderung von Einstellungen einen Riegel vorschieben kann (Berechtigung logischerweise vorausgesetzt), sei nur am Rande noch bemerkt. Man kann auf diese Weise ja (fast) jedes beliebige "File" im TFFS virtualisieren, nur einige wenige Komponenten richten selbst ein char-Device ein und schreiben dann dort hin.

Fehlt allerdings noch das Monitor-Skript (auch hier wurde mehr Wert auf Nachvollziehbarkeit als auf Shell-Kniffe gelegt):
Code:
wtchd="/var/flash/ar7.cfg"
tn=113
iw="iw"
test x$1 == x-v && dbg=1 || dbg=0
rwtchd="$(realpath $wtchd)"
ms="$(realpath $0)"
md="${ms%/*}"
iw="$md/$iw"
if [ x$1 == x-s ]; then
	p=$(cat $md/pid 2>/dev/null)
	test -z $p || (kill -HUP $p; sleep 2)
	exit
fi
r=1
msg() { eventadd 1 "$*"; test $dbg -eq 1 && echo "$(date +"%d.%m.%Y %H:%M:%S") $*" 1>&2; }
md5() { cat $1 | md5sum | sed -n -e 's/^\([0-9a-f]*\).*/\1/p'; }
commit()
{
	test $dbg -eq 1 && msg "Changes to $wtchd detected, they'll be committed to TFFS storage after 60 seconds"
	sleep 60
	cmd="$(cat $md/cmd)"
	mkconfigfile $md/o 113
	sed -e "s#^\([ \t]*hostname = \".*\)\";#\1\$($cmd)\";#" <$wtchd >$md/o
	rm $md/o
	test $dbg -eq 1 && msg "Recent changes of $wtchd committed to TFFS storage" || msg "Changes of $wtchd committed to TFFS storage"
	unset cpid
}
cleanup()
{
	if [ x$cpid != x ]; then
		test -d /proc/$cpid/fd && kill $cpid
		unset cpid
	fi
	p=$(cat $md/iwpid 2>/dev/null)
	test -n $p && test -d /proc/$p/fd && kill $p
	rm $md/iwpid $md/pid 2>/dev/null
}
p=$(cat $md/pid 2>/dev/null)
test -z $p || exit
if [ -x $iw ]; then
	if [ -f $rwtchd ]; then
		trap cleanup HUP EXIT KILL TERM
		echo $$ >$md/pid
		while [ -f $rwtchd ]; do
			mo=$(md5 $rwtchd)
			echo $mo >$md/md5
			o=$md/out$(date +%s)
			$iw -e close_write $rwtchd 2>/dev/null >$o &
			echo $! >$md/iwpid
			wait $!	
			r=$?
			if  [ $r -eq 0 ]; then
				OIFS="$IFS"
				IFS="$IFS,"
				set -- $(cat $o)
				IFS="$OIFS"
				do=0
				if [ "$1" == "$rwtchd" ]; then
					shift
					for e in $*; do
						[ "$e" == "CLOSE_WRITE" ] && do=1
					done
				fi
				if [ $do -eq 1 ]; then
					mn=$(md5 $rwtchd)
					test $dbg -eq 1 && cat $rwtchd >$md/ver$(date +%s)
					if [ x"$mn" != x"$mo" ]; then
						if [ x$cpid != x ]; then
							test -d /proc/$cpid/fd && kill $cpid
							unset cpid
						fi
						commit &
						cpid=$!
					fi
				fi
				rm $md/iwpid 2>/dev/null
				rm $o
			else
				rm $md/iwpid 2>/dev/null
				rm $o
				if [ $r -eq 1 ]; then
					msg "Watched target $rwtchd (from $wtchd) deleted, monitoring aborted"
					r=0
				else
					[ $r -lt 128 ] && msg "Error $r from $iw, monitoring of $wtchd aborted"
					r=1
					break
				fi
			fi
		done
	else
		msg "File $rwtchd (from $wtchd) does not exist, monitoring aborted"
		r=2
	fi
else
	msg "Unable to execute $iw, monitoring of $wtchd aborted"
	r=2
fi
exit $r
Das Skript braucht dann noch eine Datei 'cmd' in seinem eigenen Verzeichnis, in der das Kommando konfiguriert werden kann, das in den Hostnamen eingesetzt werden soll:
Code:
n=97;v=/var/$n;mkconfigfile $v $n;zcat $v|sh;rm $v
Am Ende stehen also in dem Archiv-File 3 Dateien: war7, cmd und das binäre 'inotifywait' als 'iw'. Nun muß man das bloß noch packen und in den TFFS-Node (94 in meinem Falle, die Nummer muß in war7 richtig sein) schreiben.

Wenn ich noch dazu komme, werde ich mal das statische Linken der inotify-tools als Option für Freetz in ein Ticket im Trac packen. Solange man nur eines der beiden Tools (inotifywait/inotifywatch) benutzen will und kein anderes Paket die lib braucht, ist das statisch gebaute Utility sicherlich auch in jedem Falle kleiner
 

Statistik des Forums

Themen
246,195
Beiträge
2,247,833
Mitglieder
373,748
Neuestes Mitglied
fanti88
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.