На ноутбуке стоит система мониторинга Zabbix, которая обучена отсылке SMS-сообщений.
Необходимо знать из первых уст, так сказать, что пропало внешнее питание.
Если ядро собрано с поддержкой ACPI и запущен демон devd, то при подключении/отключении внешнего питания будет генерироваться событие типа notify от подсистемы ACAD, системы ACPI. По умолчанию на это событие назначен скрипт, изменяющий профиль питания, но ничего не мешает добавить дополнительное действие:
notify 10 {
match "system" "ACPI";
match "subsystem" "ACAD";
action "/etc/rc.d/power_profile $notify";
action "/usr/local/etc/acpi_power_mon.sh $notify &";
};
/etc/rc.d/power_profile — это дефолтовый скрипт, /usr/local/etc/acpi_power_mon.sh — наш сцеарий. Амперсанд нужен для того, чтобы скрипт оставался запущенным и не мешал devd.
В самом скрипте, при пропадении питания создаём pid-файл, сообщаем по SMS куда следует, пишем в лог и запускаем цикл проверки заряда батареи. В случае падения заряда ниже min_cap, шлём смску, ждем 2 минуты и выключаемся.
Если питание появится до отключения сервера, убиваем процесс ранее запущенного скрипта и отсылаем SMS.
SMS отправляются по номерам, указанным через пробел в переменной numbers, но т.к. в Zabbix уже есть список номеров, логичней воспользоваться им.
В запросе выбираются номера пользователей, состоящих в группе «Zabbix Super Admin» и имеющих возможность уведомления по SMS.
#!/bin/sh
name="acpi_power_mon"
pidfile="/var/run/$name.pid"
min_cap="30"
smsscript="/usr/local/etc/zabbix3/zabbix/alertscripts/sendsms.sh"
numbers=$(echo "SELECT sendto from media,users WHERE users.type=3 AND media.mediatypeid=4 AND media.userid=users.userid;" | mysql zabbix | grep -E "[1-9]{1,11}")
case "$1" in
"start" | 0x00)
if [ -f $pidfile ]
then
logger -p local0.notice -t acpi_power_mon "$pidfile is allready exists"
exit
else
echo $$ > $pidfile
logger -p local0.notice -t acpi_power_mon "AC power loss"
for i in $numbers; do
$smsscript $i "Zabbix server AC power loss"
done;
fi;;
"stop" | 0x01)
if [ -f $pidfile ]
then
kill $(cat $pidfile)
rm $pidfile
logger -p local0.notice -t acpi_power_mon "AC power restored"
for i in $numbers; do
$smsscript $i "Zabbix server AC power restored"
done;
else logger -p local0.notice -t acpi_power_mon "$pidfile is not exists"
fi;
exit;;
esac
while [ 1 ]
do
cur_cap=$(acpiconf -i0 | awk '{if($1=="Remaining" && $2=="capacity:")print int($3)}')
if [ $cur_cap -lt $min_cap ]
then
for i in $numbers; do
$smsscript $i "Zabbix server shutting down by battarey discharge"
done;
sleep 120
rm $pidfile
logger -p local0.notice -t acpi_power_mon "Shutting down"
shutdown -p now
exit
fi
sleep 60
done