Pour créer vos paquets et les personnaliser, suivez cette documentation et vous maîtriserez très vite les subtilités du fonctionnement de WAPT.

Package structure detailed

A WAPT package is a .zip file containing several things:

WAPT package structure

WAPT package structure

  • a file setup.py;

  • one or several binary files;

  • some additional optional files;

  • a control file in the WAPT folder;

  • a icon.png file in the WAPT folder;

  • a certificate.crt file in the folder WAPT;

  • a manifest.sha256 file in the folder WAPT;

  • a signature.sha256 file in the folder WAPT;

  • a wapt.psproj file in the folder WAPT, this file is used to store the PyScripter configuration data for the WAPT package;

  • since WAPT 1.8, a hidden .vscode folder that contains a launch.json and a settings.json file used to store the VScode configuration data for the WAPT package;

The control file

The control file is the identity card of a package.

package           : tis-firefox-esr
version           : 62.0-0
architecture      : all
section           : base
priority          : optional
maintainer        : Administrateur
description       : Firefox Web Browser French
description_fr    : Navigateur Web Firefox Français
description_es    : Firefox Web Browser
depends           :
conflicts         :
maturity          : PROD
locale            : fr
target_os         : windows
min_os_version    :
max_os_version    :
min_wapt_version  : 1.6.2
sources           :
installed_size    :
impacted_process  : firefox.exe
audit_schedule    :
editor            : Mozilla
keywords          : Navigateur
licence           : MPL
homepage          : https://www.mozilla.org/en-US/firefox/organizations/
signer            : Tranquil IT
signer_fingerprint: 459934db53fd804bbb1dee79412a46b7d94b638737b03a0d73fc4907b994da5d
signature         : MLOzLiz0qCHN5fChdylnvXUZ8xNJj4rEu5FAAsDTdEtQ(...)hsduxGRJpN1wLEjGRaMLBlod/p8w==
signature_date    : 20170704-164552
signed_attributes : package,version,architecture,section,priority,maintainer,description,depends,conflicts,maturity,locale,min_os_version,max_os_version,min_wapt_version,sources,installed_size,signer,signer_fingerprint,signature_date,signed_attributes
Description of options of the control file

Paramètre

Description

Example value

package

Package name

tis-geogebra

version

Package version, can not contain more than 5 delimiters, the last number being the version number of the packaging

5.0.309.0-1

architecture

Processor architecture

x64

section

Package type (host, group, base)

base

priority

Package install priority (optional)

Not mandatory for the moment

maintainer

Author of the package

Arnold Schwarzenegger <terminator@mydomain.lan>

description

Package description that will appear in the console and on the web interface

The Graphing Calculator for Functions, Geometry, Algebra, Calculus, Statistics and 3D

description_fr

Localized description of the package

Calculatrice graphique

depends

Packages that must be installed before installing the package

tis-java

conflicts

Packages that must be uninstalled before installing the package

tis-graph

maturity

Maturity level (BETA, DEV, PROD)

PROD

locale

Language environment for the package

fr,en,es

target_os

Accepted Operating System for the package

windows,mac,linux

min_os_version

Minimum version of Windows for the package to be seen by the WAPT agent

6.0

max_os_version

Maximum version of Windows for the package to be seen by the WAPT agent

8.0

min_wapt_version

WAPT’s minimal version for the package to work properly

1.3.8

sources

Path to the SVN location of the package (source command)

https://srv-svn.mydomain.lan/sources/tis-geogebra-wapt/trunk/

installed_size

Minimum required free disk space to install the package

254251008

impacted_process

Indicates a list of impacted processes when installing a package

firefox.exe

audit_schedule

Periodicity of execution of the audit function in the WAPT package

60

editor

Editor of the software package

Mozilla

license

Reference of the software license

GPLV3

keywords

Set of keywords describing the WAPT package

Productivity,Text Processor

homepage

Official homepage of the software embedded in the WAPT package

https://www.tranquil.it/

signer

CommonName (CN) of the package’s signer

Tranquil IT

signer_fingerprint

Fingerprint of the certificate holder’s signature

2BAFAF007C174A3B00F12E9CA1E74956

signature

SHA256 hash of the package

MLOzLiz0qCHN5fChdylnvXUZ8xNJj4rEu5FAAsDTdEtQ(…)hsduxGRJpN1wLEjGRaMLBlod/p8w==

signature_date

Date when the package was signed

20180307-230413

signed_attributes

List of package’s attributes that are signed

package, version, architecture, section, priority, maintainer, description, depends, conflicts, maturity, locale, min_wapt_version, sources, installed_size, signer, signer_fingerprint, signature_date, signed_attributes

Attention

If the control file contains special characters, the control file must be saved in UTF-8 (No BOM) format.

PyScripter - UTF-8 (No BOM)

PyScripter - UTF-8 (No BOM)

Fields details

package

WAPT package name, without any accent, nor space, nor any special or uppercase character.

version

Preferably, always start with the packaged software version (digits only) split by points (.) and finish with the WAPT packaging version separated by a dash (-) character.

architecture

Nouveau dans la version 1.5.

Defines whether the package may be installed on x64 or x32 processor equipped computers.

Note

A x64 package will be invisible for a WAPT agent installed on a x86 machine.

Allowed values:

  • x86: the package is designed for 32bit computers;

  • x64: the package is designed for 64bit computers;

  • all: the package is designed for 32bit or 64bit computers;

section

  • host: host package;

  • group: group package;

  • base: software package;

  • unit: OU package;

priority

This option is not supported at this time. That field will be used to define package installation priority. This feature will become useful to define mandatory security updates.

maintainer

Defines the WAPT package creator.

Note

To define the WAPT package creator’s email address may be useful.

Use Firstname LASTNAME <email@example.com> format.

description

Describes the functionality of the package that will appear in the console and on the local web interface http://127.0.0.1:8088.

Indication

Adding a field description_fr or description_es allows you to internationalize the description of your package. If the language does not exist, the WAPT agent will use the default language description.

depends

Defines the packages that must be installed before, for example tis-java is a dependency for the LibreOffice package and tis-java must be installed before LibreOffice.

Several dependencies may be defined by splitting them with commas (,).

depends: tis-java,tis-firefox-esr,tis-thunderbird

conflicts

Works as the opposite of depends.

conflicts defines package(s) that must be removed before installing a package, for example tis-firefox must be removed before the package tis-firefox-esr is installed, or OpenOffice must be removed before LibreOffice is installed.

Several conflicts may be defined by splitting them with commas (,).

conflicts: tis-firefox

maturity

Nouveau dans la version 1.5.1.19.

Defines the maturity of a package.

By default, WAPT agents will see packages flagged as PROD and packages with an empty maturity.

For a computer to see packages with different maturity levels, you will have to configure the maturities attribute in wapt-get-ini of the WAPT agent.

locale

Nouveau dans la version 1.5.1.19.

Defines the language of the WAPT package.

A WAPT agent will see by default packages that are configured for its language environment(s) and packages with no language specified.

For a computer to see a package in another language, you will have to configure the locales in wapt-get.ini of the WAPT agent.

locales = fr,en,es

The language filled in the field must be in ISO 639-1 format.

target_os

Nouveau dans la version 1.5.1.18.

Defines the Operating System for the package.

A WAPT agent will see by default packages that are configured for its operating system and packages with no operating system specified.

Since version 1.8 the field target_os can either be windows, macos, linux or left empty.

min_os_version

Nouveau dans la version 1.3.9.

For a windows target_os, this field defines the minimal Windows Operating System Version. For example, this attribute may be used to avoid installing on WindowsXP packages that only work on Windows7 and above.

Since version 1.8, it can also define the minimal Mac OS version. We advise not to use it with Linux since there are several different distributions.

max_os_version

Nouveau dans la version 1.3.9.

For a windows target_os, it defines the maximal Windows Operating System Version. For example, this attribute may be used to install on Windows7 more recent versions of a software that are no more supported on Windows XP.

Since version 1.8, it can also define the minimal Mac OS version. We advise not to use it with Linux since there are several different distributions.

min_wapt_version

Nouveau dans la version 1.3.8.

WAPT minimum version to install a package

Note

With functionalities in WAPT evolving, some functions that you may have used in old packages may become obsolete with newer versions of WAPT agents.

sources

Defines a SVN repository, for example:

This method allows to version a package and collaboratively work on it.

Indication

Package versionning is particularly useful when several people create packages in a collaborative way. This function is also useful to trace the history of a package if you are subject to Regulations in your industry.

installed_size

Defines the required minimum free disk space to install the package.

installed_size: 254251008

The testing of available free disk space is done on the C:\Program Files folder.

The value set in installed_size must be in bytes.

Indication

To convert storage values to bytes, visit https://bit-calculator.com/.

impacted_process

Nouveau dans la version 1.5.1.18.

Indicates processes that are impacted when installing a package.

Exemple :

impacted_process : firefox.exe,chrome.exe,iexplorer.exe

This field is used by the functions install_msi_if_needed and install_exe_if_needed if killbefore has not been filled.

impacted_process is also used when uninstalling a package. This allows to close the application if the application is running before being uninstalled.

audit_schedule

Nouveau dans la version 1.6.

Periodicity of execution of audit checks.

audit_schedule : 60

The periodicity may be indicated in several ways:

  • un entier (en minutes) ;

  • an integer followed by a letter (m = minutes, h = hours, d = days, w = weeks);

editor

Nouveau dans la version 1.6.

Software editor of the binaries embedded in the WAPT base package.

editor: Mozilla

The values may be used as filters in the WAPT console and with the self-service.

keywords

Nouveau dans la version 1.6.

Keyword list to categorize the WAPT package.

keywords: office

The values may be used as filters in the WAPT console and with the self-service.

license

Nouveau dans la version 1.6.

Reference of the software license for the embedded software binaries.

license : GPLV3

The values may be used as filters in the WAPT console and with the self-service.

homepage

Nouveau dans la version 1.6.

Official homepage of the software binaries embedded in the WAPT package.

homepage : https://wapt.fr

The values may be used as filters in the WAPT console and with the self-service.

signer

Automatically filled during package signature.

CN of the certificate. It is typically the signer’s full name.

signer_fingerprint

Automatically filled during package signature.

Private key fingerprint of the package signer.

signature

Automatically filled during package signature.

Signature of the attributes of the package.

signature_date

Automatically filled during package signature.

Date when the attributes of the package have been signed.

signed_attributes

Automatically filled during package signature.

List of the package’s attributes that are signed.

The setup.py file

import setuphelpers

That line is found at the beginning of every WAPT package that embeds a setup.py:

from setuphelpers import *

The package imports all setuphelpers functions.

Setuphelpers is a WAPT library that offers many methods to more easily develop highly functional packages.

uninstallkey list

We then find:

uninstallkey = ['tisnaps2','Mozilla Firefox 45.6.0 ESR (x86 fr)']

We associate here a list of uninstall keys to the package. When a package is removed, the WAPT agent looks up the uninstallkey in the registry associated to the package. This uninstallkey will indicate to WAPT the actions to trigger to remove the software.

Even if there is no uninstallkey for a software, it is mandatory to declare an empty uninstallkey array:

uninstallkey = []

Function install()

Then comes the setup.py function declaration.

It is the recipe of the WAPT package, the set of instructions that will be executed.

def install():
    run('"install.exe" /S')

The wapt.psproj file

Package project file wapt.psproj is found in the WAPT folder.

It’s the PyScripter project file for the WAPT package.

To edit a package with PyScripter, just open the file.

The icon.png file

The icon.png icon file is located in the WAPT folder.

It associates an icon to the package.

That icon will appear in the local web interface of WAPT self-service (http://127.0.0.1:8088).

Indication

The icon must be a 48px per 48px PNG file.

The manifest.sha256 file

The manifest.sha256 manifest file is located in the WAPT folder.

It contains the sha256 fingerprint of every file in the WAPT package.

The signature file

The signature file is located in the WAPT folder.

It contains the signature of the manifest.sha256 file.

On installing a package, wapt-get checks:

  • that the signature of manifest.sha256 matches the actual manifest.sha256 file (the agent will verify the public certificates in C:\Program Files (x86)\wapt\ssl on Windows and /opt/wapt/ssl on Linux and MacOS);

  • that the sha256 fingerprint of each file is identical to the fingerprint in the manifest.sha256 file;

Other files

Other files may be embedded in the WAPT package. For example:

  • an installer beside your setup.py to be called in your setup.py;

  • an answer file to pass on to the software installer;

  • a license file;

Python 2 to Python 3

Attention

With WAPT 2.0, the WAPT internals have switched to python3. WAPT packages must also follow the new python3 syntax.

The principale syntax differences

Syntax

Python 2

Python 3

print

print'Hello'

print('Hello')

unicode string

ur

r

operators

<> <=> !=

!=

Windows registry access

_winreg

winreg

Créer son environment de développement de paquets WAPT

Pré-requis

Attention

  • il est impératif d’être en possession d’un compte Administrateur Local de la machine pour cette opération ;

  • nous vous conseillons de créer / éditer vos paquets dans un environment maîtrisé, sain et jetable ;

  • l’utilisation d’une machine virtuelle autonome (type Virtualbox ou équivalent) est vivement recommandée ;

  • importer le paquet tis-pyscripter dans votre dépôt local et l’installer sur votre machine de développement ;

Préconisations concernant l’environment de test

La méthode préconisée pour tester correctement vos paquets est d’utiliser un échantillon de machines représentatif de votre parc. Donc plus votre parc est hétérogène, plus votre échantillon devra être large.

Cette démarche vise à confronter le paquet WAPT à une multitude de plateformes et d’environments afin qu’il devienne le plus abouti possible en régime de test, avant d’être basculé en production.

Démarche de test

Systèmes d’exploitation et architectures

  • Windows XP ;

  • Windows 7 ;

  • Windows 10 ;

  • Windows Server 2008 R2 ;

  • Windows Server 2012 ;

  • x86 ;

  • x64 ;

  • Machine physique et virtuelle ;

  • PC portables ;

Indication

On testera si possible les versions RC / Beta des OS si elles sont disponibles (exemple : Windows 10 Creators Update).

État des mises à jour Windows Update

  • Poste Microsoft Windows sans aucune mise à jour Windows Update : l’objectif est de détecter les mises à jour indispensables au bon fonctionnement du logiciel et adapter le paquet en conséquence ;

  • Poste Microsoft Windows à jour avec les toutes dernières MàJ Windows Update : l’objectif est de détecter les mise à jour en conflit avec le logiciel et d’adapter le paquet en conséquence ;

État des installations logicielles

  • Poste avec peu de logiciels déjà installés : l’objectif est de détecter une dépendance possible à Java ou autre framework applicatif ;

  • Poste avec beaucoup de logiciels déjà installés : l’objectif est de détecter un conflit avec une application existante ;

  • Installer les anciennes versions du logiciel : il est possible que l’installeur ne supporte pas l’écrasement d’une installation précédente, dans ce cas il faudra prévoir la désinstallation des anciennes versions avant d’installer la nouvelle version ;

Principes of creating package template from the WAPT console

Indication

Pour créer des paquets à partir de la console, il faut d’abord avoir installé l’environnement de développement WAPT tis-pyscripter.

Créer un paquet WAPT depuis la console

Dans cet exemple, l’installeur de 7zip est utilisé au format MSI.

  • obtenir l’installeur MSI de 7zip :

  • créer le modèle de paquet depuis l’installeur ;

    Dans la console WAPT, cliquer sur Outils ‣ Créer un modèle de paquet depuis un installeur:

    Pyscripter - WAPT console window for creating a package template

    PyScripter - Menu pour la création de modèle de paquets depuis la console

    Sélectionner l’installeur MSI téléchargé et renseigner les différentes informations demandées. Veillez bien à ce que le nom du paquet ne contienne pas de numéro de version.

    Informations required for creating the package

    PyScripter - Renseignements nécesssaires pour la création du paquet

  • deux solutions sont proposées :

    • cliquer sur OK (recommandée) pour lancer la personnalisation du paquet ;

    • cliquer sur Build and upload pour lancer la création et le chargement direct du paquet sur le serveur WAPT (non recommandé) ;

    Attention

    Le bouton Build and upload envoi directement le paquet dans le dépôt privé sans tester l’installation.

    Cette méthode fonctionne assez bien avec les MSI car leur installation est standard.

    Cependant la deuxième méthode qui consiste à tester localement le paquet d’abord puis à l’uploader est la méthode recommandée.

Customize the package before make and edit

La méthode conseillée avant l”upload d’un paquet est de personnaliser son comportement en l’éditant avec PyScripter.

Lors de la création du modèle de paquet, cliquer sur OK.

PyScripter - Informations required for creating the package

PyScripter - Renseignements nécésssaires pour la création du paquet

PyScripter - The package has been created

PyScripter - Validation de la création du modèle et ouverture de PyScripter

L’IDE PyScripter se lance et permet d’éditer les fichiers du paquet.

PyScripter - Customizing a package with Pyscripter

PyScripter - Personnalisation du paquet avec PyScripter

Présentation de PyScripter

L’explorateur de projets PyScripter

PyScripter - project explorer

PyScripter - Explorateur de projets PyScripter

L’explorateur de projets PyScripter liste les différents fichiers dont vous pouvez avoir besoin, notamment le fichier control et le fichier setup.py.

Run Configurations

PyScripter - Run commands in the PyScripter project explorer

PyScripter - Commandes Run dans l’explorateur de projets PyScripter

Les options de Run dans l’explorateur de projets de PyScripter vont vous permettre de lancer des actions de votre paquet en cours d’édition.

Zone d’édition

PyScripter - Editor panel

PyScripter - zone d’édition de PyScripter

La Zone d’édition de PyScripter permet d’éditer le fichier setup.py ainsi que le fichier control.

Console Python

PyScripter - Python console in PyScripter

PyScripter - console python de PyScripter

C’est la console python visible dans PyScripter, elle va vous permettre d’afficher la sortie python lorsque vous exécuterez des commandes run.

Vous pouvez également l’utiliser pour tester / déboguer des portions de votre script setup.py.

To learn more about the composition of a wapt package, visit the documentation on the structure of a WAPT package detailed.

Tester localement l’installation du paquet WAPT

Vous pouvez ensuite tester le lancement d’une installation sur votre station de développement.

Running an install command from the Pyscripter console

Exécuter une commande d’installation depuis la console Pyscripter

La Console PyScripter vous permet de vérifier si l’installation s’est bien déroulée.

Tester localement la désinstallation du paquet WAPT

Vous pouvez ensuite tester le lancement d’une désinstallation sur votre station de développement.

Running a remove command from the Pyscripter console

Exécuter une commande de désinstallation depuis la console Pyscripter

La Console PyScripter vous permet de vérifier si l’installation s’est bien déroulée.

Packager des .msi (exemple)

Pour cet exemple, nous prendrons tightvnc.

Vous pouvez le télécharger ici : https://www.tightvnc.com/download.php

Maintenant, vous pouvez générer votre modèle de paquet, veuillez vous référer à la documentation pour la création de paquets à partir de la console WAPT.

Editer le fichier control (architecture, impacted_process, target_os, description, maintainer …), veuillez vous référer à la structure du fichier documentation control.

Votre pyscripter s’ouvre, allez dans votre setup.py :

# -*- 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 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 arguments disponibles avec install_exe_if_need

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

valeur 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.

Indication

Vous n’avez pas non plus à remplir le champ killbefore si la valeur indiquée dans le champ impacted_process du fichier :file:`control » est correcte.

Note

Le setup.py aurait pu ressembler à cela, mais la méthode est moins élégante car elle fait moins de vérifications :

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

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

def install():
    print('installing tis-tightvnc')
    run('msiexec /norestart /q /i "tightvnc-2.8.5-setup-64bit.msi"')

Lancez l’installation et voyez ce qui se passe lorsque le logiciel est déjà installé.

wapt-get -ldebug install C:\waptdev\tis-tightvnc-wapt
Installing WAPT file C:\waptdev\tis-tightvnc-wapt
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)

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')
    install_msi_if_needed('tightvnc-2.8.5-setup-64bit.msi', properties = properties )

Note

Le setup.py aurait pu ressembler à cela, mais la méthode est moins élégante car elle fait moins de vérifications :

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

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

def install():
    print('installing tis-tightvnc')
    run('msiexec /norestart /q /i "tightvnc-2.8.5-setup-64bit.msi" SERVER_REGISTER_AS_SERVICE=0 SERVER_ADD_FIREWALL_EXCEPTION=0')

Packager des .exe (exemple)

  • télécharger l’installateur .exe à partir d’une source fiable ;

    Téléchargez l’installateur au format exe Firefox ESR x64 sur https://download.mozilla.org/?product=firefox-esr-latest-ssl&os=win64

  • rechercher la documentation associée pour les flags silencieux ;

  • puis générer votre modèle de paquet, veuillez vous référer à la documentation pour la création de paquets à partir de la console WAPT. PyScripter se charge et ouvre le projet de paquet .exe.

    PyScripter opening with focus on the *control* file

    PyScripter affichant le fichier control

  • éditer le fichier control (architecture, impacted_process, target_os, description, maintainer …), veuillez vous référer à la structure du fichier documentation du fichier control;

  • vérifier le fichier control ;

    Mozilla Firefox-ESR ne répond pas aux standards et retourne un numéro de version erroné (il s’agit du numéro de version du logiciel qui créé l’installeur).

    • fichier control d’origine :

      package           : tis-firefox-esr
      version           : 4.42.0.0-0
      architecture      : all
      section           : base
      priority          : optional
      maintainer        : user
      description       : automatic package for firefox setup 52.6.0esr
      impacted_process  : 
      
    • fichier control modifié :

      package           : tis-firefox-esr
      version           : 52.6.0-1
      architecture      : all
      section           : base
      priority          : optional
      maintainer        : Tranquil-IT Systems
      description       : Mozilla Firefox 52.6.0 ESR
      impacted_process  : firefox.exe
      

    Note

    Il est à noter qu’une sous-version -1 a été ajoutée au numéro de version du logiciel ; il s’agit de la version de packaging du paquet WAPT.

    Il permet au développeur de paquets de publier plusieurs versions de paquets WAPT d’un même logiciel, ce qui est très utile pour un développement très rapide et itératif.

Utiliser install_exe_if_needed

La fonction est sensiblement la même que celle utilisée pour les installeurs .msi, avec quelques différences :

  • la fonction nécessite l’ajout des flags silencieux en paramètre ;

  • la fonction nécessite l’ajout de la clé de désinstallation en paramètre ;

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

uninstallkey = []

def install():
    print('installing tis-firefox-esr')
    install_exe_if_needed("Firefox Setup 45.5.0esr.exe",silentflags="-ms",key='',min_version="4.42.0.0")
Liste des arguments disponibles avec install_exe_if_need

Paramètre

Valeur par défaut

Description

exe

nom du fichier .exe à exécuter.

silentflags

paramètres silencieux à passer en argument à l’installeur.

key

None

clé de désinstallation du programme.

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).

get_version

None

valeur 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

supprimer automatiquement une ancienne version d’un logiciel dont la clé de désinstallation est identique

force

False

force l’installation même si une uninstallkey avec une version identique est trouvée

Le paquet aura alors ce comportement :

  • le logiciel Firefox s’installera uniquement si le logiciel n’est pas installé et si la version est strictement inférieure à 45.5.0, sauf si l’option --force est indiquée lors de l’installation du paquet ;

  • à l’installation, les processus firefox.exe en cours d’exécution seront tués (avec la valeur indiquée dans impacted_process du fichier control) ;

  • la fonction ajoutera elle-même la clé de désinstallation, donc laisser uninstallkey vide ;

  • à la fin de l’installation, la fonction ira vérifier si l”uninstallkey est bien présente sur le poste et si la version est bien égale ou supérieure à 45.5.0, si ce n’est pas le cas, elle basculera le paquet en ERROR ;

Trouver la clé de désinstallation

Contrairement aux fichiers .msi, la clé pour désinstaller un .exe n’est pas dans les propriétés du fichier.

Vous devez donc d’abord installer le logiciel pour connaître la clé de désinstallation.

Vous devez donc démarrer une fois l’installation à partir de pyscripter avec le run configuration et ensuite install.

_images/run_install.png

Une fois le logiciel installé, allez à la console WAPT, puis trouvez votre machine de développement.

Dans l’onglet inventaire des logiciels, trouvez votre logiciel et copiez la valeur indiquée dans la colonne clé de désinstallation.

Retrieving an uninstallkey from the console

Récupérer une clé de désinstallation depuis la console

Vous devez également vérifier la valeur de la version avec la valeur indiquée dans min_version dans votre setup.py.

Modifier votre fichier setup.py avec les nouveaux paramètres :

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

uninstallkey = []

def install():
    print('installing tis-firefox-esr')
    install_exe_if_needed("Firefox Setup 45.5.0esr.exe",silentflags="-ms",key='Mozilla Firefox 45.5.0 ESR (x64 fr)',min_version="45.5.0")

Pour tester que votre clé fonctionne correctement, vous devez relancer une installation dans pyscripter.

_images/run_install.png

WAPT ne tentera pas d’installer le logiciel car il est déjà présent, le message suivant devrait donc s’afficher :

>>>
*** Remote Interpreter Reinitialized ***
Command Line : install "c:\waptdev\tis-firefox-esr_x64_PROD_fr-wapt\WAPT\.."
Using config file: C:\Program Files (x86)\wapt\wapt-get.ini
Installing WAPT files c:\waptdev\tis-firefox-esr_x64_PROD_fr-wapt
Exe setup Firefox_Setup_78.7.1esr.exe already installed. Skipping

Results:

=== install packages ===
c:\waptdev\tis-firefox-esr_x64_PROD_fr-wapt | tis-firefox-esr (78.7.1-102)

Vous pouvez maintenant tester la désinstallation :

Test the uninstallation

Vous pouvez maintenant construire et envoyer votre paquet, veuillez vous référer à la documentation pour construire et envoyer des paquets depuis la console WAPT.

Note

Si vous laissez la clé de désinstallation vide, la désinstallation de votre paquet ne fonctionnera pas.

Cas particulier d’un dé-installeur non-silencieux

Dans certains cas particuliers, un paquet utilisant install_exe_if_needed remplit la clé de désinstallation, mais la clé de désinstallation pointe vers un désinstalleur non silencieux.

Il nous faut contourner le problème en utilisant une fonction qui va supprimer la clé de désinstallation à la fin de l’installation.

:emphasize-lines: 13

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

uninstallkey = []

def install():
    install_exe_if_needed("setup.exe",
                          silentflags="/s",
                          key='{D9E87643-0005-447E-9111-78697A9C1595}',
                          min_version="14.0")
    uninstallkey.remove('{D9E87643-0005-447E-9111-78697A9C1595')

def uninstall():
    run(r'"C:\Program Files\Kutl\uninstall.exe" /supersilent')

Indication

La fonction de désinstallation peut également être utilisée pour exécuter du code en plus de la désinstallation de logiciels, ex : supprimer un dossier, supprimer un raccourci …

Construire le paquet et l’envoyer au serveur WAPT

  • une fois que le paquet est prêt, le construire et l’envoyer au serveur WAPT, dans la console WAPT :

Option "build-upload in waptconsole"

Option « Construire et charger le paquet » dans la console WAPT

  • sélectionner le paquet dans le dossier c:\waptdev ;

_images/build-upload-console-select-folder.PNG
  • confirmer le paquet sélectionné ;

_images/build-upload-console-confirm.PNG

Vous venez de charger votre premier paquet wapt !!

Video demonstration

Créer et déployer un paquet msi avec WAPT

Créer, configurer et déployer un paquet exe avec WAPT

Travailler avec des codes de retour non standard

Les codes de retour sont utilisés pour indiquer si un logiciel a été correctement installé.

Avec Windows, le code standard de retour pour une installation réussie est [0].

Si vous savez que vos paquets WAPT s’installent correctement, mais que vous obtenez quand même un code de retour différent de [0], alors vous pouvez explicitement dire à WAPT d’ignorer le code d’erreur en utilisant le paramètre accept_returncodes.

Vous pouvez découvrir comment utiliser le paramètre accept_returncodes en explorant le code de ce paquet.

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

uninstallkey = []

def is_kb_installed(hotfixid):
    installed_update = installed_windows_updates()
    if [kb for kb in installed_update if kb['HotFixID' ].upper() == hotfixid.upper()]:
        return True
    return False

def waiting_for_reboot():
    # Query WUAU from the registry
    if reg_key_exists(HKEY_LOCAL_MACHINE,r"SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update\RebootRequired") or \
        reg_key_exists(HKEY_LOCAL_MACHINE,r"SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending") or \
        reg_key_exists(HKEY_LOCAL_MACHINE,r'SOFTWARE\Microsoft\Updates\UpdateExeVolatile'):
        return True
    return False

def install():
    kb_files = [
        'windows10.0-kb4522355-x64_af588d16a8fbb572b70c3b3bb34edee42d6a460b.msu',
        ]
    with EnsureWUAUServRunning():
      for kb_file in kb_files:
          kb_guess = re.findall(r'^.*-(KB.*)-',kb_file)
          if not kb_guess or not is_kb_installed(kb_guess[0]):
              print('Installing {}'.format(kb_file))
              run('wusa.exe "{}" /quiet /norestart'.format(kb_file),accept_returncodes=[0,3010,2359302,-2145124329],timeout=3600)
          else:
              print('{} already installed'.format(kb_file))

      if waiting_for_reboot():
          print('A reboot is needed!')

Indication

La liste complète des messages d’erreur de l’installeur Windows peut être consultée sur cette page <https://docs.microsoft.com/en-us/windows/win32/msi/windows-installer-error-messages>`_.

Exemples simples de fonctions setuphelpers couramment utilisées

Nous présentons ici quelques fonctions implémentées dans Setuphelpers et fréquemment utilisées pour développer des paquets WAPT.

Tests et manipulation de dossiers et fichiers

Créer un chemin avec récursion

La commande makepath

makepath(programfiles,'Mozilla','Firefox')

… fabrique la variable pour le chemin C:\Program Files (x86)\Mozilla\Firefox.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=makepath#setuphelpers.makepath

Créer et détruire des répertoires

La commande mkdirs

mkdirs('C:\\test')

… crée le répertoire C:      est.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=mkdirs#setuphelpers.mkdirs

La commande remove_tree

remove_tree(r'C:\tmp\target')

… détruit le répertoire C:   mp    arget.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=remove_tree#setuphelpers.remove_tree

Tester si des éléments de l’arborescence sont des fichiers ou des répertoires

La commande isdir

isdir(makepath(programfiles32,'software')):
    print('The directory exists')

… vérifie que C:\Program Files (x86)\software est un répertoire.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=isdir#setuphelpers.isdir

La commande isfile

isfile(makepath(programfiles32,'software','file')):
    print('file exist')

… vérifie que C:\Program Files (x86)\software\file est un fichier.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=isfile#setuphelpers.isfile

Tester si un répertoire est vide

La commande dir_is_empty

dir_is_empty(makepath(programfiles32,'software')):
    print('dir is empty')

… vérifie que le répertoire C:\Program Files (x86)\software est vide.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=dir_is_empty#setuphelpers.dir_is_empty

Copier un fichier

La commande filecopyto

filecopyto('file.txt',makepath(programfiles32,'software'))

… copie le fichier file.txt dans le répertoire C:\Program Files (x86)\software.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=filecopyto#setuphelpers.filecopyto

Copier un répertoire

La commande copytree2

copytree2('sources','C:\\projet')

… copie le dossier sources dans le répertoire C:\projet.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=copytree2#setuphelpers.copytree2

Récupérer la version d’un fichier

La commande get_file_properties

get_file_properties(makepath(programfiles32,'InfraRecorder','infrarecorder.exe'))['ProductVersion']

… affiche les propriétés du paquet.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=get_file_properties#setuphelpers.get_file_properties

Manipulation de clés de registre

La commande registry_readstring

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

… vérifie que la clé {8A69D345-D564-463c-AFF1-A69D9E530F96} existe dans le répertoire SOFTWARE\Google\Update\Clients de la ruche HKEY_LOCAL_MACHINE.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=registry_readstring#setuphelpers.registry_readstring

La commande registry_readstring

print(registry_readstring(HKEY_LOCAL_MACHINE, r'SOFTWARE\Google\Update\Clients\{8A69D345-D564-463c-AFF1-A69D9E530F96}', 'pv'))

… lit la valeur de la clé {8A69D345-D564-463c-AFF1-A69D9E530F96} inscrite dans le répertoire SOFTWARE\Google\Update\Clients de la ruche HKEY_LOCAL_MACHINE.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=registry_readstring#setuphelpers.registry_readstring

La commande registry_setstring

registry_setstring(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows Live\\Common",'TOUVersion','16.0.0.0', type=REG_SZ)

… modifie la valeur de la clé TOUVersion dans le répertoire SOFTWARE\Microsoft\Windows Live de la ruche HKEY_CURRENT_USER.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=registry_setstring#setuphelpers.registry_setstring

Créer et supprimer des raccourcis

A simple shortchut

A menu folder shortcut

A desktop shortcut

create_desktop_shortcut

La commande create_desktop_shortcut

create_desktop_shortcut(r'WAPT Console Management',target=r'C:\Program Files (x86)\wapt\waptconsole.exe')

… crée le raccourci WAPT Console Management dans le répertoire C:\Users\Public pointant vers l’exécutable C:\Program Files (x86)\wapt\waptconsole.exe ; le raccourci est ajouté pour tous les utilisateurs.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=create_desktop_shortcut#setuphelpers.create_desktop_shortcut

remove_desktop_shortcut

La commande remove_desktop_shortcut

remove_desktop_shortcut('WAPT Console Management')

… supprime le raccourci WAPT Console Management du répertoire C:\Users\Public ; le raccourci est supprimé pour tous les utilisateurs.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=remove_desktop_shortcut#setuphelpers.remove_desktop_shortcut

Firefox place un raccourci sur le bureau de tous les utilisateurs, nous allons le supprimer.

Nous utiliserons la fonction remove_desktop_shortcut :

  • modifier le setup.py et utiliser la fonction comme ceci :

    # -*- coding: utf-8 -*-
    from setuphelpers import *
    
    uninstallkey = []
    
    def install():
        install_exe_if_needed("Firefox Setup 45.5.0esr.exe",silentflags="-ms",key='Mozilla Firefox 45.5.0 ESR (x64 fr)',min_version="45.5.0")
        remove_desktop_shortcut('Firefox')
    
  • si vous redémarrez l’installation à partir de pyscripter, vous remarquerez que le raccourci de bureau « all users » a disparu ;

A current user desktop shortcut

create_user_desktop_shortcut

Indication

Ces fonctions sont utilisées avec le session_setup.

La commande create_user_desktop_shortcut

create_user_desktop_shortcut(r'WAPT Console Management',target=r'C:\Program Files (x86)\wapt\waptconsole.exe')

… crée le raccourci WAPT Console Management sur le bureau de l’utilisateur pointant vers l’exécutable C:\Program Files (x86)\wapt\waptconsole.exe.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=create_user_desktop_shortcut#setuphelpers.create_user_desktop_shortcut

remove_user_desktop_shortcut

La commande remove_user_desktop_shortcut

remove_user_desktop_shortcut('WAPT Console Management')

… supprime le raccourci WAPT Console Management du bureau de l’utilisateur.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=remove_user_desktop_shortcut#setuphelpers.remove_user_desktop_shortcut

Environment Windows / Logiciels / Services

Windows version check

La commande windows_version

windows_version()<Version('6.2.0'):

… vérifie que la version de Windows est strictement inférieure à 6.2.0.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=windows_version#setuphelpers.windows_version

Visitez également le site sur les numéros de version de Windows.

Check if 64bits architecture

La commande iswin64

if iswin64():
    print('Pc x64')
else:
    print('Pc not x64')

… vérifie que le processeur de la machine est 64bits.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=iswin64#setuphelpers.iswin64

Program Files variable

programfiles / programfiles32 / programfiles64

Renvoie les différentes localisations de Program Files

La commande programfiles64

print(programfiles64())

Renvoie le répertoire natif du programme, c.à.d. C:\Program Files (x86) pour les architecture win64 et win32.

print(programfiles())

Renvoie le chemin vers le répertoire Programs Files (x86) (sur architecture win64) ou Programs Files (sur architecture win32).

print(programfiles32())

AppData variable

user_appdata / user_local_appdata

Indication

Ces fonctions sont utilisées avec le session_setup

La commande user_appdata

print(user_appdata())

… renvoie le profil appdata itinérant de l’utilisateur courant (C:\Users\%username%\AppData\Roaming).

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=user_appdata#setuphelpers.user_appdata

La commande user_local_appdata

print(user_local_appdata())

… renvoie le profil appdata local de l’utilisateur courant (C:\Users\%username%\AppData\Local).

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=user_local_appdata#setuphelpers.user_local_appdata

Disable temporarily the wow3264 file redirector

La commande disable_file_system_redirection

with disable_file_system_redirection():
    filecopyto('file.txt',system32())

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=disable_file_system_redirection#setuphelpers.disable_file_system_redirection

Gère le contexte pour désactiver temporairement le redirecteur wow3264

Get current user

La commande get_current_user

print(get_current_user())

… affiche l’identifiant de l’utilisateur connecté

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=get_current_user#setuphelpers.get_current_user

Get computer name

La commande get_computername

print(get_computername())

… affiche le nom de la machine sans le domaine

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=get_computername#setuphelpers.get_computername

Get computer domain

La commande get_domain_fromregistry

get_domain_fromregistry()

… renvoie le nom de la machine avec le domaine.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=get_domain_fromregistry#setuphelpers.get_domain_fromregistry

Action on installed software

Check installed software

La commande installed_softwares

installed_softwares('winscp')

… renvoie la liste des logiciels inscrits dans la base de registre machine sous forme de tableau.

[{'install_location': u'C:\\Program Files\\WinSCP\\', 'version': u'5.9.2', 'name': u'WinSCP 5.9.2', 'key': u'winscp3_is1', 'uninstall_string': u'"C:\\Program Files\\WinSCP\\unins000.exe"', 'publisher': u'Martin Prikryl', 'install_date': u'20161102', 'system_component': 0}]

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=installed_softwares#setuphelpers.installed_softwares

Get uninstall command with registry

La commande uninstall_cmd

uninstall_cmd('winscp3_is1')

… renvoie la commande de désinstallation silencieuse.

"C:\Program Files\WinSCP\unins000.exe" /SILENT

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=uninstall_cmd#setuphelpers.uninstall_cmd

Uninstalling software

for soft in installed_softwares('winscp3'):
    if Version(soft['version']) < Version('5.0.2'):
        run(WAPT.uninstall_cmd(soft['key']))
  • pour chaque élément de la liste renvoyée par installed_softwares contenant le mot-clé winscp ;

  • si la version dans la liste est plus petite que 5.0.2 ;

  • alors lancer la désinstallation avec uninstall_cmd et en indiquant la uninstallkey ;

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://dev.tranquil.it/sphinxdocs/source/setuphelpers.html?highlight=uninstall_cmd#setuphelpers.uninstall_cmd

Kill task

La commande killalltasks

killalltasks('firefox')

… termine l’exécution du logiciel Firefox.

Indication

Pour plus d’informations ou pour connaître les paramètres complémentaires de la commande, consultez la documentation de référence (en anglais) en visitant :

https://www.wapt.fr/en/api-doc-1.5/source/setuphelpers.html?highlight=killalltasks#setuphelpers.killalltasks

Utiliser les champs du fichier control

It’s possible to use control file informations on setup.py

Get packages version

def setup():
    print(control['version'])

… affiche le champ version du fichier control du paquet WAPT.

def setup():
    print(control['version'].split('-',1)[0])

… affiche le numéro de version du fichier control sans le numéro de version de packaging WAPT.

Get software name

Manage WAPT package by another WAPT package

Installer un paquet

La commande install

WAPT.install('tis-scratch')

… installe tis-scratch sur la machine.

Supprimer un paquet

La commande remove

WAPT.remove('tis-scratch')

… désinstalle tis-scratch de la machine.

Créer des paquets WAPT

La commande forget_packages

WAPT.forget_packages('tis-scratch')

… informe WAPT de ne plus suivre le paquet tis-scratch ; WAPT ne connaîtra plus l’existence de ce paquet.

Indication

Si vous voulez supprimer tis-scratch, il faudra soit réinstaller le paquet (wapt-get install "tis-scratch"), puis le supprimer (wapt-get remove "tis-scratch"), ou bien le supprimer manuellement à partir du panneau de configuration Windows Ajout / Suppression de Programmes.

Améliorer mon paquet

Copier un fichier

Il est possible de configurer Firefox avec un fichier policies.json. Voir https://github.com/mozilla/policy-templates/blob/master/README.md.

Ce fichier doit être placé dans le dossier distribution à la racine de Firefox.

Pour vous aider à créer ce fichier policies.json, vous pouvez utiliser cette extension : https://addons.mozilla.org/fr/firefox/addon/enterprise-policy-generator/.

Lorsque vous avez généré votre fichier policies.json, placez-le dans c:\waptdev\prefix-firefox-esr-wapt\policies.json.

Le dossier distribution à la racine de Firefox peut ne pas exister, nous allons donc tester son existence et le créer avec la commande mkdirs si il n’existe pas :

if not isdir(r'C:\Program Files\Mozilla Firefox\distribution'):
    mkdirs(r'C:\Program Files\Mozilla Firefox\distribution')

Important

Si vous avez des backslashes sur votre chemin, vous devez toujours mettre un r devant la chaîne, comme dans l’exemple précédent.

Vous devrez également utiliser la fonction filecopyto pour copier le fichier policies.json :

filecopyto('policies.json',r'C:\Program Files\Mozilla Firefox\distribution')

Indication

Il n’est pas nécessaire de mettre le chemin complet du fichier source puisque le fichier policies.json est à la racine du paquet WAPT, donc nous utilisons le chemin relatif.

Modifier le setup.py :

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

uninstallkey = []

def install():
    install_exe_if_needed("Firefox Setup 45.5.0esr.exe",silentflags="-ms",key='Mozilla Firefox 45.5.0 ESR (x64 fr)',min_version="45.5.0")
    remove_desktop_shortcut('Firefox')

    if not isdir(r'C:\Program Files\Mozilla Firefox\distribution'):
        mkdirs(r'C:\Program Files\Mozilla Firefox\distribution')

    filecopyto('policies.json',r'C:\Program Files\Mozilla Firefox\distribution')

Votre paquet est maintenant prêt à appliquer une configuration. Vous pouvez lancer une installation avec pyscripter et valider que le paquet fonctionne selon votre objectif.

Enfin, lancer votre :program :Firefox pour vérifier qu’il fonctionnera pour vos utilisateurs.

Désinstaller des versions non désirées

Indication

À chaque étape de ces exemples, vous pouvez lancer une installation pour tester le résultat.

Dans notre cas, nous voulons désinstaller la version non ESR de Firefox.

Nous chercherons les autres logiciels installés sur la machine pour vérifier si une version non-esr de Firefox est installée.

Pour reproduire notre exemple, téléchargez et installez la version grand public ici : https://download.mozilla.org/?product=firefox-latest-ssl&os=win :

  • pour rechercher une version non désirée du programme :Firefox, nous utiliserons la fonction installed_softwares. Cette fonction renvoie un dictionnaire contenant les propriétés du logiciel :

    print(installed_softwares('Firefox'))
    
    [
       {
         'install_date': '',
       'install_location': 'C:\\Program Files\\Mozilla Firefox',
       'key': 'Mozilla Firefox 78.7.1 ESR (x64 fr)',
       'name': 'Mozilla Firefox 78.7.1 ESR (x64 fr)',
       'publisher': 'Mozilla',
       'system_component': 0,
       'uninstall_string': '"C:\\Program Files\\Mozilla Firefox\\uninstall\\helper.exe"',
       'version': '78.7.1',
       'win64': True
         },
    
       {
          'install_date': '',
        'install_location': 'C:\Program Files (x86)\\Mozilla Firefox',
        'key': 'Mozilla Firefox 79.0 (x86 fr)',
        'name': 'Mozilla Firefox 79.0 (x86 fr)',
        'publisher': 'Mozilla',
        'system_component': 0,
        'uninstall_string': '"C:\Program Files (x86)\\Mozilla Firefox\\uninstall\\helper.exe"',
        'version': '79.0',
        'win64': False
          }
    ]
    
  • vérifier le nom de chaque logiciel :

    for uninstall in installed_softwares('Mozilla Firefox'):
        print(uninstall['name'])
    
  • afficher le nom de chaque logiciel trouvé :

    for uninstall in installed_softwares('Mozilla Firefox'):
        if not 'ESR' in uninstall['name']
            print(uninstall['name'])
    
  • afficher le nom de chaque logiciel trouvé qui n’inclut pas la chaîne ESR dans son nom et sa clé de désinstallation :

    for uninstall in installed_softwares('Mozilla Firefox'):
        if not 'ESR' in uninstall['name']
            print(uninstall['name'])
            print('Uninstall ' + uninstall['key'])
    

Nous allons maintenant utiliser une astuce WAPT en utilisant la fonction uninstall_cmd :

  • install cmd accepte une clé de désinstallation comme argument et enverra la commande à exécuter pour lancer la désinstallation silencieuse :

    for uninstall in installed_softwares('Mozilla Firefox'):
        if not 'ESR' in uninstall['name']:
            print(uninstall['name'])
            print('Uninstall ' + uninstall['key'])
            silent_uninstall = uninstall_cmd(uninstall['key'])
            print('Run ' + silent_uninstall)
    
  • commencer la désinstallation :

    for uninstall in installed_softwares('Mozilla Firefox'):
        if not 'ESR' in uninstall['name']:
            print(uninstall['name'])
            print('Uninstall ' + uninstall['key'])
            silent_uninstall = uninstall_cmd(uninstall['key'])
            print('Run ' + silent_uninstall)
            run(silent_uninstall)
    

Nous pouvons également désinstaller le service de maintenance de la mozilla :

for uninstall in installed_softwares('MozillaMaintenanceService'):
    run(uninstall_cmd(uninstall['key']))
  • enfin, modifier votre setup.py :

    # -*- coding: utf-8 -*-
    from setuphelpers import *
    
    uninstallkey = []
    
    def install():
        #Install firefox if necessary
        install_exe_if_needed("Firefox Setup 45.5.0esr.exe",silentflags="-ms",key='Mozilla Firefox 45.5.0 ESR (x64 fr)',min_version="45.5.0")
    
        #Removal of the firefox shortcut on the all user desktop
        remove_desktop_shortcut('Firefox')
    
        #Creation of the distribution folder if it does not exist
        if not isdir(r'C:\Program Files\Mozilla Firefox\distribution'):
            mkdirs(r'C:\Program Files\Mozilla Firefox\distribution')
    
        #Copy of the policies.json file found at the root of the package in the destination of the distribution folder
        filecopyto('policies.json',r'C:\Program Files\Mozilla Firefox\distribution')
    
        #For each Mozilla Firefox installed
        for uninstall in installed_softwares('Mozilla Firefox'):
            #If the software does not have the word ESR in the name
            if not 'ESR' in uninstall['name']:
                print(uninstall['name'])
                print('Uninstall ' + uninstall['key'])
    
                #Looking for how we can uninstall it silently
                silent_uninstall = uninstall_cmd(uninstall['key'])
                print('Run ' + silent_uninstall)
    
                #We launch the previous command.
                run(silent_uninstall)
    
        #Uninstalling mozilla maintenance service
        for uninstall in installed_softwares('MozillaMaintenanceService'):
            run(uninstall_cmd(uninstall['key']))
    

Votre code gère maintenant la désinstallation des versions non désirées de Firefox.

Améliorer setup.py pour utiliser des variables

Exemples d’utilisation de variables :

version_firefox = "45.0"

uninstallkey = "Mozilla Firefox " + version_firefox + " ESR (x64 fr)"
print(uninstallkey)

uninstallkey = "Mozilla Firefox %s ESR (x64 fr)" % (version_firefox)
print(uninstallkey)

uninstallkey = "Mozilla Firefox {} ESR (x64 fr)".format(version_firefox)
print(uninstallkey)

uninstallkey = f"Mozilla Firefox {version_firefox} ESR (x64 fr)"
print(uninstallkey)

Important

Le dernier exemple est le meilleur mais cette opération ne fonctionne qu’avec Python3.

Nous pouvons maintenant utiliser des variables dans notre fichier setup.py :

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

uninstallkey = []

def install():

    version_firefox = "45.5.0"

    #Install firefox if necessary
    install_exe_if_needed("Firefox Setup %sesr.exe" % version_firefox,silentflags="-ms",key='Mozilla Firefox %s ESR (x64 fr)' % version_firefox,min_version=version_firefox)

    #Removal of the firefox shortcut on the all user desktop
    remove_desktop_shortcut('Firefox')

    distribution_folder=r'C:\Program Files\Mozilla Firefox\distribution'

    #Creation of the distribution folder if it does not exist
    if not isdir(distribution_folder):
        mkdirs(distribution_folder)

    ... The rest of the code does not change ...

Indication

Vous pouvez récupérer le numéro de version indiqué dans le fichier control comme ceci :

version_firefox = control.get_software_version()

Personnaliser le contexte utilisateur

Il est parfois nécessaire de personnaliser un programme ou un logiciel en contexte utilisateur pour rendre le logiciel immédiatement exploitable par l’utilisateur dans le contexte spécifique de son entreprise ou du service au sein de son entreprise :

  • créer des raccourcis sur le bureau utilisateur avec des arguments spécifiques ;

  • modifier de clés registres utilisateurs ;

  • modifier des fichiers, une configuration de navigateur ;

  • configurer des raccourcis réseaux aux modèles de documents de l’entreprise pour assurer la conformité des documents aux chartes éditoriales en vigueur ;

  • paramétrer la messagerie de l’utilisateur à partir d’un référentiel externe (annuaire, base de données, etc) ;

  • paramétrer un logiciel bureautique ou métier à partir d’un référentiel externe (annuaire, base de données, etc) ;

La fonction session_setup bénéficie de toute la puissance et de l’étendue des librairies python pour atteindre un niveau d’automatisation élevé.

Fonctionnement du session_setup

La fonction WAPT : command:session_setup est exécutée pour chaque utilisateur utilisant cette commande :

C:\Program Files (x86)\wapt\wapt-get.exe session-setup ALL

L’appel à cette fonction permet d’exécuter la partie session_setup de chaque paquet WAPT logiciel installé sur la machine.

WAPT enregistre en base locale les instructions de tous les paquets dans le fichier C:\Program Files (x86)\wapt\waptdb.sqlite.

Attention

Le session_setup de chaque paquet n’est exécuté qu”une seule fois par paquet ou version de paquet et par profil utilisateur.

L’agent WAPT stocke dans la base de données locale %appdata%\wapt\waptsession.sqlite les instances de session_setup qui ont déjà été jouées.

Exemple de sortie de la commande wapt-get session-setup ALL :

Note

le session_setup de l’utilisateur connecté, avait déjà été exécuté.

wapt-get session-setup ALL

Configuring tis-7zip ... No session-setup. Done
Configuring tis-ccleaner ... Already installed. Done
Configuring tis-vlc ... No session-setup. Done
Configuring tis-tightvnc ... No session-setup. Done
Configuring tis-paint.net ... No session-setup. Done
Configuring wsuser01.mydomain.lan ... No session-setup. Done

Utiliser le session_setup

Les scripts session_setup sont situés dans la section def session_setup() du fichier setup.py :

Exemple :

def session_setup():
   registry_setstring(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows Live\\Common",'TOUVersion','16.0.0.0', type=REG_SZ)

Attention

Avec session_setup, il n’est pas possible de faire appel à des fichiers contenus dans le paquet.

Pour appeler des fichiers externes lors de la désinstallation, copier et coller les fichiers nécessaires dans un dossier externe pendant le processus d’installation du paquet (exemple : c:cachefile).

Exemple : créer un raccourci personnalisé sur le bureau

Une des possibilités offertes par SetupHelpers est la création de raccourcis individuels sur le bureau utilisateur, à la différence du bureau « Public » commun à tous les utilisateurs.

Nous utiliserons pour ça la fonction create_user_desktop_shortcut() pour créer un raccourci contenant le nom de l’utilisateur et qui passera en argument à Firefox le site https://tranquil.it par exemple.

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

uninstallkey = []

def install():
    install_exe_if_needed("Firefox Setup 45.5.0esr.exe",silentflags="-ms",key='Mozilla Firefox 45.4.0 ESR (x64 fr)',min_version="45.5.0")

def session_setup():
  create_user_desktop_shortcut("Mozilla Firefox de %s" % get_current_user(),r'C:\Program Files\Mozilla Firefox\firefox.exe',arguments="-url https://tranquil.it")
  • maintenant, lancer le session-setup directement à partir de pyscripter :

    Pyscripter - running session-setup

    Pyscripter - Effectuer un session-setup

  • enfin, vérifier que l’icône est bien présente sur le bureau ;

Utiliser les fonctions d’audit pour la conformité

Note

Cette fonctionnalité est disponible dans la version Entreprise.

L’audit permet d’effectuer des vérifications régulières sur les configurations des postes et de centraliser le résultat des vérifications dans la console WAPT. Ceci permet de vérifier que votre parc est conforme à votre référentiel sur la durée.

Vous pouvez par exemple :

  • vérifier régulièrement la liste des administrateurs locaux des postes ;

  • vérifier régulièrement la bonne configuration d’un logiciel ;

  • vérifier régulièrement la présence de la bonne version d’un logiciel ;

  • vérifier régulièrement les configurations de sécurité d’un poste ;

La fonction audit bénéficie de toute la puissance et de l’étendue des librairies python pour atteindre une précision d’audit élevée.

Principe de fonctionnement

Les tâches d”audit s’exécutent après un upgrade puis à intervalle régulier défini par la valeur de audit_schedule.

Pour executer manuellement un audit vous pouvez également exécuter la commande :

wapt-get audit

Note

Par défaut, la fonction audit ne sera pas lancée si l’audit n’est pas nécessaire.

Pour forcer l’exécution vous pouvez exécuter la commande :

wapt-get audit -f

How to write

On définit la partie audit dans le fichier setup.py du paquet dans une fonction def audit() :

Dans cet exemple, nous améliorons le paquet firefox précédemment étudié dans cette documentation.

  • ajouter la fonction audit dans le fichier setup.py :

    def audit():
        if isfile(r'C:\Program Files\Mozilla Firefox\distribution\policies.json'):
            print('File policies.json found')
            return "OK"
        else:
            print('File policies.json not found')
            return "ERROR"
    
  • lancer l’audit à partir de pyscripter :

    Pyscripter - Running an audit

    Pyscripter - Effectuer un audit

  • tester avec le fichier puis supprimer le fichier C:\Program Files\Mozilla Firefox\distribution\policies.json et tester à nouveau avec pyscripter ;

Vous pouvez voir directement l’état de l’audit dans la console (Cliquez sur le paquet puis sur la colonne audit) :

Checking an audit status in the WAPT console

Vérifier l’état d’un audit dans la console WAPT

L’audit restitue une des 3 valeurs suivantes :

  • OK ;

  • WARNING ;

  • ERROR ;

Attention

Avec audit, il n’est pas possible de faire appel à des fichiers contenus dans le paquet.

Pour utiliser des fichiers lors de l’audit il faut d’abord les copier dans un répertoire temporaire de la machine lors de l’installation du paquet.

Planifier un audit

Les tâches d”audit s’exécutent après un upgrade puis à intervalle régulier défini par la valeur de audit_schedule.

La valeur est contenue dans le fichier control du paquet WAPT.

Par défault si audit_schedule est vide alors il faudra effectuer l’audit manuellement ou à partir de la console WAPT.

Sinon la valeur peut être indiquée de plusieurs manières :

  • un entier (en minutes) ;

  • un entier suivi d’une lettre (m = minutes , h = heure , d = jour , w = semaine) ;

Audit par défaut

Par défault, si aucun audit n’est déclaré, l’agent WAPT vérifiera la présence des Uninstallkey dans le paquet WAPT.

De cette manière WAPT vérifie que le logiciel est toujours présent.

Automatiser la mise à jour d’un paquet logiciel

Note

Cette partie de la documentation est déconseillée aux utilisateurs qui débutent avec WAPT.

Les fonctions update_package sont très pratiques, elles permettent de gagner du temps lorsque qu’il faut mettre à jour un paquet avec la version la plus récente d’un logiciel.

Principe de fonctionnement

La fonction update_package paquet ira :

  • récupérer la dernière version du logiciel en ligne ;

  • télécharger la dernière version du binaire ;

  • supprimer les anciennes version des binaires ;

  • mettre à jour la version dans le fichier control ;

Si votre fonction install se base sur la version du fichier control pour l’installation, alors vous n’avez pas besoin de modifier votre setup.py.

Il vous reste maintenant à tester l’installation avant de lancer un build-upload.

Exemple

Voici l”update_package de firefox-esr comme exemple :

def update_package():
      import re,requests,glob

      #Retrieving the last file name
      url = requests.head('https://download.mozilla.org/?product=firefox-esr-latest&os=win64',proxies={}).headers['Location']
      filename = url.rsplit('/',1)[1].replace('%20',' ')

      #download of it if is not in the package
      if not isfile(filename):
          print('Downloading %s from %s'%(filename,url))
          wget(url,filename)

      #removing old exe with wrong name
      for fn in glob.glob('*.exe'):
          if fn != filename:
              remove_file(fn)

      # updates control version from filename, increment package version.
      control.version = '%s-0'%(re.findall('Firefox Setup (.*)esr\.exe',filename)[0])
      control.save_control_to_wapt()

Vous pouvez lancer le update_package dans PyScripter :

Pyscripter - Running an update-package-source

Pyscripter - Exécution d’un update-package-source

Vous trouverez de nombreux exemples d”update_package qui vous inspireront dans les paquets du store de Tranquil IT.

Exemple: déployer un logiciel portable avec WAPT

Un bon exemple de paquet applicatif WAPT est celui d’un logiciel dit portable. Pour cela, il faudra :

  • créer le répertoire d’installation dans C:\Program Files (x86) ;

  • copier l’application dans le dossier ;

  • créer un raccourci sur le bureau de l’utilisateur ;

  • gérer la désinstallation de l’application portable ;

  • fermer l’application si elle est en cours d’exécution ;

Exemple avec ADWCleaner

Tout d’abord, télécharger Adwcleaner : https://downloads.malwarebytes.com/file/adwcleaner.

Vous pouvez générer votre modèle de paquet, veuillez vous référer à la documentation pour la création de paquets à partir de la console WAPT.

Le fichier C:\waptdev\tis-adwcleaner-wapt est créé.

Vous trouverez ici un exemple de paquet portable qui prend presque toutes les fonctions WAPT d’un setup.py :

from setuphelpers import *

uninstallkey = []

exe_name = 'AdwCleaner.exe'
path_adw = makepath(programfiles,'AdwCleaner')
path_exe = makepath(path_adw,exe_name)
nameshortcut = 'AdwCleaner'

def install():
    mkdirs(path_adw)
    filecopyto(exe_name,path_exe)
    create_desktop_shortcut(nameshortcut,path_exe)

def uninstall():
    remove_tree(path_adw)
    remove_desktop_shortcut(nameshortcut,path_exe)

def audit():
    if not isfile(path_exe):
        print('File not found')
        return "OK"
    else:
        print('File Found')
        return "ERROR"

def update_package():
    wget('https://downloads.malwarebytes.com/file/AdwCleaner',exe_name)
    control.version = get_file_properties(exe_name)['FileVersion'] + '-0'
    control.save_control_to_wapt()

Créer des paquets WAPT de mises à jour Windows avec des .msu

Indication

Pré-requis : pour construire des paquets WAPT, l’environnement de développement WAPT doit être installé ;

Entre les sorties de Patch Tuesday, Microsoft peut publier des KB supplémentaires ou des mises à jour critiques qui devront être rapidement poussées sur les machines.

À cette fin, WAPT fournit un modèle de paquet pour les fichiers .msu.

Dans cet exemple, nous utilisons la KB4522355 téléchargée du site officiel Microsoft.

Créer un modèle de paquet MSU à partir de la console WAPT

  • créer un modèle de paquet WAPT à partir du fichier .msu téléchargé ;

    Dans la console WAPT, cliquez sur Outils ‣ Assistant de paquets ;

    Pyscripter - WAPT console window for creating a package template

    PyScripter - Menu pour la création de modèle de paquets depuis la console

  • sélectionner le paquet téléchargé .msu et remplir les champs obligatoires ;

    Informations required for creating the MSU package

    Informations requises pour la création du paquet MSU

  • cliquer sur Make and edit (recommandé) pour lancer la personnalisation du paquet ;

  • L’IDE du paquet WAPT est lancé en utilisant le code source du modèle prédéfini .msu ;

  • comme d’habitude avec les paquets WAPT, tester, puis construire, puis signer, puis télécharger et enfin affecter les paquets WAPT souhaités à vos hôtes sélectionnés et c’est fait !

  • si le KB est groupé avec le Patch Tuesday suivant, vous pourrez sélectionner les hôtes sur lesquels le paquet a été appliqué et oublier le paquet KB sur les hôtes ;

Packager des paquets linux simples

Avant de commencer, nous supposons plusieurs conditions :

  • vous disposez d’une interface graphique sur votre système Linux que vous utilisez pour développer et tester des paquets ;

  • vous avez installé le paquet vscode à partir du dépôt de Tranquil IT ;

  • votre utilisateur s’appelle linuxuser et est membre du groupe sudoers ;

Créer un modèle de base à partir de votre ordinateur linux

  • démarrer un utilitaire de ligne de commande ;

  • en tant que linuxuser, créer un modèle de paquet WAPT ;

    wapt-get make-template <template_name>
    

    Avertissement

    Ne pas lancer cette commande en tant que root ou avec sudo.

    Lorsque vous créez un modèle, il y aura plusieurs fichiers dans le dossier .vscode à l’intérieur de votre dossier de développement de paquets :

    • settings.json ;

    • launch.json ;

    Exemple avec TightVNC :

    wapt-get make-template "tis-vlc"
    
    Using config file: /opt/wapt/wapt-get.ini
    Template created. You can build the WAPT package by launching
    /opt/wapt//wapt-get.py build-package /home/linuxuser/waptdev/tis-vlc-wapt
    You can build and upload the WAPT package by launching
    /opt/wapt//wapt-get.py build-upload /home/linuxuser/waptdev/tis-vlc-wapt
    

    Indication

    Tous les paquets sont stockés dans le répertoire personnel de linuxuser.

VSCode se charge et ouvre le projet de paquet.

VSCode opening with focus on the *setup* file

Ouverture du VSCode avec le focus sur le fichier setup

  • vérifier le fichier control ;

    Vous devez donner une description à votre paquet, et renseigner le target_os et la version de votre paquet.

    Indication

    os_target pour unix est linux

    Avertissement

    Le numéro de version dans votre fichier control doit commencer à 0, et non le numéro de version du logiciel car nous ne savons pas précisément à partir de apt/yum repo quelle sera la version du logiciel.

    • fichier control d’origine :

      package           : tis-vlc
      version           : 0-0
      architecture      : all
      section           : base
      priority          : optional
      maintainer        : user
      description       : automatic package for vlc
      
    • fichier control modifié :

      package           : tis-vlc
      version           : 0
      architecture      : all
      section           : base
      priority          : optional
      maintainer        : Tranquil-IT Systems
      description       : VLC for linux
      target_os         : linux
      min_wapt_version  : 1.8
      

    Note

    Il est à noter qu’une sous-version -1 a été ajoutée. Il s’agit de la version de packaging du paquet WAPT.

    Il permet au développeur de paquets de publier plusieurs versions de paquets WAPT d’un même logiciel, ce qui est très utile pour un développement très rapide et itératif.

  • changer le code du fichier setup.py en conséquence ;

    :emphasize-lines: 8
    # -*- coding: utf-8 -*-
    from setuphelpers import *
    
    uninstallkey = []
    
    def install():
        apt_install('vlc')
    
  • enregistrer le paquet ;

Gérer la désinstallation

  • modifier le fichier setup.py avec une procédure de désinstallation ;

def uninstall():
apt_remove('vlc')
  • lancer un remove de VSCode Run Configurations ;

    After uninstallation, the software is correctly removed

    À l’issue de la désinstallation, le programme est désinstallé

  • vérifier que le logiciel a été correctement supprimé ;

    dpkg -l | grep vlc
    

Indication

Dans la fonction uninstall(), on ne peut pas appeler des fichiers contenus dans le paquet WAPT. Pour les appeler, il faudra avoir copié les fichiers dans un répertoire local de la machine lors de l’installation du paquet.

Gérer le session-setup

  • modifier le fichier setup.py avec un session-setup ;

    Dans cet exemple, nous allons créer un fichier :fichier : vlcrc par défaut dans le profil de l’utilisateur.

    def session_setup():
      vlcrc_content="""[qt] # Qt interface
    qt-notification=0
    qt-privacy-ask=0
    metadata-network-access=0
    """
    
      vlcdir = os.path.join(os.environ['HOME'], '.config', 'vlc')
      path_vlrc = makepath(vlcdir,'vlcrc')
      ensure_dir(vlcdir)
      if not isfile(path_vlrc):
          with open(makepath(vlcdir,'vlcrc')) as f:
              f.write(vlcrc_content)
    
  • lancez un session-setup à partir de VSCode Run Configurations ;

    After uninstallation, the software is correctly removed

    À l’issue de la désinstallation, le programme est désinstallé

Construire et charger le paquet WAPT

Vous trouverez votre paquet ici : ~/waptdev.

Vous devez transférer le dossier du paquet sur la machine Windows qui possède la clé privée.

Ensuite, se référer à la documentation pour la construire et charger le paquet depuis la console WAPT.

Chiffrer des données sensibles contenues dans un paquet WAPT

Note

Cette partie de la documentation est déconseillée aux utilisateurs qui débutent avec WAPT.

Cette fonctionnalité est disponible uniquement dans la version Entreprise.

Pour quoi faire ?

Dans le fonctionnement de WAPT, l’intégrité du paquet est assurée. Un paquet dont le contenu a été modifié sans avoir été re-signé sera systématiquement refusé par le client WAPT.

En revanche le contenu d’un paquet WAPT n’est pas chiffré et sera lisible de tous. Ce modèle technique de transparence apporte cependant de nombreux bénéfices.

Cela peut être génant dans le cas d’un paquet qui contiendrait un mot de passe, une clé de licence, ou une donnée sensible.

Heureusement nous avons une solution.!!

Principe de fonctionnement

Lorsque qu’un agent WAPT s'enregistre auprès du serveur WAPT, il génère un couple clé privée / certificat public dans C:Program Files (x86)\waptprivate.

  • Le certificat est envoyé au serveur avec l’inventaire lors de l’enregistrement initial du client WAPT ;

  • La clé privée est conservée par l’agent et n’est accessible en lecture que par les Administrateurs Locaux ;

Nous allons donc chiffrer la donnée sensible contenue dans le paquet avec le certificat appartenant à la machine.

Lors de l’installation l’agent WAPT pourra ainsi déchiffrer la donnée sensible grâce à sa clé privé.

Avec ce mode de fonctionnement le serveur WAPT et les dépôts secondaires n’ont pas connaissance de la donnée sensible.

Cas pratique

Vous trouverez ici un exemple de paquet WAPT ou nous chiffrons un texte dans dans une fonction update_package puis nous déchiffrons ce texte dans la partie install.

Dans cet exemple, la fonction update_package nous permet de parcourir la base de donnée du serveur WAPT pour récupérer le certificat de chaque machine pour ensuite chiffrer le texte sensible avec celui-ci.

Le texte chiffré pour chaque machine est ensuite stocké dans un fichier encrypt-txt.json à la racine du paquet.

Lors de l’installation du paquet, l’agent WAPT prendra le texte chiffré et le déchiffrera avec sa clé privé.

# -*- coding: utf-8 -*-
from setuphelpers import *
import json
from waptcrypto import SSLCertificate
import waptguihelper

uninstallkey = []

def install():
    encryptlist = json.loads(open('encrypt-txt.json','r').read())
    if WAPT.host_uuid in encryptlist:
        host_key = WAPT.get_host_key()
        encrypttxt = host_key.decrypt(encryptlist[WAPT.host_uuid].decode('base64')).decode('utf-8')
        print( ur'Here is the deciphered text:  %s' % encrypttxt)
    else:
        error('%s not found in encrypt-txt.json' % WAPT.host_uuid)

def update_package():
    urlserver = inifile_readstring(makepath(install_location('WAPT_is1'),'wapt-get.ini'),'global','wapt_server').replace('https://','')
    encrypttxt = str(raw_input('Enter the text to be encrypted :').encode('utf-8'))
    encryptlist = {}
    credentials_url = waptguihelper.login_password_dialog('Credentials for wapt server',urlserver,'admin','')
    data = json.loads(wgets('https://%s:%s@%s/api/v1/hosts?columns=host_certificate&limit=10000' % (credentials_url['user'],credentials_url['password'],urlserver)))
    for value in data['result']:
        if value['host_certificate']:
            host_cert=SSLCertificate(crt_string=value['host_certificate'])
            encryptlist[value['uuid']]=host_cert.encrypt(encrypttxt).encode('base64')
            print value['computer_fqdn'] + ':' + value['uuid'] + ':' + encryptlist[value['uuid']]
    open('encrypt-txt.json','w').write(json.dumps(encryptlist))

if __name__ == '__main__':
    update_package()

Attention

La sortie python (log install du paquet) est accessible en lecture aux utilisateurs de la machine, vous ne devez donc pas afficher le text déchiffré avec un :command:`print` lors de l’installation.

Utiliser différents IDE pour le développement de paquets WAPT

Si vous êtes habitué(e) à travailler avec un autre IDE, vous pouvez être soulagé maintenant car WAPT supporte d’autres éditeurs de développement intégrés.

Certains éditeurs de code sont pris en charge en natif :

  • PyScripter;

  • VSCode ;

  • VSCodium ;

D’autres éditeurs peuvent être sélectionnés et seront lancés lorsque vous créerez un nouveau modèle pour un paquet WAPT à partir de la console WAPT.

Note

Utiliser un IDE supporté lancera le projet de paquet WAPT avec une configuration de débogage valide.

Sur Windows

Pour configurer un autre éditeur pour WAPT, vous devez modifier l’attribut editor_for_packages dans la section [global] du fichier de configuration %LOCALAPPDATA%waptconsolewaptconsole.ini de votre console WAPT.

Méthodes alternatives pour l’édition de paquets WAPT sur Windows

Nom de l’éditeur de code

editor_for_packages value

PyScripter

None

Microsoft Visual Studio Code

vscode ou code

Microsoft Visual Studio Codium

vscodium ou codium

Exemple de configuration de waptconsole.ini :

[global]
...
editor_for_packages=vscode

Sur Linux / macOS

Pour configurer un autre éditeur pour WAPT, vous devez modifier l’attribut editor_for_packages dans la section [global] du fichier de configuration /opt/wapt/wapt-get.ini de votre agent WAPT.

Par défaut, si l’attribut editor_for_packages est vide, le WAPT essaiera de lancer (dans cet ordre) :

  • vscodium ;

  • vscode;

  • nano ;

  • vim ;

  • vi ;

Méthodes alternatives pour l’édition de paquets WAPT sous Linux

Nom de l’éditeur de code

editor_for_packages value

Microsoft Visual Studio Code

vscode ou code

Microsoft Visual Studio Codium

vscodium ou codium

Nano

nano

Vim

vim

Vi

vi

[global]
...
editor_for_packages=vim

Configurer WAPT pour utiliser un éditeur de code personnalisé

Sur Windows

Des éditeurs de code personnalisés peuvent être utilisés, par exemple Notepad++ ou PyCharm.

Utiliser un éditeur de texte personnalisé sous Windows

Nom de l’éditeur de code

editor_for_packages value

Notepad++

C:\Program Files\Notepad++\notepad++.exe setup_filename

PyCharm

C:\Program Files\JetBrains\PyCharm Community Edition 2019.3.2\bin\pycharm64.exe wapt_sources_dir

[global]
...
editor_for_packages=C:\Program Files\Notepad++\notepad++.exe {setup_filename}

Sur Linux / macOS

Des éditeurs de code personnalisés peuvent être utilisés, par exemple PyCharm.

Utiliser un éditeur de texte personnalisé sur linux / macos

Nom de l’éditeur de code

editor_for_packages value

PyCharm

/opt/pycharm/bin/pycharm_x64 wapt_sources_dir

[global]
...
editor_for_packages=/opt/pycharm/bin/pycharm_x64 {wapt_sources_dir}

Arguments personnalisés

Les arguments peuvent être passés dans la commande editor_for_packages

Argument

Description

{setup_filename}

Lance l’éditeur de code personnalisé et édite le fichier WAPT setup.py

{control_filename}

Lance l’éditeur de code personnalisé et modifie le fichier control des paquets WAPT

{wapt_sources_dir}

Lance l’éditeur de code personnalisé et ouvre le dossier du paquet WAPT

{wapt_base_dir}

Lance l’éditeur de code personnalisé et ouvre le dossier d’installation WAPT