Отслеживание электропитания через ACPI на ноутбуке

Автор: | 2016-09-20

На ноутбуке стоит система мониторинга 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *