#!/bin/sh -e
#
# Opens captive portal page when internet is unreachable.

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LOCK_FILE="/run/captive-portal.lock"
LOCK_TIMEOUT=30   # секунд между повторным открытием окна

if [ -x "/usr/bin/logger" ]; then
  logger="/usr/bin/logger -s -t captive-portal"
else
  logger=":"
fi

# --- Проверка частоты запуска ---
should_run() {
    if [ -f "$LOCK_FILE" ]; then
        last=$(cat "$LOCK_FILE")
        now=$(date +%s)
        diff=$(( now - last ))

        if [ "$diff" -lt "$LOCK_TIMEOUT" ]; then
            $logger "Skipping: opened browser $diff seconds ago (diff=$diff)"
            return 1
        fi
    fi

    date +%s > "$LOCK_FILE"
    return 0
}

# --- Проверка интернета ---
check_internet() {
    ping -c1 -W1 1.1.1.1 >/dev/null 2>&1 && return 0
    curl -s --max-time 5 http://www.google.com >/dev/null 2>&1 && return 0
    return 1
}

# --- Открытие Captive—портала ---
open_captive() {
  user="$1"
  gateway=$(ip --oneline route get 1.1.1.1 | awk '{print $3}')
  captive_url="http://www.google.com"

  $logger "Trying captive portal URL: ${captive_url}"

  sudo -u "$user" env DISPLAY=:10 \
    DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u "$user")/bus \
    xdg-open "$captive_url"
}

case "$2" in
  up|dhcp4-change|connectivity-change)
    $logger "dispatcher: $2 event (connectivity=$CONNECTIVITY_STATE)"

    user=$(who | head -n1 | awk '{print $1}')
    if [ -z "$user" ]; then
        $logger -p user.err "No active user session, cannot open browser"
        exit 1
    fi

    # Не открываем слишком часто
    should_run || exit 0

    # Проверяем реальный интернет
    if check_internet; then
        $logger "Internet seems available, skipping captive portal"
        exit 0
    fi

    $logger "Internet unavailable, opening captive portal for '$user'"
    open_captive "$user" \
      || $logger -p user.err "Failed to launch captive portal for '$user'"
    ;;
  *)
    exit 0
    ;;
esac