Création paquet wapt

De WIKI Les fourmis du libre
Révision de 31 janvier 2017 à 00:08 par Simon (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

Waptlogo.jpg

Cette documenation est maintenant caduc !

Je travail maintenant pour tranquil.it et j'ai écrit une nouvelle documentation beaucoup plus complète ici :

http://wapt.fr/fr/doc


Docwapt.jpg



Développement de Paquet

Configurer le client wapt pour faire du développement de paquet

Il vous faut modifier le fichier C:\wapt\wapt-get.ini comme ceci (adapté à vous bien sûr)

[global]
waptupdate_task_period=120
wapt_server=https://wapt
repo_url=http://wapt/wapt
use_hostpackages=1
private_key=c:\private\key.pem
default_package_prefix=aiz
default_sources_suffix=wapt

default_sources_root=c:\waptdev


Recharger ensuite le service:

rechargeservice

Création de paquet

Tranquil.it a mis a jour sa documentation, elle est ici : [1]

Installer tout d’abord le paquet wapt "tis-waptdev" sur votre machine, il est présent dans les dépôts publics de tranquil.it.

Si vous êtes sous Windows XP, dupliquer préalablement le paquet tis-msi-4.5 (ou installer http://www.microsoft.com/en-us/download/details.aspx?id=8483, ceci est nécessaire pour la dépendance SVN)

Télécharger le paquet souhaité

exemple VLC

Ouvrer ensuite une console cmd et faites:

 wapt-get make-template C:\Users\sfonp\Downloads\vlc_2.1.5.exe aiz-vlc

En gros prépare moi un modèle de paquet pour cet exe et le paquet aura le nom aiz-vlc

Vous retrouverez donc le dossier c:\waptdev\aiz-vlc-wapt\

Lorsque vous fermée pyscripter, vous pouvez exécuter ceci pour relancer l’édition du paquet présent dans c:\waptdev\aiz-vlc-wapt\

 wapt-get edit aiz-vlc

Lorsque vous faites un "editer le paquet" dans la console c'est un peu la même chose

Celui ci contient :

  • Un fichier texte "control" qui contient les informations d'identification du paquet (il contient notamment la version du paquet et les dépendances) ;
  • Un script python setup.py qui contient les instructions qui manipulent les fichiers propres du logiciel (nous allons y toucher) ;
  • Les fichiers propres du logiciel (MSI, exe, fichiers de réponse, fichiers ini...) vlc_2.1.5.exe dans notre cas ;
  • Un fichier manifest (signature numérique) permettant de sécuriser le contenu du paquet WAPT et d'identifier son auteur (nous n'y touchons pas).

Plus d'info très utile sur la structure des paquet ici : Comprendre le fonctionnement "moteur" de wapt

Dans le cas de vlc, le make-template n'est pas capable de récupérer le numéro de version. Il faut donc le renseigner dans :

c:\waptdev\aiz-vlc-wapt\WAPT\control


Editer le et modifier le comme ceci:

package      : aiz-vlc
version      : 2.1.5-0
architecture : all
section      : base
priority     : optional
maintainer   : TIS tranquil-it-systems.fr
description  : vlc media player
depends      : 
conflicts    : 
sources      : 

A noter qu'un -0 doit être rajouté à la fin de la version pour indicer les version successives du paquet.

Ce -0 permet d’incrémenter une sous version du paquet pour forcer la réinstallation sans modifier la version réelle du logiciel.

Plus d'info très utile sur la structure des paquet ici : Comprendre le fonctionnement "moteur" de wapt

Setup.py

Nous allons donc ensuite construire notre fichier setup.py



from setuphelpers import *

uninstallkey = ['VLC media player']
uninstallstring=[]


def install():
  killalltasks('vlc.exe')
  print("installing VLC exe")
  run('"vlc-2.1.5-win32.exe" /S  --no-qt-privacy-ask')

Je continue d’ailleurs de m'inspirer de http://wpkg.org/Category:Silent_Installers pour connaitre les commandes exactes.


Vous pourrez trouver ici :http://unattended.sourceforge.net/installers.php

Une page qui définie les différents installeur (sauvegarde du site (en case de disparition ici) Sauvegarde_site_unattended

--


J'ai également ajouté l'uninstallkey pour faire fonctionner la désinstallation.

Quand le logiciel est désinstallable avec une uninstallkey, il suffit juste de la renseigner, vous pouvez la trouver comme ceci (il faut bien-sur installer le logiciel en mode manuel avant pour trouver) :

wapt-get list-registry mindview 

qui liste les applications correspondant au mot clé mindview

Ou il faut parfois chercher, par exemple dans le registre: HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\

On remarquera que uninstallkey est une liste. On peut renseigner plusieurs uninstallkey dans la liste si le paquet a installé plusieurs msi par exemple (cas de libreoffice avec le helppack).

La uninstallkey utilise la commande UninstallString associé à la key renseigné. (voir dans HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\)

Il peut arriver que la uninstallstring ne soit pas silencieuse. Ou alors qu'il n'y a pas de uninstallstring associé à la key.

Il faut dans ce cas utiliser la "uninstallstring" qui donne a wapt la liste des commandes à lancer pour la désinstallation.

exemple:

uninstallstring = [r'c:\soft\uninstall.exe /s']


En savoir plus ici : http://dev.tranquil.it/wiki/WAPT_-_Sp%C3%A9cifier_la_clef_de_d%C3%A9sinstallation

Vous pouvez tester toute l'install et remove dans PySrripter.

  • Rendre actif le fichier setup.py du paquet dans l'éditeur PyScripter
  • Activer l'explorateur de projets à gauche / Clic droit sur install / Débugger pour tester l'install
  • Explorateur de projets à gauche / Clic droit sur install / Débugger pour tester la désinstallation.

On peut mettre des points d'arrêts dans les fonctions install() par exemple pour interrompres l'exécution à une ligne donnée est inspecter les variables ou tester une fonction.

Upload du paquet wapt

Nous allons maintenant upload le paquet vers le dépôt privé:

Dans une commande cmd

wapt-get build-upload c:\waptdev\aiz-vlc-wapt aiz-vlc

Vous pouvez aussi, (lorsque pyscripter est ouvert) faire un clique droit sur build-upload, puis executée

buildupload


Votre paquet va être créer en .wapt Puis va être signé Puis va être envoyer le serveur.

Si on veut incrémenter automatiquement la version du paquet, rajouter l'option -i

wapt-get -i build-upload c:\waptdev\aiz-vlc-wapt aiz-vlc

Remarque : cette commande est également disponible dans les "Run configurations" du projet PyScripter

Gestion des environnements 32 et 64bits

Pour les petites installations

Dans le setup.py vous pouvez le gérer comme ceci :

      if iswin64():
          run("setup-x64.msi /q")
      else:
          run("setup-x86.msi /q")

Et donc mettre "all" dans architecture dans le fichier control

Du coup le paquet wapt intègre les deux installation

Pour les grosses installations

Si l'installeur d'une application est trop lourd il faut le faire en 3 paquet pour ne pas surcharger la bande passante.

Vous devez-faire un paquet standard smp-libreoffice un paquet smp-libreofficex64 et un paquet smp-libreofficex86

Les deux paquet smp-libreofficex64 et smp-libreofficex86 doivent être construit de manière standard (habituel)

Le paquet smp-libreoffice lui n'est qu'un pointeur :

def install():
   if iswin64():
       # installation d'un paquet pour mon application en 64 bits
       WAPT.install('smp-libreofficex64',force=WAPT.options.force)
   else:
       # installation d'un paquet pour mon application en 32 bits
       WAPT.install('smp-libreofficex86',force=WAPT.options.force)

   #Vous pouvez ensuite ajouter des un configuration supplémentaire ici

Une méthode plus pratique est visiblement en cour de développement

Pour aller plus loin - Différentes utilisations dans setup.py

Ce qui est ci dessous n'est qu'une infime partie de ce qu'est capable de de faire wapt avec python. Ce ne sont que des exemples.


install_msi_if_needed et install_exe_if_needed

Deux fonctionnalités ont été implantée a wapt, install_msi_if_needed et install_exe_if_needed.

Ces fonctions fonctionne avec la lecture des uninstallkey dans la base de registre, elles permettes :

- De prendre en charge la comparaison de la version d'une potentiel uninstallkey déjà existante avec l'installation en cour - Ne pas lancer l'installation si la version testée est inférieur - Une fois l'installation terminée, la fonction reste la présence de la uninstall key et sa version, si elle n'est pas présente, la fonction bascule volontairement en erreur

Exemple pour un exe :

  def install ():
     install_exe_if_needed('vlc-2.2.2-win32.exe',silentflags='/S --no-qt-privacy-ask --no-qt-updates-notif',key='VLC media player',min_version='2.2.2',killbefore=['vlc.exe'])


Pour un msi :

Comme le msi est standardisée, les silentflag sont donc standard, et le fichier fournis dans ses propriétés la uninstallkey et la version.

Il suffit de lui fournir le nom du fichier

  def install ():
   install_msi_if_needed('install_flash_player_21_active_x.msi',killbefore=['iexplore.exe'])


Jusqu'auboutiste numéro de version

Je suis un gros fainéant et du coup je ne veux pas indiquer mon numéro de version La commande ci-dessous permet de récupérer le numéro de version du fichier control en supprimant le tiret de fin (sous version wapt du paquet)

 versionpaquet = control['version'].split('-',1)[0]

Récupération du uninstall_location

L'un des problèmes de la fonction install_msi_if_needed c'est que si le logiciel a été installé avant le paquet wapt, on ne sait pas où le logiciel a été installé

Et donc si on doit copier par la suite un fichier pour par exemple couper les mise a jour automatique, il nous faut savoir où le logiciel est installée.

La fonction install_location est là pour ça

install_location('{E2D7784B-C904-4DD8-8644-685C091CD2B7}_is1')


Autre fonction Divers

Uninstall old software

Les commande ci-dessus ne vont pas résoudre tout les soucis, par exemple, lors de d'installation comme java ou scribus, car les installateurs ne replace pas la version précédente du logiciel,

J'utilise donc ceci avant de lancer les commande d'installation:


      for soft in installed_softwares('Scribus'):
                if installed_softwares(soft['key']): 
                     if Version(soft['version']) < Version('15.007.20033'):
                         run(WAPT.uninstall_cmd(soft['key']))

Dossier

Ici on test la présence du dossier C:\Program Files\Google\Update

if isdir(makepath(programfiles32,'Google','Update')):
      print 'faitceci'

Fichier

Verification de présence

Ici on test la présence de C:\Program Files\Google\Update\GoogleUpdate.exe

if isfile(makepath(programfiles32,'Google','Update','GoogleUpdate.exe')):
     print 'faitceci'
Version fichier

Des Logiciels comme infrarecorder ne renvoie pas la version du logiciel avec Version(uninstall['version']

Et comme Version(uninstall['version']) est utilisée dans la fonction need_install, alors la fonction install_exe_if_needed ne fonctionnera pas

Dans ce cas je check la version du fichier exe exemple pour : C:\Program Files\InfraRecorder\infrarecorder.exe

Je défini 3 variables :

 exefilename = makepath(programfiles32,'InfraRecorder','infrarecorder.exe')
 versionpaquet = '0.53.0.0'
 key='{1CB92574-96F2-467B-B793-5CEB35C40C29}'

Je check donc d'abord la présence du logiciel dans uninstall, puis vérifie la version de l'exe ensuite. Ce qui donne pour le check d'entrée:

if installed_softwares(uninstallkey=key):
  version = get_file_properties(exefilename)['ProductVersion']
  if Version(version) >= Version(versionpaquet) :
       print('%s already installed. Skipping' % key)
  else:
       #installation
       print "closing infrarecorder"
       run_notfatal("taskkill /im infrarecorder.exe /f")
       print"installing exe"
       run("ir053.exe /S /LANGUAGE=french")
# on va faire un test de post installation pour vérifier que tout a bien fonctionner
if installed_softwares(uninstallkey=key):
  version = get_file_properties(exefilename)['ProductVersion']
  if Version(version) < Version(versionpaquet) :
       error('The output verification has found a old version of software')
else: 
       error('End audit did not find the software.')
Propriétés de fichiers

La fonction get_file_properties(nomdevariable) renvoie des info sur les propriétés du fichier

   nomdevariable = makepath(programfiles32,'InfraRecorder','infrarecorder.exe')
   get_file_properties(variable)['argument']

Arguments dispo :

       ('Comments', 'InternalName', 'ProductName',
       'CompanyName', 'LegalCopyright', 'ProductVersion',
       'FileDescription', 'LegalTrademarks', 'PrivateBuild',
       'FileVersion', 'OriginalFilename', 'SpecialBuild')


Taille d'un fichier
exefilename = makepath(programfiles32,'InfraRecorder','infrarecorder.exe')
sizefile = os.path.getsize(makepath(programfiles32,'Google','Chrome','Application','chrome.exe'))
print(sizefile)

Vous pouvez bien-sur ensuite utiliser des if avec == > < avec sizefile



Dates d'un fichier

os.path.getctime = date de creation os.path.getatime = date du dernier acces os.path.getmtime = date de la dernière modification

Exemple :

exefilename = makepath(programfiles32,'InfraRecorder','infrarecorder.exe')
datedecreation = os.path.getctime(makepath(programfiles32,'Google','Chrome','Application','chrome.exe'))
if datedecreation == '1425496279.25' :
   print('cool la date de creation est bonne')

La valeur fournis par os.path.getctime est une valeur barbare. Elle peut être plus lisible avec "datetime.fromtimestamp".

Attention cela nécessite l'import de datetime

Exemple :

from datetime import datetime
exefilename = makepath(programfiles32,'InfraRecorder','infrarecorder.exe')
datedecreation = os.path.getctime(makepath(programfiles32,'Google','Chrome','Application','chrome.exe'))
utctime = datetime.fromtimestamp(datedecreation)
print(utctime)


Registre

Valeur de la cle

Tester une valeur registre string :

variable = registry_readstring(HKEY_LOCAL_MACHINE, r'SOFTWARE\Google\Update\Clients\{8A69D345-D564-463c-AFF1-A69D9E530F96}', 'pv')
if variable == '41.0.2272.76' :
     print('cette version est ok')
else:
     error('version pas ok')


Existence de la cle

Ou tester simplement son existance :

variable = registry_readstring(HKEY_LOCAL_MACHINE, "SOFTWARE\\Google\\Update\\Clients\\{8A69D345-D564-463c-AFF1-A69D9E530F96}", 'pv')
if variable :
     print('La cle exist')

Architecture OS

Utiliser Programfiles pout 32 ou 64

Explication pour programfiles32:

Sous un windows 64 : C:\Program Files(x86)

Sous un windows 32 : C:\Program Files


Explication pour programfiles64 :

Sous un windows 64 : C:\Program Files

Sous un windows 32 : C:\Program Files


Variable os
Nom du pc
 get_computername()
FQDN du PC

Domaine:

 get_domain_fromregistry()
Version de windows
    if windows_version()<Version('6.2.0'):
                  print('install flash player')

Voir ici pour bien comprendre la comparaison de version : https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms724832(v=vs.85).aspx


=Tester le type d'os
 registry_readstring(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName')

Suppression

Dossier
    remove_tree(r'%s\FreeCAD 0.15'%programfiles)
Fichier
    remove_file(makepath(programfiles32,'toto.txt'))
Logiciel

Suppression de l'enregistrement d'un logiciel dans la liste des logiciels windows

ATTENTION! Ceci ne supprime pas le logiciel proprement !

    unregister_uninstall("FreeCAD 0.15")

Copie

1 fichier
     source_filename = 'toto.txt'
     dest_filename = makepath(programfiles,'toto',source_filename)
     filecopyto(source_filename,dest_filename)
Plusieurs Fichiers
     import glob
     for fn in glob.glob('folder/*'):  
             filecopyto(fn,programfiles())