#!/bin/bash # Рабочая директория: /etc/NetworkManager/dispatcher.d/99-tailscale-resume.sh exec &> /tmp/tailscale-resume.log set -x INTERFACE="$1" ACTION="$2" # Игнорируем служебные и виртуальные интерфейсы if [[ "$INTERFACE" =~ ^(lo|tailscale|tun|tap|docker|veth) ]]; then exit 0 fi send_notification() { local icon="$1" local title="$2" local message="$3" USER_ID=$(ls /run/user/ | grep -E '^[0-9]+$' | head -n1) ACTIVE_USER=$(id -nu "$USER_ID" 2>/dev/null) if [ -n "$ACTIVE_USER" ]; then # Задержка для готовности DBus sleep 1 systemd-run --machine="${ACTIVE_USER}@.host" --user \ notify-send -i "$icon" "$title" "$message" fi } if [ "$ACTION" = "up" ]; then sleep 2 CURRENT_SSID=$(nmcli -t -f active,ssid dev wifi 2>/dev/null | grep '^yes:' | cut -d: -f2) # Сценарий 1: Сеть AirPort -> Принудительное отключение if [ "$CURRENT_SSID" = "AirPort" ]; then if tailscale status &>/dev/null || [ -f /run/tailscale-suspended ]; then tailscale down rm -f /run/tailscale-suspended send_notification "network-vpn-disconnected" "Tailscale" "Отключен (сеть AirPort)" fi exit 0 fi # Сценарий 2: Любая другая сеть -> Автоматическое подключение if ! tailscale status &>/dev/null; then if tailscale up; then rm -f /run/tailscale-suspended send_notification "network-vpn" "Tailscale" "Автоматически подключен" fi else # Если Tailscale уже был активен, просто очищаем маркер сна rm -f /run/tailscale-suspended fi fi