#!/bin/sh
WAR="/usr/share/greenmail/greenmail-webapp.war"

HTTP_PORT="${GREENMAIL_WEBAPP_HTTP_PORT:-8080}"
SHUTDOWN_PORT="${GREENMAIL_WEBAPP_SHUTDOWN_PORT:-8005}"
BIND_ADDR="${GREENMAIL_WEBAPP_BIND_ADDR:-127.0.0.1}"
CONTEXT_PATH="${GREENMAIL_WEBAPP_CONTEXT_PATH:-/}"
BASE_DEF="${XDG_RUNTIME_DIR:-/tmp}/greenmail-webapp-${USER:-$(id -un)}"
CATALINA_BASE="${GREENMAIL_WEBAPP_BASE:-$BASE_DEF}"
CMD="${GREENMAIL_WEBAPP_TOMCAT_CMD:-start}"

JAVA_EXTRA=""
CATALINA_EXTRA=""

usage() {
    echo "Usage: greenmail-webapp [OPTIONS]" >&2
    echo "  --port N            HTTP port (default: 8080)" >&2
    echo "  --shutdown-port N   Tomcat shutdown port (default: 8005)" >&2
    echo "  --bind ADDR         Bind address (default: 127.0.0.1)" >&2
    echo "  --context-path /p   Context path (default: /)" >&2
    echo "  --base DIR          CATALINA_BASE directory" >&2
    echo "  --java-opt OPT      Append OPT to JAVA_OPTS" >&2
    echo "  --catalina-opt OPT  Append OPT to CATALINA_OPTS" >&2
    echo "  --tomcat-command C  start|stop (default: start)" >&2
}

while [ $# -gt 0 ]; do
    case "$1" in
        --port|--http-port)
            [ $# -ge 2 ] || { usage; exit 2; }
            HTTP_PORT="$2"
            shift 2
            ;;
        --shutdown-port)
            [ $# -ge 2 ] || { usage; exit 2; }
            SHUTDOWN_PORT="$2"
            shift 2
            ;;
        --bind)
            [ $# -ge 2 ] || { usage; exit 2; }
            BIND_ADDR="$2"
            shift 2
            ;;
        --context-path)
            [ $# -ge 2 ] || { usage; exit 2; }
            CONTEXT_PATH="$2"
            shift 2
            ;;
        --base)
            [ $# -ge 2 ] || { usage; exit 2; }
            CATALINA_BASE="$2"
            shift 2
            ;;
        --java-opt)
            [ $# -ge 2 ] || { usage; exit 2; }
            JAVA_EXTRA="${JAVA_EXTRA} $2"
            shift 2
            ;;
        --catalina-opt)
            [ $# -ge 2 ] || { usage; exit 2; }
            CATALINA_EXTRA="${CATALINA_EXTRA} $2"
            shift 2
            ;;
        --tomcat-command)
            [ $# -ge 2 ] || { usage; exit 2; }
            CMD="$2"
            shift 2
            ;;
        --help|-h)
            usage
            exit 0
            ;;
        -D*|-X*|-XX:*)
            JAVA_EXTRA="${JAVA_EXTRA} $1"
            shift
            ;;
        *)
            usage
            exit 2
            ;;
    esac
done

TOMCAT_SERVER=/usr/libexec/tomcat/server
CATALINA_HOME="${CATALINA_HOME:-/usr/share/tomcat}"
if [ ! -x "$TOMCAT_SERVER" ]; then
    echo "greenmail-webapp: unable to find /usr/libexec/tomcat/server" >&2
    echo "Install tomcat10 package." >&2
    exit 1
fi

mkdir -p \
    "$CATALINA_BASE/conf/Catalina/localhost" \
    "$CATALINA_BASE/logs" \
    "$CATALINA_BASE/temp" \
    "$CATALINA_BASE/work" \
    "$CATALINA_BASE/webapps"

for conf in \
    catalina.properties \
    logging.properties \
    web.xml \
    context.xml

do
    if [ ! -f "$CATALINA_BASE/conf/$conf" ] && \
       [ -f "$CATALINA_HOME/conf/$conf" ]; then
        cp -f "$CATALINA_HOME/conf/$conf" "$CATALINA_BASE/conf/$conf"
    fi
done

case "$CONTEXT_PATH" in
    /) CTX_FILE="ROOT.xml" ;;
    /*) CTX_FILE="${CONTEXT_PATH#/}.xml" ;;
    *)
        echo "greenmail-webapp: context path must start with /" >&2
        exit 2
        ;;
esac

cat > "$CATALINA_BASE/conf/server.xml" <<EOT
<Server port="$SHUTDOWN_PORT" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Connector
      port="$HTTP_PORT"
      address="$BIND_ADDR"
      protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost" appBase="webapps"
            autoDeploy="true" unpackWARs="true" />
    </Engine>
  </Service>
</Server>
EOT

cat > "$CATALINA_BASE/conf/Catalina/localhost/$CTX_FILE" <<EOT
<Context docBase="$WAR" />
EOT

if [ -n "${GREENMAIL_WEBAPP_JAVA_OPTS:-}" ]; then
    if [ -n "${JAVA_OPTS:-}" ]; then
        JAVA_OPTS="$JAVA_OPTS ${GREENMAIL_WEBAPP_JAVA_OPTS}"
    else
        JAVA_OPTS="${GREENMAIL_WEBAPP_JAVA_OPTS}"
    fi
fi

if [ -n "$JAVA_EXTRA" ]; then
    JAVA_EXTRA=${JAVA_EXTRA# }
    if [ -n "${JAVA_OPTS:-}" ]; then
        JAVA_OPTS="$JAVA_OPTS $JAVA_EXTRA"
    else
        JAVA_OPTS="$JAVA_EXTRA"
    fi
fi

if [ -n "${GREENMAIL_WEBAPP_CATALINA_OPTS:-}" ]; then
    if [ -n "${CATALINA_OPTS:-}" ]; then
        CATALINA_OPTS="$CATALINA_OPTS ${GREENMAIL_WEBAPP_CATALINA_OPTS}"
    else
        CATALINA_OPTS="${GREENMAIL_WEBAPP_CATALINA_OPTS}"
    fi
fi

if [ -n "$CATALINA_EXTRA" ]; then
    CATALINA_EXTRA=${CATALINA_EXTRA# }
    if [ -n "${CATALINA_OPTS:-}" ]; then
        CATALINA_OPTS="$CATALINA_OPTS $CATALINA_EXTRA"
    else
        CATALINA_OPTS="$CATALINA_EXTRA"
    fi
fi

export CATALINA_HOME CATALINA_BASE JAVA_OPTS CATALINA_OPTS

exec "$TOMCAT_SERVER" "$CMD"
