61 lines
2.0 KiB
Python
Executable File
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()
|