[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3-wpkg/sources/wpkg/ -> autoit-auto.au3 (source)

   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)


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1