Wednesday, 18. July 2007, 11:10:52
Alors que je m’amuse à développer un script d’installation automatisé pour ZazouMiniWebServer, je me dis que je peux faire partager celui-ci déjà avancé principalement sur les fonctions opérationnelles.
Nous partons alors du principe que les fichiers se trouvent sur un serveur distant, sous la même arborescence qu’il devrait se trouver afin de la reconstruire sur le PC. Bien entendu vous vous douter que ceci ne fonctionne que pour les applications indépendantes (application portable ou « standalone »).
Continuons. Après avoir hébergé votre application sous la même structure sur un espace Web, il faut maintenant que celle-ci se télécharge dans un dossier choisis par l’utilisateur tout en recréant la même structure.
Zen.
Alors je pense que la première chose que je ferais ce serait une petite GUI toute simple :
#Region ### START Koda GUI section ### Form=
$gui_Installation = GUICreate("Installation de ZLAAM", 355, 135, -1, -1)
$gp_SelectionDossier = GUICtrlCreateGroup(" Dossiers : ", 10, 16, 335, 73)
$btn_Dossier = GUICtrlCreateButton("&Dossier...", 230, 41, 110, 31, 0)
$lbl_Dossier = GUICtrlCreateLabel("Sélectionnez le dossier de téléchargement", 20, 48, 203, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$btn_Installer = GUICtrlCreateButton("&Installer", 230, 96, 110, 31, 0)
GUISetState(@SW_SHOW, $gui_Installation)
#EndRegion ### END Koda GUI section ###
Par la suite, je ferais la boucle d’affichage :
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
exitScript(); Sortie du script
Case $btn_Dossier
choixDossier() ; définition du choix de dossier de l'installation
Case $btn_Installer
GUISetState(@SW_HIDE, $gui_Installation); Je cache la GUI
verifierDossier(); Vérification de la variable $u_DossierSelect
creationStructure() ; Création de la structure des répertories
verificationConnexion() ; Lancement de la vérification de connexion
telechargementComposant(); Lancement du téléchargement des différents composants
EndSwitch
WEnd
Exit
Et enfin les différentes fonctions.
Evidement une des premières fonctions à créer est le test de la connexion :
Func verificationConnexion()
ProgressSet(4, "Vérification de la connexion", "Téléchargement")
Dim $s_Ping
Sleep(1000)
$s_Ping = Ping("www.google.com", 1000)
If NOT $s_Ping Then
Dim $s_MsgPing
$s_MsgPing = MsgBox(4+32, "Information", "La vérification de la connexion semble avoir échoué, " & @CR & _
"Vérifier si vous êtes connecté et si votre pare-feu permet l'accès au réseau ; " & @CR & _
"Désirez-vous continuer ?")
If $s_MsgPing = 7 Then
abandonProcedure()
EndIf
Else
ProgressSet(4, "Connexion réussie")
Sleep(1000)
EndIf
EndFunc
Par la suite une simple petite routine pour avoir le chemin de téléchargement et d’installation :
Func telechargementFichier($s_URIpath, $s_nomFichier, $s_pc)
Dim $s_tailleFichier, $s_URIcomplete, $s_cheminComplet
MsgBox(0, "", "Track : entrée fonction Func telechargementFichier" & @CR & _
"$s_URIpath = " & $s_URIpath & @CR & _
"$s_nomFichier = " & $s_nomFichier & @CR & _
"$s_pc = " & $s_pc)
$s_URIcomplete = $s_URI & $s_URIpath & $s_nomFichier
MsgBox(0, "", "Track : $s_URIcomplete = " & $s_URIcomplete)
$s_cheminComplet = $u_DossierSelect & "\" & StringReplace($s_URIpath, "/", "\", 0, 1) ;& $s_nomFichier
;$s_tailleFichier = InetGetSize($s_URI & $s_URIpath & $s_nomFichier); Taille du fichier à télécharger
$s_tailleFichier = InetGetSize($s_URIcomplete)
;MsgBox(0, "", "Track $s_tailleFichier = " & $s_tailleFichier & @CR & _; Tracking d'information
;"Chemin : " & $s_URI & $s_URIpath & $s_nomFichier)
MsgBox(0, "", "Track $s_tailleFichier = " & $s_tailleFichier & @CR & _
"Chemin : " & $s_URIcomplete)
If $s_tailleFichier = 0 Then; si la taille est égale à 0 alors erreur
Dim $s_msgTailleFichier
$s_msgTailleFichier = MsgBox(4+32, "Information","Un problème semble être rencontré pour le téléchargement" & @CR & _
"du fichier " & $s_nomFichier & ", désirez-vous continuer ?")
If $s_msgTailleFichier = 7 Then
MsgBox(0+16, "Erreur", "Abandons de procédure par action utilisateur ; " & @CR & _
"Veuillez reporter l'erreur suivante sur les forums : " & @CR & _ ;"Func telechargementFichier(" & $s_URIpath & "/" & $s_nomFichier & "/" & $s_pc & _
"Func telechargementFichier(" & $s_URIcomplete & " / % " & $s_pc & _
"sur la ligne " & @ScriptLineNumber & " ERROR InetGetSize = 0")
abandonProcedure()
EndIf
EndIf
;$s_destination = $u_DossierSelect & "\" & StringReplace($s_URIpath, "/", "\", 0, 1) ; Remplacement des / par \
;MsgBox(0, "", "Track $s_destination = " & $s_destination); Tracking d'information
MsgBox(0, "", "Track $s_destination = " & $s_cheminComplet)
;If NOT FileExists($s_destination) Then ; vérification de l'existance de l'arborescence
If NOT FileExists($s_cheminComplet)Then
Dim $s_msgDestination
$s_msgDestination = MsgBox(4+32, "Erreur", "Il semble que la structure de téléchargement ne soit pas correcte," & _
@CR & "Désirez-vous continuer ?")
If $s_msgDestination = 7 Then
MsgBox(0+16, "Erreur", "Abandons de procédure par action utilisateur ; " & @CR & _
"Veuillez reporter l'erreur suivante sur les forums : " & @CR & _
"Func telechargementFichier(" & $s_cheminComplet & "/ % " & $s_pc & _
"sur la ligne " & @ScriptLineNumber & " ERROR FileExists = -1 => " & $s_cheminComplet)
abandonProcedure()
EndIf
EndIf
;$s_destination = $s_destination & $s_nomFichier
;MsgBox(0, "", "Track $s_destination (2) = " & $s_destination) ; Tracking d'information
$s_cheminComplet = $s_cheminComplet & $s_nomFichier
MsgBox(0, "", "Track $s_destination (2) = " & $s_cheminComplet)
;$s_URIpath = $s_URI & $s_URIpath & $s_nomFichier
;MsgBox(0, "", "Track $s_URIpath (full) = " & $s_URIpath) ; Tracking d'information
MsgBox(0, "", "Track $s_URIpath (full) = " & $s_URIcomplete)
; Reprise totale des variables
MsgBox(0, "", "Track" & @CR & @CR & _
"$s_URIcomplete = " & $s_URIcomplete & @CR & _
"$s_cheminComplet = " & $s_cheminComplet & @CR & _
"$s_tailleFichier = " & $s_tailleFichier & @CR)
InetGet($s_URIcomplete, $s_cheminComplet, 1, 1); Téléchargement du fichier
While @InetGetActive; Téléchargement actif
ProgressSet($s_pc, "Téléchargement " & $s_nomFichier & "(" & _; Mise à jour du Progress
@InetGetBytesRead & "/" & $s_tailleFichier & " bytes)")
Sleep(250); Attente
WEnd
EndFunc
Le tour est joué.
Bientôt le script en entier…