Bonjour,
Pour mon premier post sur ce forum, je vais déterrer un vieux sujet.
Je cherchais à ajouter/supprimer des utilisateurs de FileZilla serveur à l'unité ou par lot.
Ne trouvant pas d'outil et ne sachant pas utiliser l'API disponible pour ce faire, j'ai écrit un script sous AutoIt, et je me suis dit que cela pouvait valoir la peine de partager le code source.
Pour faire fonctionner ce script :
- dans ce script, le fichier Filezilla_serveur.xml doit être sur le bureau, mais cela est facile à modifier (ligne 82)
- l'hypothèse de départ est que les utilisateurs sont organisés en groupe : chaque groupe donne l'ensemble des droits et limites, donc les utilisateurs sont créés sans droit particuliers, ceux ci étant hérités de leur groupe. Il faut donc que les groupes soient bien constitués en premier lieu.
- la liste des comptes à créer / supprimer est à fournir sous forme d'un fichier txt, avec valeurs séparées par ";" comportant une ligne d'entête et comportant pour chaque compte le nom, le mdp et le groupe. Le fichier de données ne doit pas contenir de dernière ligne vide.
- Le script affiche une MsgBox pour expliquer ce qui a été fait en fin de traitement : le nombre de comptes à traiter, combien ont été traités et où dans le fichier Filezilla_serveur.xml se trouve le premier compte ajouté.
- Pour la création de comptes, le script vérifie tout d'abord si le compte n'existe pas déjà.
Je suis débutant sous autoit, donc il y a sûrement des mauvaises pratiques dans le script (les déclarations de variables sont parfois un peu chaotiques), mais le xml généré est fonctionnel.
Voilà le script. N'hésitez pas à me présenter vos observations.
Nb : l'hypothèse de base est que les droits des utilisateurs soient hérités de leur groupe, il faut donc avoir préalablement configurer les groupes requis.
Mots clefs : Filezilla, add user, delete user, script, autoit
Code : Tout sélectionner
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=..\3_Icone\if_Filezilla1_95986.ico
#AutoIt3Wrapper_Outfile=..\2_Programme\FileZilla_serveur_adm_v5.Exe
#AutoIt3Wrapper_Compression=3
#AutoIt3Wrapper_Res_Comment=Ce programme permet d'ajouter/supprimer des comptes sur le serveur FTP Filezilla à l'unité ou par lot.
#AutoIt3Wrapper_Res_Description=Ce programme permet d'ajouter/supprimer des comptes sur le serveur FTP Filezilla à l'unité ou par lot.
#AutoIt3Wrapper_Res_Fileversion=1.0.0.5
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=p
#AutoIt3Wrapper_Res_ProductVersion=1.1.0
#AutoIt3Wrapper_Res_LegalCopyright=Parlendir
#AutoIt3Wrapper_Res_SaveSource=y
#AutoIt3Wrapper_Res_Language=1036
#AutoIt3Wrapper_Res_Field=Contact|Parlendir
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Region ~ ~ Description du programme ~ ~
#CS
~ ~ ~ ~ ~ ~ FileZilla Serveur - Ajout et Suppression ~ ~ ~ ~ ~ ~
~ ~ ~ ~ ~ ~ des comptes dans le fichier 'Filezilla serveur.XML' ~ ~ ~ ~ ~ ~
Ce programme est destiné à automatiser l'ajout et la suppression de comptes sur le
serveur FTP FileZilla.
La gestion des utilisateurs peut être réalisée soit via un API mimant les fonctions
de l'interface d'administration soit par édition du fichier XML enregistrant tous
les paramètres du serveur, y compris les groupes et les comptes utilisateur.
Ce second axe est utilisé par ce programme.
Le fichier de configuration se nomme 'FileZilla Server.xml' et se situe à la racine du
répertoire d'installation de FileZilla Server.
Au sein de ce fichier XML, le Noeud définissant les comptes utilisateur est tel que :
| <Users>
| <User Name="NOM_DU_COMPTE">
| <Option Name="Pass">MOT_DE_PASSE_STOCKE_CRYPTE</Option>
| <Option Name="Salt"></Option>
| <Option Name="Group">GROUPE_AUQUEL_APPARTIENT_LE_COMPTE</Option>
| <Option Name="Bypass server userlimit">2</Option>
| <Option Name="User Limit">0</Option>
| <Option Name="IP Limit">0</Option>
| <Option Name="Enabled">2</Option>
| <Option Name="Comments" />
| <Option Name="ForceSsl">2</Option>
| <IpFilter>
| <Disallowed />
| <Allowed />
| </IpFilter>
| <Permissions />
| <SpeedLimits DlType="0" DlLimit="10" ServerDlLimitBypass="2" UlType="0" UlLimit="10" ServerUlLimitBypass="2">
| <Download />
| <Upload />
| </SpeedLimits>
| </User>
| </Users>
Pour l'ajout ou la suppression de comptes, ce programme :
- cherche le début du noeud <Users>
- vérifie si le compte existe
- si oui : - la création n'est pas réalisée pour éviter la redondance
- la suppression peut être réalisée, par suppression des 20 lignes composant un Noeud <User>
- si non : - la création est réalisée par adjonction au début du Noeud <Users> des 20 lignes formant un Noeud <User>
- la suppression n'est pas réalisée
La première version du Logiciel permettait de ne traîter qu'un compte à la fois.
A compter de la deuxième version (v2), le traitement par lot est ajouté : il consiste à fournir un fichier structuré (csv) avec les
comptes à ajouter ou à supprimer. Ce fichier est alors traité ligne à ligne pour faire boucler les fonctions basiques (ajout/suppression).
Le fichier 'FileZilla Server.xml' est à placer sur le bureau : une copie en est réalisée avant d'apporter les modifications.
Ce comportement peut être facilement modifié par la modification du script.
Historique des versions :
- 31/08/17 : rédaction et tests du programme sur un serveur ftp fermé.
- 18/10/17 : - création d'une info bulle pour décrire le fichier attendu pour la création / suppression par lot
- sélecteur de fichier réglé sur les "Texte (*.csv)"
- validation du logiciel sur le ftp en production.
- 05/03/18 : - ajout d'un label pour suivre la progression du travail en cours
- verrouillage de l'interface après lancement du traitement pour éviter un double clic
- reste un bug : le compteur de suppression de compte, dans le traitement à l'unité, affiche toujours 0.
#CE
#EndRegion ~ ~ Description du programme ~ ~
#Region ~ ~ Includes ~ ~
#include <GUIConstants.au3>
#include <File.au3>
#include <md5.au3>
#include <Array.au3>
#include <String.au3>
#include <MsgBoxConstants.au3>
#include <date.au3>
#EndRegion
#Region ~ ~ Déclarations variables globales ~ ~
Global $ServerXML = @DesktopDir & "\FileZilla Server.xml"
Global $FichierDonnees = ""
Global $occurences_dejaCree = 0
Global $occurences_creation = 0
Global $occurences_non_suppr = 0
Global $occurences_suppression = 0
Global $nbr_lignes_donnees = 0
#EndRegion ~ ~ Déclarations variables globales ~ ~
#Region ~ ~ Interface ~ ~
; Création de l'interface de saisie des comptes
$msg = GUICreate ("Gestion users FTP",220,220)
GUISetState(@SW_SHOW)
$Tab1 = GUICtrlCreateTab(0, 0, 220, 230)
; Onglet "Gérer un compte"
$TabSheet1 = GUICtrlCreateTabItem("Gérer UN compte")
; Label et zone de saisie pour le Nom du compte
GUICtrlCreateLabel("Nom du compte :",10,30)
$ftpuserloginGUI = GUICtrlCreateInput ("", 10, 45, 200, 20)
; Label et zone de saisie pour le mot de passe
GUICtrlCreateLabel("Mot de passe du compte :",10, 80)
$ftpuserpassGUI = GUICtrlCreateInput ("", 10, 95, 200, 20)
; Label et zone de saisie pour le groupe auquel appartient le compte
GUICtrlCreateLabel("Groupe pour ce compte :",10, 130)
$ftpusergroupGUI = GUICtrlCreateInput ("", 10, 145, 200, 20)
; Boutons pour lancer un type d'opération : créer ou supprimer un / des compte(s)
$Bouton_CREER1 = GUICtrlCreateButton("Créer", 10, 195, 100, 20)
$Bouton_SUPPRIMER1 = GUICtrlCreateButton("Supprimer", 110, 195, 100, 20)
; Onglet "Gérer par lot"
$TabSheet2 = GUICtrlCreateTabItem("Gérer DES comptes")
; Bouton pour choisir un dossier
$Bouton_Fichier = GUICtrlCreateButton("Choisir le fichier de données", 10, 65, 200, 25, 0)
GUICtrlSetTip(-1, "Le fichier doit être sous format .csv, séparateur "";"")." & @CRLF & _
"La ligne d'entête doit être présente." & @CRLF & _
"Les champs doivent être dans l'ordre : nom utilisateur; mdp; groupe.", "", 0, 1)
; Label pour le fichier choisi
$GUI_FichierDonnees = GUICtrlCreateLabel($FichierDonnees, 10, 130, 200, 20, BitOR($SS_RIGHT, $WS_BORDER, $SS_CENTERIMAGE))
; Boutons pour lancer un type d'opération : créer ou supprimer un / des compte(s)
$Bouton_CREERX = GUICtrlCreateButton("Créer", 10, 195, 100, 20)
$Bouton_SUPPRIMERX = GUICtrlCreateButton("Supprimer", 110, 195, 100, 20)
; Libellé pour visualiser les opérations en cours
$LabelWip = GUICtrlCreateLabel("WiP : ", 10, 170, 200, 20, $SS_CENTER)
GUICtrlSetState(-1, $GUI_HIDE)
; Onglet à créer vide pour le bon affichage des onglets
GUICtrlCreateTabItem("")
; Présenter le premier onglet, $TabSheet1, à l'ouverture de l'interface
GUICtrlSetState($TabSheet1, $GUI_SHOW)
#EndRegion ~ ~ Interface ~ ~
#Region ~ ~ Boucle principale ~ ~
; Permettre la fin du programme avec la touche Echap
HotKeySet("{ESC}", "_endscript")
;Boucle d'affichage de la fenêtre de saisie d'informations
While 1
$msg = GUIGetMsg()
Switch $msg
CASE $gui_event_close ; Fermeture du programme
Exit
CASE $Bouton_Fichier ; Choisir un fichier de données
; Ouvre une boîte de dialogue pour sélectionner un fichier.
;~ FileOpenDialog( "title", "init dir", "filter" [, options = 0 [, "default name" [, hwnd]]] )
Global $FichierDonnees = FileOpenDialog("Sélectionnez le fichier de données", @DesktopDir & "\", "Texte (*.csv)", 1)
; Label commentant la sélection opérée par l'utilisateur
If @error Then
$FichierDonnees = '' ; La variable est remise à vide
; Mise à jour du label présentant le nom du fichier sélectionné
GUICtrlSetData($GUI_FichierDonnees, $FichierDonnees)
Else
; Mise à jour du label présentant le nom du fichier sélectionné
GUICtrlSetData($GUI_FichierDonnees, $FichierDonnees)
EndIf
CASE $Bouton_CREER1 ; Créer un compte utilisateur
_InterfaceClose()
_SauvegardeXML()
_ServeurXML_nbr_ligne($ServerXML)
_DebutNoeudUsers()
$ftpuserlogin = GUICtrlRead($ftpuserloginGUI)
$ftpuserpass = GUICtrlRead($ftpuserpassGUI)
$ftpusergroup = GUICtrlRead($ftpusergroupGUI)
_testuser($ftpuserlogin,$ftpuserpass,$ftpusergroup)
MsgBox(64, "Résultat", $occurences_creation & " compte nouvellement créé avec succès.")
$occurences_creation = 0
_InterfaceOpen()
;~ Exit
CASE $Bouton_SUPPRIMER1 ; Supprimer un compte utilisateur
_InterfaceClose()
$occurences_suppression = 0
_SauvegardeXML()
_ServeurXML_nbr_ligne($ServerXML)
$ftpuserlogin = GUICtrlRead($ftpuserloginGUI)
_SupprUser($ftpuserlogin)
MsgBox(64, "Résultat", $occurences_creation & " compte supprimé avec succès.")
$occurences_suppression = 0
_InterfaceOpen()
;~ Exit
CASE $Bouton_CREERX ; Créer un lot de comptes utilisateur
_InterfaceClose()
_SauvegardeXML()
_ServeurXML_nbr_ligne($ServerXML)
_DebutNoeudUsers()
_MiseAZeroVariable()
_CreationUserBoucle()
_InterfaceOpen()
;~ Exit
CASE $Bouton_SUPPRIMERX ; Supprimer un lot de comptes utilisateur
_InterfaceClose()
_SauvegardeXML()
_ServeurXML_nbr_ligne($ServerXML)
_DebutNoeudUsers()
_MiseAZeroVariable()
_SupprUserBoucle()
_InterfaceOpen()
;~ Exit
EndSwitch
WEnd
#EndRegion ~ ~ Boucle principale ~ ~
#Region ~ ~ Fonctions ~ ~
Func _SauvegardeXML() ; Sauvegarder le fichier XML avant toute modification
; Variables pour nommer le fichier avec la date du jour, l'heure du scan, et le nom du fichier
$NomDate = StringRegExpReplace(_NowDate(), "/", "-") ; va remplacer le '/' dans la date par un '-' pour ne pas avoir de pb pour créer le fichier
$NomHeure = StringRegExpReplace(_NowTime(4), ":", "h") ; va remplacer le ':' dans l'heure par un 'h'
FileCopy($ServerXML, @DesktopDir & "\FileZilla_Serveur_sauv_" & $NomDate & "_" & $NomHeure & ".xml", 0)
EndFunc
Func _ServeurXML_nbr_ligne($ServerXML) ; Déterminer le nombre de lignes présentes dans le fichier 'Filezilla serveur.xml'
Global $nbr_lignes_xml = _FileCountLines($ServerXML)
EndFunc
Func _DebutNoeudUsers() ; Trouver le début du Noeud Users
For $i = 1 to $nbr_lignes_xml
If FileReadLine($ServerXML, $i) = " <Users>" Then
Global $DebutNoeudUsers = $i + 1
ExitLoop
EndIf
Next
EndFunc
Func _CreationUserBoucle() ; Faire boucler la fonction _CreationUser
If $FichierDonnees = "" Then MsgBox(64, "Erreur", "Aucun Fichier n'a été sélectionné.")
If $FichierDonnees <> "" Then
Global $occurences_dejaCree = 0
Global $occurences_creation = 0
Global $nbr_lignes_donnees = _FileCountLines($FichierDonnees) ; compter le nombre de lignes dans le fichier de données. La première est un entête
$FichierDonneesOuvert = FileOpen($FichierDonnees, 0) ; ouverture du fichier de données en mode lecture seule
; Boucle pour lancer la fonction _CreationUser
For $i = 2 To $nbr_lignes_donnees step 1
$ligne = FileReadLine($FichierDonneesOuvert, $i) ; lire la ligne $i du fichier de données
; Extraire les valeurs contenues dans cette ligne
$aLigne = _StringExplode($ligne, ";", 0)
$ftpuserlogin = $aLigne[0]
$ftpuserpass = $aLigne[1]
$ftpusergroup = $aLigne[2]
; Lancer la fonction _testuser pour éviter d'inscrire un utilisateur existant déjà
_testuser($ftpuserlogin,$ftpuserpass,$ftpusergroup)
; Mise à jour du Label compteur d'étapes
GUICtrlSetData($LabelWip, "WiP : " & $occurences_creation + $occurences_suppression + $occurences_dejaCree + $occurences_non_suppr & " / " & $nbr_lignes_donnees - 1 )
Next
; rajouter un compteur pour dire combien de comptes ont été créés
MsgBox(64, "Résultats", "Compte(s) à créer :" & @TAB & @TAB & $nbr_lignes_donnees - 1 & @CRLF & _
"Compte(s) créé(s) :" & @TAB & @TAB & $occurences_creation & @CRLF & _
"Compte(s) déjà créé(s) :" & @TAB & $occurences_dejaCree & @CRLF & _
"Ligne de création :" & @TAB & @TAB & $DebutNoeudUsers)
EndIf
EndFunc
Func _testuser($ftpuserlogin,$ftpuserpass,$ftpusergroup) ; Tester l'existence d'un compte
; Variable pour savoir si le compte testé a été trouvé dans le fichier XML
$existe = 0
; Lancement du test : valeur recherchée
$verif = " <User Name=""" & $ftpuserlogin &""">"
; Boucle pour vérifier toutes les lignes ou jusqu'à trouver une occurrence correspondante
For $i = $DebutNoeudUsers to $nbr_lignes_xml
If FileReadLine($ServerXML, $i) = $verif Then
;~ MsgBox(64, "Debug - Compte déjà créé", "Cet utilisateur ( " & $ftpuserlogin & " ) existe déjà dans " & @CRLF & $ServerXML & @CRLF & "creation = " & $occurences_creation)
$occurences_dejaCree += 1
$existe = 1
Exitloop ; quand la valeur est trouvée, il n'est plus nécessaire de chercher dans le reste du fichier XML
EndIf
Next
; Si le test retourne que le compte n'existe pas déjà (donc $existe est resté à 0), on peut le créer
If $existe = 0 Then
$occurences_creation += 1 ; incrémenter la variable de suivi des comptes créés
_CreationUser($ftpuserlogin,$ftpuserpass,$ftpusergroup)
EndIf
EndFunc
Func _CreationUser($ftpuserlogin,$ftpuserpass,$ftpusergroup) ; Création d'un compte unique par insertion d'un noeud XML
_FileWriteToLine($ServerXML, $DebutNoeudUsers, " <User Name=""" & $ftpuserlogin & """>" & @CRLF & _
" <Option Name=""Pass"">" & md5($ftpuserpass) & "</Option>" & @CRLF & _
" <Option Name=""Salt""></Option>" & @CRLF & _
" <Option Name=""Group"">" & $ftpusergroup & "</Option>" & @CRLF & _
" <Option Name=""Bypass server userlimit"">2</Option>" & @CRLF & _
" <Option Name=""User Limit"">0</Option>" & @CRLF & _
" <Option Name=""IP Limit"">0</Option>" & @CRLF & _
" <Option Name=""Enabled"">2</Option>" & @CRLF & _
" <Option Name=""Comments"" />" & @CRLF & _
" <Option Name=""ForceSsl"">2</Option>" & @CRLF & _
" <IpFilter>" & @CRLF & _
" <Disallowed />" & @CRLF & _
" <Allowed />" & @CRLF & _
" </IpFilter>" & @CRLF & _
" <Permissions />" & @CRLF & _
" <SpeedLimits DlType=""0"" DlLimit=""10"" ServerDlLimitBypass=""2"" UlType=""0"" UlLimit=""10"" ServerUlLimitBypass=""2"">" & @CRLF & _
" <Download />" & @CRLF & _
" <Upload />" & @CRLF & _
" </SpeedLimits>" & @CRLF & _
" </User>" , False)
FileFlush($ServerXML) ; ne sert qu'à être sûr que les nouvelles données sont bien accessibles lors du prochain passage de _testuser
EndFunc
Func _SupprUserBoucle() ; Faire boucler la fonction _SupprUser
If $FichierDonnees = "" Then MsgBox(64, "Erreur", "Aucun Fichier n'a été sélectionné.")
If $FichierDonnees <> "" Then
Global $occurences_non_suppr = 0
Global $occurences_suppression = 0
$nbr_lignes_donnees = _FileCountLines($FichierDonnees) ; compter le nombre de lignes dans le fichier de données. La première est un entête
$FichierDonneesOuvert = FileOpen($FichierDonnees, 0) ; ouverture du fichier de données en mode lecture seule
; Boucle pour lancer la fonction _CreationUser
For $i = 2 To $nbr_lignes_donnees step 1
$ligne = FileReadLine($FichierDonneesOuvert, $i) ; lire la ligne $i du fichier de données
; extraire les valeurs contenues dans cette ligne
$aLigne = _StringExplode($ligne, ";", 0)
$ftpuserlogin = $aLigne[0]
; Lancer la fonction _SupprUser pour supprimer l'utilisateur
_SupprUser($ftpuserlogin)
; Mise à jour du Label compteur d'étapes
GUICtrlSetData($LabelWip, "WiP : " & $occurences_creation + $occurences_suppression + $occurences_dejaCree + $occurences_non_suppr & " / " & $nbr_lignes_donnees - 1)
Next
; rajouter un compteur pour dire combien de comptes ont été supprimés
MsgBox(64, "Résultats", "Comptes à supprimer : " & @Tab & $nbr_lignes_donnees - 1 & @CRLF & _
"Comptes supprimés : " & @Tab & $occurences_suppression & @CRLF & _
"Comptes non trouvé(s) : " & @Tab & $nbr_lignes_donnees - 1 - $occurences_suppression)
EndIf
EndFunc
Func _SupprUser($ftpuserlogin) ; Suppression d'un compte unique
; Vérifier si le compte existe déjà
$verif = " <User Name=""" & $ftpuserlogin &""">"
For $i = 1 to $nbr_lignes_xml step 1
If FileReadLine($ServerXML, $i) = $verif Then
For $j = 1 to 20 ; Alors : supprimer le compte en supprimant les 20 lignes
_FileWriteToLine($ServerXML, $i, "", True)
Next
$occurences_suppression += 1
ExitLoop
EndIf
Next
EndFunc
Func _InterfaceOpen()
; Activation de tous les boutons
GUICtrlSetState($Bouton_CREERX, $GUI_ENABLE)
GUICtrlSetState($Bouton_SUPPRIMERX, $GUI_ENABLE)
GUICtrlSetState($Bouton_SUPPRIMERX, $GUI_ENABLE)
GUICtrlSetState($Bouton_CREER1, $GUI_ENABLE)
GUICtrlSetState($Bouton_SUPPRIMER1, $GUI_ENABLE)
GUICtrlSetState($Bouton_Fichier, $GUI_ENABLE)
GUICtrlSetState($LabelWip, $GUI_HIDE)
EndFunc
Func _InterfaceClose()
; Désactivation de tous les boutons
GUICtrlSetState($Bouton_CREERX, $GUI_DISABLE)
GUICtrlSetState($Bouton_SUPPRIMERX, $GUI_DISABLE)
GUICtrlSetState($Bouton_SUPPRIMERX, $GUI_DISABLE)
GUICtrlSetState($Bouton_CREER1, $GUI_DISABLE)
GUICtrlSetState($Bouton_SUPPRIMER1, $GUI_DISABLE)
GUICtrlSetState($Bouton_Fichier, $GUI_DISABLE)
GUICtrlSetState($LabelWip, $GUI_SHOW)
EndFunc
Func _MiseAZeroVariable()
$occurences_creation = 0
$occurences_suppression = 0
$occurences_dejaCree = 0
$occurences_non_suppr = 0
; Mise à jour du Label compteur d'étapes
GUICtrlSetData($LabelWip, "WiP : " & $occurences_creation + $occurences_suppression + $occurences_dejaCree + $occurences_non_suppr & " / " & $nbr_lignes_donnees - 1)
EndFunc
Func _endscript() ; Fonction pour fermer le programme
Exit
EndFunc ;==>endscript
#EndRegion ~ ~ Fonctions ~ ~