#!/bin/sh set -eu bin=${GITPOCKET_BIN:-/usr/local/bin/gitpocket} root=${GITPOCKET_ROOT:-/srv/gitpocket} user=${GITPOCKET_USER:-git} port=${GITPOCKET_PORT:-3200} conf=${GITPOCKET_NGINX:-/etc/nginx/conf.d/gitpocket-domains.conf} cert=${GITPOCKET_CERT:-/etc/gitpocket/origin.pem} key=${GITPOCKET_KEY:-/etc/gitpocket/origin.key} cloudflare=${GITPOCKET_CLOUDFLARE:-/etc/gitpocket/cloudflare} domains=$(runuser -u "$user" -- "$bin" -root "$root" domains | grep -E '^[a-z0-9.-]+$' || true) render() { [ -n "$domains" ] || return 0 names=$(printf ' %s' $domains) cat < "$next" if [ -f "$conf" ] && cmp -s "$next" "$conf"; then rm -f "$next" return 0 fi [ -f "$conf" ] && cp "$conf" "$conf.old" mv "$next" "$conf" chmod 644 "$conf" if nginx -t 2>/dev/null; then systemctl reload nginx else echo "nginx rejected $conf, restoring" >&2 if [ -f "$conf.old" ]; then mv "$conf.old" "$conf"; else rm -f "$conf"; fi exit 1 fi } hostnames() { [ -r "$cloudflare" ] || return 0 python3 - "$cloudflare" $domains <<'PY' import json, sys, urllib.request env = dict(l.strip().split("=", 1) for l in open(sys.argv[1]) if "=" in l) want = set(sys.argv[2:]) - set(env.get("CF_SKIP", "").split()) base = f"https://api.cloudflare.com/client/v4/zones/{env['CF_ZONE']}/custom_hostnames" def call(method, url, body=None): req = urllib.request.Request(url, method=method, data=json.dumps(body).encode() if body else None, headers={"Authorization": "Bearer " + env["CF_TOKEN"], "Content-Type": "application/json"}) with urllib.request.urlopen(req, timeout=30) as r: return json.load(r) have, page = {}, 1 while True: res = call("GET", f"{base}?per_page=50&page={page}")["result"] have.update({h["hostname"]: h["id"] for h in res}) if len(res) < 50: break page += 1 for name in sorted(want - have.keys()): try: call("POST", base, {"hostname": name, "ssl": {"method": "http", "type": "dv"}}) except Exception as e: print(f"custom hostname {name}: {e}", file=sys.stderr) for name in sorted(have.keys() - want): call("DELETE", f"{base}/{have[name]}") PY } apply hostnames