Уведомления о потере интернета
Парадокс: если дома пропал интернет, веб-сервис уведомлений не сможет ничего прислать. Решение — отправлять с другого устройства: NAS, Raspberry Pi с LTE-модемом, рабочий ноутбук с активной мобильной сетью.
Что мы будем делать
Заголовок раздела «Что мы будем делать»- На независимом устройстве (с собственным резервным каналом — LTE/4G свистком, мобильной точкой) запустим скрипт-watchdog.
- Он каждую минуту пытается достучаться до домашнего сервера / роутера
и до внешнего хоста (например,
1.1.1.1). - На переходе состояния шлёт в Notifly.
Скрипт notifly-net-check
Заголовок раздела «Скрипт notifly-net-check»#!/usr/bin/env bashset -euset -a; source /etc/notifly.env; set +a
HOME_HOST="192.168.1.1" # домашний роутерWAN_HOST="1.1.1.1" # внешний контрольSTATE=/var/lib/notifly-net.state
ping_ok() { ping -c1 -W2 "$1" >/dev/null 2>&1; }
if ping_ok "$WAN_HOST" && ping_ok "$HOME_HOST"; then NOW=ALL_OKelif ping_ok "$WAN_HOST" && ! ping_ok "$HOME_HOST"; then NOW=HOME_DOWNelif ! ping_ok "$WAN_HOST" && ping_ok "$HOME_HOST"; then NOW=WAN_DOWNelse NOW=ALL_DOWNfi
PREV=$(cat "$STATE" 2>/dev/null || echo ALL_OK)if [[ "$NOW" != "$PREV" ]]; then case "$NOW" in ALL_OK) TITLE="✅ Интернет восстановлен"; PRI=4 ;; WAN_DOWN) TITLE="⚠️ Нет внешнего интернета"; PRI=7 ;; HOME_DOWN) TITLE="⚠️ Дом не отвечает"; PRI=8 ;; ALL_DOWN) TITLE="🔥 Всё лежит"; PRI=10 ;; esac curl -fsS -X POST "$NOTIFLY_URL/message?token=$NOTIFLY_TOKEN" \ -H "Content-Type: application/json" \ -d "$(jq -n --arg t "$TITLE" \ --arg m "Состояние: $NOW (было $PREV)" \ --argjson p "$PRI" \ '{title:$t, message:$m, priority:$p}')" >/dev/nullfiecho "$NOW" > "$STATE"Cron каждую минуту:
* * * * * /usr/local/bin/notifly-net-checkАльтернатива: проверка с телефона/ноутбука
Заголовок раздела «Альтернатива: проверка с телефона/ноутбука»Если нет отдельного устройства, можно настроить watchdog на рабочем ноутбуке — он почти всегда подключён к мобильной точке:
# проверяет роутер дома и шлёт push, если пять минут подряд молчитCOUNT=0while true; do if ping -c1 -W2 home.duckdns.org >/dev/null 2>&1; then COUNT=0 else COUNT=$((COUNT+1)) if (( COUNT == 5 )); then notifly-send "⚠️ Дом не пингуется 5 минут" "" 7 fi fi sleep 60doneWindows: PowerShell + Test-Connection
Заголовок раздела «Windows: PowerShell + Test-Connection»Если в роли watchdog-а — рабочий Windows-ноутбук с мобильным интернетом.
Предполагается настроенная функция Send-Notifly.
. $env:USERPROFILE\Documents\WindowsPowerShell\Notifly.ps1
$HomeHost = "192.168.1.1"$WanHost = "1.1.1.1"$State = "$env:LOCALAPPDATA\notifly-net.state"
function Ping-Ok($h) { return Test-Connection -ComputerName $h -Count 1 -Quiet -TimeoutSeconds 2}
$wanOk = Ping-Ok $WanHost$homeOk = Ping-Ok $HomeHost
$now = if ($wanOk -and $homeOk) { "ALL_OK" } elseif ($wanOk -and -not $homeOk) { "HOME_DOWN" } elseif (-not $wanOk -and $homeOk) { "WAN_DOWN" } else { "ALL_DOWN" }
$prev = if (Test-Path $State) { Get-Content $State -Raw } else { "ALL_OK" }$prev = $prev.Trim()
if ($now -ne $prev) { $info = switch ($now) { "ALL_OK" { @{ Title = "✅ Интернет восстановлен"; Pri = 4 } } "WAN_DOWN" { @{ Title = "⚠️ Нет внешнего интернета"; Pri = 7 } } "HOME_DOWN" { @{ Title = "⚠️ Дом не отвечает"; Pri = 8 } } "ALL_DOWN" { @{ Title = "🔥 Всё лежит"; Pri = 10 } } } Send-Notifly -Title $info.Title -Message "Состояние: $now (было $prev)" -Priority $info.Pri}$now | Set-Content $StateРасписание каждую минуту:
$Action = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File C:\scripts\Notifly-Net-Check.ps1"$Trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) ` -RepetitionInterval (New-TimeSpan -Minutes 1)Register-ScheduledTask -TaskName "Notifly Net Check" -Action $Action -Trigger $Trigger- Узнаёте о падении до того, как заметите соцсети без новостей.
- Особенно ценно для домашнего сервера / NAS: вы за городом, дома вырубили свет, NAS уже стоит в офлайне — а вы получили push сразу.
- Можно интегрировать с UPS: при переходе на батарею слать сообщение с расчётом «времени до отключения».
Что улучшить дальше
Заголовок раздела «Что улучшить дальше»- Подвязать UPS-демон (
apcupsd,nut) — push о переходе на батарею. - Прикладывать
mtr-вывод до проблемного узла.