1 - Hoe werkt het?


Scripts kunnen worden gebruikt om te reageren op acties en commando's die worden uitgevoerd door de server.
De ondersteunde script talen zijn VBScript en JScript.
Elk script moet worden geplaatst in /scripts/ om ze te kunnen gebruiken.

 2 - Beschikbare script bronnen


Hier is een lijst met functies die worden genoemd.

OnSiteXXXXX waar XXXXX je SITE commando is in kleine letters
Dit commando vindt plaats wanneer een gebruiker een SITE commando gebruikt (Bijv. "SITE BLA test test2" zal de functie OnSitebla("test test2") oproepen).

Aantekening : SITE commando is in kleine letters gevoelig voor script engines die kijken naar grote of kleine letters zoals JScript; VBScript is hoofdletter gevoelig : SITE TEST zal OnSitetest starten, geen OnSiteTEST voor JScript.

Het is aan jou de keus om parameters te parsen.

De volgende functies bevatten geen parameters :

OnClientConnected : Cliënt verbind met domein
OnClientDisconnected: Cliënt verbreekt verbinding met domein
OnClientBanned : Cliënt probeert te verbinden maar is geblokkeerd op het domein
OnClientHammering : Cliënt was aan het hameren op de server en werd geblokkeerd en de verbinding werd afgebroken
OnSameIPConnect : De verbinding met de cliënt werd verbroken omdat er te veel clients met hetzelfde IP waren verbonden
OnTooManyClient : De verbinding met de cliënt werd verbroken omdat er te veel clients waren verbonden

OnClientTimeOut : De cliënt had een time-out en de verbinding is gesloten/afgebroken
OnClientLoggedIn : De cliënt logt in
OnDomainClosed : Domein is offline gegaan
OnDomainOpened : Domein is geopend : domein wacht op inkomende verbindingen
OnDomainStarted : Een domein was opgezet
OnDomainStopped : Een domein is verwijderd
OnEvery05Minutes, OnEveryDay, OnEveryHour : Wordt alleen opgeroepen voor domein scripts
OnDirCreated : Er werd een map gemaakt
OnDirDeleted : Er werd een map verwijderd
OnDirListed : Er werd een mapoverzicht gemaakt
OnFileBanned : Cliënt probeerde een geblokkeerd bestand te uploaden
OnFileDeleted : Cliënt verwijderde een bestand
OnFileDownloaded : Cliënt is klaar met downloaden van bestand
OnFileRenamed : Cliënt heeft de naam van een bestand/map succesvol hernoemt
OnFileUploaded : Cliënt is klaar met uploaden van bestand
OnFileUploadFailed : Tijdens het uploaden van een bestand verbrak de cliënt de verbinding of trad er een socket error op
OnIPChanged : Het domein IP is veranderd
OnQuotaExceeded : Cliënt heeft quote limiet overschreden

De volgende functie is genoemt met een parameter :

OnScriptError(error) : Er is een fout opgetreden in een script, de parameter is de foutbeschrijving

Aantekening:
Elke cliënt doet een aanvraag naar een script dus wanneer je twee scripts hebt die op dezelfde tijd worden uitgevoerd is het mogelijk dat een bestand wordt afgesloten door een ander script die hem open heeft.

Beschikbare objects in scripts :

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

Object Script

string FileName : Haal de naam van het script op
boolean IsDomainContext : Voer terug wanneer het script wordt gedraaid in alleen domein context. Indien het in een domein context is dan is het cliënt object niet beschikbaar.
int Timeout : Haal en bepaal de script time-out, een nieuwe waarde invoeren reset de script time-out. 0 betekent onbeperkt.
void Include(string scriptPath) : Laad en pars het script
void Sleep(int Msec) : Wachten in Msec milliseconds

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

Object gereedschap

string CRCFile(String path) : Bereken en bepaal de CRC van een bestand
string CRCStr(String str) : Bereken en bepaal de CRC van een string
string FormatSize(int size) : Bepaal de opmaak op basis van de grootte, achter de waarde zal er een suffix aan worden geplakt TBytes, GBytes, MBytes, KBytes or Bytes
string FormatSize(int size, int FormatStyle, boolean LongForm) : Bepaal de opmaak op basis van de opmaak stijl en de lengte van de form (lange of korte suffix : KBytes of KB). Opmaakstijl = 1 converteren naar Bytes, 2 in KBytes, ...
string MD5File(String path) : Bereken en bepaalde MD5 hash van een bestand
string MD5Str(String str) : Bereken en bepaalde MD5 hash van een string
string SHA1File(String path) : Bereken en bepaalde SHA1 hash van een bestand
string SHA1Str(String str) : Bereken en bepaalde SHA1 hash van een string

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

Object Server

string CertificatePath : Toon het pad waar de certificaten zijn opgeslagen
string LogPath : Toon het pad waar de logs zijn opgeslagen
string ScriptPath : Toon het pad waar de scripts zijn opgeslagen
string ServerPath : Toon het pad van de applicatie

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

Object Domein

int Bandwidth : Toon het huidige bandbreedte verbruik in bytes/second
int Bandwidth_in : Toon het huidige bandbreedte verbruik in upload in bytes/second
int Bandwidth_out : Toon het huidige bandbreedte verbruik in download in bytes/second
int ClientCount : Toon het aantal cliënts die zijn verbonden met het domein
int UserCount : Toon het aantal cliënts die zijn ingelogd op het domein
int DownloadCount : Toon het aantal downloadende cliënts
int UploadCount : Toon het aantal uploadende cliënts
string Name : Toon de naam van het domein
date StartTime : Toon de datum en tijd wanneer het domein is gestart

void WriteToLog(String log) : Als het log is ingeschakeld, schrijf de parameter in het log

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

Object Client

string AccountName : Toon de accountnaam van de cliënt, het kan verschillen met een gebruikersnaam wanneer er een alias wordt gebruikt om in te loggen
date ConnectionDateTime : Toon de verbindingsdatum tijd
string HostName : Toon de cliënt hostname (wanneer Vertalen van IP is ingeschakeld)
string ID : Toon de unieke cliënt ID
string PeerIP : Toon de cliënt IP adres
int PeerPort : Toon de cliënt poort
string LocalIP : Toon de cliënt's lokale IP adres
int LocalPort : Toon de cliënt's lokale poort
string Keyword : Toon het huidige commando keyword
string Directory : Toon de huidige virtuele map van de cliënt
string DirectoryReal : Toon het huidige pad van de cliënt
int Downloaded : Toon de hoeveelheid bytes die zijn verzonden naar de cliënt
int Uploaded : Toon de hoeveelheid bytes die zijn ontvangen van de cliënt
boolean Logged : Toon 'waar' als de cliënt is ingelogd
int RestartPos : Toon de restart positie van de teller
string Username : Toon de cliënt's gebruikersnaam
string Filename : Toon de huidige virtuele bestandsnaam (Bijv. "/temp/file.txt")
string FilenameReal : Toon de huidige bestandsnaam (Bijv. "C:\temp\file.txt")
int FileSize : Toon de grootte van het laatste overgedragen bestand
int FilePosition
int Speed : Toon de gemiddelde snelheid van de cliënt over de laatste 5 seconden in bytes/seconde
int Speed_In : Toon de gemiddelde uploadsnelheid van de cliënt over de laatste 5 seconden in bytes/seconde
int Speed_Out : Toon de gemiddelde downloadsnelheid van de cliënt over de laatste 5 seconden in bytes/seconde
int TransferTimeSeconds : Toon de overdrachtstijd in seconde's
string TransferTime : Toon de overdrachtstijd. De vorm is "00:00:00"
int TransferSpeedBps : Toon de overdrachts snelheid in bytes/s
string TransferSpeed : Toon de overdrachts snelheid in KBytes/s. De vorm is "128 KBytes/s"

boolean IsSecure : Toon of de cliënt verbinding is beveiligd
boolean IsTransferSecure : Toon of de cliënt data verbinding is beveiligd

void ConvertToReal(string path) : Converteer een virtueel pad (Bijv. /temp) naar een fysiek pad (Bijv. C:\Temp)
void Kick() : Verbreek de verbinding van de cliënt met de server
void Post(string Message) : Verstuur een bericht naar de cliënt : het zal worden getoond door de server en overwogen worden bij het volgende antwoord van de server
void Post(string Message, boolean ProcessTags) : Verstuur een bericht naar de cliënt : het zal worden getoond door de server en overwogen worden bij het volgende antwoord van de server
void Post(string Message, boolean ProcessTags, boolean Append) : Verstuur een bericht naar de cliënt : het zal worden getoond door de server en overwogen worden bij het volgende antwoord van de server
void Send(string Message) : Verstuur een string naar de cliënt
void send(int Code, string Message) : Verstuur een FTP opgemaakte string naar de cliënt, Bijv. 200 ok

 3 - Voorbeeld


'SCRIPT: Log downloads.vbs
'AUTHOR: Gene6
'DATE: 2002/10/04
'DESC: Log elke download naar een logbestand
' Elke invoer heeft de vorm "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 - Geavanceerd scripten


Je kunt ook functies schrijven die worden opgeroepen om te reageren op sommige cliënt acties zonder dat ze worden uitgevoerd door de FTP server.

Bijvoorbeeld, je kunt een functie maken welke het verbied om bestanden te uploaden die niet overeenkomen met een bestandsmasker of scan een bestand op virussen en geef de server de opdracht om het te deleten en te reageren op de gebruiker dat het bestand is geinfecteerd.

Een nieuw object staat wijzigingen toe op de FTP server en is beschikbaar als een globale constante :

Object Hook

boolean DeleteFile : Sta toe of verbied het verwijderen van een bestand dat is geupload door de cliënt. Dit kan alleen worden gebruikt in HookStoreFinished
int Result : Sta wijzigingen toe op de resultaten van de cliënts bewerkingen
void SetReply(int Code, string Message) : Bewerk the antwoorden die worden verstuurd naar de gebruiker wanneer Hook.Result verschilt met 0

Dit object kan worden gebruikt in de volgende functies:

HookChangeDirectory(FileName, FileNameReal) : cliënt probeert om van map te wijzigen
Mogelijke waardes die worden getoond van Hook.Result :
0 : toegestaan
1 : geblokkeerd
2 : map niet gevonden

HookDeleteFile(FileName, FileNameReal) : cliënt probeert om bestand te verwijderen
Mogelijke waardes die worden getoond van Hook.Result :
0 : toegestaan
1 : geblokkeerd
2 : bestand niet gevonden
3 : bestand kon niet worden verwijderd

HookMakeDirectory(FileName, FileNameReal) : cliënt probeert map aan te maken
Mogelijke waardes die worden getoond van Hook.Result :
0 : toegestaan
1 : geblokkeerd
2 : map kon niet worden aangemaakt
3 : map bestaat reeds

HookMove(FileName, FileNameReal, ToFileName, ToFileNameReal) : cliënt probeert om bestand of map te hernoemen
Mogelijke waardes die worden getoond van Hook.Result :
0 : toegestaan
1 : geblokkeerd
2 : bronbestand niet gevonden
Aantekening:
ToFileName en ToFileNameReal zijn leeg wanneer RNFR stap van de RNFR/RNTO commando.

HookRemoveDirectory(FileName, FileNameReal) : cliënt probeert om map te verwijderen
Mogelijke waardes die worden getoond van Hook.Result :
0 : toegestaan
1 : geblokkeerd
2 : map niet gevonden
3 : map kon niet worden verwijderd

HookRetrieve(FileName, FileNameReal) : cliënt probeert bestand te downloaden
Mogelijke waardes die worden getoond van Hook.Result :
0 : toegestaan
1 : geblokkeerd
2 : bestand niet gevonden
3 : bestand kan niet worden gedownload
4 : overdracht is alleen mogelijk over beveiligde verbinding
5 : niet genoeg credits om te downloaden

sub HookRetrieveFinished(FileName, FileNameReal) : cliënt is klaar met downloaden van bestand
Mogelijke waardes die worden getoond van Hook.Result :
0 : overdracht oke
1 : overdracht mislukt
2 : disk fout tijdens overdracht
3 : niet genoeg credits om download te hervatten
4 : quota bereikt
5 : overdrachtslimiet is bereikt
6 : overdrachtsnelheid is te laag
7 : overdracht is gestopt door de server (geblokkeerde cliënt, gestopt door beheerder, account uigeschakeld, ....)
8 : gereserveerd
9 : deel overdracht
10 : inactieve time-out
11 : beveiligde handshake is mislukt

HookStore(FileName, FileNameReal) : cliënt probeert bestand te uploaden
Mogelijke waardes die worden getoond van Hook.Result :
0 : toegestaan
1 : geblokkeerd
2 : bestand kan niet worden opgeslagen
3 : uploaden is alleen toegestaan over beveiligde verbinding

HookStoreFinished(FileName, FileNameReal) : cliënt is klaar met uploaden van bestand
Mogelijke waardes die worden getoond van Hook.Result :
0 : transfer ok
1 : transfer failed
2 : disk error while transfering
3 : reserved
4 : quota exceeded
5 : transfer limit has been reached
6 : transfer speed too slow
7 : transfer stopped by the server (banned client, stopped by admin, disabled account, ...)
8 : reserved
9 : reserved
10 : idle time-out
11 : secure handshake has failed

HookTag(Tag) : een onbekende tag is niet uitgevoerd door de FTP-Server
Toon de waarde van de tag met Hook.SetText(string text), je kunt de tag parameters ontvangen met int Hook.ParamCount() en string Hook.GetParam(int index)


 5 - Geavanceerd voorbeeld


'SCRIPT: test hooks.vbs
'AUTHOR: Gene6
'DATE: 2004/08/01
'DESC: Simpel script om hooks te testen

' 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