Créer un paquet *.msi evolué

Améliorer le paquet MSI

L’installation / la mise à jour du paquet TightVNC pris pour exemple précédemment nécessitera de le fermer le temps de la mise à jour.

Méthode manuelle : killalltasks

Une première méthode est de tuer tous les processus VNC avant de lancer l’installation du paquet tis-tightvnc.

# -*- coding: utf-8 -*-
from setuphelpers import *

uninstallkey = ["{8B9896FC-B4F2-44CD-8B6E-78A0B1851B59}"]

def install():
    print('installing tis-tightvnc')
    killalltasks("vncviewer.exe")
    run(r'"tightvnc-2.8.5-gpl-setup-64bit.msi" /q /norestart')

Méthode élégante : install_msi_if_needed

# -*- coding: utf-8 -*-
from setuphelpers import *

uninstallkey = []

def install():
    print('installing tis-tightvnc')
    install_msi_if_needed('tightvnc-2.8.5-setup-64bit.msi')
  • la librairie de fonctions setuphelpers fournit la fonction install_msi_if_needed qui permet de gérer ce cas directement en une seule fonction ;
  • la fonction testera également si une version du logiciel est déjà installée sur la machine avec la clé de désinstallation ;
  • si présence il y a, l’installation sera enclenchée uniquement si la version actuellement installée est inférieure ;
  • après installation, la fonction testera finalement la présence de la clé de déinstallation et sa version pour vérifier que tout s’est bien passé ;
Liste des paramètres utilisables avec install_msi_if_needed
Paramètre Valeur par défaut Description
msi   nom du fichier MSI à exécuter.
min_version None version minimale au dessus de laquelle il mettra à jour.
killbefore [] liste des programmes à tuer avant de lancer l’installation.
accept_returncodes [0,3010] codes de retour autres que 0 ou 3010 acceptés en retour par la fonction.
timeout 300 durée d’attente maximale d’installation (en secondes).
properties {} propriétés supplémentaires à passer en argument au MSI pour l’installation.
get_version None utiliser la fonction passée en paramètre pour le contrôle de version au lieu de celle retournée par la fonction installed_softwares
remove_old_version False supprimme automatiquement une ancienne version d’un logiciel dont la uninstallkey est identique
force False force l’installation du logiciel même si une uninstall key avec une version identique est trouvée.

Note

La fonction install_msi_if_needed récupère la clé de désinstallation depuis le MSI, il n’est pas nécessaire de l’écrire dans le fichier setup.py.

En lançant le paquet, on observe ce qu’il se passe dans la console quand le logiciel est déjà installé.

wapt-get -ldebug install C:\waptdev\tis-tightvnc-wapt
Installing WAPT file C:\waptdev\tis-tightvnc-wapt
installing tis-tightvnc
installing x64 version
MSI tightvnc-2.8.5-gpl-setup-64bit.msi already installed. Skipping msiexec

Results :

=== install packages ===
C:\waptdev\tis-tightvnc-wapt   | tis-tightvnc (2.8.5.0-1)

Gérer les plateformes x32/x64

Pour la gestion de l’architecture de processeur x32 / x64, on utilise la fonction iswin64().

# -*- coding: utf-8 -*-
from setuphelpers import *

uninstallkey = []

def install():
    print(u'Installation en cours de TightVNC')
    if iswin64():
        print('installation version 64 bits')
        install_msi_if_needed('tightvnc-2.8.5-setup-64bit.msi')
    else:
        print('installation version 32 bits')
        install_msi_if_needed('tightvnc-2.8.5-setup-32bit.msi')
    print(u'Installation terminée.')

Ajouter des propriétés supplémentaires en argument

Pour ajouter des propriétés supplémentaires on va les stocker dans un élément dict.

# -*- coding: utf-8 -*-
from setuphelpers import *

uninstallkey = []

properties = {
    'SERVER_REGISTER_AS_SERVICE':0,
    'SERVER_ADD_FIREWALL_EXCEPTION':0,
    }

def install():
  print(u'Installation en cours de TightVNC')
  if iswin64():
    print('installation version 64 bits')
    install_msi_if_needed('tightvnc-2.8.5-setup-64bit.msi', properties =
                                                            properties)
  else:
    print('installation version 32 bits')
    install_msi_if_needed('tightvnc-2.8.5-setup-32bit.msi', properties =
                                                            properties)
  print(u'Installation terminée.')