incus-contrib/bin/pve-api

61 lines
2.0 KiB
Python
Executable File

#!/usr/bin/env python3
"""Proxmox API helper — avoids bash ! quoting issues in interactive shells."""
import json, os, ssl, sys, urllib.request
def main():
# Load config
script_dir = os.path.dirname(os.path.abspath(__file__))
env_file = os.path.join(os.path.dirname(script_dir), "env")
if os.path.exists(env_file):
for line in open(env_file):
line = line.strip()
if line.startswith("export "):
line = line[7:]
if "=" in line and not line.startswith("#"):
k, v = line.split("=", 1)
os.environ[k] = v
yaml_file = os.path.join(script_dir, "proxmox.yaml")
cfg = {}
if os.path.exists(yaml_file):
for line in open(yaml_file):
line = line.strip()
if ": " in line and not line.startswith("#"):
k, v = line.split(": ", 1)
cfg[k] = v.strip("'\"")
host = cfg.get("host", "")
node = cfg.get("node", "pve")
token_id = cfg.get("api_token_id", "")
secret = os.environ.get("PROXMOX_TOKEN_SECRET", "")
if not host or not token_id or not secret:
print("Error: missing host/token_id/secret", file=sys.stderr)
sys.exit(1)
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
method = "GET"
endpoint = sys.argv[1] if len(sys.argv) > 1 else f"/nodes/{node}/qemu"
if len(sys.argv) > 2:
method = sys.argv[2]
data = sys.argv[3].encode() if len(sys.argv) > 3 else None
url = f"https://{host}:8006/api2/json{endpoint}"
req = urllib.request.Request(url, method=method, data=data)
req.add_header("Authorization", f"PVEAPIToken={token_id}={secret}")
if data:
req.add_header("Content-Type", "application/json")
try:
resp = urllib.request.urlopen(req, context=ctx)
print(resp.read().decode())
except urllib.error.HTTPError as e:
print(json.dumps({"error": str(e), "code": e.code}))
sys.exit(1)
if __name__ == "__main__":
main()