# Tooling — config rendering, mod mirror, launcher fetch ## Summary Three scripts in `./tooling/` turn the two env vars + templates into a working, offline-capable stack. All are **cautious**: they halt on unset vars or missing inputs rather than emit half-broken output. ## render-config.sh Renders every `*.tmpl` into its real config by substituting `BASE_DOMAIN` / `HOST_LAN_IP`. Caddy is excluded (it reads `{$BASE_DOMAIN}` natively). Targets: - `drasl/config/config.toml.tmpl` → `drasl/config/config.toml` - `dnsmasq/dnsmasq.conf.tmpl` → `dnsmasq/dnsmasq.conf` ```bash #!/usr/bin/env bash set -euo pipefail [ -f .env ] && set -a && . ./.env && set +a : "${BASE_DOMAIN:?BASE_DOMAIN unset}" : "${HOST_LAN_IP:?HOST_LAN_IP unset}" render() { # $1=tmpl $2=out [ -f "$1" ] || { echo "missing template: $1"; exit 1; } envsubst '${BASE_DOMAIN} ${HOST_LAN_IP}' < "$1" > "$2" echo "rendered $2" } render drasl/config/config.toml.tmpl drasl/config/config.toml render dnsmasq/dnsmasq.conf.tmpl dnsmasq/dnsmasq.conf ``` > Note: `envsubst` with an explicit var list avoids clobbering `$`-syntax that > belongs to the target file (e.g. dnsmasq/caddy literals). ## mirror-mods.sh Vendors mod jars for offline install and rewrites packwiz URLs to the LAN host. See `04-packwiz.md`. Outline: 1. For each `pack/mods/*.pw.toml`, read `[download] url` + `filename`. 2. Download jar → `pack/mods-files/` (served by Caddy under packwiz subdomain). 3. Rewrite `url` to `http://packwiz.${BASE_DOMAIN}/mods-files/`. 4. `packwiz refresh` to recompute hashes + `index.toml`. Must halt if a download fails or a hash mismatches. ## mirror-assets.sh Mirrors Minecraft asset objects for offline clients (the ~400 MB+ chunk) and lays them out for Caddy + the Fjord "Assets Server" override. Full design in `10-assets-mirror.md`. Verifies SHA1, idempotent, halts on mismatch. ## fetch-launcher.sh Downloads all FjordLauncherUnlocked release assets → `mirror/launcher//`. Full script in `06-launcher.md`. ## Generated / gitignored ``` drasl/config/config.toml # rendered dnsmasq/dnsmasq.conf # rendered pack/mods-files/ # vendored jars mirror/ # launcher assets + mod mirror .env # secrets + host-specific ``` ## Tasks - [ ] Write `tooling/render-config.sh` (above), `chmod +x` - [ ] Write `tooling/mirror-mods.sh` (toml parse + download + rewrite + refresh) - [ ] Write `tooling/mirror-assets.sh` (see 10) - [ ] Write `tooling/fetch-launcher.sh` (see 06) - [ ] Add `gettext` (envsubst) + `jq` to host prereqs doc - [ ] Update `.gitignore` for rendered configs + `mirror/` + `pack/mods-files/` - [ ] `build-stack.sh` orchestrator (preflight + `--prep` online + `--up` offline) — DONE, sequences the sub-scripts; see plan/12