Snapshot: full project state

This commit is contained in:
2026-10-06 23:43:32 -07:00
commit 8e95d8a78c
16 changed files with 1002 additions and 0 deletions

99
deploy_landings.py Normal file
View File

@@ -0,0 +1,99 @@
#!/usr/bin/env python3
"""Deploy landing pages to SatsSpin (CT146), Signal Miner (CT548), WorkBrain (CT144).
Run ON Proxmox: /usr/bin/python3 /tmp/deploy_landings.py
"""
import re, subprocess, sys
def sh(cmd, timeout=60):
r = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=timeout)
return r.stdout + r.stderr
def pct(vmid, cmd, timeout=60):
return sh(f"pct exec {vmid} -- bash -c {sh_quote(cmd)}", timeout)
def sh_quote(s):
return "'" + s.replace("'", "'\\''") + "'"
results = {}
# ── 1. SatsSpin CT146: replace dist/index.html ──────────────────────
print("=== SATSSPIN CT146 ===")
out = pct(146, "cp /opt/casino/dist/index.html /opt/casino/dist/index.html.aistudio.bak && "
"cp /tmp/satsspin.html /opt/casino/dist/index.html && "
"chmod 644 /opt/casino/dist/index.html && echo COPIED")
results['satsspin'] = 'COPIED' in out
print(out[:200])
sh("pct exec 146 -- systemctl restart satsspin", timeout=60)
print("restarted satsspin")
# ── 2. Signal Miner CT548: landing file + patch "/" route ───────────
print("=== SIGNAL MINER CT548 ===")
out = pct(548, "cp /opt/signal-miner/app.py /opt/signal-miner/app.py.bak-landing-20260813 && "
"cp /tmp/signalminer.html /opt/signal-miner/landing.html && echo BACKED_UP")
results['signalminer_backup'] = 'BACKED_UP' in out
print(out[:200])
# patch app.py: replace old landing() body with file read
patch_script = '''
import re
src = open("/opt/signal-miner/app.py").read()
old_start = src.find("@app.route(\\"/\\")\\ndef landing():")
assert old_start != -1, "landing route not found"
old_end = src.find("</div></body></html>\\"\\"\\"", old_start)
assert old_end != -1, "landing end marker not found"
old_end += len("</div></body></html>\\"\\"\\"")
new_code = """@app.route(\\"/\\")
def landing():
with open("/opt/signal-miner/landing.html") as f:
return f.read()"""
src = src[:old_start] + new_code + src[old_end:]
open("/opt/signal-miner/app.py","w").write(src)
print("PATCHED")
'''
open("/tmp/patch_sm.py", "w").write(patch_script)
sh("pct push 548 /tmp/patch_sm.py /tmp/patch_sm.py", timeout=60)
out = pct(548, "python3 /tmp/patch_sm.py && systemctl restart signal-miner && echo RESTARTED")
results['signalminer'] = 'RESTARTED' in out
print(out[:300])
# ── 3. WorkBrain CT144: landing file + "/" → landing, "/app" → dashboard ──
print("=== WORKBRAIN CT144 ===")
svc = pct(144, "systemctl list-units --type=service --state=running | grep -oiE '[a-z-]*workbrain[a-z-]*' | head -1").strip()
print("service:", svc or "?")
out = pct(144, "cp /opt/workbrain/app.py /opt/workbrain/app.py.bak-landing-20260813 && "
"cp /tmp/workbrain.html /opt/workbrain/landing.html && echo BACKED_UP")
results['workbrain_backup'] = 'BACKED_UP' in out
print(out[:200])
patch_script2 = '''
src = open("/opt/workbrain/app.py").read()
old = "@app.route(\\"/\\")\\ndef dashboard():\\n return render_template(\\"dashboard.html\\")"
new = """@app.route(\\"/\\")
def landing():
with open("/opt/workbrain/landing.html") as f:
return f.read()
@app.route(\\"/app\\")
def dashboard():
return render_template(\\"dashboard.html\\")"""
assert old in src, "dashboard route pattern not found"
src = src.replace(old, new, 1)
open("/opt/workbrain/app.py","w").write(src)
print("PATCHED")
'''
open("/tmp/patch_wb.py", "w").write(patch_script2)
sh("pct push 144 /tmp/patch_wb.py /tmp/patch_wb.py", timeout=60)
out = pct(144, "python3 /tmp/patch_wb.py && echo PATCHED")
print(out[:200])
if svc:
out = pct(144, f"systemctl restart {svc} && echo RESTARTED")
results['workbrain'] = 'RESTARTED' in out
print(out[:200])
else:
out = pct(144, "systemctl list-units --type=service --state=running | grep -iE 'flask|gunicorn|python' | head -3")
print("fallback services:", out[:300])
results['workbrain'] = 'manual'
print("=== RESULTS ===")
for k, v in results.items():
print(k, "OK" if v else "FAILED")