#!/bin/sh
# script/run: build bin/smallwebwaf with script/build and run servewaf and
# rproxy on the host, with the settings in the environment, until rproxy
# exits or the script is told to stop. rproxy listens on port 8080 unless
# SWRP_LISTEN_ADDR says otherwise, in front of the app at SWRP_UPSTREAM_URL.
# servewaf listens on port 8090 unless SWWAF_LISTEN_ADDR says otherwise, and
# rproxy asks it there unless SWRP_WAF_BACKEND says otherwise. Unless
# SWWAF_STATE_DIR is set, the state files go in bin/state, beside the binary,
# and unless SWWAF_RULES_DIR is set, the rule files are those of share/rules.d,
# which the image ships.
set -eu

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
ROOT="$(cd "$SCRIPT_DIR/.." && pwd -P)"

SERVEWAF=""
RPROXY=""

# stop_both: stop what runs, and wait for it, so that servewaf writes its state
# files.
stop_both() {
    trap '' HUP INT TERM
    kill $SERVEWAF $RPROXY 2>/dev/null || true
    wait || true
}

main() {
    "$SCRIPT_DIR/build"
    if [ -z "${SWWAF_STATE_DIR+set}" ]; then
        SWWAF_STATE_DIR="$ROOT/bin/state"
        export SWWAF_STATE_DIR
        mkdir -p "$SWWAF_STATE_DIR"
    fi
    if [ -z "${SWWAF_RULES_DIR+set}" ]; then
        SWWAF_RULES_DIR="$ROOT/share/rules.d"
        export SWWAF_RULES_DIR
    fi
    SWWAF_LISTEN_ADDR="${SWWAF_LISTEN_ADDR:-:8090}"
    SWRP_WAF_BACKEND="${SWRP_WAF_BACKEND:-http://127.0.0.1:${SWWAF_LISTEN_ADDR##*:}}"
    export SWWAF_LISTEN_ADDR SWRP_WAF_BACKEND

    trap stop_both EXIT
    trap 'exit 1' HUP INT TERM

    "$ROOT/bin/smallwebwaf" servewaf &
    SERVEWAF=$!
    "$ROOT/bin/smallwebwaf" rproxy &
    RPROXY=$!
    wait "$RPROXY"
}

main "$@"
