1. Créer des paquets WAPT¶
1.1. Créer son environnement de développement de paquets WAPT¶
1.1.1. 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 environnement maîtrisé, sain et jetable.
L’utilisation d’une machine virtuelle autonome (type Virtualbox ou équivalent) est vivement recommandée.
Importer le paquet tis-waptdev dans votre dépôt local et l’installer sur votre machine de développement.
1.1.2. Préconisations concernant l’environnement 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 environnements afin qu’il devienne le plus abouti possible en régime de test, avant d’être basculé en production.
1.1.3. Démarche de test¶
1.1.3.1. Systèmes d’exploitation et architectures¶
Windows XP ;
Windows 7 ;
Windows 10 ;
Windows Serveur 2008 R2 ;
Windows Serveur 2012 ;
x86 ;
x64 ;
Machine physique et virtuelle ;
Des ordinateurs portables.
On testera si possible les versions RC / Beta des OS si elles sont disponibles (exemple : Windows 10 Creators Update).
1.1.3.2. L’état des mises à jour Windows¶
Un 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 ;
Un 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 ;
1.1.3.3. État des installations des logiciels¶
Un poste avec peu de logiciels déjà installés : l’objectif est de détecter une dépendance possible à Java ou autre framework applicatif ;
Les postes 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 ;
1.2. Les principes de création d’un paquet WAPT à partir d’un modèle depuis la console¶
Attention
Pour créer des paquets à partir de la console, il faut d’abord avoir installé l’environnement de développement WAPT tis-pyscripter3. Il n’est PAS recommandé d’utiliser tis-pyscripter4.
Nous vous recommandons de télécharger le paquet waptdev et de l’installer sur votre ordinateur où vous créerez les paquets WAPT.
Si vous ne savez plus comment télécharger un paquet depuis le store Tranquil IT, veuillez consulter comment télécharger un paquet dans votre dépôt privé.
Si vous ne savez plus comment installer un paquet, veuillez consulter comment installer un paquet sur un hôte.
1.2.1. Créer un paquet WAPT depuis la Console WAPT¶
Dans cet exemple, l’installeur de 7zip est utilisé au format MSI.
Créer le modèle de paquet depuis l’installeur.
Dans la Console WAPT, cliquer sur
: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.
Deux solutions sont proposées :
Cliquer sur Créer et éditer (recommandée) pour lancer la personnalisation du paquet et l’adapter aux besoin spécifique de votre Organisation.
Cliquer sur Créer et Téléverser 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.
1.2.2. Personnaliser le paquet avant de le téléverser dans votre dépôt¶
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.
L’IDE PyScripter se lance et permet d’éditer les fichiers du paquet.
1.2.3. Présentation de PyScripter¶
1.2.3.1. L’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
.
1.2.3.2. Run Configurations¶
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.
1.2.3.3. Zone d’édition¶
La Zone d’édition de PyScripter permet d’éditer le fichier setup.py
ainsi que le fichier control
.
1.2.3.4. Console Python¶
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
.
Pour en savoir plus sur la composition d’un paquet WAPT, consultez la documentation sur la structure détaillée d’un paquet.
1.2.3.5. Tester localement l’installation du paquet WAPT¶
Vous pouvez ensuite tester le lancement d’une installation sur votre station de développement.
La Console PyScripter vous permet de vérifier si l’installation s’est bien déroulée.
1.2.3.6. Tester localement la désinstallation du paquet WAPT¶
Vous pouvez ensuite tester le lancement d’une installation sur votre station de développement.
La Console PyScripter vous permet de vérifier si l’installation s’est bien déroulée.
1.3. Créer vos premiers paquets WAPT¶
1.3.1. Packager des .msi (exemple)¶
Pour cet exemple, nous prendrons tightvnc.
Vous pouvez le télécharger ici.
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 du fichier 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 plus ancienne.
Après installation, la fonction testera finalement la présence de la clé de désinstallation et sa version pour vérifier que tout s’est bien passé.
Options (Option par défaut) |
Description |
---|---|
|
Définit la version minimale au dessus de laquelle le logiciel se mettra à jour. |
|
Liste des programmes à tuer avant de lancer l’installation. |
|
Définit les codes de retour autres que 0 ou 3010 acceptés en retour par la fonction. |
|
Définit la durée d’attente maximale d’installation (en secondes). |
|
Définit les propriétés supplémentaires à passer en argument au MSI pour l’installation. |
|
Définit la valeur passée en paramètre pour le contrôle de version au lieu de celle retournée par la fonction installed_softwares. |
|
Supprime automatiquement une ancienne version d’un logiciel dont la clé de désinstallation est identique. |
|
Force l’installation du logiciel même si une clé de désinstallation avec une version identique est trouvée. |
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
.
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)
1.3.1.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,
'ADDLOCAL': 'Server,Viewer'
}
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')
1.3.1.2. Vidéo de démonstration¶
1.3.2. Packager des .exe (exemple)¶
Télécharger l’installateur .exe à partir d’une source fiable.
Télécharger 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 :
Sur le site de la Fondation Mozilla .
Autres méthodes pour récupérer le flag silencieux :
Dépôt de paquets WPKG ;
Recherche Internet avec le terme Firefox silent install.
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.
Editer 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 contenu du 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
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")
Options (Option par défaut) |
Description |
---|---|
|
Paramètres silencieux à passer en argument à l’installeur. |
|
Clé de désinstallation du programme. |
|
Définit la version minimale au dessus de laquelle le logiciel se mettra à jour. |
|
Liste des programmes à tuer avant de lancer l’installation. |
|
Définit les codes de retour autres que 0 ou 3010 acceptés en retour par la fonction. |
|
Définit la durée d’attente maximale d’installation (en secondes). |
|
Définit la valeur passée en paramètre pour le contrôle de version au lieu de celle retournée par la fonction installed_softwares. |
|
Supprime automatiquement une ancienne version d’un logiciel dont la clé de désinstallation est identique. |
|
Force l’installation du logiciel même si une clé de désinstallation 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.A l’installation, les processus firefox.exe en cours d’exécution seront tués (avec la valeur indiquée dans
impacted_process
du fichiercontrol
).La fonction ajoutera elle-même la clé de désinstallation, donc laisser l’argument clé de désinstallation vide.
A la fin de l’installation, la fonction ira vérifier si la clé de désinstallation 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 ERREUR.
1.3.2.1. 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.
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.
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.
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 :
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.
1.3.2.2. 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 …
1.3.2.3. Vidéo de démonstration¶
1.3.3. Packager des paquets linux simples¶
1.3.4. 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.
Sélectionner le paquet dans le dossier
c:\waptdev
.
Confirmer le paquet sélectionné.
Vous venez de charger votre premier paquet wapt.
Avertissement
Une fois que votre paquet est téléversé, rafraîchissez la liste des paquets en utilisant le bouton Actualiser les paquets disponibles ou en appuyant sur la touche F5 de votre clavier.
1.3.4.1. 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>`_.
2. Comment coder les paquets WAPT¶
2.1. 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.
2.1.1. Tests et manipulation de dossiers et fichiers¶
2.1.1.1. Créer un chemin avec récursion¶
La commande makepath fabrique la variable pour le chemin C:\Program Files (x86)\Mozilla\Firefox
.
makepath(programfiles,'Mozilla','Firefox')
2.1.1.2. Créer et supprimer des répertoires¶
La commande mkdirs crée le répertoire C:\test
.
mkdirs('C:\\test')
La commande remove_tree détruit le répertoire C:\tmp\target
.
remove_tree(r'C:\tmp\target')
2.1.1.3. Vérifier si un chemin est un fichier ou un dossier¶
La commande isdir vérifie que C:\Program Files (x86)\software
est un répertoire.
isdir(makepath(programfiles32,'software')):
print('The directory exists')
La commande isfile vérifie que C:\Program Files (x86)\software\file
est un fichier.
isfile(makepath(programfiles32,'software','file')):
print('file exist')
2.1.1.4. Vérifier si un répertoire est vide¶
La commande dir_is_empty vérifie que le répertoire C:\Program Files (x86)\software
est vide.
dir_is_empty(makepath(programfiles32,'software')):
print('dir is empty')
2.1.1.5. Copier un fichier¶
La commande filecopyto copie le fichier file.txt
dans le répertoire C:\Program Files (x86)\software
.
filecopyto('file.txt',makepath(programfiles32,'software'))
2.1.1.6. Copier un dossier¶
La commande copytree2 copie le dossier sources
dans le répertoire C:\projet
.
copytree2('sources','C:\\projet')
2.1.2. Manipulation de clés de registre¶
2.1.2.1. Vérifier l’existence d’une clé de registre¶
La commande registry_readstring vérifie si la clé de registre {8A69D345-D564-463c-AFF1-A69D9E530F96} existe dans le chemin de registre SOFTWARE\Google\Update\Clients
de HKEY_LOCAL_MACHINE.
if registry_readstring(HKEY_LOCAL_MACHINE, "SOFTWARE\\Google\\Update\\Clients\\{8A69D345-D564-463c-AFF1-A69D9E530F96}", 'pv'):
print('key exist')
2.1.2.2. Afficher la valeur d’une clé de registre¶
La commande registry_readstring lit la valeur {8A69D345-D564-463c-AFF1-A69D9E530F96} stockée dans le chemin de registre SOFTWARE\Google\Update\Clients
de HKEY_LOCAL_MACHINE.
print(registry_readstring(HKEY_LOCAL_MACHINE, r'SOFTWARE\Google\Update\Clients\{8A69D345-D564-463c-AFF1-A69D9E530F96}', 'pv'))
2.1.2.3. Modifier la valeur d’une clé de registre¶
La commande registry_setstring modifie la valeur de la clé de registre TOUVersion stockée dans le chemin de registre SOFTWARE\Microsoft\Windows Live
de HKEY_CURRENT_USER.
registry_setstring(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows Live\\Common",'TOUVersion','16.0.0.0', type=REG_SZ)
2.1.3. Créer et supprimer des raccourcis¶
Avec WAPT setuphelper, il est possible de créer différents types de raccourcis.
2.1.3.1. Créer un raccourci du bureau pour tous les utilisateurs¶
La commande create_desktop_shortcut crée le raccourci Gestion de la Console WAPT dans le répertoire C:\Users\Public
pointant sur C:\Program Files (x86)\wapt\waptconsole.exe
; le raccourci est disponible pour tous les utilisateurs.
create_desktop_shortcut(r'WAPT Console Management',target=r'C:\Program Files (x86)\wapt\waptconsole.exe')
2.1.3.2. Supprimer un raccourci du bureau pour tous les utilisateurs¶
La commande remove_desktop_shortcut supprime le raccourci Gestion de la Console WAPT du dossier C:\Users\Public
; le raccourci est supprimé pour tous les utilisateurs.
remove_desktop_shortcut('WAPT Console Management')
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.
2.1.3.5. Créer un raccourci du bureau pour un utilisateur connecté¶
Indication
Ces fonctions sont utilisées avec le session_setup.
La commande create_user_desktop_shortcut crée le raccourci Gestion de la Console WAPT sur le bureau de l’utilisateur en pointant sur C:\Program Files (x86)\wapt\waptconsole.exe
.
create_user_desktop_shortcut(r'WAPT Console Management',target=r'C:\Program Files (x86)\wapt\waptconsole.exe')
2.1.3.6. Supprimer un raccourci du bureau pour un utilisateur connecté¶
La commande remove_user_desktop_shortcut supprime le raccourci Gestion de la Console WAPT du bureau de l’utilisateur connecté.
remove_user_desktop_shortcut('WAPT Console Management')
2.1.4. Manipulation des fichiers ini¶
2.1.4.1. Lire une valeur dans une section d’un fichier ini¶
La commande inifile_readstring lit une valeur à partir d’une clé et d’une section d’un fichier ini.
inifile_writestring("file.ini","global","key")
2.1.4.2. Écrire une valeur dans une section d’un fichier ini¶
La commande inifile_writestring modifie une valeur à partir d’une clé et d’une section d’un fichier ini.
inifile_writestring("file.ini","global","key","value")
2.1.4.3. Supprimer une clé dans une section d’un fichier ini¶
La commande inifile_deleteoption supprime une clé dans une section donnée d’un fichier ini.
inifile_deleteoption("file.ini","global","key")
2.1.4.4. Supprimer une section entière d’un fichier ini¶
La commande inifile_deletesection supprime une section d’un fichier ini et tout son contenu.
inifile_deletesection("file.ini","global")
2.1.5. Environnement Windows / Logiciel / Services¶
2.1.5.1. Récupérer la version d’un fichier¶
La commande get_file_properties affiche les propriétés du paquet WAPT.
get_file_properties(makepath(programfiles32,'InfraRecorder','infrarecorder.exe'))['ProductVersion']
2.1.5.2. Vérifier la version de Windows¶
La commande windows_version vérifie que la version de Windows est strictement inférieure à 6.2.0.
windows_version()<Version('6.2.0'):
Indication
Pour plus d’informations, vous pouvez consulter le site Microsoft Windows version number.
2.1.5.3. Vérifier l’architecture 64bits¶
La commande iswin64 vérifie que le processeur de la machine est 64bits.
if iswin64():
print('Pc x64')
else:
print('Pc not x64')
2.1.5.4. Vérifier la variable Program Files¶
programfiles ;
print(programfiles())
programfiles32 ;
print(programfiles32())
programfiles64 ;
print(programfiles64())
Chaque commande renvoie un emplacement de Fichier Programme différent.
Par exemple, la commande programfiles64 renvoie le répertoire natif de Program Files, par exemple C:\Program Files (x86)
sur l’architecture win64 ou win32 et programfiles() renverra le chemin du répertoire Program Files 32bit, par exemple. Programs Files (x86)
sur une architecture win64, et Programs Files
sur une architecture win32.
2.1.5.5. Vérifier la variable AppData¶
user_appdata / user_local_appdata
Indication
Ces fonctions sont utilisées avec le session_setup
La commande user_appdata renvoie le profil appdata itinérant de l’utilisateur courant (C:\Users\%username%\AppData\Roaming
).
print(user_appdata())
La commande user_local_appdata renvoie le profil appdata local de l’utilisateur courant (C:\Users\%username%\AppData\Local
).
print(user_local_appdata())
2.1.5.6. Désactiver temporairement la redirection de fichiers wow3264¶
La commande disable_file_system_redirection désactive la redirection wow3264 dans le contexte courant.
with disable_file_system_redirection():
filecopyto('file.txt',system32())
2.1.5.7. Obtenir l’utilisateur connecté actuel¶
La commande get_current_user affiche le nom d’utilisateur actuellement connecté.
print(get_current_user())
2.1.5.8. Obtenir le nom de l’ordinateur¶
La commande get_computername affiche le nom de la machine.
print(get_computername())
2.1.5.9. Obtenir le domaine AD auquel l’ordinateur est joint¶
La commande get_domain_fromregistry renvoie le nom de la machine avec le domaine.
get_domain_fromregistry()
2.1.6. Actions sur les logiciels installés¶
2.1.6.1. Vérifier les logiciels installés¶
La commande installed_softwares renvoie la liste des logiciels inscrits dans la base de registre machine sous forme de tableau.
installed_softwares('winscp')
[{'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}]
2.1.6.2. Récupérer la commande de désinstallation depuis le registre¶
La commande uninstall_cmd renvoie la commande de désinstallation silencieuse.
uninstall_cmd('winscp3_is1')
"C:\Program Files\WinSCP\unins000.exe" /SILENT
2.1.6.3. Désinstaller des logiciels¶
for soft in installed_softwares('winscp'):
if Version(soft['version']) < Version('5.9.2'):
run(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 clé de désinstallation.
2.1.6.4. Terminer des tâches¶
La commande killalltasks tue toutes les tâches portant le nom spécifié.
killalltasks('firefox')
2.1.7. Utiliser les champs du fichier control¶
Il est possible d’utiliser les informations du fichier control dans le setup.py
.
2.1.7.1. Récupérer la version du paquet¶
def setup():
print(control['version'])
La commande print(control['version']) affiche le champ version
du fichier control
du paquet WAPT.
def setup():
print(control['version'].split('-',1)[0])
La commande print(control['version'].split('-',1)[0]) affiche le numéro de version du fichier control
sans le numéro de version de WAPT.
2.1.7.2. Obtenir le nom de logiciels¶
À faire
documentation à venir
2.1.8. Gérer un paquet WAPT avec un autre paquet WAPT¶
2.1.8.1. Installer un paquet¶
WAPT.install('tis-scratch')
La commande install installe un paquet WAPT sur la machine sélectionnée.
2.1.8.2. Supprimer un paquet¶
WAPT.remove('tis-scratch')
La commande remove désinstalle un paquet WAPT sur la machine sélectionnée.
2.1.8.3. Créer des paquets WAPT¶
WAPT.forget_packages('tis-scratch')
La commande forget_packages informe l’Agent WAPT d’oublier un paquet WAPT sur la machine sélectionnée.
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
.2.2. Améliorer mon paquet¶
2.2.1. 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.
2.2.2. 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 de 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 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.
2.2.3. 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()
2.2.4. 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 instantanée ou le mail de l’utilisateur à partir d’un dépôt externe (annuaire, base de données, etc).
Paramétrer un logiciel bureautique ou métier à partir d’un dépôt 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é.
2.2.4.1. Les principes du session_setup¶
La fonction WAPT 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 courant a déjà été lancé précédemment.
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
2.2.4.2. 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
).
2.2.4.3. 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.Enfin, vérifier que l’icône est bien présente sur le bureau.
2.2.5. 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 dépôt 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 critique.
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.
2.2.5.1. 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 exécuter 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() :
Dans cet exemple, nous améliorons le paquet firefox précédemment étudié dans cette documentation.
Ajouter la fonction
audit
dans le fichiersetup.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.
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) :
L’audit restitue une des 3 valeurs suivantes :
OK ;
WARNING ;
ERREUR.
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.
2.2.5.2. 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éfaut, si audit_schedule
est vide, la tâche d’audit peut être lancée manuellement depuis la Console WAPT ou être lancée automatiquement si vous avez défini l’option waptaudit_task_period
dans le wapt-get.ini
de l’Agent WAPT. Pour plus d’informations sur la dernière méthode, veuillez consulter cette documentation.
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).
2.2.5.3. Comportement par défaut de la fonction d’audit¶
Par défaut, si aucun audit n’est déclaré, l’Agent WAPT vérifiera la présence des Clé de désinstallation dans le paquet WAPT.
De cette manière WAPT vérifie que le logiciel est toujours présent.
2.2.6. Utiliser les fonctions d’audit pour la conformité¶
Note
Cette fonctionnalité est disponible dans la version Entreprise.
La fonction audit_data
permet de faire des vérifications régulières des configurations de l’ordinateur et de centraliser les résultats de ces vérifications dans la Console WAPT. Il y a une historisation et vous pouvez crypter vos données et les décrypter avec votre certificat WAPT.
Vous pouvez par exemple :
Modifier un mot de passe d’administrateur, chiffrer des informations et les afficher dans la Console WAPT.
Vérifier régulièrement les modifications dont votre ordinateur a besoin comme l’inventaire CVE ou l’inventaire GLPI.
Vérifier régulièrement les configurations de sécurité d’un poste et les historiser.
La fonction
audit_data
est utilisable uniquement dans la fonctionaudit
.
2.2.6.1. Principe de fonctionnement¶
Les fonctions audit_data
sont lancées si elles sont définies dans la section def audit()
du fichier setup.py
.
Du côté serveur, les données d’audit sont stockées dans la table HostAuditData. Le contenu de cette table peut être interrogé à l’aide de l’onglet Reporting de la Console WAPT. Les données sont automatiquement purgées en fonction de leur date d’expiration. Lorsque le update_status()
est lancé, les données d’audit les plus récentes sont envoyées au Serveur WAPT.
Du côté client, les données d’audit sont stockées dans la base de données avec une date d’expiration (date_expiration) et le nombre maximum (max_count) des données stockées est défini dans le code.
Dans cet exemple, nous vérifions l’IP publique de l’ordinateur.
Ajouter la fonction
audit_data
à l’intérieur de la fonctionaudit
dans lesetup.py
.def audit(): ip = wgets('https://api.ipify.org',verify_cert=False) print(f'My public IP address is: {ip}') WAPT.write_audit_data_if_changed('Public IP','log for %s' % get_computername(),ip,max_count=5) return 'OK'
Voici les fonctions liées au audit_data
:
def write_audit_data_if_changed(self, section, key, value, ptype=None, value_date=None, expiration_date=None, max_count=2, keep_days=None): """Write data only if different from last one """ def write_audit_data(self, section, key, value, ptype=None, value_date=None, expiration_date=None, max_count=2, keep_days=None): """Stores in database a metrics, removes expired ones Args: section (str) key (str) value (any) value_date expiration_date (str) : expiration date of the new value max_count (int) : keep at most max_count value. remove oldest one. keep_days (int) : set the expiration date to now + keep_days days. override expiration_date arg if not None Returns: None """ def read_audit_data(self, section, key, default=None, ptype=None): """Retrieve the latest value associated with section/key from database""" def read_audit_data_set(self, section, key): """Retrieve all the values associated with section/key from database""" def delete_audit_data(self, section, key): def read_audit_data_since(self, last_query_date=None): """Retrieve all the values since a date from database"""
2.2.7. 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 beaucoup de temps lorsqu’il faut mettre à jour un paquet WAPT avec la version la plus récente d’un logiciel.
2.2.7.1. 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 le numéro de 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.
2.2.7.2. 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 :
Vous trouverez de nombreux exemples d”update_package qui vous inspireront dans les paquets du store de Tranquil IT.
2.2.8. Exemple : déployer un logiciel portable avec WAPT¶
Un bon exemple de paquet applicatif WAPT est celui d’un logiciel dit portable :
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.
2.2.8.1. 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()
2.2.9. 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.
télécharger le paquet MSU KB4522355 depuis le Catalogue du site de Microsoft .
Créer un modèle de paquet WAPT à partir du fichier .msu téléchargé. Dans la Console WAPT, cliquez sur
.Sélectionner le paquet téléchargé .msu et remplir les champs obligatoires.
Cliquer sur Créer et éditer (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.
2.2.10. 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.
2.2.10.1. Créer un modèle de paquet base depuis votre poste 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 du dossier de développement de paquets :
settings.json
;launch.json
.
Exemple avec VLC :
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 (le home de l’utilisateur acutellement connecté).
VSCode se charge et ouvre le projet de paquet.
Vérifier le contenu du fichier
control
.Vous devez donner une
description
à votre paquet, et renseigner letarget_os
et laversion
du paquet.Indication
os_target
pour Unix est linux.Avertissement
Le numéro de
version
du logiciel dans votre fichiercontrol
DOIT commencer à 0, et non le numéro de version du titre du logiciel, car le numéro de version peut ne pas être le même que celui affiché dans le dépôt DEB / YUM.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.
2.2.10.2. 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.
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.
2.2.10.3. Gérer le session-setup¶
Modifier le fichier
setup.py
avec unsession-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.
2.2.10.4. Construire et téléverser le paquet¶
Vous trouverez votre paquet dans le répertoire ~/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.
2.2.11. 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.
2.2.11.1. 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 !
2.2.11.2. 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)\wapt\private
.
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.
2.2.11.3. 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é.
Vous pouvez le tester par vous-même en téléchargeant le packaging d’exemple tis-encrypt-sample.
Attention
La sortie python (log install du paquet) est accessible en lecture aux utilisateurs de la machine, vous ne devez donc pas afficher le texte déchiffré avec un print lors de l’installation.
3. Utiliser des IDE différents pour développer les paquet WAPT¶
3.1. Configurer WAPT pour utiliser un éditeur de code personnalisé¶
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.
Note
Utiliser un IDE supporté lancera le projet de paquet WAPT avec une configuration de débogage valide.
3.1.1. Sur Windows¶
Récupérer le nom du logiciel |
Logo de l’éditeur de texte |
---|---|
PyScripter |
|
Visual Studio Code |
|
Visual Studio Codium |
Pour configurer un autre éditeur pour WAPT, vous devez modifier l’attribut editor_for_packages
dans la section [global]
du fichier de configuration %LOCALAPPDATA%\waptconsole\waptconsole.ini
de votre Console WAPT.
[global]
...
editor_for_packages = vscode
3.1.2. Sur Linux / macOS¶
Récupérer le nom du logiciel |
Logo de l’éditeur de texte |
---|---|
Visual Studio Code |
|
Visual Studio Codium |
|
Nano |
|
Vim |
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.
[global]
...
editor_for_packages = vim
3.2. Configurer WAPT pour utiliser un éditeur de code personnalisé¶
[global]
...
editor_for_packages = C:\Program Files\Notepad++\notepad++.exe {setup_filename}
[global]
...
editor_for_packages = /opt/pycharm/bin/pycharm_x64 {wapt_sources_dir}
3.2.1. Arguments personnalisés¶
Argument |
Description |
---|---|
|
Lance l’éditeur de code personnalisé et édite le fichier WAPT |
|
Lance l’éditeur de code personnalisé et modifie le fichier |
|
Lance l’éditeur de code personnalisé et ouvre le dossier du paquet WAPT. |
|
Lance l’éditeur de code personnalisé et ouvre le dossier d’installation WAPT. |