Удалённое включение компьютера бесплатно, без SMS и без облаков, с помощью Mikrotik Другая реализация

в 5:17, , рубрики: mikrotik, vake-on-lan, включить, разбудить, скрипт

Еще в далеком 2016 годуин Александр Корюкин @GeXoGeN реализовал интересный проект по удаленному включению домашнего компа. Ссылка на статью. Само направление мысли правильное, так как очень востребованное! Критику пропускаем и сразу переходим к рассмотрению другого варианта скрипта для удаленного включения компа.

Для начала сразу оговорюсь, скрипт подразумевает в себе минимализм, максимальную живучесть, простоту, скорость (и при этом не грузил процессор), возможность подать сигнал на любое количество компов, независимость от каких либо посредников в виде чат-ботов и др. сервисов, ну разве что кроме DDNS, гибкость, и не ломал аспекты безопасности. Для этого самым наилучшим способом на сегодняшний день вижу только контроль логов микротика. К тому же микротик позволяет их тонко настраивать и дополнять своими.

И так. Скрипт делался для многих других целей, но в данном случае обсуждаем именно включение компьютера.

В виду разъездной работы имеется под рукой только смартфон. Чтобы срочно заскочить на необходимой компьютер, я использую программу Кнокинга для прохождения фейс-контроля, многие для удобства сами могут запустить нужную программу типа того же Удаленного рабочего стола. Не буду разжевывать что за Кногинги, полистайте инет самостоятельно, если не знакомы с такой темой. Как только я прошел проверку свой-чужой, срабатывание NAT пишет событие в лог определенную запись:  мак-адрес компа на который идет перенаправление, с префиксом «mac:».  Этот префикс играет ключевую роль, именно ее скрипт ищет в логах.

Пример подключения на рабочий стол

Пример подключения на рабочий стол

В этом окне заносим и ip-адрес и мак компьютера. Соответственно ip-адрес должен быть в статике!

Чтобы скрипт среагировал максимально быстро, шедулер стартует его каждые 5 секунд (можно подобрать и большее время с регулировкой некоторый значений, но меньше 5 не имеет никакого смысла).

Далее разберем тело скрипта.

Необходимо просматривать небольшое количество ближайшего прошедшего времени. Не стал заморачиваться исчислением секунд, для простоты я использовал 2 команды:

:local X "$[:pic [/system clock get time ] 0 7 ]";

:local Y "$[:pic ([/system clock get time ] - 00:00:10 ) 0 7 ]";

Захватываю текущее время в переменные "X" и "Y", причем время Y убавляем на 10 секунд!, и пиканьем обрезаем последнюю цифру у обоих переменных. Для чего же это нужно? А необходимо это для команды "find", которая единственная умеет быстро искать что либо в логах, да еще с применением каких-никаких регулярок! (условие было простота, надежность, а главное скорость), и ядро получилось:

log find time~"$X|$Y"&&message~"^mac:"

Двойное условие времени необходимо для перехлеста времени, чтобы отловить запись в логе, которое появилось в самом конце десятках секунд или даже прошлой минуты (это такая слепая зона), и строка начиналась с префикса "mac:". Из-за перехлеста времени срабатывает несколько раз, но после включения компьютера лишние сигналы никак не влияют на работоспособность компа, поэтому можно забить на них. Строка целиком:

:foreach i in=[ log find time~"$X|$Y"&&message~"^mac:"] do={

Если есть совпадение, переменной " i " присваивается номер строки и далее выковыриваем из содержимого ( колонка Message ) в переменную "m" мак-адрес, указанный в лог-префиксе NAT-а :

:foreach m in="$[:pic [log get [ find .id="$i" ] value-name=message ] 4 21 ]" do={

А переменная "m" уже используется по прямому назначению:

:log warning "Включатель компов: $m";      :tool wol interface="bridge1" mac="$m"

Даже если появилось одновременно несколько записей в логе к примеру, на разные рабочие станции (ну так совпало) - всех отрабатывает корректно. Что необходимо для минимизации всяких ненужных нюансов ! Скрипт целиком выглядит так:

:local X "$[:pic [/system clock get time ] 0 7 ]";        :local Y "$[:pic ([/system clock get time ]  - 00:00:10 ) 0 7 ]";

:foreach i in=[ log find time~"$X|$Y"&&message~"^mac:"] do={:foreach m in="$[:pic [log get [ find .id="$i" ] value-name=message ] 4 21 ]" do={:log warning "Включатель компов: $m";      :tool wol interface="bridge1" mac="$m";}}};
и визуально

и визуально

Пример как это работает со смартфона

Стоит также упомянуть, что если у вас старенький / слабенький борд, для увеличения скорости имеет смысл убавить количество строк в логах. К примеру на RB951 рекомендую оставить не больше 300-500 строк. А бывалые микротофилы могут спокойно за автоматизировать настройку лог-префиксов для правил NAT! Но это уже другая история. Если кому пригодиться - дерзайте!

Автор: Diyk

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js