Скрипт отправки сообщения при падении интерфейса...

Обсуждение ПО и его настройки
Аватара пользователя
Dragon_Knight
Сообщения: 1724
Зарегистрирован: 26 мар 2012, 18:21
Откуда: МО, Мытищи
Контактная информация:

Итак, нашлось время и желание попробовать написать что нибудь из первого поста. После нескольких часов .... родил следующее:
 Скрипт, вызывается каждые 10 секунд.

Код: Выделить всё

:local ParamInterfaceName "ISP-PPPoE-OPCOM";
:local ParamPingHost "8.8.8.8";
:local ParamPingCount 10;


:global LastInterfaceStatus;
:global LastAction;
:local DayTime do={
	:local tmptime [/system clock get value-name=time];
	:return (([:pick $tmptime 0 2] * 3600) + ([:pick $tmptime 3 5] * 60) + [:pick $tmptime 6 8]);
};
:local InterfaceStatus "Unknown";
:local PingStatus 0;
:local SMSString "Empty";
:local Action "None";

if ([$DayTime] >= 20400 && [$DayTime] <= 21600) do={
	# Nothing :)
} else={
	:set SMSString ("Test interface: " . $ParamInterfaceName);

	# Определяем состояние интерфейса (disabled, connected, disconnected, ...).
	/interface pppoe-client monitor [find name="$ParamInterfaceName"] once do={:set InterfaceStatus $status};

	# Основная логика.
	:if ($InterfaceStatus = "connected") do={
		:set SMSString ($SMSString . "\nInterface: Connected");
		
		# Проверяем доступность мира #
		:set PingStatus [ping count=$ParamPingCount interface=$ParamInterfaceName interval=100ms $ParamPingHost];
		:if ($PingStatus > 0) do={
			:if ($PingStatus = $ParamPingCount) do={
				:set SMSString ($SMSString . "\nPing: Ok");
			} else={
				:set SMSString ($SMSString . "\nPing: Unstable");
			}
		} else={
			:set SMSString ($SMSString . "\nPing: Failed");
		}
		# #
		
		:set Action "SMS";
		
	} else={
		:if ($InterfaceStatus = "disabled") do={
			# Nothing :)
		} else={
			:set SMSString ($SMSString . "\nInterface: Failed");
			:set Action "SMS";
		}
	}
	
	:if ($Action = "SMS" && $LastInterfaceStatus != $InterfaceStatus) do={
		# Отправляем SMS #
		:do {
			:log info ("/tool sms send port=usb3 phone-number=+79030000000 channel=3 message=$SMSString");
		} on-error={
			:log info "Send SMS: Error!";
		}
		# #
		:set LastInterfaceStatus $InterfaceStatus;
	}
}
Несколько комментариев:
1) "if ([$DayTime] >= 20400 && [$DayTime] <= 21600)" Таким методом я избавляюсь от ложных срабатываний, т.к. в период с 5:40 до 6:00 мой провайдер перезагружает своё оборудование. Переменная DayTime содержит кол-во секунд с начала дня.
2) Отправку смс временно загнал в лог, отладка...

Что можете сказать по коду, какие предложение по улучшению? :-):

PS> Когда допилем, выложу в паблик.


Небольшой свод правил логики и ссылок:
  1. Если устройство имеет Ethernet порт, то оно обязано быть подключено через него. Компьютер, Ноутбук, Телевизор, Принтер, Камера видеонаблюдения, и т.д.
  2. Если нет возможности протянуть кабель, то найдите её, или страдайте со своими проблемами Wi-Fi дальше.
  3. Wi-Fi это сеть для мобильных устройств. Если Вы подключили свой шикарный 50" телевизор не кабелем, то без фотоотчёта, когда он лежит у Вас в кармане дальнейшего разговора не получиться. Это относится и ко всем остальным устройствам.
  4. Если Ваше устройство вызывает вопросы в работе, первое что необходимо делать: NetInstall + дальнейшая настройка вручную.
  5. Не используйте WebFig или QuickSet - это пути к глюкам и ошибкам. Только SSH или WinBox, и да, - WinBox есть под Android.
  6. name.rsc - это текстовый файл, и Вы можете его открыть блокнотом.
  7. Если Вы хотите связаться со мной для ремонта или настройки, то: Telegram ( Не благотворительность ).
  8. Мой сайт по Mikrotik: Global Zone >> MikroTik.
Ответить