network v0.4.2 [extra]


Модуль проверки локальной сети

README

# network

Карта домашней сети: кто онлайн, кто новый, кто пропал.

Тип: Модуль. Категория: `extra`. Зависимости: системный `nmap` (сканирование выполняется внешними вызовами `nmap`; без него модуль не видит устройства), pip-пакет `python-telegram-bot` (кнопки и диалоги в Telegram; пин версии — как у транспорта).
## Описание
Глаза бота в локальной сети (например, `192.168.0.0/24`).

Модуль периодически обходит сеть сканером и ведёт карту устройств: сверяет свежий обход с кешем и докладывает о четырёх событиях — новое устройство, переподключение, отключение и смена IP. Устройство считается пропавшим только после нескольких пропусков подряд, так что случайный пропуск одного обхода тревогу не поднимает. Мелкие повторы уведомлений склеиваются в одно сообщение за окно агрегации.

Про каждое устройство копятся статистика появлений и список открытых портов. Человеческие имена подписываются вручную — и из Telegram, и из веба. Знакомые MAC-адреса (свои устройства, которые неинтересны) складываются в игнор-лист и больше не шумят.

Модуль поддерживает подключение дополнительных источников данных через `register_monitor`: любой источник, умеющий периодически отдавать наблюдения, встраивается в ту же карту и те же уведомления. Длинные списки в Telegram режутся на чанки по 3000 символов.
## Возможности
- `scanner` `{}` → движок сканирования (кеш устройств)
- `cache_file` `{}` → путь кеша устройств
- `ignored_file` `{}` → путь игнор-листа
- `devices_snapshot` `{}` → `{total, online, devices[]}` — обогащённый снимок для мониторинга
- `register_monitor` `{name, factory, interval_s, type, silent}` → плагин доп. источника
## Права
- `nmap_manage` — Сканер сети (GET/POST /api/admin/nmap*)
- `receive_notifications_nmap` — Уведомления сканера сети (новые/потерянные устройства)
- `receive_notifications_nmap_edit` — Право менять себе уведомления сканера сети
## Telegram
- кнопка «📡 Сканирование» → меню, постраничные списки устройств и статистики (просмотр — право `view_net_status`, изменения — `nmap_manage`)
- переименование устройств диалогом (`net_setname` / `nmap_setname`)
## Web
- `GET /api/network/devices` — устройства для мониторинга
- `GET /api/admin/nmap` — устройства + игнор-лист
- `POST /api/admin/nmap/name` — подписать имя `{mac, name}`
- `POST /api/admin/nmap/ignore` — игнор `{action: add|remove, mac}`
- `POST /api/network/nmap/delete` — удалить устройство (только веб, в TG удаления нет)
- карточка «Сканер сети»
## События шины
- излучает `network.device_new`, `network.device_reconnected`, `network.device_disconnected`, `network.device_ip_changed` (по одному на устройство)
## Конфигурация (`config.schema.json`)
- обязательных нет; опциональные (дефолты):
  - `SCAN_NETWORK_RANGE` = `10.10.10.0/24` — диапазон сканирования (задайте свою подсеть)
  - `SCAN_ENABLED` = `1` — фоновый обход сети (`0` — только кеш/веб/мониторы, без скана)
  - `CHECK_DURATION_NSCAN_LONG` = `30` — длинный цикл (пауза между обходами), сек
  - `CHECK_DURATION_NSCAN_FAST` = `5` — быстрый цикл (мониторы доп. источников), сек
  - `DEBOUNCE_COUNT` = `2` — пропусков подряд до «пропал» (nmap + пинг)
  - `AGGREGATION_INTERVAL` = `300` — окно склейки мелких уведомлений, сек
  - `AGGREGATION_MAX_CHARS` = `3500` — лимит склеенного текста
  - `NOTIF_MAX_RETRIES` = `3` — ретраи уведомлений
  - `NOTIF_RETRY_BACKOFF` = `1.5` — backoff ретраев
  - `NOTIF_CHUNK_LIMIT` = `3000` — чанки TG (потолок Telegram 4096)
  - `SCAN_NMAP_BIN` = `nmap` — бинарник сканера
  - `SCAN_TIMING` = `-T4` — темп обхода (`-T0`…`-T5`; мусор → `-T4`)
  - `SCAN_PRIVILEGED` = `1` — `--privileged` (ARP-скан; без root падает на `-T` connect)
  - `SCAN_EXTRA_ARGS` = `` — доп. аргументы обхода (напр. `--min-rate 50`)
  - `SCAN_TIMEOUT_S` = `300` — потолок одного обхода, сек (10…3600)
  - `PORTSCAN_ENABLED` = `1` — портскан новых/вернувшихся (`0` — не сканировать порты)
  - `PORTSCAN_PORTS` = `-p-` — какие порты (напр. `--top-ports 1000` вместо всех 65535)
  - `PORTSCAN_TIMING` = `-T5` — темп портскана
  - `PORTSCAN_TIMEOUT_S` = `600` — потолок портскана одного IP, сек (10…7200)
  - `PING_BIN` = `ping`, `PING_COUNT` = `10` (1…100), `PING_TIMEOUT_S` = `20` (1…300) — перепроверка пропавших
  - `NET_TG_PAGE` = `8` — строк на страницу TG-списков (1…50)
  - `SCAN_STOP_TIMEOUT_S` = `10` — ожидание потоков при останове, сек
  - `MONITOR_MIN_INTERVAL_S` = `5`, `MONITOR_MAX_INTERVAL_S` = `86400` — клампы `register_monitor`
## Как сканирует (безопасность)
- Обход: `nmap -sn` — только discovery (ARP/ICMP/TCP-пинг хостов своей подсети, порты не трогает). Безопасно и тихо: ~десятки пакетов на хост раз в `CHECK_DURATION_NSCAN_LONG`. Требует `cap_net_raw` у nmap (ставит `install.sh` через setcap) — иначе нет MAC-адресов.
- Хосты без MAC (скан без привилегий) сохраняются под ключом `ip:<адрес>` + warning в лог (раньше молча выбрасывались). Игнор-лист и кнопки переименования для них недоступны (не к чему привязать).
- Один MAC может отвечать с нескольких IP (алиасы на одном NIC). Устройство в кеше одно, все его адреса лежат в `ips`, основной — в `ip`; основной не меняется, пока виден в обходе (иначе у мульти-IP хоста каждые 60 с прыгал бы адрес и летели ложные `ip_changed`).
- Пропавшие перепроверяются `ping -c N` перед признанием «отключён» + `DEBOUNCE_COUNT` пропусков — ложных срабатываний нет.
- Портскан (`-p-`, все 65535) — только для новых и переподключившихся устройств, один раз, в фоне. Самый шумный кусок: при желании ужмите до `PORTSCAN_PORTS=--top-ports 1000` или выключите `PORTSCAN_ENABLED=0` (карта устройств продолжит работать).

Манифест

{
  "name": "network",
  "version": "0.4.2",
  "category": "extra",
  "description": "Сеть: сканер устройств, WireGuard/Guacamole/fail2ban-мониторы, MAC-блокировки, сниффер.",
  "requires": [],
  "rights": [],
  "api_methods": [],
  "web_routes": [],
  "commit": "1dd562644e15cbec55e0adf11138168dfb690b6c",
  "updated": "2026-10-20 10:00:45 +0300",
  "history": [
    {
      "version": "0.1.0",
      "date": "2026-09-08 09:46:42 +0300",
      "commit": "5c758d465ca4dd3e1541909f2b685dc5c5424246"
    },
    {
      "version": "0.2.0",
      "date": "2026-09-11 10:24:38 +0300",
      "commit": "1fa8180d936fbda6caa5efa0841f338fe2e569b1"
    },
    {
      "version": "0.3.0",
      "date": "2026-09-11 10:41:03 +0300",
      "commit": "f645c6d24b4da92aba8e00156457b0c440f85d2b"
    },
    {
      "version": "0.3.1",
      "date": "2026-09-12 23:22:16 +0300",
      "commit": "db9c47f797b3a96a29b646f86025a87d1eb4d645"
    },
    {
      "version": "0.3.2",
      "date": "2026-09-14 00:47:42 +0300",
      "commit": "e8d36b3d51166a6c1dd13c3eb72f48cdbb7956d2"
    },
    {
      "version": "0.3.3",
      "date": "2026-09-14 00:56:05 +0300",
      "commit": "c7ba9a668eae7e30625afcad5cecb5b5931575fe"
    },
    {
      "version": "0.3.4",
      "date": "2026-09-14 08:54:17 +0300",
      "commit": "c515a4348823477dacf1fa00732253ffeabc4184"
    },
    {
      "version": "0.3.5",
      "date": "2026-09-14 09:04:12 +0300",
      "commit": "c5b660a598e65f542b8b4a3355354f660e0cb8c1"
    },
    {
      "version": "0.3.6",
      "date": "2026-09-14 09:08:22 +0300",
      "commit": "42a3a7207dcdee1f174e2a239a39861f6b5626e7"
    },
    {
      "version": "0.3.7",
      "date": "2026-09-14 09:14:29 +0300",
      "commit": "dd208f5dd4618bea5f2134a82ceb3a4577385c43"
    },
    {
      "version": "0.3.8",
      "date": "2026-09-14 20:00:53 +0300",
      "commit": "ff34f9c62413b043289a8c7b8151c3218e342695"
    },
    {
      "version": "0.3.9",
      "date": "2026-09-17 09:30:25 +0300",
      "commit": "47801cc7f98e5d02856f09e224f586aba5c5d256"
    },
    {
      "version": "0.4.0",
      "date": "2026-10-10 17:04:21 +0300",
      "commit": "078a7e70690791b0ea66f0766ef14e9d2d293b25"
    },
    {
      "version": "0.4.1",
      "date": "2026-10-12 17:08:48 +0300",
      "commit": "0e7068e27ad93ead45ee753e9090ed49feda5f64"
    },
    {
      "version": "0.4.2",
      "date": "2026-10-20 09:52:13 +0300",
      "commit": "64de3fc47719b23104a604b82be07693fc583a95"
    }
  ],
  "integrity": "sha256:747755c01ac0a0690d33ef46de41340c0612d7d944c687cc08a28ee1d4eca440",
  "files": "[13 файлов — см. вкладки ниже]",
  "note": "Модуль проверки локальной сети",
  "wdesc": "",
  "wbody": "",
  "_extra": {
    "api": "",
    "events_emitted": "",
    "events_subscribed": "[]",
    "audit_allow": "",
    "uses_rights": "",
    "shared_routes": "",
    "config_schema": "config.schema.json",
    "env_example": ".env.example"
  }
}

Файлы и исходники

Дерево файлов

  • · корень
    • 8.2 КБ
    • 4.4 КБ
    • 0.8 КБ
    • 2.3 КБ
    • 9.9 КБ
    • 0.2 КБ
    • 33.5 КБ
    • 5.6 КБ
    • 15.5 КБ
    • 1.2 КБ
    • 4.4 КБ
  • web/
    • 1.1 КБ
    • 6.1 КБ

Предпросмотр

Выберите файл в дереве выше — код откроется здесь.

История версий

versiondatecommit
0.4.22026-10-2064de3fc47719
0.4.12026-10-120e7068e27ad9
0.4.02026-10-10078a7e706907
0.3.92026-09-1747801cc7f98e
0.3.82026-09-14ff34f9c62413
0.3.72026-09-14dd208f5dd461
0.3.62026-09-1442a3a7207dcd
0.3.52026-09-14c5b660a598e6
0.3.42026-09-14c515a4348823
0.3.32026-09-14c7ba9a668eae
0.3.22026-09-14e8d36b3d5116
0.3.12026-09-12db9c47f797b3
0.3.02026-09-11f645c6d24b4d
0.2.02026-09-111fa8180d936f
0.1.02026-09-085c758d465ca4