feat: add homelab topology documentation, docker deployments, and authentik sso configuration scripts
This commit is contained in:
67
scripts/setup_authentik_ldap_bind_flow.py
Normal file
67
scripts/setup_authentik_ldap_bind_flow.py
Normal file
@@ -0,0 +1,67 @@
|
||||
import urllib.request
|
||||
import json
|
||||
import ssl
|
||||
|
||||
ctx = ssl.create_default_context()
|
||||
ctx.check_hostname = False
|
||||
ctx.verify_mode = ssl.CERT_NONE
|
||||
|
||||
AK_BASE = "https://authentik.snarfnet.net"
|
||||
AK_TOKEN = "SnarfNetPermanentAutomationToken2026"
|
||||
|
||||
def ak_req(endpoint, method="GET", data=None):
|
||||
url = f"{AK_BASE}/api/v3/{endpoint.lstrip('/')}"
|
||||
body = json.dumps(data).encode("utf-8") if data else None
|
||||
headers = {
|
||||
"Authorization": f"Bearer {AK_TOKEN}",
|
||||
"Content-Type": "application/json",
|
||||
"Accept": "application/json"
|
||||
}
|
||||
req = urllib.request.Request(url, data=body, headers=headers, method=method)
|
||||
with urllib.request.urlopen(req, timeout=10, context=ctx) as r:
|
||||
raw = r.read().decode("utf-8")
|
||||
return r.getcode(), json.loads(raw) if raw else {}
|
||||
|
||||
# 1. Check or Create Flow
|
||||
code, flows = ak_req("flows/instances/")
|
||||
flow = next((f for f in flows.get("results", []) if f["slug"] == "ldap-bind-flow"), None)
|
||||
|
||||
if not flow:
|
||||
payload = {
|
||||
"name": "LDAP Bind Flow",
|
||||
"slug": "ldap-bind-flow",
|
||||
"title": "LDAP Bind Flow",
|
||||
"designation": "authentication",
|
||||
}
|
||||
code, flow = ak_req("flows/instances/", method="POST", data=payload)
|
||||
print("Created flow:", flow["pk"])
|
||||
else:
|
||||
print("Flow exists:", flow["pk"])
|
||||
|
||||
flow_pk = flow["pk"]
|
||||
|
||||
# 2. Check or Create Bindings
|
||||
code, bindings = ak_req(f"flows/bindings/?target={flow_pk}")
|
||||
existing_stage_pks = [b["stage"] for b in bindings.get("results", [])]
|
||||
|
||||
stages = [
|
||||
(10, "f46eee4d-5bf7-415a-9eea-ba589536f90a"), # Identification
|
||||
(20, "8f68c5d8-52f8-49a2-a578-5f43846d5edb"), # Password
|
||||
(30, "84c2290f-eed3-464d-a997-5b70bb435b7e"), # Login
|
||||
]
|
||||
|
||||
for order, stage_pk in stages:
|
||||
if stage_pk not in existing_stage_pks:
|
||||
b_payload = {
|
||||
"target": flow_pk,
|
||||
"stage": stage_pk,
|
||||
"order": order,
|
||||
}
|
||||
code, new_b = ak_req("flows/bindings/", method="POST", data=b_payload)
|
||||
print(f"Bound stage {stage_pk} at order {order}")
|
||||
else:
|
||||
print(f"Stage {stage_pk} already bound")
|
||||
|
||||
# 3. Update Provider 22
|
||||
code, prov = ak_req("providers/ldap/22/", method="PATCH", data={"authentication_flow": flow_pk})
|
||||
print("Updated Provider 22 authentication_flow to:", prov.get("authentication_flow"))
|
||||
Reference in New Issue
Block a user