#!/bin/sh set -eu BASE_DIR="/usr/local/hitme_plugins/global-autoresponders" STATE_FILE="$BASE_DIR/config/backend-state.json" PLUGIN_DIR="/usr/local/directadmin/plugins/global-autoresponder" CUSTOM_DIR="/usr/local/directadmin/custombuild/custom/exim" CUSTOM_CONF="$CUSTOM_DIR/exim.conf" SOURCE_CONF="/usr/local/directadmin/custombuild/configure/exim/exim.conf" ROUTER_SNIPPET="$PLUGIN_DIR/scripts/exim/global_autoresponder_router.conf" TRANSPORT_SNIPPET="$PLUGIN_DIR/scripts/exim/global_autoresponder_transport.conf" ROLLBACK_ACTIVE=0 ROLLBACK_CREATED=0 ROLLBACK_REBUILD=0 ROLLBACK_FILE= usage() { echo "Usage: scripts/backend.sh da|exim" >&2 } if [ "${1:-}" != "da" ] && [ "${1:-}" != "exim" ]; then usage exit 2 fi mkdir -p "$BASE_DIR/config" "$BASE_DIR/data" "$BASE_DIR/state" "$BASE_DIR/logs" chmod 700 "$BASE_DIR/config" "$BASE_DIR/logs" write_state() { backend="$1" printf '{"active_backend":"%s","migration_status":"complete"}\n' "$backend" > "$STATE_FILE" chmod 600 "$STATE_FILE" } remove_marked_block() { marker="$1" file="$2" tmp="${file}.global-autoresponder.$$" awk -v marker="$marker" ' $0 == "# BEGIN global-autoresponder " marker { skip=1; next } $0 == "# END global-autoresponder " marker { skip=0; next } skip != 1 { print } ' "$file" > "$tmp" mv "$tmp" "$file" } insert_after_section() { section="$1" snippet="$2" file="$3" tmp="${file}.global-autoresponder.$$" if ! awk -v section="$section" -v snippet="$snippet" ' BEGIN { while ((getline line < snippet) > 0) { block = block line "\n" } close(snippet) } { print } $0 == section && inserted != 1 { printf "\n%s\n", block inserted = 1 } END { if (inserted != 1) { exit 3 } } ' "$file" > "$tmp"; then rm -f "$tmp" echo "Cannot install exim backend: section $section not found in custom exim.conf." >&2 exit 1 fi mv "$tmp" "$file" } backup_custom_conf() { mkdir -p "$CUSTOM_DIR" ROLLBACK_FILE="${CUSTOM_CONF}.global-autoresponder.backup.$$" if [ -f "$CUSTOM_CONF" ]; then cp "$CUSTOM_CONF" "$ROLLBACK_FILE" ROLLBACK_CREATED=0 else : > "$ROLLBACK_FILE" ROLLBACK_CREATED=1 fi ROLLBACK_ACTIVE=1 } restore_custom_conf() { if [ "$ROLLBACK_ACTIVE" != "1" ]; then return fi set +e if [ "$ROLLBACK_CREATED" = "1" ]; then rm -f "$CUSTOM_CONF" else cp "$ROLLBACK_FILE" "$CUSTOM_CONF" fi rm -f "$ROLLBACK_FILE" if [ "$ROLLBACK_REBUILD" = "1" ]; then rebuild_and_reload_exim >/dev/null 2>&1 fi ROLLBACK_ACTIVE=0 } commit_custom_conf() { rm -f "$ROLLBACK_FILE" ROLLBACK_ACTIVE=0 ROLLBACK_CREATED=0 ROLLBACK_REBUILD=0 } trap 'restore_custom_conf' EXIT trap 'restore_custom_conf; exit 1' HUP INT TERM validate_exim_conf() { if command -v exim >/dev/null 2>&1; then exim -C "$CUSTOM_CONF" -bV >/dev/null elif command -v exim4 >/dev/null 2>&1; then exim4 -C "$CUSTOM_CONF" -bV >/dev/null else echo "Cannot validate exim backend: exim binary not found." >&2 exit 1 fi } rebuild_and_reload_exim() { if command -v da >/dev/null 2>&1; then da build exim_conf elif [ -x /usr/local/directadmin/custombuild/build ]; then /usr/local/directadmin/custombuild/build exim_conf else echo "Cannot rebuild exim configuration: da/build command not found." >&2 exit 1 fi if command -v systemctl >/dev/null 2>&1; then systemctl reload exim 2>/dev/null || systemctl restart exim else service exim reload 2>/dev/null || service exim restart fi } if [ "$1" = "da" ]; then if [ -f "$CUSTOM_CONF" ]; then backup_custom_conf remove_marked_block "router" "$CUSTOM_CONF" remove_marked_block "transport" "$CUSTOM_CONF" if grep -Fq "global_autoresponder_" "$CUSTOM_CONF"; then echo "Cannot switch to da: plugin Exim markers were not removed cleanly." >&2 exit 1 fi validate_exim_conf ROLLBACK_REBUILD=1 rebuild_and_reload_exim commit_custom_conf fi write_state "da" echo "Backend set to da" exit 0 fi if [ ! -d "$(dirname "$SOURCE_CONF")" ]; then echo "Cannot enable exim backend: DirectAdmin CustomBuild exim source config not found." >&2 exit 1 fi if [ ! -f "$ROUTER_SNIPPET" ] || [ ! -f "$TRANSPORT_SNIPPET" ]; then echo "Cannot enable exim backend: plugin Exim snippets are missing." >&2 exit 1 fi backup_custom_conf if [ ! -f "$CUSTOM_CONF" ]; then cp "$SOURCE_CONF" "$CUSTOM_CONF" fi remove_marked_block "router" "$CUSTOM_CONF" remove_marked_block "transport" "$CUSTOM_CONF" insert_after_section "begin routers" "$ROUTER_SNIPPET" "$CUSTOM_CONF" insert_after_section "begin transports" "$TRANSPORT_SNIPPET" "$CUSTOM_CONF" validate_exim_conf ROLLBACK_REBUILD=1 rebuild_and_reload_exim commit_custom_conf write_state "exim" echo "Backend set to exim"