[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 ; Installation de n'importe quel programme à l'aide d'un autoit générique qui lit un fichier ini par application 2 ; Comportement : 3 ; 1. pour chaque prog.xml nécessaire, on descend un fichier /var/se3/unattended/install/packages/prog/prog.ini contenant les noms des fenêtres et 4 ; boutons à cliquer, étape par étape (voir structure ci-dessous) 5 ; 2. Dans le cas où une clé de licence est demandée, l'administrateur doit effectuer une copie de ce fichier en /var/se3/unattended/install/packages/prog/prog-perso.ini 6 ; puis compléter la clé de licence dans la ligne "key=......" 7 ; Rque : le fait de renommer le fichier ini évite qu'il soit écrasé lors d'une prochaine mise à jour du prog.xml 8 9 ; Fonctionnement côté développement : 10 ; 1. le xml de l'application doit appeler <install cmd='%z%\wpkg\autoit-auto.exe %z%\packages\prog\prog.ini' /> 11 ; 2. Dans ce dossier %Z%\packages\prog, il faut créer un fichier prog.ini qui contient les sections et fenêtres à fermer. 12 13 ; Structure du fichier prog.ini 14 ; [section1] 15 ; titre=titre de la fenetre 16 17 ; mode debug = 0 par defaut. 18 $debug = 1 19 20 If EnvGet("Z") = "" Then 21 EnvSet( "Z", "\\se3\install") 22 EndIf 23 24 ; options autoit 25 Opt("WinWaitDelay",2000) 26 Opt("WinTitleMatchMode",4) 27 Opt("WinDetectHiddenText",1) 28 ;Opt("RunErrorsFatal",0) 29 30 If $CmdLine[0] <> 0 Then 31 $file_ini = $CmdLine[1] 32 Else 33 ; pour mes tests en VM sans argument 34 ;$file_ini = "Y:\SambaEdu3\wpkg-packages\files\generis\generis-remove.ini" 35 $file_ini = "Y:\SambaEdu3\wpkg-packages\files\generis\generis.ini" 36 EndIf 37 38 IniReadSectionNames($file_ini) 39 If @error Then 40 _Message("Fichier passé en argument 1 absent : " & $file_ini & ".") 41 Exit(1) 42 Else 43 _Message("Installation en cours à partir de " & $file_ini) 44 EndIf 45 46 ; En argument deux, on peut passer deux choses : 47 ; 0. Si pas d'argument 2, le script teste si %Z%\packages\prog\prog-key.ini (le même que passé en argument 1 mais avec le suffixe "-key") existe 48 ; 1. le nom du fichier ini perso qui contient la clé de licence : ne sera pas écrasé lors d'une maj wpkg du package. 49 ; 2. le Nom du programme afin que l'autoit aille chercher la clé de licence dans le fichier "%Z%\site\wpkg_apps.ini" 50 ; (partie 2 non implémentée pour le moment) 51 52 ; initialisation de la variable pour savoir si un fichier de licence est fourni 53 $nokey=0 54 55 If $CmdLine[0] < 2 Then 56 ;_Message("Il y a 0 ou 1 argument :" & $CmdLine[0]) 57 ;Sleep(3000) 58 ; si l'argument 2 est vide, on teste le fichier -key.ini sinon le fichier wpkg_apps.ini 59 ; fichier perso de licence propre à l'appli 60 $cheminZ=StringRegExpReplace($file_ini ,"\\", "\\\\" ) 61 $licence_ini = StringRegExpReplace($cheminZ ,".ini", "" ) & "-key.ini" 62 If $debug > 1 Then 63 _Message("Argument facultatif n°2 absent. Tentative d'utilisation du fichier: " & $licence_ini) 64 EndIf 65 IniReadSectionNames($licence_ini) 66 If @error Then 67 ; fichier commun à toutes les applis : la section doit porter le nom de la section correspondante dans prog.ini et comporter une clé "key" 68 $licence_ini = EnvGet("Z") & "\site\wpkg_apps.ini" 69 IniReadSectionNames($licence_ini) 70 If @error Then 71 If $debug > 1 Then 72 _Message("Fichier avec suffixe -key absent et " & @CRLF & $licence_ini & " absent.") 73 EndIf 74 $nokey=1 75 ; tous les progs n'ont pas besoin d'une clé : on mémorise qu'il n'y a pas de fichier de clé fournie 76 Else 77 If $debug = "1" Then 78 _Message("Installation en cours à partir du fichier de licence : " & $licence_ini) 79 EndIf 80 EndIf 81 Else 82 If $debug = "1" Then 83 _Message("Installation en cours à partir du fichier de licence : " & $licence_ini) 84 EndIf 85 EndIf 86 Else 87 ;_Message("Il y a 2 arguments :" & $CmdLine[2]) 88 ;Sleep(3000) 89 ; l'argument 2 n'est pas vide : on teste si le fichier existe ; dans le cas contraire, on sort avec une erreur 90 $licence_ini=$CmdLine[2] 91 IniReadSectionNames($licence_ini) 92 If @error Then 93 _Message("Fichier passé en argument 2 absent : " & $licence_ini) 94 Exit(1) 95 Else 96 If $debug > 1 Then 97 _Message("Installation en cours à partir du fichier de licence : " & $licence_ini) 98 EndIf 99 EndIf 100 EndIf 101 102 IniReadSectionNames($licence_ini) 103 If @error Then 104 If $debug = "1" Then 105 _Message("Fichier " & $licence_ini & " absent.") 106 EndIf 107 Else 108 If $debug > 1 Then 109 _Message("Installation en cours à partir du fichier de licence : " & $licence_ini) 110 EndIf 111 EndIf 112 113 ; on essaie de trouver le numero de licence dans "Z:\site\wpkg_apps.ini" sinon dans "Z:\packages\prog\prog-key.ini" 114 ; A IMPLEMENTER : il faut chercher la section quand on en a besoin dans action_programmee() 115 ;$section = "test" 116 ;IniReadSection($licence_ini, $section) 117 ;If @error Then 118 ;$licence_ini = EnvGet("Z") & "\packages\" & $prog & "\" & $prog & "-key.ini" 119 ;IniReadSection($licence_ini, $section) 120 ;If @error Then 121 ;If $debug = "1" Then 122 ; _Message("Section " & $section & " introuvable dans " & $licence_ini & ".") 123 ;EndIf 124 ;$nokey=1 125 ; tous les progs n'ont pas besoin d'une clé 126 ;Exit(1) 127 ;EndIf 128 ;EndIf 129 130 ;on boucle sur toutes les sections et on fait ce qui est demandé dans l'ordre avec des boucles pour attendre le programme d'install 131 $sectionsliste = IniReadSectionNames($file_ini) 132 If @error Then 133 If $debug = "1" Then 134 _Message("Ne peut pas se produire vu les tests du début. Error occurred, probably no INI file.") 135 EndIf 136 Else 137 For $i = 1 To $sectionsliste[0] 138 ;MsgBox(4096, "", $sectionsliste[$i]) 139 ; lecture du timeout sinon on fixe un timeout par défaut à 900 secondes=15 minutes 140 $timeout = 900 141 ; par défaut, on attend 1 seconde après avoir réalisé l'action de la section courante 142 $afterwait = 1 143 ; réinitialisation des actions à mener entre deux sections. 144 $actiontexte = "" 145 $actionrun = "" 146 $actiontitre = "" 147 $actionbouton = "" 148 $actionkey = "" 149 $actionname = "" 150 $actionkeymultizone = 0 151 ;If $debug = "1" Then 152 ;_Message( "Toutes variables initialisées :" & $actionrun ) 153 ;EndIf 154 155 ; lecture des actions programmees : plusieurs variables peuvent être nécessaires pour une action 156 $var = IniReadSection($file_ini, $sectionsliste[$i]) 157 For $j = 1 To $var[0][0] 158 ;MsgBox(4096, "", $sectionsliste[$i] & @CRLF & "Key: " & $var[$j][0] & @CRLF & "Value: " & $var[$j][1]) 159 ; une fonction lit la clé et affecte les bonnes variables pour exécution en fin de section. 160 _ActionProgrammee($var[$j][0] , $var[$j][1]) 161 Next 162 163 ; A IMPLEMENTER 164 ; si $nokey=0 165 ; Alors on teste si, dans $licence_ini , une section $sectionsliste[$i] existe 166 ; si oui, on lit la clé key et on met sa valeur dans $actionkey 167 ; si non , on passe à la suite. 168 169 ; lancement des actions programmees 170 _ActionLanceur() 171 Next 172 EndIf 173 174 Func _ActionProgrammee($key , $value) 175 ; action timeout personnalisé 176 If $key = "timeout" Then 177 $timeout = $value 178 EndIf 179 180 ; action afterwait : permet d'attendre x secondes après l'action en cours dans la section 181 If $key = "afterwait" Then 182 $afterwait = $value 183 EndIf 184 185 ; action run 186 If $key = "run" Then 187 $actionrun = "" & $value & "" 188 EndIf 189 190 ; action clic sur un bouton 191 If $key = "titre" Then 192 $actiontitre = $value 193 EndIf 194 If $key = "bouton" Then 195 $actionbouton = $value 196 EndIf 197 If $key = "texte" Then 198 $actiontexte = $value 199 EndIf 200 201 ; action saisie clé de licence avec nom d'utilisateur 202 If $key = "key" Then 203 $actionkey = $value 204 $actionkeytab = StringSplit( $actionkey , "-" ) 205 EndIf 206 If $key = "name" Then 207 $actionname = $value 208 EndIf 209 ; indique qu'il faudra tabuler pour saisir la clé dès qu'un tiret sera rencontré. Sinon, on saisit la clé dans un seul et unique champ. 210 If $key = "keymultizone" Then 211 $actionkeymultizone = $value 212 EndIf 213 214 EndFunc 215 216 Func _ActionLanceur() 217 ; initialisation du compteur temps à chaque fenêtre 218 $begin = TimerInit() 219 220 ; action timeout personnalisé 221 If $timeout <> 900 Then 222 If $debug = "1" Then 223 _Message("Timeout perso :" & $timeout ) 224 EndIf 225 Else 226 If $debug > 1 Then 227 _Message("Timeout par défaut :" & $timeout ) 228 EndIf 229 EndIf 230 231 ; action run 232 If $actionrun <> "" Then 233 ; problème avec l'antislash compris dans EnvGet("Z") qui est interprété : il faut donc le doubler. 234 $cheminZ=StringRegExpReplace(EnvGet("Z") ,"\\", "\\\\" ) 235 $cheminProgramFiles=StringRegExpReplace(EnvGet("ProgramFiles") ,"\\", "\\\\" ) 236 $Commande=StringRegExpReplace(StringRegExpReplace($actionrun,"%Z%", $cheminZ ),"%ProgramFiles%", $cheminProgramFiles ) 237 If $debug = "1" Then 238 _Message("Action run : " & $actionrun & "." & @CRLF & "interprété : " & $Commande ) 239 EndIf 240 $pid = Run($Commande, EnvGet("SystemRoot")) 241 EndIf 242 243 ; action saisie clé de licence 244 If $actionkey <> "" Then 245 If $actiontitre <> "" And $actionkey <> "" Then 246 If $debug = "1" Then 247 _Message("Action clé de licence perso :" & $actionkey & " dans la fenêtre : " & $actiontitre ) 248 EndIf 249 ; A VERIFIER : non testé 250 If WinExists($actiontitre,$actiontexte) Then 251 ; on clique sur le champ de saisie désiré 252 ControlClick($actiontitre, $actiontexte, $actionbouton) 253 If $actionkeymultizone = 1 Then 254 ; la clé est à saisir dans plusieurs cases : on va tabuler entre chacune. 255 ;on saisit en tabulant à chaque tiret rencontré. 256 For z = 1 to $actionkeytab[0] 257 ; peut etre rajouter l'activation de la fenêtre. 258 ; WinActivate etc... 259 ControlSetText($actiontitre, $actiontexte, "", $actionkeytab[$z]) 260 ControlSetText($actiontitre, $actiontexte, "", "tab") 261 Next 262 Else 263 ; on saisit la clé direct dans l'unique champ présent 264 ControlSetText($actiontitre, $actiontexte, $actionbouton, $actionkey) 265 EndIf 266 EndIf 267 ElseIf $actiontitre = "" Or $actionkey <> "" Then 268 ; dans le cas où une key est fournie , il faut absoluement renseigner un titre de fenêtre. 269 If $debug = "1" Then 270 _Message("La clé key est fournie mais le titre de la fenêtre n'est pas fourni dans la section : " & $sectionsliste[$i] & ". Il est nécessaire de définir les deux pour que la clé de licence soit saisie") 271 EndIf 272 EndIf 273 ;Else 274 ;If $debug = "1" Then 275 ; _Message("pas de key fournie dans la section : " & $sectionsliste[$i] & ".") 276 ;EndIf 277 EndIf 278 279 ; action clic sur un bouton 280 If $actiontitre <> "" And $actionbouton <> "" Then 281 ; le texte du bouton est facultatif mais préférable. 282 If $debug = "1" Then 283 _Message( "Action clic bouton programmee sur le bouton :" & $actiontexte & "(Advanced mode :" & $actionbouton & "), dans la fenêtre : " & $actiontitre ) 284 EndIf 285 286 ; variable permettant de savoir si on sort de la boucle par timeout ou par succès d'apparition de la fenêtre. 287 $success = 0 288 289 While 1 290 $timediff = Int(TimerDiff($begin) / 1000) 291 ; existence de la fenêtre ? 292 If WinExists($actiontitre, $actiontexte) Then 293 ; décoche l'option installer 'Installez le logiciel gratuit Norton Security Scan' 294 ControlClick($actiontitre, $actiontexte, $actionbouton) 295 ; on passe à la section suivante en validant le success dans la variable. 296 $success=1 297 If $debug = "1" Then 298 _Message("ControlClick(" & $actiontitre & "," & $actiontexte & "," & $actionbouton & ") effectué. " & @CRLF & "On passe à la section qui suit la section " & $sectionsliste[$i] ) 299 EndIf 300 ExitLoop 301 EndIf 302 _Message("Attente de la fenêtre : " & $actiontitre & @CRLF & "depuis " & $timediff & " secondes avec un timeout de " & Number($timeout) & " secondes.") 303 304 ; dépassement du timeout ? 305 If $timediff > Number($timeout) Then 306 _Message("Timeout atteint : " & $timediff & ">" & Number($timeout)) 307 Sleep(1000) 308 ExitLoop 309 EndIf 310 Sleep(500) 311 WEnd 312 If $success=0 Then 313 If $debug = "1" Then 314 _Message("Timeout atteint : la fenêtre espérée n'existe toujours pas après " & $timeout & " secondes." ) 315 Sleep(1000) 316 EndIf 317 ;Exit(1) 318 EndIf 319 ElseIf $actiontitre <> "" Or $actionbouton <> "" Then 320 If $debug = "1" Then 321 _Message("Seule une des deux clés bouton ou titre est définie dans la section : " & $sectionsliste[$i] & ". Il est nécessaire de définir les deux pour que l'autoit puisse cliquer sur le bouton désiré." ) 322 EndIf 323 EndIf 324 325 ; action attente après action personnalisée : $afterwait 326 If $afterwait <> 1 Then 327 If $debug = "1" Then 328 _Message("Afterwait personnalisé : script en pause durant " & $afterwait & " secondes.") 329 Sleep(4000) 330 EndIf 331 EndIf 332 Sleep($afterwait * 1000) 333 EndFunc 334 335 ; messages 336 Func _Message($mess) 337 SplashTextOn("Informations Autoit-auto", $mess ,500,100,-1,0) 338 Sleep(2000) 339 EndFunc 340 341 Exit(0)
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Tue Mar 17 22:47:18 2015 | Cross-referenced by PHPXref 0.7.1 |