1 - Wie es funktioniert


Um auf Ereignisse und Befehle zu reagieren können Sie Scripte verwenden, die durch den Server verfügbar sind.
Unterstützte Scriptsprachen sind: VBScript, JScript.
Jedes Script muss sich im Verzeichnis /Scripts befinden.


 2 - Verfügbare Quellen (Serverseitig)


Hier ist eine Liste der Funktionen, die aufgerufen werden können:

OnSiteXXXXX wobei XXXXX Ihr SITE Kommando ist, klein geschrieben!
Dieses Funktion erscheint, wenn ein User ein SITE Kommando eingibt (Beispiel "SITE BLA test test2" ruft die Funktion OnSitebla("test test2") auf).

Hinweis: SITE Kommandos werden klein geschrieben, angepasst für Scriptsprachen die 'case sensitive' sind wie JScript; VBScript ist case insensitive: SITE TEST würde OnSitetest starten, in JScript aber nicht OnSiteTEST.

Es ist Ihnen überlassen weitere Parameter zu übergeben.

Die folgenden Funktionen werden ohne Parameter aufgerufen:

OnClientConnected: Benutzer meldet sich an
OnClientDisconnected: Benutzer hat sich abgemeldet
OnClientBanned: Verbindungsversuch eines gesperrten Benutzers
OnClientHammering: Benutzer hat den Server "gehämmert", wurde gesperrt und die Verbindung getrennt
OnSameIPConnect: Benutzer wurde getrennt weil zu viele Verbindungen für diese IP vorhanden waren
OnTooManyClient: Benutzer wurde getrennt weil zu viele Verbindungen für dieses Konto vorhanden waren

OnClientTimeOut: Benutzer wurde wegen Zeitüberschreitung getrennt
OnClientLoggedIn: erfolgreiche Benutzeranmeldung
OnDomainClosed: Domain ist offline
OnDomainOpened: Domain wurde gestartet
OnDomainStarted: neue Domain wurde erstellt
OnDomainStopped: Domain wurde gelöscht
OnEvery05Minutes, OnEveryDay, OnEveryHour: nur für Domainscripte (werden alle 5min; volle Stunde; tägl. gestartet)
OnDirCreated: neuer Ordner erstellt
OnDirDeleted: Ordner wurde gelöscht
OnDirListed: Ordnerinhalt wurde aufgelistet
OnFileBanned: Benutzer versuchte eine verbotene Datei hochzuladen
OnFileDeleted: Datei wurde gelöscht
OnFileDownloaded: eine Datei wurde erfolgreich heruntergeladen
OnFileRenamed: Benutzer hat eine(n) Datei/Ordner umbenannt
OnFileUploaded: Benutzer hat eine Datei fertig hochgeladen
OnFileUploadFailed: Benutzer hat das hochladen abgebrochen oder es lag ein Fehler vor
OnIPChanged: IP der Domain hat sich geändert
OnQuotaExceeded: Benutzer hat sein Konten quota überschritten

Die folgende Funktion kann mit einem Parameter aufgerufen werden:

OnScriptError(error): ein Scriptfehler ist aufgetreten, der Parameter ist die Fehlernachricht

Hinweis:
Jeder Client hat eine Instanz eines Scripts. Es können also zwei Scripte gleichzeitig laufen und eine Datei kann durch ein Script blockiert sein, das sie grade geöffnet hat.


Verfügbare Objekte für Scripte:

:-------------------------------------------------------------

Objekte Script

string FileName: den Scriptnamen erhalten
boolean IsDomainContext: Gibt aus ob ein Script nur Domainabhängig läuft. Wenn es Domainabhängig läuft, sind Client Objekte nicht verfügbar.
int Timeout: Gibt den Timeout für Scripte aus und setzt den Wert neu, setzt man einen neuen Wert wird der Timeout resettet, 0= unbegrenzt
void Include(string scriptPath): ein Script laden und parsen
void Sleep(int Msec): warte für Msec Millisekunden

:-------------------------------------------------------------

Objekte Werkzeuge

string CRCFile(String path): Berechne den CRC einer Datei und gebe ihn aus
string CRCStr(String str): Berechne den CRC eines String und gebe ihn aus
string FormatSize(int size): Gebe die Größe aus, entsprechend seinem Wert formatiert. Der Wert bekommt den passenden Anhang  TBytes, GBytes, MBytes, KBytes oder Bytes
string FormatSize(int size, int FormatStyle, boolean LongForm): Gibt die Größe aus, entsprechend seinem Formatierungstyp und langer Schreibweise (langer oder kurzer Suffix: KBytes or KB). Formatierungstyp = 1 Anzeige in Bytes, 2 in KBytes, ...
string MD5File(String path): Berechne den MD5 hash einer Datei und gebe ihn aus
string MD5Str(String str): Berechne den MD5 hash eines String und gebe ihn aus
string SHA1File(String path): Berechne den SHA1 hash einer Datei und gebe ihn aus
string SHA1Str(String str): Berechne den SHA1 hash eines String und gebe ihn

:-------------------------------------------------------------

Objekte Server

string CertificatePath: Gib den Pfad aus, in dem Zertifikate gespeichert werden
string LogPath: Gib den Pfad aus, in dem Log Dateien gespeichert werden
string ScriptPath: Gib den Pfad aus, in dem Scripte gespeichert werden
string ServerPath: Gib den Anwedungspfad des Servers aus

:-------------------------------------------------------------

Objekte Domain

int Bandwidth: Gib derzeitige Bandbreite in Bytes/Sekunde aus
int Bandwidth_in: Gib derzeitige Bandbreite für den Upload in Bytes/Sekunde aus
int Bandwidth_out: Gib derzeitige Bandbreite für den Download in Bytes/Sekunde aus
int ClientCount: Gib die Anzahl der Clients aus, die derzeit mit der Domain verbunden sind
int UserCount: Gib die Anzahl der Clients aus, die auf der Domain gemeldet sind
int DownloadCount: Gib die Anzahl der Clients aus die runterladen
int UploadCount: Gib die Anzahl der Clients aus die hochladen
string Name: Gib den Namen der Domain aus
date StartTime: Gib Datum/Zeit aus, wann die Domain gestartet ist

void WriteToLog(String log): Wenn Protokolle aktiviert sind, Parameter in Protokoll schreiben

:-------------------------------------------------------------

Objekte Client

string AccountName: Gib den Accoutnamen auf dem Client aus, kann unterschiedlich zum Usernamen sein wenn mit Alias eingeloggt wurde
date ConnectionDateTime: Gib Zeit/Datum der Verbindung aus
string HostName: Gib des Hostnamen des Clienten aus (wenn ResolveIP aktiviert ist)
string ID: Gib die Client ID aus
string PeerIP: Gib die öffentliche IP Adresse des Clienten aus
int PeerPort: Gib den öffentlichen Port des Clienten aus
string LocalIP: Gib die lokale IP Adresse des Clienten aus
int LocalPort: Gib den lokalen Port des Clienten aus
string Keyword: Gib das derzeitige Schlüsselwort eines Kommandos aus
string Directory: Gib den derzeitigen virtuellen Ordner des Clienten aus
string DirectoryReal: Gib den derzeitigen Pfad des Clienten aus
int Downloaded: Gib die Summe der gesendeten Bytes des Clienten aus
int Uploaded: Gib die Summe der empfangenen Bytes des Clienten aus
boolean Logged: Gebe true aus, wenn der Client eingeloggt ist
int RestartPos: Gib die, die Position aus bei Neustart verwendet wird
string Username: Gib den Usernamen des Clienten aus
string Filename: Gib den derzeitigen virtuellen Dateinamen aus (Beispiel "/temp/file.txt")
string FilenameReal: Gib den derzeitigen Dateinamen aus (Beispiel "C:\temp\file.txt")
int FileSize: Gib die Grösse der zuletzt übertragenen Datei aus
int FilePosition
int Speed: Gib die Durschnittsgeschwindigkeit in Bytes/Sekunde der letzten 5 Sekunden des Clienten aus
int Speed_In: Gib die Durschnittsuploadgeschwindigkeit in Bytes/Sekunde der letzten 5 Sekunden des Clienten aus
int Speed_Out: Gib die Durschnittsdonwloadgeschwindigkeit in Bytes/Sekunde der letzten 5 Sekunden des Clienten aus
int TransferTimeSeconds : Gib die Übertragungszeit in Sekunden aus
string TransferTime: Gib die Übertragungszeit aus. Format "00:00:00"
int TransferSpeedBps: Gib die Übertragungsgeschwindigkeit in Bytes/Sekunde aus
string TransferSpeed: Gib die Übertragungsgeschwindigkeit in KBytes/Sekunde aus. Format "128 KBytes/s"

boolean IsSecure: Gib aus, ob die Steuerungsverbindung zum Clienten sicher ist
boolean IsTransferSecure: Gib aus, ob die Datenverbindung zum Clienten sicher ist

void ConvertToReal(string path): Konvertiert einen virtuellen Pfad (Beispiel /temp) zu dem physischen Pfad (Beispiel C:\Temp)
void Kick(): trenne den Clienten vom Server
void Post(string Message): sende eine Nachricht zum Clienten: sie wird vom Server formatiert und der nächsten Server Antwort vorangestellt
void Post(string Message, boolean ProcessTags): sende eine Nachricht zum Clienten: sie wird vom Server formatiert und der nächsten Server Antwort angehängt
void Post(string Message, boolean ProcessTags, boolean Append): sende eine Nachricht zum Clienten: sie wird vom Server formatiert und der nächsten Server Antwort angehängt oder vorangestellt
void Send(string Message): sende einen String zum Clienten
void send(int Code, string Message): sende einen FTP formatierten String, Beispiel 200 ok

 3 - Beispiel


'SCRIPT: Log downloads.vbs
'AUTHOR: Gene6
'DATE: 2002/10/04
'DESC: Protokolliere jeden Download in eine Log-Datei
' Jeder Eintrag hat die Form "date time#Username#Filename#filenamereal#from#to#time#Speed

'Constants
Delimiter = "#"
ForAppending = 8

'Create the file path
strYear = Year(Date)

strMonth = Month(Date)
' add the leading zero
if (strMonth < 10) Then
strMonth = "0" & strMonth
end if

strDay = Day(Date)
' add the leading zero
if (strDay < 10) Then
strDay = "0" & strDay
end if

LogFilename = Server.LogPath & Domain.Name & "-" & strYear & "-" & strMonth & "-" & strDay & "-downloads.log"

sub OnFileDownloaded()
Set fso = CreateObject("Scripting.fileSystemObject")
Set LogObj = fso.OpenTextFile(LogFilename, ForAppending, true)

Line = FormatDateTime(Now) & Delimiter & Client.Username & Delimiter & Client.Filename & Delimiter &
Client.FilenameReal & Delimiter & Client.RestartPos & Delimiter & Client.FilePosition & Delimiter &
Client.TransferTime & Delimiter & Client.TransferSpeed

LogObj.WriteLine(Line)
LogObj.Close
end sub

 4 - Fortgeschrittenes Scripting


Sie können auch Funktionen schreiben, die vom Server als Reaktion auf Aktionen des Clienten aufgerufen werden, bevor der FTP Server die Aktion ausführt.

Als Möglichkeit, Sie können eine Funktion erstellen, die den Dateiupload verbietet wenn ein Dateischema nicht zutrifft oder auch eine Datei auf Viren überprüfen und vom Server löschen lassen wenn ein Infekt gefunden wird, incl. einer Server Antwort an den User.

Ein neues Objekt, was Veränderungen am Server Verhalten erlaubt ist als globale Konstante verfügbar: 

Objekt Hook

boolean DeleteFile: Erlaube oder verbiete das Löschen von Datei, die durch den Clienten hochgeladen wurden. Kann nur in HookStoreFinished benutzt werden
int Result: erlaube Modifikationen am Ergebnis der Client Operationen
void SetReply(int Code, string Message): modifiziere die Antwort, die zum User gesendet wird wenn Hook.Result anders als 0

Dieses Objekt kann in folgenden Funktionen benutzt werden:

HookChangeDirectory(FileName, FileNameReal): Client versucht Verzeichnis zu wechseln
Mögliche Rückgabewerte von Hook.Result:
0: erlaubt
1: verweigert
2: Verzeichnis nicht gefunden

HookDeleteFile(FileName, FileNameReal): Client versucht eine Datei zu löschen
Mögliche Rückgabewerte von Hook.Result:
0: erlaubt
1: verweigert
2: Datei nicht gefunden
3: Datei konnte nicht gelöscht werden

HookMakeDirectory(FileName, FileNameReal): Client versucht ein Verzeichnis zu erstellen
Mögliche Rückgabewerte von Hook.Result:
0: erlaubt
1: verweigert
2: Verzeichnis konnte nicht erstellt werden
3: Verzeichnis existiert bereits

HookMove(FileName, FileNameReal, ToFileName, ToFileNameReal): der Client versucht eine Datei oder ein Verzeichnis zu verschieben oder umzubenennen
Mögliche Rückgabewerte von Hook.Result:
0: erlaubt
1: verweigert
2: Datei nicht gefunden
Hinweis:
ToFileName et ToFileNameReal are empty if at RNFR step of the RNFR/RNTO command.

HookRemoveDirectory(FileName, FileNameReal): Client versucht ein Verzeichnis zu löschen
Mögliche Rückgabewerte von Hook.Result:
0: erlaubt
1: verweigert
2: Verzeichnis nicht gefunden
3: Verzeichnis konnte nicht gelöscht werden

HookRetrieve(FileName, FileNameReal): Client versucht eine Datei zu laden
Mögliche Rückgabewerte von Hook.Result:
0: erlaubt
1: verweigert
2: Datei nicht gefunden
3: Datei konnte nicht geladen werden
4: Übertragung ist nur mit sicherer Verbindung erlaubt
5: nicht genügend Credits

sub HookRetrieveFinished(FileName, FileNameReal): Client hat den Download einer Datei beendet
Mögliche Rückgabewerte von Hook.Result:
0: Transfer ok
1: Transfer fehlgeschlagen
2: Festplatten fehler beim Transfer
3: nicht genügend Credits um Transfer fortzusetzen
4: Quota erreicht
5: Transferlimit ist erreicht
6: Transfergeschwindigkeit zu langsam
7: Transfer vom Server gestoppt (gebannter Client, vom Admin gestoppt, Account deaktiviert, ...)
8: Reserviert
9: Partitieller Transfer
10: idle Timeout
11: Zertifikatsverhandlungen gescheitert

HookStore(FileName, FileNameReal): Client versucht eine Datei hochzuladen
Mögliche Rückgabewerte von Hook.Result:
0: erlaubt
1: verweigert
2: Datei konnte nicht gespeichert werden
3: Übertragung ist nur mit sicherer Verbindung erlaubt

HookStoreFinished(FileName, FileNameReal): Client hat den Upload beendet
Mögliche Rückgabewerte von Hook.Result:
0: Transfer ok
1: Transfer fehlgeschlagen
2: Festplatten fehler beim Transfer
3: nicht genügend Credits um Transfer fortzusetzen
4: Quota erreicht
5: Transferlimit ist erreicht
6: Transfergeschwindigkeit zu langsam
7: Transfer vom Server gestoppt (gebannter Client, vom Admin gestoppt, Account deaktiviert, ...)
8: Reserviert
9: Partieller Transfer
10: idle Timeout
11: Zertifikatsverhandlungen gescheitert

HookTag(Tag): ein ubekannter Tag wurde vom Server nicht ausgeführt
den Wert des tags kann Hook.SetText(string text) ausgeben, die Parameter des Tags können Sie mit Hook.ParamCount() und string Hook.GetParam(int index) empfangen.


 5 - Advanced example


'SCRIPT: test hooks.vbs
'AUTHOR: Gene6
'DATE: 2004/08/01
'DESC: Simple script to test hooks

' Constants
cwdOk = 0
cwdNoRight = 1
cwdNotFound = 2

rmOk = 0
rmNoRight = 1
rmNotfound = 2
rmFailed = 3

mkdOk = 0
mkdNoRight = 1
mkdFailed = 2
mkdAlreadyExists = 3

mvOk = 0
mvNoRight = 1
mvNotfound = 2
mvFailed = 3

orOk = 0
orNoRight = 1
orNotfound = 2
orFailed = 3
orSecureTransferOnly = 4
orNotEnoughCredits = 5

owOk = 0
owNoRight = 1
owFailed = 2
owSecureTransferOnly = 3

tNormal = 0
tFailed = 1
tDiskError = 2
tRatioError = 3
tQuotaExceeded = 4
tTransferLimitReached = 5
tTransferTooSlow = 6
tAborted = 7
tCantOpenDataConnection = 8
tPartial = 9
tSessionTimeOut = 10
tSSLNegotiationFailed = 11


sub HookChangeDirectory(FileName, FileNameReal)
Hook.SetReply 550, "No right"
Hook.Result = cwdNoRight
end sub


sub HookDeleteFile(FileName, FileNameReal)
Hook.SetReply 550, "No right"
Hook.Result = rmNoRight
end sub


sub HookMakeDirectory(FileName, FileNameReal)
Hook.SetReply 550, "No right"
Hook.Result = mkdNoRight
end sub


sub HookMove(FileName, FileNameReal, ToFileName, ToFileNameReal)
Hook.SetReply 550, "No right"
Hook.Result = mvNoRight
end sub


sub HookRemoveDirectory(FileName, FileNameReal)
Hook.SetReply 550, "No right"
Hook.Result = rmNoRight
end sub


sub HookRetrieve(FileName, FileNameReal)
if StrComp(Right(FileNameReal, 4), ".zip", 1) < > 0 Then
Hook.SetReply 550, "No right, you can only download *.zip files"
Hook.Result = orNoRight
end if
end sub


sub HookRetrieveFinished(FileName, FileNameReal)
' place code here to do something when a client transfer stops
end sub


sub HookStore(FileName, FileNameReal)
if StrComp(Right(FileNameReal, 4), ".zip", 1) < > 0 Then
Hook.SetReply 550, "No right, you can only upload *.zip files"
Hook.Result = owNoRight
end if
end sub


sub HookStoreFinished(FileName, FileNameReal)
Set fso = CreateObject("Scripting.fileSystemObject")
Set fil = fso.OpenTextFile(FileNameReal, 1, true)

if StrComp(fil.Read(2), "PK", 0) < > 0 Then
Hook.SetReply 550, "This .zip file is not a true zip file ! It will be deleted."
Hook.Result = tFailed
Hook.DeleteFile = true
end if
end sub

sub HookTag(Tag)
'this will write the tag in the file c:\tags.txt
Set fso = CreateObject("Scripting.fileSystemObject")
Set fil = fso.OpenTextFile("c:\tags.txt", 8, true)
fil.WriteLine(Tag)
fil.Close

'Handle the tag $TEST(param1, param2, ..)
if StrComp(Tag, "Test", 1) = 0 Then
Params = ""

for I = 0 to Hook.ParamCount-1
Params = Params & Hook.GetParam(I) & " "
Next

Hook.SetText "Hello " & Client.Username & chr(13) & "This is a test tag and it seems to be working," & chr(13) & _
Hook.ParamCount & " parameters were passed, here is the list: " & chr(13) & _
Params & chr(13)
end if
end sub