#!/usr/bin/env python3
"""
L2 deep: extract job configs (Jenkinsfile/pipeline definitions) and node configs.
Read-only (config.xml fetch).
"""
import urllib.request
import ssl
import json
import os

BASE = "https://jenkins.camel-soft.com"
COOKIE = "JSESSIONID.3cb5c8ef=node01ndmoz5yqoo7wekrqondgfhi01325.node0"

ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

JOBS = [
    "camelsoft-website", "camelsoft-website-api",
    "camelsofttaxib2b", "camelsofttaxibackend", "camelsofttaxisuperadmin", "camelsofttaxiwebsite",
    "coach-doc", "coachbackend", "coachdashboard", "coachsuite", "coachwebsite",
    "huna", "huna-server",
    "ordrat-backend", "ordrat-frontend", "ordrat-website",
    "productapproval",
]

def fetch(path):
    url = BASE + path
    req = urllib.request.Request(url)
    req.add_header("Cookie", COOKIE)
    try:
        with urllib.request.urlopen(req, timeout=25, context=ctx) as resp:
            return resp.status, resp.read().decode("utf-8", errors="replace")
    except urllib.error.HTTPError as e:
        return e.code, f"HTTP {e.code}"
    except Exception as e:
        return -1, str(e)

os.makedirs("job_configs", exist_ok=True)

summary = {}
for job in JOBS:
    # Fetch config.xml
    status, xml = fetch(f"/job/{job}/config.xml")
    summary[job] = {"status": status, "size": len(xml) if status == 200 else 0}
    
    if status == 200:
        fname = f"job_configs/{job}.xml"
        with open(fname, "w") as f:
            f.write(xml)
        print(f"[+] {job}: {status} ({len(xml)} bytes) -> {fname}")
    else:
        print(f"[-] {job}: {status} {xml[:100]}")
    
    # Also fetch last build info
    status2, info = fetch(f"/job/{job}/api/json?tree=lastBuild[number,url,timestamp,result],nextBuildNumber,property[parameterDefinitions[name,type,defaultParameterValue[value]]]")
    if status2 == 200:
        try:
            j = json.loads(info)
            summary[job]["lastBuild"] = j.get("lastBuild")
            summary[job]["params"] = j.get("property", [])
        except:
            pass

# Node configs
status, nodes_xml = fetch("/computer/config.xml")
if status == 200:
    with open("job_configs/_nodes.xml", "w") as f:
        f.write(nodes_xml)
    print(f"[+] Nodes config: {len(nodes_xml)} bytes -> job_configs/_nodes.xml")

# Summary
with open("job_configs/_summary.json", "w") as f:
    json.dump(summary, f, indent=2)
print(f"\n[*] Summary saved to job_configs/_summary.json")
