Pourquoi créer un plugin ?
Universal Installer V2 couvre les formats et algorithmes les plus courants. Mais certains contextes nécessitent des extensions : un format de compression propriétaire industriel, un système de signature spécifique à votre PKI, ou un provider cloud non pris en charge nativement. La Plugin API V1.2 permet d'ajouter ces fonctionnalités sans modifier le core.
Un plugin Universal Installer bien écrit est indiscernable d'une fonctionnalité native. Il bénéficie du même pipeline de vérification HMAC, du même reporting et de la même intégration CI/CD.
Structure d'un plugin
mon_plugin/
├── plugin.py # code principal
├── plugin.json # métadonnées et schéma
├── requirements.txt # dépendances pip
└── tests/
└── test_plugin.py
Schéma plugin.json
{
"name": "custom_signer",
"display_name":"Signature PKI Interne",
"type": "signer",
"version": "1.0.0",
"api_version": "1.2",
"description": "Signe les archives via la PKI interne de l'entreprise",
"params": [
{"key":"pki_url", "type":"string", "required":true},
{"key":"cert_template", "type":"string", "default":"CodeSigning"}
]
}
Implémentation
from universal_installer.plugin import SignerPlugin, SignResult
class CustomPKISigner(SignerPlugin):
name = "custom_signer"
def setup(self, params, ctx):
self.pki_url = params['pki_url']
self.template = params.get('cert_template', 'CodeSigning')
# Tester la connectivité PKI
requests.get(self.pki_url, timeout=5).raise_for_status()
def sign(self, archive_path: str, params, ctx) -> SignResult:
# Appeler l'API PKI interne
with open(archive_path, 'rb') as f:
archive_hash = hashlib.sha256(f.read()).hexdigest()
r = requests.post(f"{self.pki_url}/sign", json={{
"hash": archive_hash,
"template": self.template,
"algorithm": "SHA256withRSA"
}}, timeout=30)
sig = r.json()["signature"]
sig_path = archive_path + ".pkisig"
open(sig_path, 'w').write(sig)
return SignResult(success=True, sig_path=sig_path)
Tests unitaires
from universal_installer.testing import PluginTestRunner
runner = PluginTestRunner("mon_plugin/")
runner.test_sign("tests/fixtures/sample.uxc",
params={{"pki_url": "http://pki-mock:8080"}})
# → ✓ Plugin valide, signature vérifiable
Packaging et marketplace
# Packager le plugin
universal-installer plugin pack mon_plugin/ --output custom_signer_1.0.0.uipkg
# Installer localement
universal-installer plugin install custom_signer_1.0.0.uipkg
# Publier sur la marketplace TRUvector
universal-installer plugin publish custom_signer_1.0.0.uipkg --token $MARKETPLACE_TOKEN
Conclusion
La Plugin API V1.2 couvre 4 types de plugins : compresseur (algorithme custom), signateur (PKI propriétaire), provider cloud (endpoint non standard) et postprocesseur (actions post-compression). Le cycle de vie setup/action/teardown est identique à AutomationSequence V8 — la cohérence de l'écosystème TRUvector facilite la montée en compétences entre les deux produits.