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.

📦
PRODUIT LIÉ
Universal Installer V2.0
← Article précédent Article suivant →