[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3-wpkg/sources/wpkg-md5verif/ -> wpkg-md5verif.sh (source)

   1  #!/bin/bash
   2  # Auteur : Olivier Lacroix
   3  # Script permettant de tester les xml du svn du crdp.ac-caen.fr afin de surveiller les sommes md5 des xml officiels.
   4  
   5  # ATTENTION : ce script ne doit pas tre exŽcutŽ sur un serveur en production. Il doit tre exŽcutŽ uniquement sur un serveur de tests car il modifie la base des xml wpkg automatiquement !
   6  
   7  ######## Utilisation : ##########
   8  
   9  # 1. copier wpkg-md5verif.sh sur le serveur se3 de test.
  10  # 2. renseigner toutes les variables en debut de script : nom netbios du se3, IP du client windows de test, etc...
  11  # 3. exŽcuter une fois wpkg-md5verif.sh afin de generer les scripts utiles et la conf : installation en crontab de l'exŽcution de wpkg-md5verif.sh
  12  # 4. sur le client windows, sous le compte admin executer une fois Y:\unattended\install\wpkg-md5verif\client\install.bat : renseigner le mot de passe d'admin lors de la creation de la tache planifiee.
  13  # 5. redemarrer le client windows pour activer automatiquement la tache planifiee.
  14  
  15  # PS : verifier au prealable que le serveur SE3 peut envoyer des mails.
  16  
  17  ####### Fin de la documentation sur l'utilisation ########
  18  
  19  # Chemin UNC vers partages du se3
  20  SE3="\\\\se3"
  21  
  22  # Dossier contenant tous les fichiers generes par ce script.
  23  REP=/var/se3/unattended/install/wpkg-md5verif
  24  REPSOUSWIN="$SE3\install\wpkg-md5verif"
  25  mkdir -p $REP
  26  
  27  # dossier contenant les fichiers temoins pour les pauses.
  28  mkdir -p $REP/pause
  29  
  30  # MODE DEBUG
  31  DEBUG=1
  32  
  33  # quantite max a telecharger en une execution de ce script (en Ko)
  34  # le script prend en compte cette limite avant le debut du telechargement suivant :
  35  # exemple : si la limite est 1 000 000Ko et que le script a telecharge 999 999Ko, il va telecharger le fichier suivant
  36  # meme si celui-ci pese lourd et s'interrompra apres...
  37  # par defaut 6Go (en Ko)
  38  MAXDOWNLOAD=6000000
  39  
  40  # Heure du matin a partir de laquelle le script s'interrompt
  41  HOURMAX=8
  42  
  43  # Emplacement du fichier downloade... Ecrase-efface a chaque fois pour ne pas remplir le disque.
  44  # 1Go doit etre dispo sur la partition du serveur pour certains download qui pesent un peu (orcad, ...).
  45  DESTFILE=$REP/wpkg-md5-verif-file.tmp
  46  
  47  # mail d'envoi
  48  DESTMAIL=wpkg-se3@listes.tice.ac-caen.fr
  49  
  50  # IP du SE3
  51  IPSE3="10.211.55.200"
  52  
  53  # IP du client windows (qui doit repondre aux pings)
  54  IPWIN="10.211.55.150"
  55  
  56  # Acces au script wpkg-se3.js
  57  WPKGJS="$SE3\install\wpkg\wpkg-se3.js"
  58  
  59  # PARAMETRES wpkg-se3.js obligatoires
  60  PARAM="/noDownload:True"
  61  
  62  ####### CONF : ne pas modifier la suite ###########
  63  
  64  wpkgroot=/var/se3/unattended/install/wpkg
  65  
  66  LISTEDESXML=$REP/wpkg-LISTEDESXML
  67  
  68  # emplacement local du fichier repertoriant les applications installees
  69  WPKGXML="%systemroot%\system32\wpkg.xml"
  70  
  71  # url de telechargement des xml (doit contenir trois sous-dossiers stable, testing (avec les xml) et logs (avec les fichiers journaux))
  72  export url=http://svn.tice.ac-caen.fr/svn/SambaEdu3/wpkg-packages
  73  
  74  # variable globales utiles
  75  export RetourTelechargeUrls=0
  76  export TOUTESTCORRIGE=1
  77  
  78  # creation si besoin du dossier pour DESTFILE
  79  DESTFILEDOSSIER="$(dirname "$DESTFILE")"
  80  mkdir -p $DESTFILEDOSSIER
  81  
  82  # Dossier de dialogue avec le client
  83  REPBAT=$REP/client
  84  mkdir -p $REPBAT
  85  REPBATWIN=$REPSOUSWIN\\client
  86  
  87  # Fichier de dialogue avec le client windows : contient la liste des instructions qu'il devra exŽcuter pour tester les xml modifiŽs.
  88  TESTFILE=$REPBAT/TesteXml.bat
  89  TESTFILEWIN=$REPBATWIN\\TesteXml.bat
  90  [ -e $TESTFILE ] && rm -f $TESTFILE
  91  
  92  # Fichier provoquant une pause
  93  PAUSEFILE=$REPBAT/pause.vbs
  94  PAUSEFILEWIN=$REPBATWIN\\pause.vbs
  95  
  96  # Fichier execute en tache panifiee au demarrage du pc client, qui ne s'arrete jamais et teste toutes les 10 secondes s'il y a quelquechose a faire (presence de $TESTFILE)
  97  TACHEFILE=$REPBAT/bootscript.bat
  98  TACHEFILEWIN=$REPBATWIN\\bootscript.bat
  99  
 100  # Fichier provoquant une pause
 101  INSTALLSCRIPTCLIENT=$REPBAT/install.bat
 102  
 103  # Fichier de retour du client windows : contient les informations utiles pour savoir si l'install, l'upgrade, le remove ont fonctionnŽ.
 104  RETOURFILE=$REPBAT/TesteXml.log
 105  RETOURFILEWIN=$REPBATWIN\\TesteXml.log
 106  
 107  # Dossier contenant toutes les commandes passŽes par le poste windows au serveur SE3.
 108  REPCMDCRON=$REP/cron
 109  
 110  # Dossier contenant tous les xml modifiŽs ˆ tester par le poste windows.
 111  REPXML=$REP/xml
 112  
 113  # Fichier qui reste apres le lancement du script afin de ne pas reprendre tous les download depuis le debut.
 114  # Fichier listant dans l'ordre les verifications a faire. Permet de ne pas recommencer au debut a chaque lancement du script
 115  # Le script reprend a la premiere ligne de ce fichier les verifications
 116  LISTEAEXECUTER=$REP/wpkg-md5-verif-liste
 117  
 118  # on concatene les xml les plus recents dans un wpkg-md5-verif-packages.xml
 119  export PACKAGESFILE=$REP/wpkg-md5-verif-packages.xml
 120  
 121  #### Fichiers temporaires a supprimer en fin de script.
 122  # Fichier contenant le mail a envoyer
 123  MAILFILETMP=$REP/wpkg-md5-verif-mail
 124  
 125  # Fichier genere depuis $PACKAGEARCH avec toutes les url a verifier sous la forme :
 126  # file.xml#url#md5sum
 127  LISTEURLMD5=$REP/wpkg-url-md5-new
 128  
 129  # fichier temporaire pour updater les sommes md5 des xml
 130  export FILETMP=$REP/wpkg-md5verif-temp.xml
 131  
 132  ######################## FIN CONF #######################
 133  
 134  ############### DEBUT DES VERIFICATIONS DES DEPENDANCES ET TEST DE NON DOUBLE EXECUTION ############
 135  # dependance subversion...
 136  TEST=$(dpkg -l | grep subversion)
 137  if [ "$TEST" == "" ] ; then
 138      echo "Le package subversion n'est pas installe. Ce script necessite xmlstarlet pour parser les xml..."
 139      echo "apt-get install subversion"
 140      exit 1
 141  fi
 142  
 143  # dependance xmlstarlet...
 144  TEST=$(dpkg -l | grep xmlstarlet)
 145  if [ "$TEST" == "" ] ; then
 146      echo "Le package xmlstarlet n'est pas installe. Ce script necessite xmlstarlet pour parser les xml..."
 147      echo "apt-get install xmlstarlet"
 148      exit 1
 149  fi
 150  
 151  VERROU=/var/lock/wpkg-md5verif
 152  
 153  if [ -e $VERROU ]; then
 154      echo "wpkg-md5verif.sh est deja en cours d'execution sur ce serveur"
 155      exit 0
 156  fi
 157  
 158  ####################### FIN DES VERIFICATIONS DES DEPENDANCES ET DU TEST ############
 159  
 160  
 161  ####################### DEBUT DES FONCTIONS ############
 162  
 163  function CmdToWin {
 164      echo $1 >> $TESTFILE
 165  }
 166  
 167  function SupprimeScriptClient {
 168      rm -f $TESTFILE
 169  }
 170  
 171  function WpkgInstall {
 172      idpackage=$1
 173      CmdToWin "cscript $WPKGJS $PARAM /install:$idpackage"
 174      #RecupereWpkgXml
 175      WpkgStatus $idpackage
 176  }
 177  
 178  function WpkgUpgrade {
 179      idpackage=$1
 180      CmdToWin "cscript $WPKGJS $PARAM /upgrade:$idpackage"
 181      #RecupereWpkgXml
 182      WpkgStatus $idpackage
 183  }
 184  
 185  function WpkgRemove {
 186      idpackage=$1
 187      CmdToWin "cscript $WPKGJS $PARAM /remove:$idpackage"
 188      #RecupereWpkgXml
 189      WpkgStatus $idpackage
 190  }
 191  
 192  function WpkgStatus {
 193      idpackage=$1
 194      CmdToWin "cscript $WPKGJS /show:$idpackage > $RETOURFILEWIN"
 195  }
 196  
 197  function CreeTemoin {
 198      FICHIERTEMOIN=$1
 199      mkdir -p $REP/pause
 200      touch $REP/pause/$FICHIERTEMOIN
 201  }
 202  
 203  function SupprimeTemoin {
 204      FICHIERTEMOIN=$1
 205      [ -e $REP/pause/$FICHIERTEMOIN ] && rm -f $REP/pause/$FICHIERTEMOIN
 206  }
 207  
 208  function CreeScriptClient {
 209      echo "WScript.Sleep 10000" > $PAUSEFILE
 210      echo "set Z=$SE3\\install" > $TACHEFILE
 211      echo "set SOFTWARE=$SE3\\install\\packages" >> $TACHEFILE
 212      echo ":debut" >> $TACHEFILE
 213      echo "if exist $TESTFILEWIN (" >> $TACHEFILE
 214      echo " call $TESTFILEWIN" >> $TACHEFILE
 215      #echo " del /F /Q /S  $TESTFILEWIN" >> $TACHEFILE
 216      echo ")" >> $TACHEFILE
 217      echo "cscript $REPBATWIN\pause.vbs > NUL" >> $TACHEFILE
 218      echo "goto debut" >> $TACHEFILE
 219      echo "copy /Y $TACHEFILEWIN %Systemdrive%" > $INSTALLSCRIPTCLIENT
 220      echo "if exist %systemroot%\\tasks\\WpkgMd5Verif.job del /F /Q /S %systemroot%\\tasks\\WpkgMd5Verif.job" >> $INSTALLSCRIPTCLIENT
 221      echo "schtasks /create /tn WpkgMd5Verif /sc ONSTART /tr \"%Comspec% /C start %Systemdrive%\\bootscript.bat\" " >> $INSTALLSCRIPTCLIENT
 222  }
 223  
 224  function PauseWinTantQue {
 225      FICHIERTEMOIN=$1
 226      CmdToWin ":debut$FICHIERTEMOIN"
 227      CmdToWin "if not exist $REPSOUSWIN\pause\\$FICHIERTEMOIN goto suite$FICHIERTEMOIN"
 228      CmdToWin "ping -n 10 $IPSE3 1&2> NUL"
 229      CmdToWin "goto debut$FICHIERTEMOIN"
 230      CmdToWin ":suite$FICHIERTEMOIN"
 231  }
 232  
 233  function PauseSE3TantQue {
 234  # met le script en pause tant que $RETOURFILE n'a pas change de date : passe la main au bout d'une heure en envoyant un mail
 235      APPLI=$1
 236      [ "$DEBUG" = "1" ] && echo "Pause sur le SE3 en attendant le test de $APPLI sur le client windows."
 237      FICHIER=$RETOURFILE
 238      [ ! -e $FICHIER ] && touch $FICHIER
 239      modifinit=$(stat -c '%y' $FICHIER)
 240      dateinit=$(date +"%s")
 241      while true
 242      do
 243          modif=$(stat -c '%y' $FICHIER)
 244          [ "$modif" != "$modifinit" ] && echo "Le fichier $RETOURFILE a change, on poursuit." && break # teste si le ficheir wpkg.xml a change depuis le debut de l'execution
 245  #echo "date actu : $(date +\"%s\") - date init : $dateinit"
 246  #echo "diff : $(($(date +"%s") - $dateinit))"
 247          [ $(($(date +"%s") - $dateinit)) -gt 3600 ] && echo "Le fichier $RETOURFILE n'a pas change depuis 1H, on poursuit." && break # teste si une heure s'est ecoule depuis le debut de la pause 
 248          sleep 5
 249      done
 250      echo "Fin de la pause. $RETOURFILE a ete modifie."
 251  }
 252  
 253  function InstallXmlSE3 {
 254      XML=$1
 255      NOMDUXML="`basename \"$XML\"`"
 256      [ "$DEBUG" = "1" ] && echo "Installation de $XML dans la base packages.xml du SE3, telechargement des fichiers necessaires. En cours."
 257      cp -f $XML $wpkgroot/tmp
 258      retourinstallPackage=$(/var/www/se3/wpkg/bin/installPackage.sh $wpkgroot/tmp/$NOMDUXML 0 admin urlmd5 1)
 259      # reste : recuperer l'erreur en cas de probleme md5 (si besoin: pas forcement besoin car on a corrige la somme md5 au prealable sur les xml testes et les anciens liens, si non valides ne peuvent plus etre telechargees...)
 260  }
 261  
 262  function RecupereWpkgXml {
 263      CmdToWin "copy /Y $WPKGXML $REPSOUSWIN"
 264  }
 265  
 266  function svnUpdate {
 267      echo "Recuperation de $1 depuis le svn..."
 268      if [ ! -e $REP/$1 ] ; then
 269         svn checkout $url/$1 $REP/$1
 270      else
 271         svn update $REP/$1
 272      fi
 273  }
 274  
 275  function regroupeXml {
 276  # on filtre les xml obsolete en les classant par date : les plus recents en premier
 277  echo "Examen de tous les attributs download de tous les xml du svn, branche $1" 
 278  ls -t $REP/$1 | while read FILE; do
 279      [ "$DEBUG" = "1" ] && echo "Examen de $FILE"
 280      cat $REP/$1/$FILE | xmlstarlet sel -t -m "/packages/package/download" -o "$REP/$1/$FILE#" -v "@url" -o "#" -v "@md5sum" -n >> $LISTEURLMD5
 281  done
 282  }
 283  
 284  
 285  function ExtraireDownloadDuXml {
 286      #[ -e $LISTEURLMD5 ] && rm -f $LISTEURLMD5
 287      FICHIER=$1
 288      echo "Examen de tous les attributs download de $FICHIER" 
 289      cat $FICHIER | xmlstarlet sel -t -m "/packages/package/download" -v "@url" -o "#" -v "@md5sum" -o "#" -v "@saveto" -n > $LISTEURLMD5
 290  }
 291  
 292  
 293  ######## Fonctions de lecture de wpkg.xml ###############
 294  
 295  # lit le fichier $RETOURFILE 
 296  function AppliInstalled {
 297      TEST=$(cat $RETOURFILE | grep "Status" | grep "Not Installed")
 298      if [ "$TEST" == "" ]; then
 299          RETOURAppliInstalled="True"
 300      else
 301          RETOURAppliInstalled="False"
 302      fi
 303      #echo $RETOUR
 304      #xmlstarlet sel -t -m "/wpkg:wpkg/checkResults/" -v "@result" $WpkgXml
 305      #xmlstarlet ed -i "/packages/package/download[@url='$URL']" -t attr -n "md5sum" -v "$MD5" $FILE
 306  }
 307  
 308  
 309  
 310  ######## Fonctions de modification des xml du svn #########
 311  
 312  function Lireid {
 313      FILE=$1
 314      RETOUR=$(cat $FILE | xmlstarlet sel -t -m "/packages/package" -v "@id" -n)
 315      echo "$RETOUR"
 316  }
 317  
 318  function InsertMd5Sum {
 319      FILE=$1
 320      URL=$2
 321      MD5=$3
 322      xmlstarlet ed -i "/packages/package/download[@url='$URL']" -t attr -n "md5sum" -v "$MD5" $FILE
 323  }
 324  
 325  function UpdateMd5Sum {
 326      FILE=$1
 327      URL=$2
 328      MD5=$3
 329      xmlstarlet ed -u "/packages/package/download[@url='$URL']/@md5sum" -v "$MD5" $FILE
 330  }
 331  
 332  function MiseAJourDuLog {
 333      LOG=$1
 334      MOTIF=$2
 335      echo "" >> $LOG
 336      echo "$(date) : $2" >> $LOG
 337      echo "" >> $LOG
 338      [ "$DEBUG" = "1" ] && echo "Mise a jour du fichier journal $LOG."
 339  }
 340  
 341  function AjoutCrontabCommandeClientWindows {
 342      CRONFILE=/etc/cron.d/se3-wpkg-md5verif
 343      SCRIPT=$0
 344      echo "# Execution de $SCRIPT tous les soirs a 2H du matin" > $CRONFILE
 345      echo "0 2 * * * root $SCRIPT > /dev/null 2>&1" >> $CRONFILE
 346      [ "$DEBUG" = "1" ] && echo "Mise a jour de la commande crontab : execution de $SCRIPT a 2H tous les jours."
 347      /etc/init.d/cron restart > /dev/null
 348  }
 349  
 350  function AppliATester {
 351      XML=$1
 352      MOTIF=$2
 353      echo "" >> $LOG
 354      echo "$(date) : $2" >> $LOG
 355      echo "" >> $LOG
 356      [ "$DEBUG" = "1" ] && echo "Mise a jour du fichier journal $LOG."
 357  }
 358  
 359  function GenereListeDesXml {
 360      # compte le nombre de xml a tester dans $LISTEDESXML 
 361      if [ -e $LISTEDESXML ] ; then
 362          NBRELINES=$(wc -l $LISTEDESXML | cut -d" " -f1)
 363      else
 364          NBRELINES=0
 365      fi
 366  
 367      NBREDEXMLSTABLE=$(ls $REP/stable | wc -l)
 368      NBREDEXMLTESTING=$(ls $REP/testing | wc -l)
 369      NBRETOTALDEXML=$(($NBREDEXMLSTABLE+$NBREDEXMLTESTING))
 370  
 371      if [ $NBRELINES -ge $NBRETOTALDEXML ] ; then
 372          [ "$DEBUG" = "1" ] && echo "Le fichier $LISTEDESXML contient deja toutes les applications."
 373      else
 374          [ "$DEBUG" = "1" ] && echo "Le fichier $LISTEDEXML ne contient pas tous les packages, on les ajoute."
 375          ls -t $REP/stable | while read FILE; do
 376              [ "$DEBUG" = "1" ] && echo "Examen programme de $REP/$FILE"
 377              echo stable/$FILE >> $LISTEDESXML
 378          done
 379          ls -t $REP/testing | while read FILE; do
 380              [ "$DEBUG" = "1" ] && echo "Examen programme de $REP/$FILE"
 381              echo testing/$FILE >> $LISTEDESXML
 382          done
 383          [ "$DEBUG" = "1" ] && echo "Mise a jour du fichier $LISTEDESXML effectuee."
 384      fi
 385  }
 386  
 387  function MiseAJourDuXml {
 388      FILE=$1
 389      URL=$2
 390      MD5=$3
 391      if [ "$MD5" = "" ]; then
 392          InsertMd5Sum "$FILE" "$URL" "$MD5" > $FILETMP
 393          [ "$DEBUG" = "1" ] && echo "Ajout de la somme md5 $MD5 dans le fichier $FILE."
 394          MiseAJourDuLog $JOURNAL "Ajout de la somme md5 $MD5 dans le fichier $FILE."
 395      else
 396          UpdateMd5Sum "$FILE" "$URL" "$MD5" > $FILETMP
 397          [ "$DEBUG" = "1" ] && echo "Mise a jour de la somme md5 $MD5 dans le fichier $FILE."
 398          MiseAJourDuLog $JOURNAL "Mise a jour de la somme md5 $MD5 dans le fichier $FILE."
 399      fi
 400       
 401      # si le xml est en testing et que les tests sont concluants, on le passe en stable.
 402      mv -f $FILETMP $FILE
 403      # reste a commiter le fichier
 404  }
 405  
 406  function TelechargeUrls {
 407  if [ -e $LISTEURLMD5 ]; then
 408      TOUTESTCORRIGE=1
 409      RETOUR=0
 410      cat $LISTEURLMD5 | while read LINE; do
 411          # echo "$LINE"
 412          # nouvelle extraction des url et md5sum
 413          url=$(echo "$LINE" | cut -d"#" -f1)
 414          md5sum=$(echo "$LINE" | cut -d"#" -f2)
 415          DESTFILE=$(echo "$LINE" | cut -d"#" -f3)
 416          DESTFILE=/var/se3/unattended/install/$DESTFILE
 417          [ "$url" == "" ]&& exit 0
 418          echo "Telechargement de $url. MD5 attendue : $md5sum sauve vers $DESTFILE"
 419          /usr/bin/wget -O "$DESTFILE" "$url" 1>/dev/null 2>/dev/null
 420          # 2>>$MAILFILETMP
 421          # recuperation taille du download
 422          REALSIZE=$(stat -c %s $DESTFILE)
 423          #SIZEMO=$[ $(stat -c %s $DESTFILE) / 1000 ]
 424          # calcul de la somme md5, envoi du mail si mauvaise
 425          if [ -e $DESTFILE ] ; then
 426            # en cas d'erreur 404, le fichier est vide.
 427            if [ $REALSIZE -eq 0 ] ; then
 428                  echo "Le fichier telecharge depuis $url est vide. Une erreur 404 surement..." >> $MAILFILETMP
 429                  echo "Le fichier telecharge depuis $url est vide. Une erreur 404 surement... Envoi d'un email d'avertissement."
 430                  RETOUR=1
 431                  TOUTESTCORRIGE=0
 432                  echo "RETOUR=$RETOUR et $TOUTESTCORRIGE=TOUTESTCORRIGE"
 433            else
 434                  [ "$DEBUG" = "1" ] && echo "Fichier bien telecharge : $DESTFILE"
 435                  MD5REAL="$(/usr/bin/md5sum $DESTFILE | cut -d" " -f1)"
 436                  if [ "$md5sum" = "" ] ; then
 437                      echo "Somme md5 absente du fichier xml pour $url. On l'ajoute." >> $MAILFILETMP
 438                      echo "Somme md5 absente du fichier xml pour $url. On l'ajoute."
 439                     # on le fait par ailleurs : sed -e "s/$url#$md5sum#$DESTFILE/$url#$MD5REAL#$DESTFILE/g" $LISTEURLMD5
 440                     InsertMd5Sum $XMLCORRIGE $url $MD5REAL
 441                     ERREUR=1
 442                  elif [ "$MD5REAL" = "$md5sum" ]; then
 443                          echo "Tout va bien : somme md5 reelle $MD5REAL = somme md5 du xml $md5sum."
 444                    else
 445                             echo "Somme md5 incorrecte. Le telechargement depuis $url a la somme md5 $MD5REAL et non celle attendue $md5sum." >> $MAILFILETMP
 446                          echo "Somme md5 incorrecte. Le telechargement depuis $url a la somme md5 $MD5REAL et non celle attendue $md5sum. Envoi d'un mail d'avertissement"
 447                          UpdateMd5Sum $XMLCORRIGE $url $MD5REAL
 448                          RETOUR=1
 449                     fi
 450            fi
 451          else
 452                 echo "Fichier non telecharge : l'url $url du fichier xml est invalide." >> $MAILFILETMP
 453              echo "Fichier non telecharge : l'url $url du fichier xml est invalide. Envoi d'un mail d'avertissement."
 454              RETOUR=1
 455              TOUTESTCORRIGE=0
 456          fi
 457      done
 458      RetourTelechargeUrls=$RETOUR
 459      echo "RETOUR=$RETOUR et $TOUTESTCORRIGE=TOUTESTCORRIGE"
 460  else
 461      echo "$LISTEURLMD5 est vide pour $XMLATESTER. Peut-etre normal s'il ne comporte aucun lien download."
 462      RetourTelechargeUrls=0
 463  fi
 464  echo $RetourTelechargeUrls > $ERREURFILE
 465  echo $TOUTESTCORRIGE > $TOUTESTCORRIGEFILE
 466  }
 467  
 468  ################## FIN DES FONCTIONS ##################
 469  
 470  ####################### NOUVEAU SCRIPT EXECUTE UNIQUEMENT AVEC CLIENT WINDOWS #######################
 471  # Permet la modification autoamtique des xml incorrects via un test de validation (upgrade-remove-install) sur le client windows
 472  
 473  function TesterXml {
 474      BRANCHE=$1
 475      Xml=$2
 476      Correctif=$3
 477      APPLI=$REP/$BRANCHE/$Xml
 478      ID=$(Lireid $APPLI)
 479      NOMAPPLI=$(echo "$APPLI" | sed -e "s+$(dirname $APPLI)/++g" | cut -d"." -f1)
 480      echo "On teste : $APPLI de $BRANCHE avec l'id $ID"
 481          # Si tout est corrige :
 482              if [ "$Correctif" == 1 ]; then
 483                  # on teste $REP/xml/$APPLI sur le client windows
 484                  echo "On provoque l'install de l'ancien xml sur le client windows."
 485                  # si celle-ci provoque une erreur : download impossible ou install invalide, on ignore"
 486                  InstallXmlSE3 $APPLI # telecharge les fichiers du xml old version sur le SE3
 487                  WpkgInstall $ID # commande d'install de l'ancienne version du xml
 488                  PauseSE3TantQue $NOMAPPLI # teste la date de $WPKGXML et poursuit quand elle a change ou apres une heure
 489                  SupprimeScriptClient # supprime le script car deja execute par le client windows.
 490                  
 491                  echo "On lance un upgrade depuis l'ancienne version vers la version corrigee."
 492                  InstallXmlSE3 $XMLCORRIGE # telecharge les fichiers du xml corrige sur le SE3
 493                  WpkgInstall $ID # commande d'install de l'ancienne version du xml pour le client windows
 494                  PauseSE3TantQue $NOMAPPLI # teste la date de $WPKGXML et poursuit quand elle a change ou apres une heure
 495                  SupprimeScriptClient # supprime le script car deja execute par le client windows.
 496              else
 497                  echo "Xml jamais teste avec ce script sur ce serveur. On lance une installation de la version du svn."
 498                  InstallXmlSE3 $APPLI # telecharge les fichiers du xml du svn sur le SE3
 499                  WpkgInstall $ID # commande d'install de l'ancienne version du xml pour le client windows
 500                  PauseSE3TantQue $NOMAPPLI # teste la date de $WPKGXML et poursuit quand elle a change ou apres une heure
 501                  SupprimeScriptClient # supprime le script car deja execute par le client windows.                
 502              fi
 503  
 504              # recupere le succes de l'installation-upgrade
 505              AppliInstalled
 506              INSTALLED=$RETOURAppliInstalled
 507              # si succes 
 508              if [ "$INSTALLED" == "True" ]; then
 509                  echo "Installation-Upgrade realise avec succes."
 510                  # on teste le remove
 511                  echo "On lance un remove."
 512                  WpkgRemove $ID # commande d'install de l'ancienne version du xml pour le client windows
 513                  PauseSE3TantQue $NOMAPPLI # teste la date de $WPKGXML et poursuit quand elle a change ou apres une heure
 514                  SupprimeScriptClient # supprime le script car deja execute par le client windows.
 515                  # recupere le succes du remove
 516                  AppliInstalled
 517                  INSTALLED=$RETOURAppliInstalled
 518                  if [ "$INSTALLED" == "True" ]; then
 519                      echo "Le remove de $APPLI d'id $ID s'est mal deroule." >> $MAILFILETMP
 520                      echo "Le remove de $APPLI d'id $ID s'est mal deroule. Envoi d'un mail"
 521                  else
 522                      echo "L'install-upgrade $APPLI d'id $ID depuis le xml actuel et le remove semblent corrects. On valide ce xml corrige:" >> $MAILFILETMP
 523                      echo "L'install-upgrade $APPLI d'id $ID depuis le xml actuel et le remove semblent corrects. On valide ce xml corrige:"
 524                      cat $XMLCORRIGE
 525                      cat $XMLCORRIGE >> $MAILFILETMP
 526                      echo "" >> $MAILFILETMP
 527                      stat -c '%y' $XMLCORRIGE > $REP/xml/$NOMAPPLI.$BRANCHE.teste # garde en memoire la date du xml valide pour ne pas le tester indefiniment.
 528                      # reste : le corriger automatiquement sur le svn.
 529                      # A FAIRE.
 530                  fi
 531              else
 532                  echo "L'upgrade de $APPLI d'id $ID s'est mal deroule" >> $MAILFILETMP
 533                  echo "L'upgrade de $APPLI d'id $ID s'est mal deroule"
 534                  # reste :  effectuer une correction du check s'il s'agit d'un type de check uninstall
 535                  # si check nouveau non valide 
 536                      # envoi d'un mail.
 537                  
 538                  # effectuer le remove dans tous les cas pour nettoyer le client. On ne regarde pas si le remove a reussi ou pas.
 539                  echo "On lance un remove pour vider le DD de la VM."
 540                  WpkgRemove $ID # commande d'install de l'ancienne version du xml pour le client windows
 541                  PauseSE3TantQue $NOMAPPLI # teste la date de $WPKGXML et poursuit quand elle a change ou apres une heure
 542                  SupprimeScriptClient # supprime le script car deja execute par le client windows.
 543              fi
 544          # Sinon
 545              # on envoie un mail car un lien est invalide.
 546  }
 547  
 548  # fichier rajoute a cause d'un probleme de portee de variable.
 549  ERREURFILE=/tmp/wpkg-md5verifERREURFILE
 550  TOUTESTCORRIGEFILE=/tmp/wpkg-md5verifTOUTESTCORRIGEFILE
 551  
 552  function TestAndModify {
 553  # programme principal du script nouvelle version
 554  
 555  AjoutCrontabCommandeClientWindows # ajout crontab pour dialogue avec le client windows
 556  CreeScriptClient # creation des scripts a executer cote client au boot , en tache planifiee
 557  
 558  GenereListeDesXml # Genere la liste des xml ˆ examiner. Permet de reprendre les tests la ou le script s'est interrompu
 559  
 560  # Pour chaque fichier de stable puis de testing faire
 561  cat $LISTEDESXML | while read XMLATESTER ; do
 562      NOMAPPLI=$(echo "$REP/$XMLATESTER" | sed -e "s+$(dirname $REP/$XMLATESTER)/++g" | cut -d"." -f1)
 563      BRANCHE=$(echo "$XMLATESTER" | cut -d"/" -f1)
 564      FILE=$(echo "$XMLATESTER" | cut -d"/" -f2)
 565      ERREUR=0
 566      echo "On examine $NOMAPPLI de la branche $BRANCHE dans le fichier $FILE"
 567  
 568      # Tester tous les download url de $REP/$XMLATESTER
 569      ExtraireDownloadDuXml $REP/$XMLATESTER
 570      # Ce dernier script genere un fichier $LISTEURLMD5 qui contient url#md5#saveto
 571      # on modifie le xml ailleurs et on ne repercute sur le depot svn qu'en cas de succes.
 572      mkdir -p $REP/xml
 573      cp -f $REP/$XMLATESTER $REP/xml/
 574      # On corrige le xml dans 
 575      XMLCORRIGE=$REP/xml/$NOMAPPLI.xml
 576      TelechargeUrls # telecharge toutes les urls du $XMLATESTER et corrige les sommes md5 si besoin dans $XMLCORRIGE
 577      # si l'une d'elle est erronee alors ERREUR=1
 578      ERREUR=$(cat $ERREURFILE)
 579      TOUTESTCORRIGE=$(cat $TOUTESTCORRIGEFILE)
 580      echo "ERREUR=$ERREUR et TOUTESTCORRIGE=$TOUTESTCORRIGE"
 581      
 582      # si le fichier xml a change depuis la derniere execution que le client windows, il faut le retester.
 583      # tester la date contenue dans $REP/xml/$NOMAPPLI.$BRANCHE.teste la comparer a la variable $actu ci-apres
 584      if [ -e $REP/xml/$NOMAPPLI.$BRANCHE.teste ]; then
 585          old=$(cat $REP/xml/$NOMAPPLI.$BRANCHE.teste)
 586      else
 587          old="ToutSaufUneDateValide"
 588      fi
 589      actu=$(stat -c '%y' $REP/$BRANCHE/$FILE)
 590      # si le xml a change depuis le dernier test sur le client windows, on le teste de nouveau. Suppression du fichier temoin.
 591      echo "old=$old actu=$actu"
 592      [ ! "$old" == "$actu" ] && [ -e $REP/xml/$NOMAPPLI.$BRANCHE.teste ] && rm -f $REP/xml/$NOMAPPLI.$BRANCHE.teste 
 593      
 594      # teste si le xml a ete corrige entirement :
 595      [ "$ERREUR" == "1" -a "$TOUTESTCORRIGE" == "1" ] && CORRIGEENTIEREMENT=1
 596      if [ ! -e $REP/xml/$NOMAPPLI.$BRANCHE.teste -o "$CORRIGEENTIEREMENT"="1" ]; then
 597          # Si le client windows repond au ping, on l'utilise, sinon, on ne fait que tester.
 598          WINDOWSPRESENT=0
 599          ping -c 4 $IPWIN > /dev/null && WINDOWSPRESENT=1
 600          if [ $WINDOWSPRESENT == 1 ]; then
 601              echo "Le client windows $IPWIN est present, on l'utilise pour les validations des corrections de $BRANCHE/$FILE."
 602              # si jamais teste, on teste le xml corrige dessus.
 603              # si le xml a pu etre completement corrige, on le teste, sinon on envoie un mail : erreur 404 probable.
 604              if [ "$TOUTESTCORRIGE" == "1" ]; then
 605                  TesterXml $BRANCHE $FILE $ERREUR
 606                  #[ ! -e $REP/xml/$NOMAPPLI.$BRANCHE.teste ] && stat -c '%y' $XMLCORRIGE > $REP/xml/$NOMAPPLI.$BRANCHE.teste
 607              else
 608                  echo "Le xml $XMLATESTER n'a ete que partiellement corrige (erreur 404 probable)"
 609                  cat $XMLCORRIGE
 610                  echo "Le xml $XMLATESTER n'a ete que partiellement corrige (erreur 404 probable)" >> $MAILFILETMP
 611                  echo ""  >> $MAILFILETMP
 612                  cat $XMLCORRIGE  >> $MAILFILETMP
 613                  echo ""  >> $MAILFILETMP
 614              fi
 615          else
 616              echo "On envoie $XMLATESTER corrige par mail au destinataire sans garantie."
 617              echo "Voici $XMLATESTER corrige avec les nouvelles sommes md5. Malheureusement, en l'absence de client windows, impossible de tester son bon fonctionnement."
 618              echo ""
 619              cat $XMLCORRIGE
 620              echo ""    
 621              echo "Voici $XMLATESTER corrige avec les nouvelles sommes md5. Malheureusement, en l'absence de client windows, impossible de tester son bon fonctionnement." >> $MAILFILETMP
 622              echo ""  >> $MAILFILETMP
 623              cat $XMLCORRIGE  >> $MAILFILETMP
 624              echo ""  >> $MAILFILETMP            
 625          fi
 626      else
 627          echo "$BRANCHE/$FILE a deja ete teste et il n'y a pas d'erreur md5, on passe au xml suivant"
 628      fi
 629      [ -e $XMLCORRIGE ] && rm -f $XMLCORRIGE
 630  done
 631  
 632  # envoi de mail puis menage
 633  [ -e $MAILFILETMP ] && mail $DESTMAIL -s"Controle des sommes md5 WPKG" < $MAILFILETMP
 634  
 635  rm -f $MAILFILETMP
 636  rm -f $DESTFILE
 637  rm -f $LISTEURLMD5
 638  }
 639  
 640  
 641  ####################### FIN DU NOUVEAU SCRIPT EXECUTE UNIQUEMENT AVEC CLIENT WINDOWS #######################
 642  
 643  ####################### VIEUX SCRIPT EXECUTE UNIQUEMENT SANS CLIENT WINDOWS #######################
 644  function TestOnly {
 645  [ -e $PACKAGESFILE ] && rm -f $PACKAGESFILES
 646  [ -e $LISTEURLMD5 ] && rm -f $LISTEURLMD5
 647  
 648  regroupeXml "testing"
 649  regroupeXml "stable"
 650  
 651  [ ! -e $LISTEURLMD5 ] && echo "Fichier $LISTEURLMD5 absent." && exit
 652  echo "Fichier $LISTEURLMD5 genere."
 653  
 654  # initialisation liste download. On rajoute au bout de la liste a traiter le debut du packages.xml
 655  # si le fichier $LISTEAEXECUTER contient 2 fois plus de lignes que $LISTEURLMD5, c'est qu'il contient deja toutes les applis
 656  # celles eventuellement en double seront virees par le sed -i ... -e "/$url/d" qui suit.
 657  if [ -e $LISTEAEXECUTER ] ; then
 658      NBRELINES=$(wc -l $LISTEAEXECUTER | cut -d" " -f1)
 659  else
 660      NBRELINES=0
 661  fi
 662  
 663  NBRELINESPACKAGE=$(wc -l $LISTEURLMD5 | cut -d" " -f1)
 664  
 665  if [ $NBRELINES -ge $NBRELINESPACKAGE ] ; then
 666      [ "$DEBUG" = "1" ] && echo "Le fichier $LISTEAEXECUTER contient deja toutes les applications."
 667  else
 668      [ "$DEBUG" = "1" ] && echo "Le fichier $LISTEAEXECUTER ne contient pas tous les packages, on les ajoute."
 669      cat $LISTEURLMD5 >> $LISTEAEXECUTER
 670  fi
 671  
 672  echo ""
 673  
 674  
 675  #### telechargement effectif (les download effectues sont retires de $LISTEAEXECUTER au fur et a mesure)
 676  
 677  # on nettoie les lignes vides du fichier $LISTEAEXECUTER
 678  sed -i $LISTEAEXECUTER -e '/^$/d'
 679  
 680  # on nettoie les cas ou l'url n'existe pas dans le noeud download du fichier $LISTEAEXECUTER
 681  sed -i $LISTEAEXECUTER -e '/##/d'
 682  
 683  export SIZETOT=0
 684  
 685  cat $LISTEAEXECUTER | while read LINE; do
 686      [ -e $DESTFILE ] && rm -f $DESTFILE
 687      
 688      # nouvelle extraction des url et md5sum
 689      xmlfile=$(echo "$LINE" | cut -d"#" -f1)
 690      url=$(echo "$LINE" | cut -d"#" -f2)
 691      md5sum=$(echo "$LINE" | cut -d"#" -f3)
 692  
 693      echo "Fichier $xmlfile : telechargement de $url. MD5 attendue : $md5sum"
 694      
 695          /usr/bin/wget -O "$DESTFILE" "$url" 1>/dev/null 2>/dev/null
 696          # 2>>$MAILFILETMP
 697          # recuperation taille du download
 698          REALSIZE=$(stat -c %s $DESTFILE)
 699          SIZEMO=$[ $(stat -c %s $DESTFILE) / 1000 ]
 700          SIZETOT=$[$SIZEMO + $SIZETOT ]
 701  
 702          # calcul de la somme md5, envoi du mail si mauvaise
 703          if [ -e $DESTFILE ] ; then
 704            # en cas d'erreur 404, le fichier est vide.
 705            if [ $REALSIZE -eq 0 ] ; then
 706                  echo "Le fichier telecharge depuis $xmlfile correspondant a $url est vide. Une erreur 404 surement..." >> $MAILFILETMP
 707                  echo "Le fichier telecharge depuis $xmlfile correspondant a $url est vide. Une erreur 404 surement... Envoi d'un email d'avertissement."
 708            else
 709              
 710              [ "$DEBUG" = "1" ] && echo "Fichier bien telecharge : $DESTFILE"
 711                      MD5REAL="$(/usr/bin/md5sum $DESTFILE | cut -d" " -f1)"
 712                      if [ "$md5sum" = "" ] ; then
 713                      echo "Somme md5 absente du fichier $xmlfile pour $url." >> $MAILFILETMP
 714                      echo "Somme md5 absente du fichier $xmlfile pour $url."
 715          
 716                      # nettoyage liste download avec sed -i
 717                       FILENAME=$(echo "$url" | sed -e "s+$(dirname $url)/++g")
 718                      [ "$DEBUG" = "1" ] && echo "On supprime le fichier $FILENAME de la liste a verifier." 
 719                      sed -i $LISTEAEXECUTER -e "/$FILENAME/d"
 720                      elif [ "$MD5REAL" = "$md5sum" ]; then
 721                          echo "Tout va bien : somme md5 reelle $MD5REAL = somme md5 du xml $md5sum."
 722                    else
 723                             echo "Somme md5 incorrecte. Le telechargement depuis $xmlfile de $url a la somme md5 $MD5REAL et non celle attendue $md5sum." >> $MAILFILETMP
 724                          echo "Somme md5 incorrecte. Le telechargement depuis $xmlfile de $url a la somme md5 $MD5REAL et non celle attendue $md5sum. Envoi d'un mail d'avertissement"
 725                     fi
 726            fi
 727          else
 728                  echo "Fichier non telecharge : l'url $url du fichier $xmlfile est invalide." >> $MAILFILETMP
 729                  echo "Fichier non telecharge : l'url $url du fichier $xmlfile est invalide. Envoi d'un mail d'avertissement."
 730          fi
 731  
 732          # nettoyage liste download avec sed -i
 733          FILENAME=$(echo "$url" | sed -e "s+$(dirname $url)/++g" | sed -e "s+/++g")
 734      # FILENAME=$(echo $url | sed -e "s#/#\\\\/#g")
 735          [ "$DEBUG" = "1" ] && echo "On supprime le telechargement $FILENAME de la liste a verifier." 
 736      #echo $FILENAME
 737          sed -i $LISTEAEXECUTER -e "/$FILENAME/d"
 738      
 739          # on quitte si HEURE>6H
 740          HOUR=$(date '+%H')
 741          if [ $HOUR -ge $HOURMAX ] ; then
 742              echo "Il est $HOURMAX H. On continuera demain, tot le matin, lors du prochain lancement de ce script."
 743              exit
 744          fi
 745  
 746  
 747          # on quitte si $SIZETOT > $MAXDOWNLOAD
 748          [ "$DEBUG" = "1" ] && echo "Taille du telechargement : $SIZEMO Ko. Taille totale depuis le debut : $SIZETOT Ko."
 749          if [ $SIZETOT -ge $MAXDOWNLOAD ] ; then
 750              echo "Quantite maximale ($MAXDOWNLOAD Mo) atteinte. On continuera le controle des sommes md5 lors du prochain lancement de ce script."
 751              exit
 752          fi
 753      echo ""
 754  done
 755  
 756  [ -e $MAILFILETMP ] && mail $DESTMAIL -s"Controle des sommes md5 WPKG" < $MAILFILETMP
 757  
 758  rm -f $MAILFILETMP
 759  rm -f $DESTFILE
 760  rm -f $LISTEURLMD5
 761  }
 762  
 763  ####################### FIN VIEUX SCRIPT EXECUTE UNIQUEMENT SANS CLIENT WINDOWS #######################
 764  
 765  ### MAIN ()
 766  
 767  # reste : decommenter la ligne qui suit
 768  #touch $VERROU
 769  
 770  [ "$DEBUG" = "1" ] && echo "Le dossier de destination des telechargements est $DESTFILEDOSSIER."
 771  
 772  # mise a jour par rapport au svn
 773  # reste : decommenter les trois lignes suivantes
 774  #svnUpdate "stable"
 775  #svnUpdate "testing"
 776  #svnUpdate "logs"
 777  
 778  # Si le client windows repond au ping, on l'utilise, sinon, on ne fait que tester.
 779  #WINDOWSPRESENT=0
 780  #ping -c 4 $IPWIN > /dev/null && WINDOWSPRESENT=1
 781  #if [ $WINDOWSPRESENT == 1 ]; then
 782  #    echo "Le client windows $IPWIN est present, on l'utilise pour les validations des corrections md5"
 783      TestAndModify ##### Nouvelle version du script qui gere tous les cas : client present ou pas... Le script TestOnly est obsolete.
 784  #else
 785  #    echo "Le client windows $IPWIN n'est pas present, on teste juste les sommes md5"
 786  #    TestOnly
 787  #fi
 788  
 789  [ -e $VERROU ] && rm -f $VERROU


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