Attention : le support de WAPT 2.0 a pris fin le 30 juin 2022.

Merci de mettre à jour sur la version supportée la plus récente

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.

Structure détaillée d’un paquet WAPT

Un paquet WAPT est un fichier .zip contenant plusieurs élements:

Structure d'un paquet WAPT

Structure d’un paquet WAPT

  • un fichier setup.py;

  • un ou plusieurs fichier(s) binaire(s);

  • des fichiers supplémentaires optionnels;

  • un fichier control dans le dossier WAPT;

  • un fichier icon.png dans le dossier WAPT;

  • un fichier certificate.crt dans le dossier WAPT;

  • un fichier manifest.sha256 dans le dossier WAPT;

  • un fichier signature.sha256 dans le dossier WAPT;

  • un fichier wapt.psproj dans le dossier WAPT, ce fichier est utilisé pour stocket la configuration de PyScripter créé pour développer des paquets WAPT;

  • depuis WAPT 1.8, un dossier caché .vscode contenant un fichier launch.json et un fichier settings.json est utilisé pour stocker la configuration de VScode pour développer des paquets WAPT;

Le fichier control

Le fichier control est la carte d’identité du paquet.

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 des options du fichier control

Paramètres

Description

Example de valeur

paquet

Nom du paquet

tis-geogebra

version

La version du paquet, elle ne peut pas contenir plus de 5 délimiteurs, le dernier nombre est le numéro de version du paquet

5.0.309.0-1

architecture

Architecture du processeur

x64

section

Type de paquet (host, group, base)

base

priorité

Ordre de priorité d’installation du paquet (optionnel)

Non utilisable pour le moment

maintainer

L’auteur du paquet

Arnold Schwarzenegger <terminator@mydomain.lan>

description

La description du paquet qui apparaîtra dans la console et sur l’interface web

La Calculatrice Graphique pour les Fonctions, la Géométrie, l’Algèbre, le Calcul, les Statisques et la 3D

description_fr

La description avec la langue localisée du paquet

Calculatrice graphique

depends

Les paquets qui doivent être installés avant l’installation du paquet

tis-java

conflicts

Les paquets qui doivent être désinstallés avant l’installation du paquet

tis-graph

maturity

Niveau de Maturité (BETA, DEV, PROD)

PROD

locale

La langue de l’environnement pour le paquet

fr,en,es

target_os

Les Système d’exploitation compatibles avec le paquet

windows,mac,linux

min_os_version

La version minimale de Windows pour que la paquet soit vu par l’agent WAPT

6.0

max_os_version

La version maximale de Windows pour que la paquet soit vu par l’agent WAPT

10.0

min_wapt_version

La version minimum de WAPT pour que la paquet fonctionne correctement

1.3.8

sources

Chemin vers l’emplacement SVN du paquet (source command)

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

installed_size

Espace disque libre minimum requis pour l’installation du paquet

254251008

impacted_process

Indique une liste de processus impactés lors de l’installation d’un paquet

firefox.exe

audit_schedule

La périodicité de l’exécution de la fonction d’audit dans le paquet WAPT

60

editor

L’éditeur du logiciel contenu dans le paquet

Mozilla

license

Référence de la licence du logiciel

GPLV3

keywords

Ensemble de mots-clé décrivant le paquet WAPT

Productivité,Traitement de texte

homepage

Si officiel du logiciel contenu dans le paquet WAPT

https://www.tranquil.it/

signer

Le CommonName (CN) (I.E: nom commun) du signataire du paquet

Tranquil IT

signer_fingerprint

L’emprunte du propriétaire du certificat

2BAFAF007C174A3B00F12E9CA1E74956

signature

Le hash en SHA256 du paquet

MLOzLiz0qCHN5fChdylnvXUZ8xNJj4rEu5FAAsDTdEtQ(…)hsduxGRJpN1wLEjGRaMLBlod/p8w==

signature_date

Date à laquelle le paquet a été signé

20180307-230413

signed_attributes

Liste des attributs des paquets qui sont signés

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

Si le fichier control contient des caractères spéciaux, le fichier control doit être sauvegardé en format UTF-8 (No BOM).

PyScripter - UTF-8 (No BOM)

PyScripter - UTF-8 (No BOM)

Champ détails

paquet

Le nom du paquet WAPT, sans aucun accent, ni espace, ni aucun caractère spécial ou caractère en majuscule.

version

Il est préférable de toujours commencer avec la version du logiciel (numéro uniquement) séparé par des points (.) et terminant par la version du paquet WAPT séparé par un tiret (-).

architecture

Nouveau dans la version 1.5.

Définit où les paquets peuvent être installés; sur des postes équippés de processeurs en x64 ou x32.

Note

Un paquet en x64 sera invisible pour un agent WAPT installé sur une machine en x86.

Les valeurs autorisées:

  • x86: le paquet est fait des ordinateurs en 32bits;

  • x64: le paquet est fait des ordinateurs en 64bits;

  • all: le paquet est fait des ordinateurs en 64bits ou 32bits;

section

  • host: paquet hôte;

  • group: Paquet groupe;

  • base: Paquet base;

  • unit: Paquet OU;

priority

Cette option n’est actuellement pas supporté pour l’instant. Ce champ sera utilisé pour définir la priorité d’installation d’un paquet. Cette fonctionnalité sera utile pour définir des mises à jour de sécurité obligatoires.

maintainer

Définit le créateur du paquet WAPT.

Note

Définir l’adresse mail du créateur du paquet peut être utile.

Utilisez le format Prénom NOM <email@exemple.com>.

description

Décrit la fonctionnalité du paquet qui apparaîtra dans la console et sur l’interface web en local sur le http://127.0.0.1:8088.

Indication

Ajouter un champ description_fr ou description_es vous permet de faire un paquet dont la descritpion est internationale. Si la langue n’existe pas, l’agent WAPT va utiliser la langue qui est par défaut.

depends

Définit si des paquets doivent être installés avant, par exemple, tis-java est une dépendance pour que le paquet LibreOffice, il doit être installé avant.

Plusieurs dépendances peuvent être définies en les séprant par des virgules (,).

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

conflicts

Fonctionne de manière opposé à depends.

Les conflits définissent un/des paquet(s) qui doivent être désinstallés avant d’installer un paquet, par exemple tis-firefox doit être désinstallé avant que le paquet tis-firefox-esr le soit, ou OpenOffice doit être supprimé avant que LibreOffice soit installé.

Plusieurs conflits peuvent être définis en les séprant par des virgules (,).

conflicts: tis-firefox

maturity

Définit la maturité d’un paquet.

Par défaut, les agents WAPT verront des paquet marqués comme PROD et des paquets avec un maturité vide.

Pour qu’un poste puisse voir des paquets avec des niveaux de maturités différents, vous devrez configurer l’attribut maturities dans le wapt-get-ini de l’agent WAPT.

locale

Définit la langue du paquet WAPT.

Un agent WAPT verra par défaut des paquets qui sont configurés pour son language d’environnement ainsi que les paquets sans langues spécifiées.

Pour qu’un ordinateur voit un paquet dans une autre langue, vous devrez configurer les locales dans le wapt-get.ini de l’agent WAPT.

locales = fr,en,es

La langue remplie dans le champ doit être au format ISO 639-1.

target_os

Définit le Système d’exploitation du paquet.

Un agent WAPT verra par défaut les paquets qui sont configurés pour son système d’exploitation et les paquets sans système d’exploitation spécifié.

Depuis la version 1.8 le champ target_os peut soit être windows, macos, linux ou laissé vide.

min_os_version

Pour un target_os windows, ce champ définit la Version du Système d’Exploitation de Windows minimale. Par exemple, cet attribut peut être utilsé pour éviter d’installer sur un WindowsXP des paquets qui ne fonctionnent que sur Windows7 et Plus.

Depuis la version 1.8, il peut aussi définir la version minimum de Mac OS.Nous vous recommandons de ne pas l’utiliser avec Linux car il y a plusieurs distributions différentes.

max_os_version

Pour un target_os windows, ce champ définit la Version du Système d’Exploitation de Windows maximale. Par exemple, cet attribut peut être utilsé pour installer sur un Windows7 et Plus des paquets qui ne sont plus supportés sur des WindowsXP.

Depuis la version 1.8, il peut aussi définir la version minimum de Mac OS.Nous vous recommandons de ne pas l’utiliser avec Linux car il y a plusieurs distributions différentes.

min_wapt_version

La version minimum de WAPT pour installer un paquet

Note

Les fonctionnalités de WAPT évoluant, certaines fonctions que vous êtes susceptible d’avoir utilsé dans de vieux paquets deviennent obsolete avec de nouvelles version d’agents WAPT.

sources

Définit un dépôt SVN, par exemple:

Cette méthode permet de versionner un paquet de travailler collaborativement dessus.

Indication

Le versionnage de paquet est particulièrement utile lorsque plusieurs personnes créent des paquets de manière collaboratif. Cette fonction est aussi utile pour tracer l’historique d’un paquet si vous êtes sujet à des Régulations dans votre entreprise.

installed_size

Définit l’espace ldisque libre minimum requis pour installer le paquet.

installed_size: 254251008

Le test d’espace disque disponible est fait sur le dossier C:\Program Files.

La valeur définie dans installed_size doit être en bytes.

Indication

Pour convertir les valeurs de stockage en bytes, visitez https://bit-calculator.com/.

impacted_process

Indique les processus qui sont impactés lors de l’installation d’un paquet.

Exemple :

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

Ce champ est utilisé par la fonction install_msi_if_needed et install_exe_if_needed si killbefore n’a pas été rempli.

impacted_process est aussi utilisé lors de la désinstallation du paquet. Cela permet de fermer l’application si l’application tourne avant d’être désinstallé.

audit_schedule

Périodicité d’exécution des contrôles de l’audit.

audit_schedule : 60

La périodicité 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) ;

editor

Nouveau dans la version 1.6.

L’éditeur logiciel du binaire inclus dans le paquet base.

editor: Mozilla

Les valeurs peuvent être utilisées comme filtres dans la console WAPT ainsi que le self-service.

keywords

Nouveau dans la version 1.6.

Liste de mot-clé pour catégoriser le paquet WAPT.

keywords: office

Les valeurs peuvent être utilisées comme filtres dans la console WAPT ainsi que le self-service.

license

Nouveau dans la version 1.6.

Fait référence à la licence des binaires du logiciel contenus dans le paquet.

license : GPLV3

Les valeurs peuvent être utilisées comme filtres dans la console WAPT ainsi que le self-service.

homepage

Nouveau dans la version 1.6.

Site officiel des binaires du logiciel dans le paquet WAPT.

homepage : https://wapt.fr

Les valeurs peuvent être utilisées comme filtres dans la console WAPT ainsi que le self-service.

signer

Automatiquement complété durant la signature du paquet.

le CN du certificat. Habituellement, c’est le nom complet du signataire.

signer_fingerprint

Automatiquement complété durant la signature du paquet.

Emprunte de la clé privée du signataire du paquet.

signature

Automatiquement complété durant la signature du paquet.

Signature des attributs dans le paquet.

signature_date

Automatiquement complété durant la signature du paquet.

Date à laquelle les attributs du paquet ont été signés.

signed_attributes

Automatiquement complété durant la signature du paquet.

Liste des attributs signés dans le paquet.

Le fichier setup.py

import setuphelpers

Cette ligne se trouve au début de chaque paquet WAPT qui embarque un setup.py:

from setuphelpers import *

Le paquet import toutes les fonctions du setuphelpers.

Le Setuphelpers est une librairie WAPT qui offre un ensemble de méthodes afin de dévleopper plus facilement des paquets entièrement fonctionnels.

uninstallkey list

Nous trouvons alors:

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

Ici, nous associons une list de uninstall keys (clé de désinstallation) au paquet. Lorsqu’un paquet est supprimé, l’agent WAPT va regarder l”uninstallkey contenu dans la base de registre assoiciée au paquet. Cette uninstallkey va indiquer à WAPT les actions à lancer avant de supprimer le logiciel.

Même s’il n’y a pas d”uninstallkey pour un logiciel, il est nécessaire de déclarer une liste uninstallkey vide:

uninstallkey = []

Fonction install()

Viens alors la déclaration des fonctions dans setup.py.

C’est la recette du paquet WAPT, l’ensemble d’instruction qui sera exécuté.

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

Le fichier wapt.psproj

Le fichier wapt.psproj est le projet du paquet qui se trouve dans le dossier WAPT.

C’est le fichier de projet de PyScripter pour le paquet WAPT.

Pour éditer le paquet avec PyScripter, ouvrez juste le fichier.

Le fichier icon.png

Le fichier icône icon.png est situé dans le dossier WAPT.

Il associe une icône au paquet.

Cette icône apparaîtra sur l’interface web locale ou le WAPT self-service (http://127.0.0.1:8088).

Indication

L’icône doit être un fichier 48px par 48px.

Le fichier manifest.sha256

Le fichier manifeste manifest.sha256 est situé dans le dossier WAPT.

Il contient l’empreinte en sha256 de tous les fichiers du paquet WAPT.

Le fichier signature

Le fichier signature est situé dans le dossier WAPT.

Il contient la signature du fichier manifest.sha256.

Lorsqu’un paquet s’installe, wapt-get vérifie:

  • que la signature du manifest.sha256 corresponde à l’actuel fichier manifest.sha256 (l’agent va vérifier les certificats publics dans C:\Program Files (x86)\wapt\ssl sur Windows et /opt/wapt/ssl sur Linux et MacOS);

  • que l’empreinte sha256 de chaque fichier est identique à l’empreinte dans le fichier manifest.sha256;

Autres fichiers

D’autres fichiers peuvent être embarqués dans le paquet WAPT. Par exemple:

  • un installeur en plus de votre fichier setup.py pouvant être appelé dans votre setup.py;

  • un fichier de réponse à passer à l’installeur du logiciel;

  • un fichier de licence;

De Python 2 à Python3

Attention

Avec WAPT 2.0, le fonctionnement interne de WAPT est passé à python3. Les paquets WAPT doivent aussi suivre la nouvelle syntaxe python3.

The principal syntax differences

Syntaxe

Python 2

Python 3

print

print'Hello'

print('Hello')

unicode string

ur

r

opérateurs

<> <=> !=

!=

Acces à la base de registre Windows

_winreg

winreg

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

Pré-requis

Attention

  • It is required to be a Local Administrator of the machine to use WAPT’s integrated environment for developing WAPT packages.

  • We advise you to create/ edit packages in a fully controlled environment that is safe and disposable.

  • The usage of a disposable virtual machine (like Virtualbox) is recommended.

  • Import the tis-pyscripter package in your local repository and install it on your development computer.

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 ;

  • ordinateurs portables;

Indication

When possible, RC and Beta version of Operating Systems should be tested.

L’état des mises à jour Windows

  • Microsoft Windows host without any Windows update installed: the objective is to detect Windows updates that are required for the software to work properly and to adapt the WAPT package accordingly;

  • Microsoft Windows host with all the latest Windows updates: the objective is to detect Windows updates that break the package and to adapt the WAPT package accordingly;

Etat des installations des logiciels

  • Hosts with many installed packages: the objective is to detect a possible dependency with an existing application;

  • Hosts with many installed packages: the objective is to detect a possible conflict with an existing application;

  • 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 ;

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

  • Download 7-zip MSI x64.

  • Create a WAPT package Template from the installer.

    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 - WAPT console window for creating a package template

    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.

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

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

  • Two solutions are available:

    • Click on Make and edit …. (recommended) to verify the WAPT package and customize it to your Organization’s specific needs.

    • Click on Build and upload to directly build and upload the package into your private repository.

    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.

    However, the first method that consists of first testing locally the package before uploading is the recommended method.

Customizing the package before uploading it to your repository

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 - Renseignements nécésssaires pour la création du paquet

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

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

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 - Customizing a package with PyScripter

Presentation of PyScripter

L’explorateur de projets PyScripter

PyScripter - Explorateur de projets PyScripter

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 - Commandes Run dans l'explorateur de projets PyScripter

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 - zone d'édition de PyScripter

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 - console python de 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.

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

Running an install command from the PyScripter console

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

Running a remove command from the PyScripter console

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.

Edit the control file (architecture, impacted_process, target_os, description, maintainer …). For more information, visit the documentation on the control file structure.

Your PyScripter opens, go to your 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')
  • The function will test whether a version of the software is already installed on the host using the uninstall key.

  • If the uninstall key is already present, the new version of the software will be installed only if the installed version is older.

  • After the installation, the function will finally test that the uninstall key is present and its version, to ascertain that all went well.

Liste des arguments disponibles avec install_exe_if_need

Paramètres

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

Vidéo de démonstration

Packager des .exe (exemple)

  • Download the .exe installer from a reliable source.

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

  • Look up documentation relating to silent flags:

  • Then generate your package template, please refer to the documentation for creating packages from the WAPT console. PyScripter loads up and opens the .exe package project.

    PyScripter affichant le fichier *control*

    PyScripter affichant le fichier control

  • Edit the control file (architecture, impacted_process, target_os, description, maintainer …). For more information, visit the documentation on the control file structure.

  • Check the control file content. Mozilla Firefox-ESR does not comply to industry standards and returns an erroneous version number (it appears to be the installer packaging software version number).

    • Original control file.

      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  : 
      
    • Modified control file.

      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

    A sub-version -1 has been appended to the software version number; it is the packaging version of the WAPT package.

    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 :

  • The function requires to pass the silent flag as an argument.

  • The function requires to pass the uninstall key as an argument.

# -*- 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ètres

Valeur par défaut

Description

exe

Name of the .exe file to execute.

silentflags

Silent parameters to pass as arguments to the installer.

key

None

Software uninstall key.

min_version

None

Minimal version above which the software will update.

killbefore

[ ]

List of programs to kill before installing the package.

accept_returncodes

[0,3010]

Accepted codes other than 0 and 3010 returned by the function.

timeout

300

Maximum installation wait time (in seconds).

get_version

None

Value passed as parameter to control the version number instead of the value returned by the installed_softwares function.

remove_old_version

False

Automatically removes an older version of a software whose uninstallkey is identical

force

False

Forces the installation of the software even though the same uninstallkey has been found

Le paquet aura alors ce comportement :

  • Firefox will install only if Firefox is not yet installed or if the installed version of Firefox is less than 45.5.0, unless the --force option is passed as argument when installing the package.

  • On installing, the running firefox.exe processes will be killed (with the value indicated in impacted_process of the control file).

  • The function will add by itself the uninstall key, so leave the uninstall key argument empty.

  • When finishing the installation of the package, the function will check that the uninstall key is present on the machine and that the version of Firefox is greater than 45.5.0; if this not the case, the package will be flagged as 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.

Récupérer une clé de désinstallation depuis la 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 :

Testing the uninstallation

Testing 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 …

Vidéo de démonstration

Packaging empty packages

À faire

gsegat

Construire le paquet et l’envoyer au serveur WAPT

  • Once the package is ready, build it and send it to the WAPT server.

Option "build-upload in waptconsole"

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

  • Select the package in the c:\waptdev folder.

_images/build-upload-console-select-folder.PNG
  • Confirm the selected package.

_images/build-upload-console-confirm.PNG

You have just uploaded your first wapt package.

Avertissement

Once your package has uploaded, refresh the package list using the Refresh packages list button or by pressing F5 on your keyboard.

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 du setuphelper 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 supprimer des raccourcis

La commande mkdirs

mkdirs('C:\\test')

… crée le répertoire C:\test.

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:\tmp\target.

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

Vérifier si un chemin est un fichier ou un dossier

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

Vérifier 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 dossier

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

Vérifier l’existence d’une clé 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

Afficher la valeur d’une clé de registre

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

Modifier la valeur d’une clé de registre

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

Un raccourci simple

À faire

gsegat

Un raccourci dans le menu démarrer

À faire

gsegat

Créer et supprimer des raccourcis

À faire

gsegat

créer un raccourci personnalisé sur le bureau de l’utilisateur en cours

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

supprimer des raccourcis

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 :

  • Modify your setup.py and use the function like this.

    # -*- 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 you restart the installation from pyscripter, you will notice that the « all users » desktop shortcut has disappeared.

Créer un raccourci personnalisé sur le bureau de l’utilisateur en cours

créer un raccourci personnalisé sur le bureau de l’utilisateur en cours

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

supprimer un raccourci personnalisé sur le bureau de l’utilisateur en cours

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

Environnement Windows / Logiciel / Services

Vérifier la version de Windows

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.

Vérifier si l’architecture est en 64bits

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

La variable Program Files

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

La variable AppData

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

Désactiver temporairement le redirecteur wow3264

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

Récupérer l’utilisateur courant

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

Récupérer le nom de l’ordinateur

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

Récupérer le nom de domaine

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

Les actions sur les logiciels installés

Vérifier les logiciels installés

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

Récupérer la commande de désinstallation avec le registre

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

Désinstaller des logiciels

for soft in installed_softwares('winscp3'):
    if Version(soft['version']) < Version('5.0.2'):
        run(WAPT.uninstall_cmd(soft['key']))
  • For each item of the list return by installed_softwares containing keyword winscp.

  • If the version is lower than 5.0.2.

  • Then uninstall using the uninstall_cmd and specifying the corresponding 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

Tuer des tâches

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

Il est possible d’utiliser les informatoins du fichier control dans le setup.py

Récupérer la version du paquet

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.

Récupérer le nom du logiciel

À faire

Get software name (gsegat)

Managing a WAPT package with 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 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 :

  • To search unwanted version of Firefox we will use the installed_softwares function. This function returns a dictionary list containing the software properties:

    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
          }
    ]
    
  • Check the name of each software.

    for uninstall in installed_softwares('Mozilla Firefox'):
        print(uninstall['name'])
    
  • Show the name of each software found.

    for uninstall in installed_softwares('Mozilla Firefox'):
        if not 'ESR' in uninstall['name']
            print(uninstall['name'])
    
  • Show the name of each software found which does not include the string ESR in its name and its uninstallkey.

    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 accepts an uninstall key as an argument and will send the command to run to start the silent uninstall.

    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)
    
  • Start the uninstallation.

    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)
    

We can also uninstall the Mozilla maintenance service:

for uninstall in installed_softwares('MozillaMaintenanceService'):
    run(uninstall_cmd(uninstall['key']))
  • Finally, modify your 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 :

  • Creating user desktop shortcut with specific arguments.

  • Making changes to user Windows registry keys.

  • Making changes to files, to browser settings of the user.

  • Configuring shortcuts to the Organization’s set of templates for Documents, Spreadsheets or Presentations in Office Suites to encourage or insure that editorial and graphical guidelines are followed.

  • Setting up the user’s email or instant messaging from the Organization’s main user data repository (LDAP directory, database, etc).

  • Customizing an office suite or business software based on the Organization’s main user data repository (LDAP directory, database, 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é.

Les principes du session_setup

The WAPT session_setup function is executed for each user using:

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")
  • Now start the session-setup directly from pyscripter.

    PyScripter - running session-setup

    PyScripter - running session-setup

  • Finally, check that the icon is present on the desktop.

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 :

  • Regularly check the list of local administrators on the desktops.

  • Ascertain over time the correct configuration of a critical software.

  • Regularly check the presence of the correct version of a piece of software.

  • Ascertain the security settings of a workstation.

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

The audit tasks are launched once after every upgrade, then regularly as defined by the audit_schedule attribute.

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

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

In this example, we are improving the Firefox package previously studied in this documentation.

  • Add the audit function in the 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"
    
  • Start the audit from pyscripter.

    PyScripter - Running an audit

    PyScripter - Running an audit

  • Test with the file then delete the C:\Program Files\Mozilla Firefox\distribution\policies.json file and test again with pyscripter.

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

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

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 :

  • An integer (in minutes).

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

Comportement par défaut de la fonction d’audit

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 :

  • Fetch online the latest version of the software.

  • Download the latest version of the software binaries.

  • Remove old versions of the software binaries.

  • Update the version number of the software in the control file.

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 - Running an 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 :

  • Create the folder for the software in C:\Program Files (x86).

  • Copy the software in that folder.

  • Create the shortcut to the application.

  • Manage the uninstallation process for the application.

  • Close the application if it’s running.

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.

  • Download KB4522355 MSU package from Microsoft Catalog website.

  • Create a WAPT package template from the downloaded .msu file. In the WAPT console, click on Tools ‣ Package Wizard.

    PyScripter - WAPT console window for creating a package template

    PyScripter - WAPT console window for creating a package template

  • Select the downloaded .msu package and fill in the required fields.

    Informations requises pour la création du paquet MSU

    Informations requises pour la création du paquet MSU

  • Click on Make and edit (recommended) to launch package customization.

  • WAPT package IDE is launched using the source code from the pre-defined .msu template.

  • As usual with WAPT packages, test, then build, then sign, then upload and finally affect the desired WAPT packages to your selected hosts and it is done!!

  • If the KB becomes bundled with the following Patch Tuesday, you can select the hosts onto which the package has been applied and forget the KB package on the hosts.

Packager des paquets linux simples

Avant de commencer, nous supposons plusieurs conditions :

  • You have a graphical interface on your Linux system that you use for developing and testing packages.

  • You have installed the vscode package from the Tranquil IT repository.

  • Your user is named linuxuser and is a member of the sudoers group.

Créer un modèle de paquet base depuis votre poste linux

  • Start up a Command Line utility.

  • As linuxuser, create a WAPT package template.

    wapt-get make-template <template_name>
    

    Avertissement

    Do not launch this command as root or with a 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

    All packages are stored in linuxuser’s home (home of the currently logged in user).

VSCode se charge et ouvre le projet de paquet.

Ouverture du VSCode avec le focus sur le fichier *setup*

Ouverture du VSCode avec le focus sur le fichier setup

  • Check the control file content.

    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.

    • Original control file.

      package           : tis-vlc
      version           : 0-0
      architecture      : all
      section           : base
      priority          : optional
      maintainer        : user
      description       : automatic package for vlc
      
    • Modified control file.

      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.

  • Make changes to the code in the setup.py file accordingly.

    :emphasize-lines: 8
    # -*- coding: utf-8 -*-
    from setuphelpers import *
    
    uninstallkey = []
    
    def install():
        apt_install('vlc')
    
  • Save the package.

Gérer la désinstallation

  • Make changes to the setup.py file with an uninstall.

def uninstall():
apt_remove('vlc')
  • Launch a remove from VSCode Run Configurations.

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

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

  • Check that the software has been correctly removed.

    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

  • Make changes to the setup.py file with a 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)
    
  • Launch a session-setup from VSCode Run Configurations.

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

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

Construire et téléverser le paquet

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.

Quel est l’intérêt de faire cela ?

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.

  • The certificate is sent to the server with the inventory when the WAPT client is first registered.

  • The private key is kept by the agent and is only readable locally by Local Administrators.

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.With this mode of operation, the WAPT server and secondary repositories have no knowledge of the sensitive data.

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.You will find here an example of a WAPT package where we encrypt a string of text in an update_package function and then decrypt this text in the install function.

Le texte chiffré pour chaque machine est ensuite stocké dans un fichier encrypt-txt.json à la racine du paquet.In this example, the update_package function allows us to browse the WAPT server database to retrieve the certificate from each machine and then encrypt the sensitive text with it.

Lors de l’installation du paquet, l’agent WAPT prendra le texte chiffré et le déchiffrera avec sa clé privé.The encrypted text for each machine is then stored in a encrypt-txt.json file at the root of the package.

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

def install():
    encryptlist = json.loads(open('encrypt-txt.json','r').read())
    if WAPT.host_uuid in encryptlist:
        host_key = WAPT.get_host_key()
        v = base64.b64decode(encryptlist[WAPT.host_uuid])
        encrypttxt = host_key.decrypt(v).decode('utf-8')
        print(r"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 = input("Enter the text to be encrypted: ")
    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']] = base64.b64encode(host_cert.encrypt(encrypttxt.encode('utf-8'))).decode('utf-8')
            print(value['computer_fqdn'] + ':' + value['uuid'] + ':' + encryptlist[value['uuid']])
    open('encrypt-txt.json','w').write(json.dumps(encryptlist))

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 des IDE différents pour développer les paquet 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