www.ProFTPD.de

ProFTPD => ProFTPD - Deutsch => Thema gestartet von: toraX am 22. September 2006, 15:16:53



Titel: Unterabfrage mit SQLNamedQuery
Beitrag von: toraX am 22. September 2006, 15:16:53
Hallo!!

Ich hoffe mir kann von euch einer weiterhelfen, da ich schon sämtliche Seiten nach meinem Problem durchsucht habe und leider nicht
fündig geworden bin.
Ich würde gerne in meiner Datenbank speichern wann sich jemand ein- und ausgeloggt hat.
Es ist ja kein Problem die Zeit festzuhalten wann sich jemand eingeloggt hat, aber beim ausloggen komm ich auf keinen grünen Zweig.

Ist es überhaupt möglich in  SQLNamedQuery eine Unterabfrage folgender Art zu stellen:

Code:
SQLLOG QUIT quit_log
 SQLNamedQuery          quit_log      UPDATE "log_out=now() WHERE username='%u' && log_in=(SELECT MAX(log_in) FROM
ftp_login_pass)" ftp_login_pass


Titel: Re: Unterabfrage mit SQLNamedQuery
Beitrag von: VolGas am 22. September 2006, 17:18:07
Hallo!

Ich fürchte, daß dies ein hoffnungsloses Unterfangen ist.
Wenn der FTP-Client "höflich" ist, dann wird er sich tatsächlich mit "QUIT" verabschieden,
aber meist sind sie es eben nicht und trennen einfach die Verbindung. Oder der ProFTPD
trennt von sich aus die Verbindung wegen eines Timeouts. Oder...
Es ist wie im Leben: Trennungsgründe gibt es einige.

Vermutlich ist es sogar so, daß der "QUIT"-Befehl ProFTPD-intern vom Core-Module gleich
umgesetzt wird und den jeweiligen Prozess beendet, also gar nicht mehr an die anderen
Module (und damit auch nicht an das SQL-Modul) weitergeleitet wird.

Sorry...

mfg.
  Volgas


Titel: Re: Unterabfrage mit SQLNamedQuery
Beitrag von: toraX am 22. September 2006, 17:39:27
Hallo,

und Danke erstmal für die schnelle Antwort.

Ich will dir auf keinen Fall wiedersprechen, aber ich hab es gerade mal mit

Code:
SQLLOG QUIT quit_login
 SQLNamedQuery          quit_login      UPDATE "log_out=now() WHERE username='%u'" ftp_login_pass

getestet und es funktioniert auch wenn ich die Verbindung mit ctrl+c oder durch Schliessen des Fensters unterbreche.

Das Problem ist nur bei diesem Beispiel, dass  bei jedem User mit username='%u' das Datum now() eingesetzt wird und ich möchte
dies ja nur beim letzten Login erreichen.

Gruss
Torsten

 


Titel: Re: Unterabfrage mit SQLNamedQuery
Beitrag von: VolGas am 22. September 2006, 21:25:29
Ich verstehe nicht ganz - ist das Feld "username" nicht als "primary index" angelegt
und jeder Username einmalig? Kannst Du bitte ein wenig konkreter werden?

mfg.
  VolGas


Titel: Re: Unterabfrage mit SQLNamedQuery
Beitrag von: toraX am 23. September 2006, 16:58:07
Also ich hab in meiner Datenbank eine extra Tabelle erstellt, in der bei jedem Einloggen
der Username sowie der Zeitpunkt des Login gespeichert wird.
Der Username kommt also öfters vor.

Code:

 # TABELLE ftp_login_pass
 # Erfolgreiche Logins

 SQLLOG PASS pass_login
 SQLNamedQuery          pass_login      INSERT "NULL,'%u'          ,'%h' ,'%a',now() ,NULL    " ftp_login_pass
 
 # Tabelle ftp_login_pass in mysql   "nr, username, host, ip, log_in, log_out"


Das ganze ist eigentlich nur für Statistikzwecke gedacht.
Möchte mir die Daten später mit php auswerten lassen.

Gruss
Torsten
 


Titel: Re: Unterabfrage mit SQLNamedQuery
Beitrag von: VolGas am 23. September 2006, 22:13:48
Das ist eigentlich kein ProFTPD-Problem und meiner Meinung nach wäre eine
Auswertung von einem Logfile wesentlich resourcenfreundlicher.

Aber es gibt natürlich auch mit SQL eine Lösung: da das Feld "log_out" noch leer
ist, wenn sich jemand eingeloggt hat, kann man natürlich beim Ausloggen mit
einer entsprechenden "WHERE"-Klausel den Update gezielt auf diesen Datensatz
begrenzen. Zusätzlich könnte man das Update noch mit "LIMIT 1" auf einen
einzelnen Datensatz beschränken, das wird aber wohl nicht notwendig sein.

Alles nur eine Sache einer mehr oder weniger geschickten SQL-Abfrage...

mfg.
  VolGas


Titel: Re: Unterabfrage mit SQLNamedQuery
Beitrag von: toraX am 24. September 2006, 14:11:15
Da stimme ich dir auf alle Fälle zu, dass die Auswertung der Logfile resourcenfreundlicher wäre, aber ich möchte gerne aufgrund
meines Studiums mich ein bischen mehr mit mysql beschäftigen.

Für die Begrenzung des Datensatzes mit der "WHERE"-Klausel benötige ich doch eine Unterabfrage wie oben beschrieben.
Hab jetzt alle Möglichkeiten die mir bekannt sind durchprobiert und bin zu keinem vernünftigen Ergebnis
gekommen.

Ich werd mich wohl oder übel mit dem Datum der letzten Aktivität eines Users begnügen müssen.

Gruss
Torsten
 


Titel: Re: Unterabfrage mit SQLNamedQuery
Beitrag von: VolGas am 24. September 2006, 22:11:56
Mal ein "Schnellschuß", ohne groß nachzudenken:

    UPDATE ["tabelle" SET] log_out=NOW() WHERE username='%u' AND log_out='0000-00-00'

Nicht perfekt und ohne Gewähr!

In Kursivschrift und eckigen Klammern ist der Teil, der zu einem vollständigen
SQL-Query gehört, in der Syntax für "mod_sql" aber wegbleiben muß.
Unterabfragen mit einem zweiten "SELECT" gehen in mySQL leider (noch?) nicht.

mfg.
  VolGas


Titel: Re: Unterabfrage mit SQLNamedQuery
Beitrag von: toraX am 25. September 2006, 10:35:21
Super, Funktioniert einwandfrei!!!
Da hab ich wohl viel zu umständlich gedacht mit meiner Unterabfrage.

Nochmals vielen Dank für deine Hilfe.

Gruss
Torsten