ritschmanhard: und ftp - Konzeptfrage

Hallo liebes Forum!

Nachdem ich selbst unsicher bin, möchte ich gerne mal wissen, ob und wie sich folgendes Problem lösen lassen würde:

ad1) Es gebe eine Datenbank (z.B. mySQL) in der zeitgestempelte Daten im Sekundentakt abgelegt werden.

ad2) Es gebe einen ftp Zugriff, bei dem diese Daten stundenweise (als jeweils verschiedene Stundendateien) zum Download zur Verfügung stehen sollen. Dabei soll es auch noch eine Verzeichnisstruktur geben (z.B. nach Kalenderwochen), da sonst sehr viele Stundendateien die Übersicht erschweren.

Nun die Frage: wie könnte man so etwas realisieren - insbesondere, ohne dabei weitere Daten auf die Festplatte schreiben zu müssen?

Meine Überlegung hierzu wäre:

  1. Mittels Perl und einem zugehörigen ftp modul (Net::Ftp::File?) einen eigenen FTP Server (Dienst) zur Verfügung haben
  2. Dieser erzeugt eine virtuelle Verzeichnisstruktur (im Speicher), die dem ftp-client vorgaukelt, es gebe die KW/file.hh Struktur und das file.hh stehe zum Download bereit
  3. Fordert der Client nun eine Datei file.hh an, so wird diese durch einen entsprechenden Datenbankzugriff IM SPEICHER erzeugt und an den Client zurückgegeben.

Kann dieses Konzept so realisiert werden? Oder gibt es sowas gar schon fertig?

Weitere Fragen:

  1. Ich bastle mir ja dann einen eigenen Server, oder geht das auch einfacher?
  2. Ist Perl eine gute Wahl, oder findet sich in der Auswahl Java/C/C++/C#(mono)/Python irgendwo besseres Rüstzeug?
  3. Gibt es andere Ansätze, einen wie hier geforderten ftp Zugriff zu ermöglichen, die Ihr kennt/euch vorstellen könntet?

Grüsse,
Richard

  1. Hallo,

    ad1) Es gebe eine Datenbank (z.B. mySQL) in der zeitgestempelte Daten im Sekundentakt abgelegt werden.

    ad2) Es gebe einen ftp-Zugriff, bei dem diese Daten stundenweise (als jeweils verschiedene Stundendateien) zum Download zur Verfügung stehen sollen. Dabei soll es auch noch eine Verzeichnisstruktur geben (z.B. nach Kalenderwochen), da sonst sehr viele Stundendateien die Übersicht erschweren.

    Nun die Frage: wie könnte man so etwas realisieren - insbesondere, ohne dabei weitere Daten auf die Festplatte schreiben zu müssen?

    Was versprichst du dir für Vorteile daraus, ftp://example.com/april/x/y abzurufen anstatt http://example.com/april/x/y ? Genauer: Von welch' restlos überzeugender Form sind diese Vorteile, dass sie die massiven Sicherheitsprobleme, die du mit einem selbst zusammengeschusterten, zusätzlichen Server, mit dessen Technik du dich anscheinend nicht weiter auskennst, möglicherweise aufreißt, wettmachen?

    Grüße,
    Frank

    1. Hi Frank!

      Deine Fragen sind durchaus berechtigt - und man kann einem Kunden schon vorschlagen, dass er doch besser das Ganze _nur_ über http nutzen soll - will er aber nicht. Somit sind die restlos überzeugenden Vorteile, dass der Kunde folgendes möchte:

      1. Viele Daten strukturiert speichern
      2. Via ftp darauf zugreifen können

      und es sonst keinen Auftrag gibt.

      Dann müßte man nachdenken, wie das gehen könnte. Und eben weil mir unter Anderem die Sicherheitsproblematik nicht entgangen ist und weil ich diese Lösung noch nie zu realisieren hatte, frage ich ja hier, wie Lösungskonzepte aussehen könnten.

      Grüsse,
      Richard

      1. Hallo.

        die restlos überzeugenden Vorteile, dass der Kunde folgendes möchte:

        1. Viele Daten strukturiert speichern
        2. Via ftp darauf zugreifen können

        und es sonst keinen Auftrag gibt.

        Den Punkt 2, "Will ich haben", würde ich so immer noch nicht akzeptieren, aber sei's drum.

        Für den Apache gibt es ein Modul namens mod_ftp. Mir ist bislang noch kein FTP-Server untergekommen, der Zugriffe jenseits des Dateisystems erlaubt hätte (vielleicht gibt es sowas in der kommerziellen Ecke), von daher ist die Einbindung in den Apache mit seinen umfassenden Skripting-Möglichkeiten vermutlich die günstigste Möglichkeit.
        Mit mod_ftp habe ich mich nicht befasst, aber wenn das Modul URLs so verarbeitet wie beim Apache üblich, müsste mit einem Skript und mod_rewrite ein Dateisystem zu simulieren sein.

        Gruß, Frank

        1. Hallo,

          Für den Apache gibt es ein Modul namens mod_ftp.

          hmm, ich zitiere:
          <zitat>
              mod_ftp hasn't been released yet. It is still alpha quality and isn't
              identified as ready for production use.
          </zitat>

          Also ich würd's nicht einsetzen, nicht bei einem zahlenden Kunden.

          Mir ist bislang noch kein FTP-Server untergekommen, der Zugriffe jenseits des Dateisystems erlaubt hätte.

          ProFTPD scheint zu können, was der OP benötigt, siehe beispielsweise die Doku zu mod_rewrite und mod_exec, ich zitiere allerdings aus der Doku zu mod_exec:

          <zitat>
              YOU HAVE BEEN WARNED
              USE AT YOUR OWN RISK
          </zitat>

          Freundliche Grüße

          Vinzenz

          1. Hi Vinzenz!

            Danke für die Hinweise - und den Link. Deine Warnung konnte ich allerdings nicht finden:

            <zitat>
                YOU HAVE BEEN WARNED
                USE AT YOUR OWN RISK
            </zitat>

            Ich werd mal reinschauen...

            Grüsse,
            Richard

            1. Hallo Richard,

              Danke für die Hinweise - und den Link. Deine Warnung konnte ich allerdings nicht finden:

              [...] ich zitiere allerdings aus der Doku zu mod_exec:

              http://www.castaglia.org/proftpd/modules/mod_exec.html

              <zitat>
                  YOU HAVE BEEN WARNED
                  USE AT YOUR OWN RISK
              </zitat>

              Freundliche Grüße

              Vinzenz

              1. Hi Vinzenz!

                Nochmals Danke für den Link - und vermutlich ist das tatsächlich eine Lösung (wenn auch "at my own risk"), denn:

                1. selbst schreiben erzeugt auf jeden Fall (mehr) Sicherheitslücken
                2. die Idee mit dem virtuellen Filesystem kann ich irgendwie nicht auf mein Problem übertragen
                3. Anpassen von pure-ftp wäre auch möglich, erfordert aber einen Sourcecode Eingriff, womit wahrscheinlich wieder (1) gilt...

                Irgendwie hatte ich mir das simpler vorgestellt - aber interessant wird das auf jeden Fall.

                Grüsse,
                Richard

                1. Hallo Richard,

                  ich will auf Nummer Sicher gehen.

                  Nochmals Danke für den Link - und vermutlich ist das tatsächlich eine Lösung (wenn auch "at my own risk"), denn:
                  Irgendwie hatte ich mir das simpler vorgestellt - aber interessant wird das auf jeden Fall.

                  Neben mod_exec könnte Dir auch mod_rewrite weiterhelfen. Am allerbesten schaust Du Dir die komplette Doku an und prüfst, was Dir auf dem einfachsten und sichersten Weg weiterhelfen kann.

                  Freundliche Grüße

                  Vinzenz

  2. Hallo.

    Fordert der Client nun eine Datei file.hh an

    Muss das zwingend so ablaufen? Trivialer würde die Geschichte, wenn man die Dateien einfach statisch im Filesystem erzeugt.
    So könnte man eben ein Perl Script bereitstellen, welches per Cronjob z.B. alle 10 Minuten aufgerufen wird und die Dateien / Ordner erzeugt...
    Der Rest wäre dann 08/15 FTP....

    Falls die o.g. Bedingung Pflicht ist, würde ich mir mal folgendes reintun:
    http://search.cpan.org/~rwmj/Net-FTPServer-1.122/lib/Net/FTPServer.pm

    Grüße

    1. Hi Dirk!

      Muss das zwingend so ablaufen? Trivialer würde die Geschichte, wenn man die Dateien einfach statisch im Filesystem erzeugt.

      Naja, das Problem ist, dass:
      a) Sehr viele Daten geschrieben werden (wie gesagt, sekündlich und nicht nur 1 byte)
      b) Eine doppelte Datenhaltung wenig wünschenswert erscheint
      c) Die Daten aber wegen diverser anderer Zugriffe (z.B. vom Web aus mit Datenreduktion = gib nur 1 Satz pro min oder so) in der Datenbank liegen sollten, um problemlos auf einzelne Datensätze, Spalten etc. zuzugreifen.

      http://search.cpan.org/~rwmj/Net-FTPServer-1.122/lib/Net/FTPServer.pm

      Für den Tip danke ich und werde mal reinschauen.

      BTW: Ich habe gesehen, dass pure-ftp unter BSD Lizenz steht - eventuell kann man den ja auch "ummodeln/pluggen".

      Grüsse,
      Richard

    2. Fordert der Client nun eine Datei file.hh an
      Muss das zwingend so ablaufen? Trivialer würde die Geschichte, wenn man die Dateien einfach statisch im Filesystem erzeugt.

      Außerdem gäbe es noch die Möglichkeit, nicht den FTP-Server selbst zu schreiben, sondern das Dateisystem, das der FTP-Server sieht. Siehe dazu http://fuse.sourceforge.net/.

      1. Hi Dirk!

        Außerdem gäbe es noch die Möglichkeit, nicht den FTP-Server selbst zu schreiben, sondern das Dateisystem, das der FTP-Server sieht. Siehe dazu http://fuse.sourceforge.net/.

        Hochinteressant, aber irgendwie setzt es bei mir hier voll aus - was macht denn diese Software? Einer Anwendung vorgaukeln, dass es ein Filesystem gäbe, das es nicht gibt (also virtuell). Wie sollte ich denn das mit dem Datenbankkonzept und einem ftp Server verheiratet bekommen?
        So alla:
        fuse erzeugt mit Hilfe der Datenbankdaten ein virtuelles Filesystem - OK
        dem ftp client wird vorgegaukelt, dass es dieses filesystem gibt - OK
        Aber:

        1. Wenn er nun auf die nicht wirklich vorhandenen files zugreift, wie werden die dann aus der Datenbankbasis erstellt?
        2. Es kommen ja stündlich "neue Dateien" hinzu - geht dies mit fuse (und vor allem, ohne den ftp server abzuwürgen, da ja hier downloads stattfinden können, deren Dauer über die Stundengrenze locker weg geht.

        Grüsse,
        Richard

        1. Entschuldigung Murphy, Dirk hab die Absender verwechselt.

          Grüsse,
          Richard

        2. Außerdem gäbe es noch die Möglichkeit, nicht den FTP-Server selbst zu schreiben, sondern das Dateisystem, das der FTP-Server sieht. Siehe dazu http://fuse.sourceforge.net/.

          Hochinteressant, aber irgendwie setzt es bei mir hier voll aus - was macht denn diese Software? Einer Anwendung vorgaukeln, dass es ein Filesystem gäbe, das es nicht gibt (also virtuell). Wie sollte ich denn das mit dem Datenbankkonzept und einem ftp Server verheiratet bekommen?

          Hallo Richard,

          mit FUSE kann man den Betriebssystemkern dazu bringen, ein Dateisystem anzulegen, aber alle Operationen darauf an ein normales Programm weiterzuleiten. Dieses Programm, der Dateisystemserver, erhält also für jede Operation wie "Liste alle Dateien in Verzeichnis x auf" oder "Lies 42 Bytes von Position 455 aus Datei y" eine Anfrage, die er nach Lust und Laune beantworten kann.

          In Deinem Falle müsste der Dateisystemserver in etwa folgendes tun:

          • Bei einer Listinganfrage für Verzeichnisse wird der Name des Verzeichnisses zerlegt und ein Zeitfenster daraus berechnet, das in eine Datenbankabfrage einfließt. Das Resultat der Datenbankanfrage wird wiederum in künstliche Dateinamen, die aus den Zeitstempeln der Messungen synthetisiert wurden, umgesetzt.

          • Bei einer Leseanfrage für eine Datei wird ebenfalls der Name und Pfad der Datei als Zeitstempel verwendet um die passenden Daten in der Datenbank zu finden. Diese Daten werden ausgelesen und in Textform zurückgeliefert.

          • Andere Anfragen, wie zum Beispiel das Beschreiben oder Löschen von Dateien können einfach mit einem Fehlercode beantwortet werden.

          Alle Anwendungen können dieses Dateisystem nun genau so benutzen, als ob es zum Beispiel eine lokale Festplatte wäre. Da auch ein FTP-Server ein ganz normales Programm ist, würde er den Unterschied zwischen einem Verzeichnis auf Deiner Platte, das er serven soll, und einem FUSE-Dateisystem, das er serven soll, überhaupt nicht bemerken.

          1. Hi Murphy!

            Jetzt raff ich das erst - das ist ja hammergeil!

            1. Ich erstelle ein Programm, das die fuse operations http://fuse.sourceforge.net/doxygen/structfuse__operations.html "bedient", also functions des fuse.h headers implementiert.
            2. In diesen functions lege ich fest, was auch immer auf externe (Betriebssystem-)Anfragen geantwortet wird (z.B. auf ls wird mit einem entsprechenden Datenbank select reagiert und die geforderte Antwortstruct gefüllt; dieses wird als ls Antwort zurückgegeben.
            3. Wenn mein Programm (welches fuse.h includet) fertig ist, mounte ich mittels myProg /path ein "fuse" Verzeichnis in /path.
            4. Ab dann gehen alle Zugriffe auf dieses Verzeichnis in mein Programm...

            Das ist zu cool - und mit den nur knapp 40 (u.U nach Autorenaussage sogar für einfache Funktion weniger) zu realisierenden Functions können alle Linux Kommandos "beantwortet" werden?

            Danke dir,
            Richard

            PS.: This rules, aber echt.

            1. Das ist zu cool - und mit den nur knapp 40 (u.U nach Autorenaussage sogar für einfache Funktion weniger) zu realisierenden Functions können alle Linux Kommandos "beantwortet" werden?

              Für ein Dateisystem, das man nur lesen kann, sollte es sogar ausreichen die Funktionen getattr, read und readdir zu implementieren und alle anderen auf NULL zu setzen.

              Im Übrigen ist es nicht unbedingt notwendig, das Dateisystem in C zu schreiben, wenn die Geschwindigkeit nicht absolut entscheidend ist. Es gibt diverse Bindings für Skriptsprachen: http://fuse.sourceforge.net/wiki/index.php/LanguageBindings