# The household's first setup of each app, THROUGH the gate (its browser holds the gate cookies from `ro.py household`).
# Each app's own first-run API, as its first-setup screen calls it. Passwords from ro_creds.json; never printed.
import json, sys, time
sys.path.insert(0, '.')
import ro
from ro import w, host
def J(b, app, method, path, body=None, headers=None):
st, text, _ = b.req(f"https://{host(app)}{path}", method, body=body, accept="application/json", headers=headers)
return st, text
def actualbudget(b, c):
return J(b, "actualbudget", "POST", "/account/bootstrap", {"password": c["pw"]})
def komga(b, c):
return J(b, "komga", "POST", "/api/v1/claim", headers={"X-Komga-Email": c["email"], "X-Komga-Password": c["pw"]})
def jellyfin(b, c):
out = []
out.append(J(b, "jellyfin", "POST", "/Startup/Configuration", {"UICulture": "en-US", "MetadataCountryCode": "HU", "PreferredMetadataLanguage": "hu"})[0])
out.append(J(b, "jellyfin", "GET", "/Startup/User")[0])
out.append(J(b, "jellyfin", "POST", "/Startup/User", {"Name": c["user"], "Password": c["pw"]})[0])
st, t = J(b, "jellyfin", "POST", "/Startup/Complete")
out.append(st)
return st, f"steps {out}"
def emby(b, c):
out = [J(b, "emby", "POST", "/emby/Startup/Configuration", {"UICulture": "en-US", "MetadataCountryCode": "HU", "PreferredMetadataLanguage": "hu"})[0],
J(b, "emby", "POST", "/emby/Startup/User", {"Name": c["user"], "Password": c["pw"]})[0]]
st, t = J(b, "emby", "POST", "/emby/Startup/Complete")
out.append(st)
return st, f"steps {out}"
def navidrome(b, c):
return J(b, "navidrome", "POST", "/auth/createAdmin", {"username": c["user"], "password": c["pw"]})
def ghost(b, c):
return J(b, "ghost", "POST", "/ghost/api/admin/authentication/setup/",
{"setup": [{"name": "Family", "email": c["email"], "password": c["pw"] + "Zz9", "blogTitle": "Family"}]},
headers={"Origin": f"https://{host('ghost')}"})
def home_assistant(b, c):
return J(b, "home-assistant", "POST", "/api/onboarding/users",
{"client_id": f"https://{host('home-assistant')}/", "name": "Family", "username": c["user"], "password": c["pw"], "language": "en"})
def romm(b, c):
J(b, "romm", "GET", "/api/heartbeat") # sets romm's csrftoken cookie, as its setup screen's first call does
tok = b.jar.get(host("romm"), {}).get("romm_csrftoken") or b.jar.get(host("romm"), {}).get("csrftoken", "")
return J(b, "romm", "POST", "/api/users", {"username": c["user"], "password": c["pw"], "email": c["email"], "role": "admin"},
headers={"X-CSRFToken": tok})
def zipline(b, c):
return J(b, "zipline", "POST", "/api/setup", {"username": c["user"], "password": c["pw"]})
def docmost(b, c):
return J(b, "docmost", "POST", "/api/auth/setup", {"name": "Family", "email": c["email"], "password": c["pw"], "workspaceName": "Family"})
def calcom(b, c):
return J(b, "calcom", "POST", "/api/auth/setup", {"username": c["user"], "email_address": c["email"], "full_name": "Family", "password": c["pw"] + "Aa1!"})
def _form(b, app, path, fields, csrf_name):
import re, urllib.parse
st, html, _ = b.req(f"https://{host(app)}{path}")
m = re.search(r'name="' + csrf_name + r'" value="([^"]+)"', html)
fields[csrf_name] = m.group(1) if m else ""
body = urllib.parse.urlencode(fields)
st, text, hops = b.req(f"https://{host(app)}{path}", "POST", body=body,
headers={"Content-Type": "application/x-www-form-urlencoded", "Referer": f"https://{host(app)}{path}", "Origin": f"https://{host(app)}"})
return st, f"after POST: {' -> '.join(str(h[0]) + ' ' + h[2] for h in hops)}"
def gitea(b, c):
import re
st, html, _ = b.req(f"https://{host('gitea')}/")
fields = dict(re.findall(r']*name="([^"]+)"[^>]*value="([^"]*)"', html))
for sel in re.findall(r'