Привет! После долгих поисков на форумах и тестирования я наконец-то нашёл решение, как мониторить мои APC UPS, которые подключены к серверам MikroTik через последовательный или USB-кабель. Поскольку стандартные SNMP OID использовать нельзя (в MikroTik SNMP сейчас не включает данные от UPS), нужно применять функции The Dude и создавать собственные функции/запросы.
Для этого я использовал функцию ros_command(), которая позволяет отправлять команды и получать ответы от сервера RouterOS. Обратите внимание, что нужно настроить The Dude так, чтобы он подключался к серверу, который мониторит ваш UPS — то есть нужно прописать логин и пароль в настройках устройства. Также убедитесь, что ваш UPS называется «ups1» (если нет, придётся переименовать в следующих функциях).
После этого можно использовать следующие функции:
ups_status() (возвращает 1, если UPS в сети, 0, если нет)
if (string_substring(ros_command("/system ups monitor ups1 once"), string_find(ros_command("/system ups monitor ups1 once"), "on-line") + 9, 3), "1", "0")
ups_battery_charge() (возвращает заряд батареи в %)
round(
string_substring(ros_command("/system ups monitor ups1 once"),
string_find(ros_command("/system ups monitor ups1 once"), "battery-charge") + 16,
3)
)
ups_temperature() (возвращает температуру в градусах Цельсия)
round(
string_substring(ros_command("/system ups monitor ups1 once"),
string_find(ros_command("/system ups monitor ups1 once"), "temperature") + 13,
2)
)
Кроме того, нужна функция, которая будет возвращать 1, если UPS доступен, и 0, если нет. Я сделал такой код (хотя он неидеальный — в будущем планирую улучшить):
ups_available()
if (string_size(ros_command("/system ups monitor ups1 once")) > 40, "1", "0")
По этим примерам вы можете создавать свои запросы и изменять официальные функции для полноценного мониторинга UPS. Я также написал ещё одну функцию, которая собирает информацию об UPS, и слегка модифицировал оригинальную функцию device_performance(). Вот они:
ups_info()
concatenate(
if(ups_available() > 0, concatenate("ups: ", round(ups_battery_charge()), "% "), ""),
if(ups_available() > 0, concatenate("temp: ", round(ups_temperature()), "C "), "")
)
device_performance() (модификация оригинальной функции — добавляет данные UPS, если он доступен)
concatenate(
if(string_size(cpu_mem_disk()) > 0,
concatenate(cpu_mem_disk(), "\n"),
""
),
if(string_size(ups_info()) > 0,
concatenate(ups_info(), "\n"),
""
)
)
Последнее — создать зонд (probe), который будет показывать, когда ваш UPS в сети или вне сети, а также отображать график заряда батареи. Вот мой пример:
ups status — Тип зонда: Function
Агент: Default
Доступен: ups_available()
Ошибка: if(ups_status(), "", "Off-line")
Значение: ups_battery_charge()
Единицы: %
Частота: none
Вот и всё из моих примеров. Пока RouterOS не даст нам полноценный SNMP OID с состоянием UPS — этот способ будет полезен. Всё это только пример, обязательно делайте бэкап конфигурации The Dude перед изменениями. И да, уверен, что моё решение — не единственное, но оно работает.
Буду рад любым предложениям по улучшению!
С уважением, Pelish
Для этого я использовал функцию ros_command(), которая позволяет отправлять команды и получать ответы от сервера RouterOS. Обратите внимание, что нужно настроить The Dude так, чтобы он подключался к серверу, который мониторит ваш UPS — то есть нужно прописать логин и пароль в настройках устройства. Также убедитесь, что ваш UPS называется «ups1» (если нет, придётся переименовать в следующих функциях).
После этого можно использовать следующие функции:
ups_status() (возвращает 1, если UPS в сети, 0, если нет)
if (string_substring(ros_command("/system ups monitor ups1 once"), string_find(ros_command("/system ups monitor ups1 once"), "on-line") + 9, 3), "1", "0")
ups_battery_charge() (возвращает заряд батареи в %)
round(
string_substring(ros_command("/system ups monitor ups1 once"),
string_find(ros_command("/system ups monitor ups1 once"), "battery-charge") + 16,
3)
)
ups_temperature() (возвращает температуру в градусах Цельсия)
round(
string_substring(ros_command("/system ups monitor ups1 once"),
string_find(ros_command("/system ups monitor ups1 once"), "temperature") + 13,
2)
)
Кроме того, нужна функция, которая будет возвращать 1, если UPS доступен, и 0, если нет. Я сделал такой код (хотя он неидеальный — в будущем планирую улучшить):
ups_available()
if (string_size(ros_command("/system ups monitor ups1 once")) > 40, "1", "0")
По этим примерам вы можете создавать свои запросы и изменять официальные функции для полноценного мониторинга UPS. Я также написал ещё одну функцию, которая собирает информацию об UPS, и слегка модифицировал оригинальную функцию device_performance(). Вот они:
ups_info()
concatenate(
if(ups_available() > 0, concatenate("ups: ", round(ups_battery_charge()), "% "), ""),
if(ups_available() > 0, concatenate("temp: ", round(ups_temperature()), "C "), "")
)
device_performance() (модификация оригинальной функции — добавляет данные UPS, если он доступен)
concatenate(
if(string_size(cpu_mem_disk()) > 0,
concatenate(cpu_mem_disk(), "\n"),
""
),
if(string_size(ups_info()) > 0,
concatenate(ups_info(), "\n"),
""
)
)
Последнее — создать зонд (probe), который будет показывать, когда ваш UPS в сети или вне сети, а также отображать график заряда батареи. Вот мой пример:
ups status — Тип зонда: Function
Агент: Default
Доступен: ups_available()
Ошибка: if(ups_status(), "", "Off-line")
Значение: ups_battery_charge()
Единицы: %
Частота: none
Вот и всё из моих примеров. Пока RouterOS не даст нам полноценный SNMP OID с состоянием UPS — этот способ будет полезен. Всё это только пример, обязательно делайте бэкап конфигурации The Dude перед изменениями. И да, уверен, что моё решение — не единственное, но оно работает.
Буду рад любым предложениям по улучшению!
С уважением, Pelish

