Страница 2 из 2

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

Добавлено: 27 окт 2014, 23:13
Dragon_Knight
Итак, нашлось время и желание попробовать написать что нибудь из первого поста. После нескольких часов .... родил следующее:
 Скрипт, вызывается каждые 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> Когда допилем, выложу в паблик.