Cybersecurity-Projects/PROJECTS/beginner/canary-token-generator/scripts/init.sh

85 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# ©AngelaMos | 2026
# init.sh
# =============================================================================
# Idempotent setup helper.
# 1. Copies .env.example -> .env if .env is missing
# 2. Generates POSTGRES_PASSWORD and OPERATOR_TOKEN if their values are blank
# 3. Downloads GeoLite2-City.mmdb when MAXMIND_ACCOUNT_ID + MAXMIND_LICENSE_KEY are set
#
# Safe to run repeatedly: skips already-set values and existing mmdb.
# =============================================================================
set -euo pipefail
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="$DIR/.env"
EXAMPLE_FILE="$DIR/.env.example"
DATA_DIR="$DIR/data"
MMDB_PATH="$DATA_DIR/GeoLite2-City.mmdb"
# ── ensure .env exists ────────────────────────────────────────────────────────
if [[ ! -f "$ENV_FILE" ]]; then
if [[ ! -f "$EXAMPLE_FILE" ]]; then
echo "Error: $EXAMPLE_FILE missing — cannot bootstrap .env" >&2
exit 1
fi
cp "$EXAMPLE_FILE" "$ENV_FILE"
echo " created .env from .env.example"
fi
# ── secret generator ──────────────────────────────────────────────────────────
gen_secret() {
local key="$1"
local current
current="$(grep -E "^${key}=" "$ENV_FILE" | head -1 | cut -d= -f2- || true)"
if [[ -z "$current" ]]; then
local newval
newval="$(openssl rand -hex 32)"
if grep -qE "^${key}=" "$ENV_FILE"; then
sed -i "s|^${key}=.*|${key}=${newval}|" "$ENV_FILE"
else
printf '\n%s=%s\n' "$key" "$newval" >> "$ENV_FILE"
fi
echo " generated $key"
else
echo " $key already set, skipping"
fi
}
gen_secret POSTGRES_PASSWORD
gen_secret OPERATOR_TOKEN
# ── geoip database ────────────────────────────────────────────────────────────
ACCT="$(grep -E "^MAXMIND_ACCOUNT_ID=" "$ENV_FILE" | head -1 | cut -d= -f2- || true)"
KEY="$(grep -E "^MAXMIND_LICENSE_KEY=" "$ENV_FILE" | head -1 | cut -d= -f2- || true)"
if [[ -n "$ACCT" && -n "$KEY" ]]; then
if [[ ! -f "$MMDB_PATH" ]]; then
mkdir -p "$DATA_DIR"
echo " downloading GeoLite2-City.mmdb from MaxMind..."
tmp_dir="$(mktemp -d)"
trap 'rm -rf "$tmp_dir"' EXIT
if curl -sSf -u "$ACCT:$KEY" \
"https://download.maxmind.com/geoip/databases/GeoLite2-City/download?suffix=tar.gz" \
-o "$tmp_dir/geolite.tar.gz"; then
tar -xzf "$tmp_dir/geolite.tar.gz" -C "$tmp_dir" --strip-components=1 \
"*/GeoLite2-City.mmdb"
mv "$tmp_dir/GeoLite2-City.mmdb" "$MMDB_PATH"
echo " GeoLite2-City.mmdb downloaded to $MMDB_PATH"
else
echo " Warning: GeoLite2 download failed (check MAXMIND_ACCOUNT_ID and MAXMIND_LICENSE_KEY)" >&2
fi
else
echo " GeoLite2-City.mmdb already present, skipping"
fi
else
echo " MaxMind credentials not set in .env — geolocation will be disabled"
fi
# ── done ──────────────────────────────────────────────────────────────────────
echo ""
echo "Setup complete. Edit .env to set PUBLIC_BASE_URL + Turnstile keys, then 'just up'."