 | Les scriptes peuvent être utilisés pour réagir aux événements et à des commandes du serveur FTP.
Les langages scripte supportés sont le VBScript et le JScript.
Pour être utilisable, les scriptes doivent être situés dans /scripts/ |  |
 | Voici la liste des fonctions qui sont appelées par le serveur.
OnSiteXXXXX où XXXXX est votre commande SITE en lettres minuscules.
Cette commande est appelée quand un utilisateur envoie une commande SITE (ex: "SITE BLA test test2" appelera la fonction OnSitebla("test test2")).
Note : SITE command est en minuscule pour les langages qui font la différence entre minuscule/majuscule comme le JScript; VBScript ne fait pas la différence : SITE TEST lancera OnSitetest, et non OnSiteTEST en JScript.
Les fonctions suivantes sont appelées sans paramêtre :
OnClientAuthenticated : un client vient d'envoyer un identifiant et mot de passe valide
OnClientConnected : un client vient de se connecter au domaine
OnClientDisconnected : un client s'est déconnecté d'un domaine
OnClientBanned : un client a essayé de se connecter mais est banni du domaine
OnClientHammering : un client a martelé le serveur et a été banni et déconnecté
OnSameIPConnect : un client a été déconnecté car trop de clients avec la même IP sont déjà connectés
OnTooManyClient : un client a été déconnecté car trop de clients sont déjà connectés
OnClientTimeOut : un client était inactif et a été déconnecté
OnClientLoggedIn : un client vient de s'authentifier
OnDomainClosed : un domaine vient de fermer
OnDomainOpened : un domaine vient d'ouvrir : le domaine accepte les connexions
OnDomainStarted : un domaine a été créé
OnDomainStopped : un domaine a été supprimé
OnEvery05Minutes : appelé toutes les 5 minutes, fonctionne seulement pour les scriptes du domaine
OnEveryDay : appelé chaque jour, fonctionne seulement pour les scriptes du domaine
OnEveryHour : appelé chaque heure, fonctionne seulement pour les scriptes du domaine
OnDirCreated : un client a créé un répertoire
OnDirDeleted : un client a supprimé un répertoire
OnDirListed : un client a listé un répertoire
OnFileBanned : un client a essayé d'uploader un fichier banni
OnFileDeleted : un client a supprimé un fichier
OnFileDownloaded : un client a fini de télécharger un fichier
OnFileRenamed : un client a renommé un fichier/répertoire
OnFileUploaded : un client a fini d'uploader un fichier
OnFileUploadFailed : un client a arrêté l'upload ou une erreur socket est intervenue pendant l'upload de fichier
OnIPChanged : les IP d'écoute du domaine ont changés
OnQuotaExceeded : le client a dépassé sa limite de quota
La fonction suivante est appelée avec un paramêtre :
OnScriptError(error) : une erreur est survenue dans un scripte, le paramêtre étant la description de l'erreur
Note:
Chaque client possède une instance du scripte. Ansi 2 scriptes peuvent s'exécuter en même temps et un fichier peut être bloqué par un autre scripte qui l'utilise.
Les objets disponibles dans les scriptes en tant que constante globale sont :
:-------------------------------------------------------------
Object Script
string FileName : Retourne le chemin du fichier scripte
boolean IsDomainContext : Retourne si le scripte tourne dans le contexte d'un domaine. Dans ce cas, l'objet Client n'est pas disponible.
int Timeout : Lit et assigne la valeur du timeout du scripte, le timeout est remis à zéro lorsqu'une nouvelle valeur est assignée, 0 désactive le timeout
void Include(String scriptPath) : Charge et inclut le script
void Sleep(int MSec) : Met le script en pause pendant MSec millisecondes
:-------------------------------------------------------------
Object Tools
string CRCFile(String path) : Calcule et retourne le CRC du fichier passé en paramêtre
string CRCStr(String str) : Calcule et retourne le CRC de la chaine passée en paramêtre
string FormatSize(int size) : Retourne la taille "size" formatée suivant sa valeur avec comme suffixe : TBytes, GBytes, MBytes, KBytes ou Bytes
string FormatSize(int size, int FormatStyle, boolean LongForm, int NumDigitsAfterDecimal) : Retourne la taille "size" formatée suivant FormatStyle (1 pour convertir en Bytes, 2 en KBytes, 3 en MBytes ...), LongForm (forme longue ou courte : KBytes ou KB) et NumDigitsAfterDecimal (le nombre de chiffres affichés après la virgule).
string MD5File(String path) : Calcule et retourne le hash MD5 du fichier passé en paramêtre
string MD5Str(String str) : Calcule et retourne le hash MD5 de la chaine passée en paramêtre
string SHA1File(String path) : Calcule et retourne le hash SHA1 du fichier passé en paramêtre
string SHA1Str(String str) : Calcule et retourne le hash SHA1 de la chaine passée en paramêtre
:-------------------------------------------------------------
Object Server
string CertificatePath : Retourne le chemin où les certificats sont stockés par défaut
string LogPath : Retourne le chemin où les logs sont stockés par défaut
string ScriptPath : Retourne le chemin où les scriptes sont stockés
string ServerPath : Retourne le chemin de l'application
:-------------------------------------------------------------
Object Domain
int Bandwidth : Retourne l'utilisation de la bande passante actuelle en octets/seconde
int Bandwidth_in : Retourne l'utilisation de la bande passante actuelle en envoi en octets/seconde
int Bandwidth_out : Retourne l'utilisation de la bande passante actuelle en réception en octets/seconde
int ClientCount : Retourne le nombre de clients connectés au domaine
int UserCount : Retourne le nombre de clients authentifiés sur le domaine
int DownloadCount : Retourne le nombre de réceptions de fichier en cours
int UploadCount : Retourne le nombre d'envois de fichier en cours
string Name : Retourne le nom du domain
date StartTime : Retourne la date/heure à laquelle le domaine a été créé
void WriteLog(String log) : Si le log est activé, écrit le paramêtre dans le log
:-------------------------------------------------------------
Object Client
string AccountName : Retourne le nom de compte du client, celui-ci peut différer de Username si un alias a été utilisé comme nom d'utilisateur
date ConnectionDateTime : Retourne la date/heure de connexion
string HostName : Retourne le nom d'hôte du client (si l'option ResolveIP est activée)
string ID : Retourne l'identifiant unique du client
string PeerIP : Retourne l'adresse IP distante du client
int PeerPort : Retourne le port distant du client
string LocalIP : Retourne l'adresse IP locale du client
int LocalPort : Retourne le port local du client
string Keyword : Retourne la commande actuelle
string Directory : Retourne le répertoire virtuel actuel du client
string DirectoryReal : Retourne le répertoire actuel du client
int Downloaded : Retourne le nombre d'octets envoyés au client
int Uploaded : Retourne le nombre d'octets reçu du client
boolean Logged : Retourne true si le client est authentifié
int RestartPos : Retourne la position de reprise du transfert
string Username : Retourne le nom d'utilisateur du client
string Filename : Retourne le nom de fichier virtuel (ex: "/temp/fichier.txt")
string FilenameReal : Retourne le nom de fichier (ex: "C:\temp\fichier.txt")
int FileSize : Retourne la taille du dernier fichier transféré
int FilePosition
int Speed : Retourne la vitesse moyenne du client sur les 5 dernières secondes en octets/second
int Speed_In : Retourne la vitesse moyenne du client en envoi sur les 5 dernières secondes en octets/second
int Speed_Out : Retourne la vitesse moyenne du client en réception sur les 5 dernières secondes en octets/second
int TransferTimeSeconds : Retourne le temps de transfert en secondes
string TransferTime : Retourne le temps de transfert formaté "00:00:01"
int TransferSpeedBps : Retourne la vitesse de transfert en octets/seconde
string TransferSpeed : Retourne la vitesse de transfert formaté en KBytes/s : "128 KBytes/s"
boolean IsSecure : Retourne si la connexion de contrôle est sécurisée
boolean IsTransferSecure : Retourne si la connexion de données est sécurisée
void ConvertToReal(string path) : Convertit un chemin virtuel (ex: /temp) en chemin physique (ex: C:\Temp)
void Kick() : Déconnecte le client du serveur
void Post(string Message) : Poste un message au client : il sera formaté par le serveur et envoyé avant la prochaine réponse du serveur
void Post(string Message, boolean ProcessTags) : Poste un message au client : il sera formaté par le serveur et envoyé avant la prochaine réponse du serveur, si ProcessTags est vrai alors tous les tags dans Message seront remplacés
void Post(string Message, boolean ProcessTags, boolean Append) : Poste un message au client : il sera formaté par le serveur et envoyé avant ou après la prochaine réponse du serveur
void Send(string Message) : Envoie une ligne au client
void Send(int Code, string Message) : Envoie une ligne formatée pour le FTP au client, ex: 200 ok
void Send(int Code, string Message, boolean ProcessTags) : Envoie une ligne formatée pour le FTP au client, si ProcessTags est vrai alors tous les tags dans Message seront remplacés |  |
 | 'SCRIPT: Log downloads.vbs
'AUTHOR: Gene6
'DATE: 2002/10/04
'DESC: Log chaque téléchargement dans un fichier
' Chaque ligne a la forme "date heure#nom d'utilisateur#chemin fichier virtuel#chemin fichier réel#de#à#temps#vitesse
'Constantes
Delimiter = "#"
ForAppending = 8
'Construit le chemin
strYear = Year(Date)
strMonth = Month(Date)
' ajoute le premier 0 si nécessaire pour toujours avoir un nombre à 2 chiffres
if (strMonth < 10) Then
strMonth = "0" & strMonth
end if
strDay = Day(Date)
' ajoute le premier 0 si nécessaire pour toujours avoir un nombre à 2 chiffres
if (strDay < 10) Then
strDay = "0" & strDay
end if
LogFilename = Server.LogPath & Domain.Name & "-" & strYear & "-" & strMonth & "-" & strDay & "-downloads.log"
' appelé lorsqu'un client a téléchargé un fichier
sub OnFileDownloaded()
Set fso = CreateObject("Scripting.fileSystemObject")
' ouvre le fichier en écriture
Set LogObj = fso.OpenTextFile(LogFilename, ForAppending, true)
' construit la ligne
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 |  |
 | Vous pouvez aussi écrire des fonctions qui seront appelées pour réagir à certaines actions des clients avant que celles-ci soient exécutées par le serveur FTP.
Par exemple, une fonction qui empêche les clients d'envoyer des fichiers s'ils ne respectent pas un bon format de nom ou bien scanner un fichier à la fin d'un transfert puis ordonner au serveur FTP de le supprimer et changer la réponse à renvoyer au client si ce fichier contient un virus.
Un nouvel objet permettant de modifier le comportement du serveur FTP est disponible en tant que constante globale :
Object Hook
boolean DeleteFile : Permet de supprimer ou non le fichier uploadé par le client. Uniquement effectif dans la fonction HookStoreFinished
int Result : Permet de modifier le résultat de l'opération du client
void SetReply(int Code, string Message) : Modifie la réponse à renvoyer au client si Hook.Result est différent de 0
Cet objet est utilisable dans les fonctions suivantes :
HookChangeDirectory(FileName, FileNameReal) : le client essaye de changer de répertoire
Valeurs possibles de Hook.Result :
0 : le changement de répertoire est autorisé
1 : le changement de répertoire est interdit
2 : le répertoire n'a pas pu être trouvé
HookDeleteFile(FileName, FileNameReal) : le client essaye de supprimer un fichier
Valeurs possibles de Hook.Result :
0 : la suppression de fichier est autorisée
1 : la suppression de fichier est interdite
2 : le fichier n'a pas pu être trouvé
3 : le fichier n'a pas pu être supprimé
HookMakeDirectory(FileName, FileNameReal) : le client essaye de créer un répertoire
Valeurs possibles de Hook.Result :
0 : la création de répertoire est autorisée
1 : la création de répertoire est interdite
2 : le répertoire n'a pas pu être créé
3 : le répertoire existe déjà
HookMove(FileName, FileNameReal, ToFileName, ToFileNameReal) : le client essaye de renommer/déplacer un fichier ou un répertoire
Valeurs possibles de Hook.Result :
0 : le déplacement ou renommage est autorisé
1 : le déplacement ou renommage est interdit
2 : le fichier source n'a pas pu être trouvé
Note:
ToFileName et ToFileNameReal sont vides s'il s'agit de la première étape (RNFR) du déplacement.
HookRemoveDirectory(FileName, FileNameReal) : le client essaye de supprimer un répertoire
Valeurs possibles de Hook.Result :
0 : la suppression du répertoire est autorisée
1 : la suppression du répertoire est interdite
2 : le répertoire n'a pas pu être trouvé
3 : le répertoire n'a pas pu être supprimé
HookRetrieve(FileName, FileNameReal) : le client essaye de télécharger un fichier
Valeurs possibles de Hook.Result :
0 : le téléchargement est autorisé
1 : le téléchargement est interdit
2 : le fichier n'a pas pu être trouvé
3 : le fichier ne peut pas être téléchargé
4 : le téléchargement n'est autorisé que pour les connexions sécurisées
5 : pas assez de crédit pour le téléchargement
sub HookRetrieveFinished(FileName, FileNameReal) : le client a fini de télécharger un fichier
Valeurs possibles de Hook.Result :
0 : le transfert s'est bien déroulé
1 : le transfert n'a pas réussi
2 : une erreur disque est survenue pendant le transfert
3 : plus assez de crédit de ratio pour continuer le transfert
4 : le quota est dépassé
5 : la limite de transfert autorisé est dépassée
6 : le transfert était trop lent
7 : le transfert a été stoppé par le serveur FTP (client banni, transfert stoppé par l'administrateur, compte désactivé, ...)
8 : réservé
9 : le téléchargement a été partiel
10 : la connexion a été fermée car le client a été inactif trop longtemps
11 : la négociation de la connexion sécurisée n'a pas réussi
HookStore(FileName, FileNameReal) : le client essaye d'uploader un fichier
Valeurs possibles de Hook.Result :
0 : l'upload est autorisé
1 : l'upload est interdit
2 : le fichier ne peut pas être uploadé
3 : l'upload n'est autorisé que pour les connexions sécurisées
HookStoreFinished(FileName, FileNameReal) : le client a fini d'uploader un fichier
Valeurs possibles de Hook.Result :
0 : le transfert s'est bien déroulé
1 : le transfert n'a pas réussi
2 : une erreur disque est survenue pendant le transfert
3 : réservé
4 : le quota est dépassé
5 : la limite de transfert autorisé est dépassée
6 : le transfert était trop lent
7 : le transfert a été stoppé par le serveur FTP (client banni, transfert stoppé par l'administrateur, compte désactivé, ...)
8 : réservé
9 : réservé
10 : la connexion a été fermée car le client a été inactif trop longtemps
11 : la négociation de la connexion sécurisée n'a pas réussi
HookTag(Tag) : un tag n'a pas été traité par le serveur
Retournez la valeur du tag avec Hook.SetText, vous pouvez récupérer les paramètres avec int Hook.ParamCount() et string Hook.GetParam(int index)
|  |
 | '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 |  |
|
|
|