71 lines
3.3 KiB
Python
71 lines
3.3 KiB
Python
import sys
|
|
import xml.etree.ElementTree as ET
|
|
import os
|
|
dump_file = sys.argv[1]
|
|
cache_file = sys.argv[2]
|
|
key_file = sys.argv[3]
|
|
ttl_sec = sys.argv[4]
|
|
pve_endpoint = sys.argv[5]
|
|
vault_addr = sys.argv[6]
|
|
tree = ET.parse(dump_file)
|
|
root = tree.getroot()
|
|
for h in root.findall(".//History"):
|
|
h.clear()
|
|
for g in root.findall(".//Group"):
|
|
name = g.find("./Name")
|
|
if name is not None and name.text == "Recycle Bin":
|
|
g.clear()
|
|
entries = {}
|
|
for entry in root.findall(".//Entry"):
|
|
title = ""
|
|
username = ""
|
|
password = ""
|
|
notes = ""
|
|
for string in entry.findall("./String"):
|
|
key_elem = string.find("./Key")
|
|
val_elem = string.find("./Value")
|
|
if key_elem is not None and val_elem is not None and key_elem.text:
|
|
k = key_elem.text
|
|
v = val_elem.text or ""
|
|
if k == "Title": title = v.strip()
|
|
elif k == "UserName": username = v.strip()
|
|
elif k == "Password": password = v.strip()
|
|
elif k == "Notes": notes = v.strip()
|
|
if title and title not in entries:
|
|
entries[title] = {
|
|
"username": username,
|
|
"password": password,
|
|
"notes": notes
|
|
}
|
|
ssh_loaded = False
|
|
for title in ("Atlas Core Key", "AtlasCoreKey", "Atlas Core"):
|
|
entry_data = entries.get(title, {})
|
|
for field in ("password", "notes"):
|
|
val = entry_data.get(field, "")
|
|
if "-----BEGIN" in val or "PRIVATE KEY" in val:
|
|
with open(key_file, "w") as kf:
|
|
kf.write(val.strip() + "\n")
|
|
os.chmod(key_file, 0o600)
|
|
ssh_loaded = True
|
|
break
|
|
if ssh_loaded:
|
|
break
|
|
if not ssh_loaded:
|
|
sys.stderr.write("Внимание: приватный SSH-ключ не найден в полях Password/Notes записи Atlas Core Key.\n")
|
|
with open(cache_file, "w") as f:
|
|
f.write(f"# TTL_SECONDS={ttl_sec}\n")
|
|
f.write(f"export PROXMOX_VE_API_TOKEN={repr(entries.get('ProxmoxAPI', {}).get('password', ''))}\n")
|
|
f.write(f"export TF_VAR_proxmox_api_token={repr(entries.get('ProxmoxAPI', {}).get('password', ''))}\n")
|
|
f.write(f"export TF_VAR_state_passphrase={repr(entries.get('TofuState', {}).get('password', ''))}\n")
|
|
f.write(f"export PROXMOX_VE_ENDPOINT={repr(pve_endpoint)}\n")
|
|
f.write(f"export VAULT_ADDR={repr(vault_addr)}\n")
|
|
f.write(f"export VAULT_TOKEN={repr(entries.get('OpenBaoToken', {}).get('password', ''))}\n")
|
|
f.write(f"export VAULT_UNSEAL_KEY={repr(entries.get('OpenBaoUnseal', {}).get('password', ''))}\n")
|
|
f.write(f"export TECHNITIUM_PASSWORD={repr(entries.get('Technitium', {}).get('password', 'admin'))}\n")
|
|
f.write(f"export TF_VAR_vaultwarden_admin_token={repr(entries.get('VaultwardenAdmin', {}).get('password', ''))}\n")
|
|
f.write(f"export TF_VAR_forgejo_runner_token={repr(entries.get('ForgejoRunnerToken', {}).get('password', ''))}\n")
|
|
f.write(f"export TF_VAR_forgejo_oidc_client_id={repr(entries.get('ForgejoOIDC', {}).get('username', 'forgejo'))}\n")
|
|
f.write(f"export TF_VAR_forgejo_oidc_secret={repr(entries.get('ForgejoOIDC', {}).get('password', ''))}\n")
|
|
f.write(f"export ATLAS_PUSH_TOKEN={repr(entries.get('AtlasPushToken', {}).get('password', ''))}\n")
|
|
f.write(f"export VYOS_WG_PRIVATE_KEY={repr(entries.get('VyosWG', {}).get('password', ''))}\n")
|
|
os.chmod(cache_file, 0o600) |