Вводная: у нас есть очень мощный источник бесперебойного питания с несколькими аккумуляторами и целая серверная стойка, которая питается от этого монстра. Марку не привожу, достаточно сказать, что один блок аккумуляторов весит как половина автомобиля.

Задача: при выключении электропитания нужно, чтобы сервера выключались в определённом порядке и не одновременно.

Вариант управлять этим процессом со сторонней машины отпадает - лишнее звено, которое само может упасть первым.

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

Все машинки на “парашут” повесить невозможно. И все машинки на Win-платформе (наследие, увы), хотя решение можно легко адаптировать и на серверные ОС.

Решение: запрос данных по SNMP и, в зависимости от роли машины, гасим по нужному значению остатка заряда батареи при отсутствии питания.

Для этого нам нужны файлы из пакета net-snmp-5.4.2.1-1.win32.exe (можно поставить полностью, а можно просто взять файлы snmpwalk.exe и netsnmp.dll) и пишем следующий “батник”:

1
2
3
4
5
6
7
8
9
10
@echo off
cd C:/rd

snmpwalk.exe -v 1 -c public  IP_UPS SNMPv2-SMI::enterprises.318.1.1.1.3.2.1.0>volt.txt
 set /p volt=""<volt.txt
 if %volt:~53,10% GTR 100 EXIT 0

snmpwalk.exe -v 1 -c public  IP_UPS SNMPv2-SMI::mib-2.33.1.2.4.0 >stat.txt
 set /p status=""<stat.txt
 if %status:~40,10% LEQ 30 shutdown /s /t 0

В данном случае:

  • C:/rd - это каталог, где лежат exe, dll и сам батник. Можно указать свой, лишь бы для временных файлов можно было разрешить запись;

  • IP_UPS - адрес бесперебойника;

  • данные во временные файлы приходится писать, так как напрямую в переменную закинуть значение Windows не даёт, почему-то.

Сначала идёт проверка наличия питания. Это необходимо было ввести, так как компьютер, включаясь по WOL, видел начало заряда UPS и снова уходил спать. Если же есть питание и оно больше 100 Вольт, скрипт просто заканчивает свою работу. Если же питания нет, вторая проверка смотрит остаток процента. При значении меньше нужного (в данном случае 30 процентов), то спать. Процент выставляли для каждой машины индивидуально: какую-то можно отправить спать практически сразу, а какая-то (как контроллер домена) ждёт “до последнего” и уходит при остатке в 10 процентов, например.

В планировщик заданий этот скрипт на “раз в …. минут” и пусть проверяются.