Add route management web interface

Prompts used since previous commit:
- Kun je ook een webinterface maken waarmee ik de regels kan beheren?
- Ik wil dat de webinterface benaderbaar is vanaf mijn hele interne netwerk. En ik wil alle regels kunnen beheren. Dus ook de bestaande ingebouwde routes.
- 1. basic auth
- 2. 4321

Special observations:
- Domain routes moved from Python source to domain_routes.json so the web UI can manage all previous built-in domain routes.
- web_config.json remains ignored; live sorter processes must be restarted after route edits to pick up changed rules.
This commit is contained in:
2026-07-05 00:19:53 +02:00
parent cfb96bc610
commit ae0813d519
8 changed files with 1462 additions and 308 deletions
+110 -3
View File
@@ -15,6 +15,8 @@ APP_USER="${APP_USER:-mailcat}"
SERVICE_NAME="${SERVICE_NAME:-mailcat-sort-backup}"
ACCOUNT="${ACCOUNT:-backup}"
DAILY_REPORT_TO="${DAILY_REPORT_TO:-hans@australius.nl}"
WEB_HOST="${WEB_HOST:-0.0.0.0}"
WEB_PORT="${WEB_PORT:-4321}"
REMOTE_PATH="${REMOTE_PATH:-/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin}"
SERVICE_MANAGER="${SERVICE_MANAGER:-systemd}"
MAILCAT_HOME="${MAILCAT_HOME:-/share/homes/$APP_USER}"
@@ -40,12 +42,16 @@ if [ "$SERVICE_MANAGER" = "plain" ]; then
LOG_DIR="${LOG_DIR:-$APP_DIR/log}"
RUN_DIR="${RUN_DIR:-$APP_DIR/run}"
PID_FILE="${PID_FILE:-$RUN_DIR/mailcat.pid}"
WEB_PID_FILE="${WEB_PID_FILE:-$RUN_DIR/mailcat_web.pid}"
WEB_CONFIG="${WEB_CONFIG:-$APP_DIR/web_config.json}"
PYTHON="${PYTHON:-/opt/bin/python3}"
else
STATE_DIR="${STATE_DIR:-/var/lib/mailcat}"
LOG_DIR="${LOG_DIR:-/var/log/mailcat}"
RUN_DIR="${RUN_DIR:-/run/mailcat}"
PID_FILE="${PID_FILE:-$RUN_DIR/mailcat.pid}"
WEB_PID_FILE="${WEB_PID_FILE:-$RUN_DIR/mailcat_web.pid}"
WEB_CONFIG="${WEB_CONFIG:-$APP_DIR/web_config.json}"
PYTHON="${PYTHON:-/usr/bin/python3}"
fi
@@ -64,6 +70,7 @@ tar \
--exclude "__pycache__" \
--exclude "mailbox" \
--exclude "config.json" \
--exclude "web_config.json" \
--exclude "*.log" \
--exclude "backup_log.json" \
--exclude "verplaats_log*.json" \
@@ -118,6 +125,11 @@ APP_GROUP="$(id -gn "$APP_USER")"
if [ ! -f "$APP_DIR/config.json" ]; then
echo "Missing $APP_DIR/config.json on remote host. Create it with mode 600 before starting the service." >&2
fi
"$SUDO" "$CHMOD" 600 "$APP_DIR/web_config.json" 2>/dev/null || true
"$SUDO" "$CHOWN" "$APP_USER:$APP_GROUP" "$APP_DIR/web_config.json" 2>/dev/null || true
if [ ! -f "$APP_DIR/web_config.json" ]; then
echo "Missing $APP_DIR/web_config.json on remote host. Create it with mode 600 before starting the web UI." >&2
fi
"$SUDO" "$CHMOD" 600 "$APP_DIR/config.json" 2>/dev/null || true
"$SUDO" "$CHOWN" "$APP_USER:$APP_GROUP" "$APP_DIR/config.json" 2>/dev/null || true
@@ -218,12 +230,105 @@ cd "\$APP_DIR"
"\$PYTHON" "\$APP_DIR/dagelijks_overzicht.py" --account "\$ACCOUNT" --mail-to "\$MAIL_TO" >> "\$LOG_DIR/daily_report.out" 2>&1
REPORT_SCRIPT
cat > /tmp/mailcat-web-start.sh <<WEB_START_SCRIPT
#!/bin/sh
set -eu
APP_DIR="$APP_DIR"
PYTHON="$PYTHON"
LOG_DIR="$LOG_DIR"
RUN_DIR="$RUN_DIR"
WEB_PID_FILE="$WEB_PID_FILE"
WEB_HOST="$WEB_HOST"
WEB_PORT="$WEB_PORT"
WEB_CONFIG="$WEB_CONFIG"
MKDIR="$MKDIR"
if [ ! -f "\$WEB_CONFIG" ]; then
echo "missing web config: \$WEB_CONFIG"
exit 1
fi
"\$MKDIR" -p "\$LOG_DIR" "\$RUN_DIR"
if [ -f "\$WEB_PID_FILE" ]; then
old_pid=""
IFS= read -r old_pid < "\$WEB_PID_FILE" || true
if [ -n "\$old_pid" ] && kill -0 "\$old_pid" 2>/dev/null; then
echo "mailcat web already running: \$old_pid"
exit 0
fi
fi
cd "\$APP_DIR"
"\$PYTHON" "\$APP_DIR/manage_routes_web.py" --host "\$WEB_HOST" --port "\$WEB_PORT" --config "\$WEB_CONFIG" >> "\$LOG_DIR/web.out" 2>&1 &
pid="\$!"
echo "\$pid" > "\$WEB_PID_FILE"
echo "mailcat web started: \$pid"
WEB_START_SCRIPT
cat > /tmp/mailcat-web-stop.sh <<WEB_STOP_SCRIPT
#!/bin/sh
set -eu
WEB_PID_FILE="$WEB_PID_FILE"
RM="$RM"
if [ ! -f "\$WEB_PID_FILE" ]; then
echo "mailcat web not running: no pid file"
exit 0
fi
pid=""
IFS= read -r pid < "\$WEB_PID_FILE" || true
if [ -z "\$pid" ]; then
"\$RM" -f "\$WEB_PID_FILE"
echo "mailcat web not running: empty pid file removed"
exit 0
fi
if kill -0 "\$pid" 2>/dev/null; then
kill "\$pid"
sleep 2
if kill -0 "\$pid" 2>/dev/null; then
echo "mailcat web still running after SIGTERM: \$pid"
exit 1
fi
fi
"\$RM" -f "\$WEB_PID_FILE"
echo "mailcat web stopped"
WEB_STOP_SCRIPT
cat > /tmp/mailcat-web-status.sh <<WEB_STATUS_SCRIPT
#!/bin/sh
set -eu
WEB_PID_FILE="$WEB_PID_FILE"
WEB_HOST="$WEB_HOST"
WEB_PORT="$WEB_PORT"
LOG_DIR="$LOG_DIR"
if [ -f "\$WEB_PID_FILE" ]; then
pid=""
IFS= read -r pid < "\$WEB_PID_FILE" || true
if [ -n "\$pid" ] && kill -0 "\$pid" 2>/dev/null; then
echo "mailcat web running: \$pid"
echo "url: http://\$WEB_HOST:\$WEB_PORT/"
exit 0
fi
echo "mailcat web not running: stale pid file (\$pid)"
exit 1
fi
echo "mailcat web not running"
echo "logs: \$LOG_DIR/web.out"
exit 1
WEB_STATUS_SCRIPT
"$SUDO" "$INSTALL" -m 0755 /tmp/mailcat-start.sh "$APP_DIR/bin/start_mailcat.sh"
"$SUDO" "$INSTALL" -m 0755 /tmp/mailcat-stop.sh "$APP_DIR/bin/stop_mailcat.sh"
"$SUDO" "$INSTALL" -m 0755 /tmp/mailcat-status.sh "$APP_DIR/bin/status_mailcat.sh"
"$SUDO" "$INSTALL" -m 0755 /tmp/mailcat-daily-report.sh "$APP_DIR/bin/run_daily_report.sh"
"$SUDO" "$CHOWN" "$APP_USER:$APP_GROUP" "$APP_DIR/bin/start_mailcat.sh" "$APP_DIR/bin/stop_mailcat.sh" "$APP_DIR/bin/status_mailcat.sh" "$APP_DIR/bin/run_daily_report.sh"
"$RM" -f /tmp/mailcat-start.sh /tmp/mailcat-stop.sh /tmp/mailcat-status.sh /tmp/mailcat-daily-report.sh
"$SUDO" "$INSTALL" -m 0755 /tmp/mailcat-web-start.sh "$APP_DIR/bin/start_web.sh"
"$SUDO" "$INSTALL" -m 0755 /tmp/mailcat-web-stop.sh "$APP_DIR/bin/stop_web.sh"
"$SUDO" "$INSTALL" -m 0755 /tmp/mailcat-web-status.sh "$APP_DIR/bin/status_web.sh"
"$SUDO" "$CHOWN" "$APP_USER:$APP_GROUP" "$APP_DIR/bin/start_mailcat.sh" "$APP_DIR/bin/stop_mailcat.sh" "$APP_DIR/bin/status_mailcat.sh" "$APP_DIR/bin/run_daily_report.sh" "$APP_DIR/bin/start_web.sh" "$APP_DIR/bin/stop_web.sh" "$APP_DIR/bin/status_web.sh"
"$RM" -f /tmp/mailcat-start.sh /tmp/mailcat-stop.sh /tmp/mailcat-status.sh /tmp/mailcat-daily-report.sh /tmp/mailcat-web-start.sh /tmp/mailcat-web-stop.sh /tmp/mailcat-web-status.sh
else
"$SUDO" "$INSTALL" -m 0644 "$APP_DIR/systemd/mailcat-sort.service" "/etc/systemd/system/$SERVICE_NAME.service"
"$SUDO" "$SED" -i \
@@ -247,6 +352,8 @@ if [ "$SERVICE_MANAGER" = "plain" ]; then
echo " sudo -u $APP_USER $APP_DIR/bin/start_mailcat.sh"
echo " sudo -u $APP_USER $APP_DIR/bin/status_mailcat.sh"
echo " sudo -u $APP_USER $APP_DIR/bin/run_daily_report.sh"
echo " sudo -u $APP_USER $APP_DIR/bin/start_web.sh"
echo " sudo -u $APP_USER $APP_DIR/bin/status_web.sh"
echo " tail -f $LOG_DIR/sort_mail_daemon.log"
else
echo " sudo systemctl start $SERVICE_NAME.service"
@@ -257,5 +364,5 @@ REMOTE
scp "$ARCHIVE" "$REMOTE_USER@$REMOTE_HOST:/tmp/mailcat-deploy.tar.gz"
scp "$REMOTE_SCRIPT" "$REMOTE_USER@$REMOTE_HOST:/tmp/mailcat-remote-deploy.sh"
REMOTE_COMMAND=$(printf "APP_USER=%q APP_DIR=%q SERVICE_NAME=%q ACCOUNT=%q DAILY_REPORT_TO=%q REMOTE_PATH=%q SERVICE_MANAGER=%q MAILCAT_HOME=%q STATE_DIR=%q LOG_DIR=%q RUN_DIR=%q PID_FILE=%q PYTHON=%q SUDO=%q USERADD=%q INSTALL=%q SED=%q TAR=%q MKDIR=%q CHOWN=%q CHMOD=%q RM=%q SYSTEMCTL=%q /bin/sh /tmp/mailcat-remote-deploy.sh" "$APP_USER" "$APP_DIR" "$SERVICE_NAME" "$ACCOUNT" "$DAILY_REPORT_TO" "$REMOTE_PATH" "$SERVICE_MANAGER" "$MAILCAT_HOME" "$STATE_DIR" "$LOG_DIR" "$RUN_DIR" "$PID_FILE" "$PYTHON" "$SUDO" "$USERADD" "$INSTALL" "$SED" "$TAR" "$MKDIR" "$CHOWN" "$CHMOD" "$RM" "$SYSTEMCTL")
REMOTE_COMMAND=$(printf "APP_USER=%q APP_DIR=%q SERVICE_NAME=%q ACCOUNT=%q DAILY_REPORT_TO=%q WEB_HOST=%q WEB_PORT=%q REMOTE_PATH=%q SERVICE_MANAGER=%q MAILCAT_HOME=%q STATE_DIR=%q LOG_DIR=%q RUN_DIR=%q PID_FILE=%q WEB_PID_FILE=%q WEB_CONFIG=%q PYTHON=%q SUDO=%q USERADD=%q INSTALL=%q SED=%q TAR=%q MKDIR=%q CHOWN=%q CHMOD=%q RM=%q SYSTEMCTL=%q /bin/sh /tmp/mailcat-remote-deploy.sh" "$APP_USER" "$APP_DIR" "$SERVICE_NAME" "$ACCOUNT" "$DAILY_REPORT_TO" "$WEB_HOST" "$WEB_PORT" "$REMOTE_PATH" "$SERVICE_MANAGER" "$MAILCAT_HOME" "$STATE_DIR" "$LOG_DIR" "$RUN_DIR" "$PID_FILE" "$WEB_PID_FILE" "$WEB_CONFIG" "$PYTHON" "$SUDO" "$USERADD" "$INSTALL" "$SED" "$TAR" "$MKDIR" "$CHOWN" "$CHMOD" "$RM" "$SYSTEMCTL")
ssh -tt "$REMOTE_USER@$REMOTE_HOST" "$REMOTE_COMMAND"