Files

83 lines
2.6 KiB
Python

"""
Skill VAULT — gestion des secrets Ansible Vault.
Usage LLM :
SKILL:vault ARGS:encrypt <fichier>
SKILL:vault ARGS:decrypt <fichier>
SKILL:vault ARGS:view <fichier>
SKILL:vault ARGS:encrypt-string <valeur> <nom_variable>
SKILL:vault ARGS:rekey <fichier>
"""
import os
import subprocess
DESCRIPTION = "Gestion des secrets chiffrés avec Ansible Vault"
USAGE = "SKILL:vault ARGS:encrypt <fichier> | decrypt <fichier> | view <fichier> | encrypt-string <valeur> <nom_var>"
VAULT_PASS_FILE = "/opt/agent_ansible/config/.vault_pass"
def _run(cmd: str, timeout: int = 30) -> str:
try:
result = subprocess.run(
cmd, shell=True, text=True,
capture_output=True, timeout=timeout
)
out = (result.stdout + result.stderr).strip()
return out[:3000] if out else "(aucune sortie)"
except Exception as e:
return str(e)
def _vault_flag() -> str:
if os.path.exists(VAULT_PASS_FILE):
return f"--vault-password-file {VAULT_PASS_FILE}"
return "--ask-vault-pass"
def run(args: str, context) -> str:
parts = args.strip().split(None, 1)
action = parts[0].lower() if parts else ""
rest = parts[1] if len(parts) > 1 else ""
flag = _vault_flag()
if action == "encrypt":
if not rest:
return "Précise le fichier à chiffrer."
return _run(f"ansible-vault encrypt {flag} {rest}")
if action == "decrypt":
if not rest:
return "Précise le fichier à déchiffrer."
return _run(f"ansible-vault decrypt {flag} {rest}")
if action == "view":
if not rest:
return "Précise le fichier à visualiser."
return _run(f"ansible-vault view {flag} {rest}")
if action == "encrypt-string":
parts2 = rest.split(None, 1)
if len(parts2) < 2:
return "Format : encrypt-string <valeur> <nom_variable>"
value, name = parts2[0], parts2[1]
return _run(f"ansible-vault encrypt_string {flag} '{value}' --name '{name}'")
if action == "rekey":
if not rest:
return "Précise le fichier."
return _run(f"ansible-vault rekey {flag} {rest}")
if action == "set-password":
# Définir le mot de passe du vault (stocké dans .vault_pass)
password = rest.strip()
if not password:
return "Précise le mot de passe."
with open(VAULT_PASS_FILE, "w") as f:
f.write(password)
os.chmod(VAULT_PASS_FILE, 0o600)
return f"Mot de passe vault enregistré dans {VAULT_PASS_FILE}"
return "Action inconnue. Disponible : encrypt, decrypt, view, encrypt-string, rekey, set-password"