rc.ftpd einführen

hermann72pb

IPPF-Promi
Mitglied seit
6 Nov 2005
Beiträge
3,726
Punkte für Reaktionen
16
Punkte
38
Im Züge meiner Bemühungen einige mount-Sachen aus den AVMs hotplug-Skripte zu freetz zu transferieren ist mir aufgefallen, dass AVM in ihren Hotplug-Skripten sehr oft auf dem ftpd rumtanzt. Wobei da widerholte Codesequenzen an mehren Stellen und sehr oft auftauchen. Das Problem von AVM: Sie haben kein Startskript für ftpd. Dies erschwert unsere Arbeit enorm. Wird AVM-eigener ftpd ausgepatcht, so muss es an mehreren Stellen durch das einfügen von if-Schleifen rum herum um Tausende andere Schleifen geschehen.
Auf der anderen Seite haben wir bei FREETZ wenigstens zwei eigene ftp-Pakete. Sind denn diese Pakete halbwegs zu ftpd kompatibel? Kann man dann die Stellen in AVM-hotplug-Skripten durch den Aufruf von z.B. vsftpd ersetzen?
Um die Sache etwas strukturierter zu gestalten, würde ich vorschlagen einen /etc/init.d/rc.ftpd einzuführen. In diesem Skript paken wir eine Art wrapper, der dann beim Ausführen von "start", "stop", "restart" erstmal live checkt, welcher der drei ftp-daemons denn am Bord ist. Ist es AVMs-ftpd, so werden die beliebten AVM-Sequenzen a-la:
Code:
ftpd -D -q $READONLYOPTION -t 120 -m 15 $USERSOPTION -h "$CONFIG_PRODUKT_NAME" &
ausgeführt, ist es vsftpd, so wid das Kommando an rc.vsftpd übergeben.
Somit könnte ich diverse Sachen aus run_mount und storage dahin auslagern. Dies würde mir die Arbeit deutlich erleichtern.

Ähnlich könnte man eventuell auch rc.tam_mount einführen.

Spricht etwas dagegen?

MfG
 
Hi.
Ich wüßte nicht was dagegen spricht. Man könnte dann so eine Abfrage machen welcher ftpd als Standard genommen werden soll, wenn mehrere im Image sind.

Ist es denn überhaupt notwendig, dass der bftpd/vsftpd bei anstecken eines USB-Gerätes neu gestartet werden? Da könnte man sich natürlich auch noch eine Startoption vorstellen...

MfG Oliver
 
Wozu ist es dann mit AVM-eigenem ftpd gut? Weiß das jemand überhaupt?
Ich bin bis jetzt kein großer Fan von ftp gewesen. Diese Geschichte interessiert mich hier nur, weil man damit den ganzen ftp-Kram zentral verwalten könnte und aus den hotplug-Skripten rausnehmen würde.

MfG
 
AVM startet den ftp nur, wenn ein USB-Datenträger angesteckt ist. Ansonsten macht der ja auch keinen Sinn, weil er nur Zugriff auf die Datenträger bietet.

Stellt sich natürlich die Frage für was man den sonst nutzen könnte.

MfG Oliver
 
Ich versuche mal zu erklären, warum es mich so interessiert.
Ich habe mir als Ziel gesetzt "run_mount" und "storage" mit sed von einigen Sektionen/Unterprogrammen zu befreien, die ich dann in den eigenen Bibliotheken (es werden wahrscheinlich doch zwei werden) nachbaue. Somit könnte man komplett auf alle storage, automount und ftpd - Patches verzichten. Soweit, sogut. Ich könnte mich nach dieser Idee nur auf die Auslagerung von nicename(), do_mount() und do_umount() beschränken. Es gibt aber im "storage"-Skript ein Paar Stellen, wo AVM alle Register zieht, ftpd und smbd killt oder neu startet.
Am härtesten finde ich die "unplug)"-Sektion von "storage". Eigentlich ist diese Sektion dafür gedacht Partitionen vereinzeln zu unmounten. Und das tut es auch und wir nutzen es jetzt sogar in der mounted.cgi. Allerdings werden dort z.B. smbd und ftpd gekillt. smbd kommt nachher wieder, weil in do_umount() dann doch "/etc/samba_control reconfig" aufgerufen wird. Die Spuren vom Starten von ftpd konnte ich nicht finden.
Die Aufrufsektionen kommen für spindown-Sachen und für ftpd doppelt, wenn sogar nicht drei-/ vierfach vor und wenn du um jeden ftpd da immer eine if-Schleife rum-herum reinpatchen musst, damit es auch mit ftpd-Patch funktioniert, dann wird es sehr umständlich mit den patches. Und genau das will ich vermeiden, indem ich ftpd-aufrufende-Teile in eine rc.ftpd packe und dort an einer Stelle eine permanente Prüfung auf das Vorhandensein von ftpd einführe.

Ist denn eurer Meinung nach notwendig ftpd und samba immer neu zu starten, wenn eine Partition dazugemounted/ungemounted wird?

MfG
 
Das "/etc/samba_control reconfig" ist für jede Partition nötig, damit die Freigaben funktionieren! Kenne mich da aus, hatte das Samba3 Webinterface zusammen mit Darkyputz kreiert
 
ok, gut zu wissen. Wahrscheinlich ist es sinnig, samba_control reconfig auch beim Unmount durchzuführen, wie AVM es momentan macht. Allerdings samba vorher killen finde ich für etwas übertrieben und werde wahrscheinlich rausschmeißen. Beim reconfig wird ja auch samba runtergefahren und nachher gestartet. Von daher dürfte es so alleine ausreichen.

Mit ftpd bin ich immer noch am überlegen. Es gibt eine lange Passage in do_mount() von run_mount, die sich mit ftpd beschäftigt. Diese Passage kommt auch unter storage in Sektion "reload) genau wörtlich so vor. Aus diesem Grund würde ich dazu neigen die Passage separat als rc.ftpd auslagern und etwas ummanteln, damit sowohl do_mount() als auch "reload)" darauf zugreifen könnten.

Warum an den Stellen ftpd gestartet werden muss ist für mich immer noch ein Rätsel. Aber sei es rum.

MfG
 
AVM startet den ftp nur, wenn ein USB-Datenträger angesteckt ist.
...
Stellt sich natürlich die Frage für was man den sonst nutzen könnte.
...
MfG Oliver

Also ich hab den und samba auf die Root gesetzt und kann damit auf /var/tmp, /tmp/flash etc. nach Belieben zugreifen.

Ich finde das gar nicht so übel, die Box direkt im Nautilus durchsuchen zu können. Das gefällt natürlich AVM nicht sonderlich ;)
 
Das würde ich auch aus Sicherheitsgründen nicht machen. Erstens, wenn man ftp nach Draußen frei gibt, dann sowieso. Zweitens, nicht alle Familien-/Wohnung-/WG-mitglieder sollen unbedingt in die Tiefen der Box reinschauen können. Wenn du die Box administrieren willst, dann nimmst du SSH/SCP-Client dafür. Das ist der bessere Weg.

Zu dem ftpd von AVM. Das Ding meldet sich eigentlich gar nicht übel als GNU-ftpd (welcher denn genau?) und hat viele Optionen, die AVM garnicht nutzt:
Code:
/var/mod/root # /var/media/ftp/SYSTEM/ftpd/ftpd --help
Usage: /var/media/ftp/SYSTEM/ftpd/ftpd [OPTION] ...
Internet File Transfer Protocol server.

  -A, --anonymous-only      Server configure for anonymous service only
  -D, --daemon              Start the ftpd standalone
  -d, --debug               Debug mode
  -l, --logging             Increase verbosity of syslog messages
  -p, --pidfile=[PIDFILE]   Change default location of pidfile
  -q, --no-version          Do not display version in banner
  -t, --timeout=[TIMEOUT]   Set default idle timeout
  -T, --max-timeout         Reset maximum value of timeout allowed
  -u, --umask               Set default umask(base 8)
      --help                Print this message
  -V, --version             Print version
  -a, --auth=[AUTH]         Use AUTH for authentication, it can be:
                               default     passwd authentication.
  -m, --max-clients         Restrict max. number of connected clients
  -h, --hostname            Set hostname
  -U, --Users               Use linux users (/var/ftpusers_readonly for access restriction)
  -s, --sendfile            DON'T use sendfile() but read/write loop
  -r, --readonly            no write access

Submit bug reports to [email protected].
Ich schau mal, ob ich so ein rc-Skript nach freetz-Vorlagen hinkriege.

Edit:
Ich hab's fertig:
Code:
/var/mod/root # /etc/init.d/rc.ftpd status
running
/var/mod/root # /etc/init.d/rc.ftpd start
Reloading ftpd AVM FTP Server...done.
/var/mod/root # /etc/init.d/rc.ftpd start
Reloading ftpd AVM FTP Server...done.
/var/mod/root # /etc/init.d/rc.ftpd stop
Stopping ftpd AVM FTP Server...done.
/var/mod/root # /etc/init.d/rc.ftpd reload
Starting ftpd AVM FTP Server...done.
/var/mod/root # /etc/init.d/rc.ftpd reload
Reloading ftpd AVM FTP Server...done.
/var/mod/root # /etc/init.d/rc.ftpd restart
Stopping ftpd AVM FTP Server...done.
Starting ftpd AVM FTP Server...done.
Bitte einchecken (Ausführungsrechte nicht vergessen)! Ich brauche es nachher als Baustein für meine Veränderungen an den mounting-Skripten. Deswegen wäre es nett, wenn es in den trunk einfließen würde.

Zum Neustarten von ftpd, wenn sich etwas an den Mountpoints geändert hat. Es ist meiner Meinung nach nicht notwendig. Wenn die Verzeichniss (mountpoints) beim unmounten korrekt gelöscht werden, dann kriegt man es auch so mit. Genau das Gleiche gilt fürs mounten.

Man kann natürlich sagen, meine Arbeit war komplett für die Katz. Ich sehe es aber nicht so. Wenigstens haben wir einen vernünftigen Starter/Stopper für AVMs-ftpd.


MfG
 

Anhänge

  • rc_ftpd.patch.bz2
    1.1 KB · Aufrufe: 13
Zuletzt bearbeitet:
Das ist _der_ ftpd. Das Dingen heisst so und kann mehr, als AVM eigentlich will. Eigentlich ein Wunder, dass sie das nicht kastriert haben, bzw. durch closed source ersetzt....
 
Allerdings samba vorher killen finde ich für etwas übertrieben und werde wahrscheinlich rausschmeißen. Beim reconfig wird ja auch samba runtergefahren und nachher gestartet.

Wo wird samba denn vorher gekillt? Bei reconfig ist das nötig um neue Partitionen freizugeben. Ein anHUPen von samba wurde wohl von AVM entfernt. Dazu gab es vor längerem eine Diskussion im Samba3-Webif Thread.
Da man mit ds-mod immer "so nah wie möglich am Original" bleiben wollte, hatten wird das so implementiert. Ich glaube bei Freetz hat sich das allerdings geändert.
Landet dein rc-Skript auch auf der Box wenn man einen anderen FTP-Server nutzt?
 
@hermann72pb:

Ich hab es ja auch nur für die Testerei und Entwicklung aufgemacht. Meine Box is fast wie Fort Knox mit iptables, DMZ, AVM Firewall etc. abgeriegelt und von außen überhaupt nicht zu erreichen (Keine Dienste im Internet freigegeben).

Intern haben die Rechner "feste" IP-Adressen mit entsprechendem Regelwerk auf der Firewall und ich wohne auch nicht in einem Studentenwohnheim.

Insofern ist das eine für mich brauchbare Lösung. Jeder kann seine Fritte doch braten, wie er will. Es gibt ja auch Leute, die Anonymous ftp, Samba und transmission ins Internet freigeben.
 
@cando: Ich hatte auch keine Zweifel, dass du das bewusst so machst. Ich wollte lediglich auf die Problematik hinweisen, dass auch diejenigen es wissen, die nicht so mit der Thematik vertraut sind, wie du. Denn sonst grabt das jemand nach 2-3 Monaten hier raus und implementiert es bei sich ohne die Risiken zu kennen. Von solchen Beispielen haben wir hier genug. Es gab diesbezüglich schon vor Jahren auch eine heftige Diskussion hier mit kriegaex bzgl. seiner rudi-shell, die zwar ein mächtiges Tool ist, jedoch im Grunde genommen ein ernsthaftes Sicherheitsrisiko bildet, wenn man das WebIF nicht genügend gut absichert.
Aber zurück zum Thema.
@cuma: Sowohl ftpd als auch smbd werden an diversen Stellen von storage und run_mount knallhart mit killall abgeschossen. Mit dem Abschießen von ftpd hat sich meine Befürchtung bestätigt: Der bleibt nach jedem unplug einer Partition (nach unserer neuen Methode mit dir bekannten Knöpfen) reproduzierbar gekillt. Aus AVM-Sicht ist es gut so, weil sie die Partitionen nicht einzeln abschießen, sondern nur komplette Medien. Wird ein Medium wieder eingesteckt, so wird ftpd "irgendwie" irgendwo in Tiefen von "storage" wieder gestartet.
Dass smbd kein HUP besitzt ist auch nicht schlimm. Dann muss man eben stop-start machen, wenn man was ändert. Vermutlich wird es in "/etc/samba_control reconfig" auch so gemacht. Nur wozu muss man da smbd davor nochmal zusätzlich so gewaltsam killen? Sicher ist sicher, oder wie? Ich schaue es mir nochmal an.
Ich würde rc.ftpd als einen festen Bestandteil in die Box einbauen. Momentan ist es so robust aufgebaut, dass selbst, wenn ftpd gepatcht ist es zu keinen Fehlermeldungen kommt. Vorteil: Man kann auf dieses rum-herum und ewige patcherei (die übrigens sowieso vermutlich nicht komplett vollständig war!) verzichten, wenn man ftpd aus dem Image entfernt. Später kann man überlegen, ob man vom rc.ftpd eine Brücke zu den Startskripten anderer FTP-Server (bftpd, vsftpd) baut. In diesem Fall würden diese FTP-Server nach der von uns festgelegten Priorisierung dann als Backup "freigeschaltet". Würde bedeuten, dass z.B. "rc.ftpd start" dann zu "vsftpd start" wird. Ich hatte es aber bewusst jetzt noch nicht so realisiert, weil die Notwendigkeit und die Kompatibilität der Server dazu genau untersucht werden sollte.
Zu der Frage, ob man denn den ftpd-Server ständig stoppen und starten muss sage ich wiederum ein klares "nein" und werde es wahrscheinlich aus den beiden (storage und run_mount) Skripten entfernen. Eventuell sehe ich dort an einigen Stellen ein "rc.ftpd start" vor. Ich hatte es im Startskript bewusst so realisiert, dass es auch im "start"-Fall zunächst übrprüft wird, ob ftpd bereits läuft. Ist es der Fall, so wird einfach ein HUP dem ftpd gesendet. Die Sinnhaftigkeit von HUP in diesem Fall sei hingestellt, es schadet aber wenigstens nicht. HUP scheint ftpd zu überleben. Ob er das auch tut, weiß ich nicht. Wenigstens meldet kill Erfolg des HUPens.
Und ich bitte nochmal es einzuchecken. Zunächst ist dieses rc-Skript wirkungslos und dürfte mit sich keine Risiken bringen.

Übrigens, man könnte/sollte auf die Art und Weise auch das Starten der anderen AVM-Diensten realisieren. Ob AVM dann die Dienste trotzdem direkt startet, ist erstmal nicht so relevant. Wenn die Dienste so FREETZ-konform ausgeführt wären, könnte man unter "Dienste"-Seite eine extra-Sektion für AVM-Dienste spendieren. Mir schwebe da was vor, wie dsld, voipd, telefon, wlan, AVM-Webserver (nicht unsere httpd-Alternative, die sowieso nicht geht, sondern ctlmgr) usw.

MfG
 
Ich finde die Stelle nicht wo Samba "gewaltsam" gekillt wird. Was meinst du denn?
 
7270v3 76-Firmware Originalskripte von AVM (vor dem patchen)
/etc/hotplug/storage: Zeile 233 (unplug-Sektion); Zeile 266 (remove-Sektion); Zeile 321 (stop-Sektion)

Nach der Zeile 233 kommt der Aufruf von "do_umount", wo dann "samba_control reconfig" aufgerufen wird.

Cuma, diese beiden sch*-hotplug-Skripte von AVM sind so verschachtelt und von so einem schlechten Programmierungsstill, dass du da am besten gar nicht anfangen sollst etwas zu verstehen. Ich hatte mir beide Skripte auf dem Papier augedruckt (mache ich relativ selten) und arbeite sie schon seit ein Paar Tagen mit einem roten Stift ab, um irgendwelche Dupplikate zu finden. ftpd-Aufruf war ein Beispiel dafür. Wenn man sowas macht, versucht man so nebenbei zu verstehen, was die Jungs von AVM damit sagen wollten. Und das sollte man wahrscheinlich doch von vorne an bleiben lassen.

MfG
 
Achso, vor dem Patchen. Dache schon wir hätten es übersehen. Wie gesagt bin ich schon durch die Skripte durch.
Aber ich würde das ganze mit rc.ftpd lassen. Bis das dann so richtig läuft wie es vorher war kostet viel Nerven. Und in der nächsten Firmware packt AVM noch ein paar Fixes rein und nichts läuft mehr und man kann von vorne anfangen. So wie es momentan ist funktioniert ja. Und die meisten nehmen eh lieber vsftpd weil man den richtig konfigurieren kann.
Aber wenn es funktioniert freu ich mich *g*
 
Die Motivation war, die ganzen patches zu ersparen und alles möglichst so transparent und boxunabhängig zu machen, dass der Wartungsaufwand von storage / ftpd / autorun / autoend und evtl. noch weiteren Geschichten sich minimiert. Anstatt zu patchen würde ich mit sed aus "storage" und "run_mount" ganze Abschnitte ausschneiden und sie durch unsere ersetzen. Die Suche würde dann nach Funktionnamen /Sektionnamen laufen und nicht wie bei patch nach den Zeilen rumherum. Klar gibt es dabei Risiken, aber dafür sind wir ja auch da, sie auszutesten und auszuschalten.

MfG
 
Dazu hatte ich schon lange einen Vorschlag gehabt, einen Ordner namens "optional" oder ähnlich einzuführen. Dort könnte man solche Sachen reinpacken, die dann nur bei Bedarf eingefügt werden. Alternativ kann man natürlich wie immer eine negative Logik verwenden und erst die Datei reinkopieren und danach löschen, wenn die Box keinen USB-Host hat. Es wird mir aber langsam umständig. Mit box.info und freetz.info hätte ich auch lieber über "optional" gemacht, als nachträglich löschen.
Grundsätzlich es optional anzubieten, damit habe ich überhaupt kein Problem. Es ist von mir auch so gedacht, dass es als ein Teil vom modifizierten storage-Patch fungiert. Allerdings es immer rauszupatchen, wenn ftpd nicht da ist und die Prüfung über das vorhandensein deaktivieren: Da bin ich streng dagegen. Das ist nämlich gerade meine Motivation, warum ich das Ding erschaffen hatte: Ich will aus modifizierten hotplug und run_mount und wie die alle heißen über einen Aufruf von "/etc/init.d/ftpd start" den ftpd immer fehlerfrei "starten" können, selbst wenn er nicht vorhanden ist. Das würde die restliche umpatcherei unheimlich vereinfachen, sodass du nicht mehr in Tausenden Skripten darauf achten muss, ob ftpd denn ausgepatcht wurde oder nicht. Außerdem könnte man dann ftpd-Startskript erweitern und damit vsftpd und bftpd starten.
Zum Programmierungsschreibstill. Ich finde, dass
Code:
if [ Bedingung ]
then
    Anweisung 1
    Anweisung 2
else
    Anweisung 3
    Anweisung 4
fi
deutlich strukturierter und logischer aussieht, als
Code:
if [ Bedingung ]; then
    Anweisung 1
    Anweisung 2
else
    Anweisung 3
    Anweisung 4
fi
Denn in der vorgeschlagenen Schreibweise werden then und else ungleich behandelt. Ich schreibe übrigens genau so die C-Programme und hasse geschleifte Klammer in der Zeile, wo der Name der Struktur steht. Auch hier würde ich die beiden Klammer gleich behandeln.
Aber keine Sorge, cuma ist schon fleißig dabei meine gewöhnungsbedürftigen then-s mit der Kurzform in der mounted.cgi zu ersetzen. Von daher werden sie irgendwann mal aussterben, wie die Dinos.

MfG
 
Mir ist nur ein Fehler beim Variablennamen aufgefallen und da hab ich gleich noch dein 4-Zeilen if in ein einzeiliges geändert. Über shell_coding_conventions sollte man nicht wirklich wieder eine Diskussion beginnen
 
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.