#!/bin/bash

# This script expects a mapping of services and ports in the SERVICES env var,
# with one line per service containing "NAME PORT".

# Other vars:
#  THRIMBLETRIMMER: Set non-empty to also serve thrimbletrimmer on /thrimbletrimmer
#  SEGMENTS: Set to path to segments dir to also serve segments dir on /segments
#  SSL: Set to path to file containing SSL cert and key, if any.

generate_location() {
	# generate_location PATH URL
	# We indirect via a variable to prevent nginx from caching dns forever
	echo -e "\t\tlocation $1 { set \$name \"$2\"; proxy_pass \$name; }"
}

LOCATIONS=$(
	[ -n "$SERVICES" ] && echo "$SERVICES" | while read name port; do
		# restreamer is the catch-all
		[ "$name" == "restreamer" ] && generate_location / "http://restreamer:$port"
		# thrimshim takes any calls to thrimshim/
		[ "$name" == "thrimshim" ] && generate_location /thrimshim "http://thrimshim:$port"
		# all services have metrics under /metrics/SERVICE, except for thrimebletrimmer
		generate_location "/metrics/$name" "http://$name:$port/metrics"
	done
	[ -n "$THRIMBLETRIMMER" ] &&
		echo -e "\t\tlocation = / { return 301 /thrimbletrimmer/dashboard.html; }" &&
		echo -e "\t\tlocation /thrimbletrimmer { }"
	[ -n "$SEGMENTS" ] &&
		echo -e "\t\tlocation /segments/ { alias $SEGMENTS/; }"
)

[ -n "$SSL" ] && SSL_CONF=$(cat <<EOF
	server {
		listen 443 ssl;
		ssl_certificate $SSL;
		ssl_certificate_key $SSL;
		ssl_session_cache shared:SSL:10m;
		gzip on;
		gzip_comp_level 9;
		absolute_redirect off;
$LOCATIONS
	}
EOF
)

cat > /etc/nginx/nginx.conf <<EOF
worker_processes auto;

events {
	worker_connections 1024;
}

http {
	include /etc/nginx/mime.types;
	resolver 127.0.0.11 valid=10s;
$SSL_CONF
	server {
		listen 80;
		gzip on;
		gzip_comp_level 9;
		absolute_redirect off;
$LOCATIONS
	}
}
EOF