Скрипт мониторинга интернета и внешних узлов с SMS оповещением

Автоматизация при помощи встроенного скриптового языка и RouterOS API
anyfix
Сообщения: 3
Зарегистрирован: 06 янв 2022, 01:43

Скрипт мониторинга интернета и внешних узлов с SMS оповещением

Сообщение anyfix »

Изображение


Добрый день, дорогие читатели! Сегодня речь пойдет о мониторинге домашнего интернета и любого внешнего узла, например вашего сервера, причем с оповещением по СМС. Для начала осмотрим скрипт:

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

:global inetdown
:global downa
:global downb
:global downc
:local checka [/ping 0.0.0.0 count=5]
:local time [/sys clock get time]

:if (checkdns = 0) do={
:if ($inetdown != true) do={
/log error "INTERNET is DOWN"
:set $inetdown true
}
} else={
:if ($inetdown = true) do={
/log warning "INTERNET is UP"
:set $inetdown false
}
:if (checka = 0) do={
:if ($downa != true) do={
/log error "VDS 0.0.0.0 is DOWN"
/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Пропал+Сервер&json=1" keep-result=yes
:set $downa true
}
} else={
:if ($downa = true) do={
/log warning "VDS 0.0.0.0 is UP"
/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Появился+Сервер&json=1" keep-result=yes
:set $downa false
}
}
}
Вам нужно заменить IP 0.0.0.0 на IP вашего сервера. ВашID на ID который Вам дадут на сайте sms.ru. ВашНомер на Ваш мобильный номер телефона. Появился+Сервер это само смс сообщение, меняете по своему усмотрению. Знак + Обязательно сохраняйте как на образце.

Также сделал видеоурок: https://www.youtube.com/watch?v=bEoMtL6KHKQ
Аватара пользователя
Chupaka
Сообщения: 3470
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Скрипт мониторинга интернета и внешних узлов с SMS оповещением

Сообщение Chupaka »

Здравствуйте. А почему не захотели использовать Tools -> NetWatch?

И что-то мне кажется, что на месте ":if (checkdns = 0) do={" скрипт должен упасть. Что такое checkdns?..
anyfix
Сообщения: 3
Зарегистрирован: 06 янв 2022, 01:43

Re: Скрипт мониторинга интернета и внешних узлов с SMS оповещением

Сообщение anyfix »

Chupaka писал(а): 06 янв 2022, 13:23 Здравствуйте. А почему не захотели использовать Tools -> NetWatch?

И что-то мне кажется, что на месте ":if (checkdns = 0) do={" скрипт должен упасть. Что такое checkdns?..
Всё работает. Когда делал видео, всё проверял. Мониторю им уже давно 10 микротов, каждый друг друга.
Аватара пользователя
Chupaka
Сообщения: 3470
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск

Re: Скрипт мониторинга интернета и внешних узлов с SMS оповещением

Сообщение Chupaka »

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

Для начала отформатируем код с нормальными отступами, чтобы понять, где какая вложенность:

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

:global inetdown
:global downa
:global downb
:global downc
:local checka [/ping 0.0.0.0 count=5]
:local time [/sys clock get time]

:if (checkdns = 0) do={
	:if ($inetdown != true) do={
		/log error "INTERNET is DOWN"
		:set $inetdown true
	}
} else={
	:if ($inetdown = true) do={
		/log warning "INTERNET is UP"
		:set $inetdown false
	}
	:if (checka = 0) do={
		:if ($downa != true) do={
			/log error "VDS 0.0.0.0 is DOWN"
			/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Пропал+Сервер&json=1" keep-result=yes
			:set $downa true
		}
	} else={
		:if ($downa = true) do={
			/log warning "VDS 0.0.0.0 is UP"
			/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Появился+Сервер&json=1" keep-result=yes
			:set $downa false
		}
	}
}
Поскольку переменная checkdns нигде не определена и никогда не задаётся - условие :if (checkdns = 0) всегда ложное, поэтому всегда выполняется часть else={}. Переменные downb и downc нигде не используются, выкидываем их за ненадобностью. Получаем:

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

:global inetdown
:global downa
:local checka [/ping 0.0.0.0 count=5]
:local time [/sys clock get time]

:if ($inetdown = true) do={
	/log warning "INTERNET is UP"
	:set $inetdown false
}
:if (checka = 0) do={
	:if ($downa != true) do={
		/log error "VDS 0.0.0.0 is DOWN"
		/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Пропал+Сервер&json=1" keep-result=yes
		:set $downa true
	}
} else={
	:if ($downa = true) do={
		/log warning "VDS 0.0.0.0 is UP"
		/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Появился+Сервер&json=1" keep-result=yes
		:set $downa false
	}
}
inetdown у нас со старта null и её никто не меняет, поэтому :if ($inetdown = true) do={} тоже выкидываем вместе с самой переменной:

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

:global downa
:local checka [/ping 0.0.0.0 count=5]
:local time [/sys clock get time]

:if (checka = 0) do={
	:if ($downa != true) do={
		/log error "VDS 0.0.0.0 is DOWN"
		/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Пропал+Сервер&json=1" keep-result=yes
		:set $downa true
	}
} else={
	:if ($downa = true) do={
		/log warning "VDS 0.0.0.0 is UP"
		/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Появился+Сервер&json=1" keep-result=yes
		:set $downa false
	}
}
Дабы исключить ошибки при начальной настройке, лучше создать переменную с адресом для мониторинга, а не раскидывать адрес по всему скрипту. ID и номер - туда же:

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

:local VDS "0.0.0.0"
:local SMSID "ВашID sms.ru"
:local to "ВашНомер"
:global downa
:local checka [/ping $VDS count=5]
:local time [/sys clock get time]

:if (checka = 0) do={
	:if ($downa != true) do={
		/log error "VDS $VDS is DOWN"
		/tool fetch url="https://sms.ru/sms/send?api_id=$SMSID&to=$to&msg=$time+Пропал+Сервер+$VDS&json=1" keep-result=yes
		:set $downa true
	}
} else={
	:if ($downa = true) do={
		/log warning "VDS $VDS is UP"
		/tool fetch url="https://sms.ru/sms/send?api_id=$SMSID&to=$to&msg=$time+Появился+Сервер+$VDS&json=1" keep-result=yes
		:set $downa false
	}
}
anyfix
Сообщения: 3
Зарегистрирован: 06 янв 2022, 01:43

Re: Скрипт мониторинга интернета и внешних узлов с SMS оповещением

Сообщение anyfix »

Спасибо


Chupaka писал(а): 08 янв 2022, 00:20 Да, проверил - действительно: если переменная не определена, то в сравнениях у неё значение null. Т.е. вы где-то навыдёргивали кода, не разбираясь, возможно, переделали под себя - в итоге получилась каша, в которой часть бесполезная или не работает.

Для начала отформатируем код с нормальными отступами, чтобы понять, где какая вложенность:

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

:global inetdown
:global downa
:global downb
:global downc
:local checka [/ping 0.0.0.0 count=5]
:local time [/sys clock get time]

:if (checkdns = 0) do={
	:if ($inetdown != true) do={
		/log error "INTERNET is DOWN"
		:set $inetdown true
	}
} else={
	:if ($inetdown = true) do={
		/log warning "INTERNET is UP"
		:set $inetdown false
	}
	:if (checka = 0) do={
		:if ($downa != true) do={
			/log error "VDS 0.0.0.0 is DOWN"
			/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Пропал+Сервер&json=1" keep-result=yes
			:set $downa true
		}
	} else={
		:if ($downa = true) do={
			/log warning "VDS 0.0.0.0 is UP"
			/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Появился+Сервер&json=1" keep-result=yes
			:set $downa false
		}
	}
}
Поскольку переменная checkdns нигде не определена и никогда не задаётся - условие :if (checkdns = 0) всегда ложное, поэтому всегда выполняется часть else={}. Переменные downb и downc нигде не используются, выкидываем их за ненадобностью. Получаем:

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

:global inetdown
:global downa
:local checka [/ping 0.0.0.0 count=5]
:local time [/sys clock get time]

:if ($inetdown = true) do={
	/log warning "INTERNET is UP"
	:set $inetdown false
}
:if (checka = 0) do={
	:if ($downa != true) do={
		/log error "VDS 0.0.0.0 is DOWN"
		/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Пропал+Сервер&json=1" keep-result=yes
		:set $downa true
	}
} else={
	:if ($downa = true) do={
		/log warning "VDS 0.0.0.0 is UP"
		/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Появился+Сервер&json=1" keep-result=yes
		:set $downa false
	}
}
inetdown у нас со старта null и её никто не меняет, поэтому :if ($inetdown = true) do={} тоже выкидываем вместе с самой переменной:

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

:global downa
:local checka [/ping 0.0.0.0 count=5]
:local time [/sys clock get time]

:if (checka = 0) do={
	:if ($downa != true) do={
		/log error "VDS 0.0.0.0 is DOWN"
		/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Пропал+Сервер&json=1" keep-result=yes
		:set $downa true
	}
} else={
	:if ($downa = true) do={
		/log warning "VDS 0.0.0.0 is UP"
		/tool fetch url="https://sms.ru/sms/send?api_id=ВашID&to=ВашНомер&msg=$time+Появился+Сервер&json=1" keep-result=yes
		:set $downa false
	}
}
Дабы исключить ошибки при начальной настройке, лучше создать переменную с адресом для мониторинга, а не раскидывать адрес по всему скрипту. ID и номер - туда же:

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

:local VDS "0.0.0.0"
:local SMSID "ВашID sms.ru"
:local to "ВашНомер"
:global downa
:local checka [/ping $VDS count=5]
:local time [/sys clock get time]

:if (checka = 0) do={
	:if ($downa != true) do={
		/log error "VDS $VDS is DOWN"
		/tool fetch url="https://sms.ru/sms/send?api_id=$SMSID&to=$to&msg=$time+Пропал+Сервер+$VDS&json=1" keep-result=yes
		:set $downa true
	}
} else={
	:if ($downa = true) do={
		/log warning "VDS $VDS is UP"
		/tool fetch url="https://sms.ru/sms/send?api_id=$SMSID&to=$to&msg=$time+Появился+Сервер+$VDS&json=1" keep-result=yes
		:set $downa false
	}
}