ApcCtrl - Software para controle de nobreak APC Brasil

ApcCtrl é um projeto open source para controle de nobreaks APC Brasil, modelos BACK-UPS BR e SMART-UPS BR. Os nobreaks da APC fabricados no Brasil possuem tecnologia herdada da Microsol (adquirida pela APC). Como o protocolo de comunicação desses equipamentos é particular do Brasil, não existia até 2016 uma solução além da disponibilizada pelo fabricante. Esse artigo ensina como instalar, configurar e utilizar o ApcCtrl.

[ Hits: 10.789 ]

Por: Wagner Popov dos Santos em 09/10/2016


Compilação e Instalação



Quando a fabricante de nobreaks APC comprou a brasileira Microsol no ano de 2009, ela passou a vender os equipamentos da Microsol com a marca APC em 2012 (estimativa) e com isso, os usuários passaram a ter como única opção, utilizar o software SGM Auto-Shutdown para os modelos BACK-UPS BR e SMART-UPS BR.

No ano de 2016 foi criado o projeto ApcCtrl, que é uma derivação do projeto apcupsd, que incorpora o protocolo para esses modelos.

Esse artigo ensina como instalar, configurar e utilizar o ApcCtrl para Linux (há também uma versão para Windows).

Download

O projeto está disponível em:
Para baixar a última versão via wget, utilize:

wget https://sourceforge.net/projects/apcctrl/files/latest/download

Compilando e Instalando

O ApcCtrl é escrito em linguagem C++ e pode ser necessário instalar dependências. Qualquer dúvida, deixe um comentário.

tar -xvvzf apcctrl-0.7.5.tar.gz
cd apcctrl-0.7.5
./configure
make
sudo make install

Fixando o ponto de acesso da porta de comunicação

Os modelos BACK-UPS BR e SMART-UPS BR, possuem embutido um conversor USB-Serial. Por conta disso, o device será do tipo /dev/ttyUSB0, /dev/ttyUSB1 etc.

Criando regras no UDEV

Para evitar que o device acabe mudando após reiniciar, você pode criar uma regra no udev para forçar o ponto de acesso. Inicialmente, verifique o fabricante e o modelo do dispositivo USB plugado no servidor com o comando:

lsusb

O resultado será da forma:

Bus 001 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

O número do fabricante e dispositivo no exemplo acima, é: 0403:6001. Então, edite o arquivo /etc/udev/rules.d/50-ttyusb.rules com o conteúdo:

SUBSYSTEM=="tty",ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", KERNEL=="ttyUSB*", GROUP="tty",MODE="0666",SYMLINK+="ttyUSB.nobreak"

Após reiniciar o udev, essa regra irá criar o link /dev/ttyUSB.nobreak e o tornará acessível para todos os usuários (0666).

/etc/init.d/udev restart

Configurando

O caminho padrão para os arquivos de configuração, é /etc/apcctrl/. A instalação cria alguns arquivos padrões nesse caminho. Caso não exista nenhum arquivo nesse caminho, sua instalação pode ter ocorrido em outro ponto.

Um exemplo para o arquivo "apcctrl.conf", é:

# UPSNAME xxx
#   Nome do nobreak apenas para fins de organização
UPSNAME Nome

# UPSCABLE <cable>
#   É uma porta serial. Sempre defina o UPSCABLE como simple.
UPSCABLE simple

# UPSTYPE <driver>
#   O projeto apcctrl possui uma série de drivers para os vários modelos de nobreak.
#   No nosso caso, todos devem utilizar o driver brazil.
UPSTYPE brazil

# DEVICE /dev/ttyUSB*
#   Device da porta serial. Caso você tenha feito a regra no udev esse caminho deve
#   ser /dev/ttyUSB.nobreak
DEVICE /dev/ttyUSB.nobreak

# SCRIPTDIR <path to script directory>
#   Caminho onde se encontra o arquivo apccontrol
SCRIPTDIR /etc/apcctrl

# PWRFAILDIR <path to powerfail directory>
#   Esse caminho define onde o apcctrl irá escrever arquivos em tempo de execução
#   no caso de um shutdown.
PWRFAILDIR /etc/apcctrl

# NOLOGINDIR <path to nologin directory>
#   Quando é comandado um shutdown é criado um arquivo que impede novos logins
NOLOGINDIR /etc

# BATTEXPANDER <number integer>
#   Esse parâmetro define se há uma expansão da bateria em AMPERES.
#   por exemplo, uma bateria de 12Volts e 42 Amperes exige que você defina
#   o valor como sendo 42. Caso o banco seja de 24V e 7A o valor deve ser
#   igual a 7.
BATTEXPANDER 0

# BATTERYLEVEL <percentage>
#   Se ocorrer uma falha na rede elétrica, essa deverá ser a porcentagem minima
#   antes do shutdown. Caso o level fique abaixo desse valor será comandado
#   o shutdown. Caso o parâmetro MINUTES seja atingido antes, será iniciado o
#   shutdown.
BATTERYLEVEL 25

# MINUTES <minutes>
#   Se ocorrer uma falha na rede elétrica, essa deverá ser o tempo mínimo
#   de autonomia antes do shutdown. Caso a autonomia calculada fique abaixo
#   desse valor, será iniciado o shutdown. Caso o parâmetro BATTERYLEVEL
#   seja atingido primeiro, será iniciado o shutdown.
MINUTES 10

# TIMEOUT <seconds>
#   Independente dos parâmetros acima, se na ocorrência de falha na rede
#   elétrica esse parâmetro define quantos segundos o servidor deve operar
#   nessa condição. Caso o valor seja 0 esse timer será desabilitado.
TIMEOUT 0

# KILLDELAY <seconds>
#   Caso esse parâmetro seja maior que zero, o apcctrl continuará a rodar
#   após o shutdown e fará o shutdown após esse período. Esse parâmetro
#   é útil quando o sistema operacional não aciona o apcctrl no momento
#   final do hangout. NÃO FOI TESTADO
KILLDELAY 0

# NETSERVER, NISIP, NISPORT definem o driver de rede do apcctrl e são
# importantes para a aplicação apcaccess e para que possa ser acessado por
# outros servidores.
NETSERVER on
NISIP 0.0.0.0
NISPORT 3551

# Log
EVENTSFILE /var/log/apcctrl.events
EVENTSFILEMAX 10

Testando

Para testar a configuração e o nobreak, utilize o aplicativo apctest:

apctest
2016-09-16 17:04:53 apctest 0.7.5 (13 June 2016) debian
Checking configuration ...
sharenet.type = Network & ShareUPS Disabled
cable.type = Custom Cable Simple
mode.type = BRAZIL UPS Driver
Setting up the port ...
Doing prep_device() ...

You are using a APC Brazil type, so I'm entering BRAZIL test mode
Hello, this is the apcctrl Cable Test program.
This part of apctest is for testing APC-Microsol Brazil.
Please select the function you want to perform.

1) Query the UPS for all known values
2) Query for last events
3) Query the internal UPS clock and scheduler
4) Schedule the UPS to shutdown in 1 minutes and restart 1 minute later.
5) Cancel Schedule. Do not shutdown or start
6) Test set input turn off
7) Test set input Turn on
8) Test battery health
9) Generate data of timeleft functions
Q) Quit

Select function number:

APCTEST não conecta

Caso o apctest não inicie adequadamente, utilize o comando:

apctest -d 1000

O resultado padrão, deve ser:

2016-09-16 17:08:01 apctest 0.7.5 (13 June 2016) debian
Checking configuration ...
0.000 apcctrl: apcconfig.c:758 After config scriptdir: "/etc/apcctrl"
0.000 apcctrl: apcconfig.c:759 After config pwrfailpath: "/etc/apcctrl"
0.000 apcctrl: apcconfig.c:760 After config nologinpath: "/etc/apcctrl"
0.000 apcctrl: newups.c:102 write_lock at drivers.c:125
0.000 apcctrl: drivers.c:127 Looking for driver: brazil
0.000 apcctrl: drivers.c:131 Driver net is configured.
0.000 apcctrl: drivers.c:131 Driver brazil is configured.
0.000 apcctrl: drivers.c:134 Driver brazil found and attached.
0.000 apcctrl: newups.c:108 write_unlock at drivers.c:151
0.000 apcctrl: drivers.c:153 Driver ptr=0x1f68380
0.000 apcctrl: drivers.c:154 Attached to driver: brazil
sharenet.type = Network & ShareUPS Disabled
cable.type = Custom Cable Simple
mode.type = BRAZIL UPS Driver
Setting up the port ...
0.000 apcctrl: brazildriver.c:84 Opening port /dev/ttyUSB.nobreak
3.008 apcctrl: brazildriver.c:129 Setup UPS MeuAPC to load specific model.
4.008 apcctrl: brazildriver.c:361 ReadData(bool getevents)
4.008 apcctrl: brazilmodelabstract.c:44 Instancing specific model, number 186.
4.008 apcctrl: brazildriver.c:504 Buffer! len: 25; pos: 00; data: 00(186); 01(105); 02(128); 03(174); 04(000); 05(007); 06(164); 07(162); 08(002); 09(053); 10(007); 11(020); 12(000); 13(000); 14(000); 15(000); 16(001); 17(000); 18(176); 19(146); 20(073); 21(096); 22(096); 23(060); 24(254);.
4.008 apcctrl: brazildriver.c:196 programmation(false, 0, false, 0)
4.008 apcctrl: brazilmodelbackups.c:438 Date to send: 2016-09-16 20:08:05 5;
4.008 apcctrl: brazildriver.c:186 Buffer to send! len: 12; data: 00(207); 01(020); 02(008); 03(005); 04(000); 05(000); 06(000); 07(000); 08(176); 09(146); 10(128); 11(178);.
4.008 apcctrl: brazildriver.c:361 ReadData(bool getevents)
4.072 apcctrl: brazildriver.c:504 Buffer! len: 25; pos: 00; data: 00(186); 01(105); 02(128); 03(174); 04(000); 05(007); 06(164); 07(159); 08(002); 09(006); 10(008); 11(020); 12(000); 13(000); 14(000); 15(000); 16(001); 17(000); 18(176); 19(146); 20(073); 21(096); 22(096); 23(011); 24(254);.
4.073 apcctrl: apclog.c:62 BrazilDriver: programmation canceled! Not turnoff or turnon!
4.073 apcctrl: brazildriver.c:325 continueMode start.
4.074 apcctrl: brazildriver.c:526 get_capabilities()
4.074 apcctrl: newups.c:102 write_lock at brazildriver.c:527
4.074 apcctrl: newups.c:108 write_unlock at brazildriver.c:547
Doing prep_device() ...
4.075 apcctrl: brazildriver.c:559 read_static_data()
4.075 apcctrl: newups.c:102 write_lock at brazildriver.c:565
4.075 apcctrl: newups.c:108 write_unlock at brazildriver.c:588

You are using a APC Brazil type, so I'm entering BRAZIL test mode
Hello, this is the apcctrl Cable Test program.
This part of apctest is for testing APC-Microsol Brazil.
Please select the function you want to perform.

1) Query the UPS for all known values
2) Query for last events
3) Query the internal UPS clock and scheduler
4) Schedule the UPS to shutdown in 1 minutes and restart 1 minute later.
5) Cancel Schedule. Do not shutdown or start
6) Test set input turn off
7) Test set input Turn on
8) Test battery health
9) Generate data of timeleft functions
Q) Quit

Select function number:


Iniciando o daemon

Para iniciar o daemon, execute o comando:

/etc/init.d/apcctrl start

Acessando o estado do daemon

Quando o daemon está em execução, você pode acessar o estado atual com o comando:

apcaccess

Controlando os eventos

Na ocorrência de algum evento, o daemon chamará o script /etc/apcctrl/apccontrol. Esse script que comandará de fato o shutdown ou outros eventos. Esse script, que também chama outros scripts caso eles existam, por exemplo, caso o daemon chame o script apccontrol com o evento killpower e exista um script em /etc/apcctrl/killpower, esse será executado.

Uma sugestão para um script onbattery, é:

#!/bin/sh
#
# This shell script if placed in /etc/apcctrl
# will be called by /etc/apcctrl/apccontrol when the UPS
# goes on batteries.
# We send an email message to root to notify him.
#

HOSTNAME=`hostname`
MSG="$HOSTNAME UPS $1 Power Failure !!!"
#
(
   echo "To: seu-email@seu-dominio.com.br"
   echo "From: nao-responda@seu-dominio.com.br"
   echo "Subject: $MSG"
   echo " "
   echo "$MSG"
   echo " "
   /sbin/apcaccess status
) | /usr/sbin/ssmtp -v seu-email@nover.com.br &
exit 0

Funcionamento do Shutdown

O funcionamento do shutdown segue os seguintes passos:
  1. O daemon chama o script: /etc/apcctrl/apccontrol
  2. O daemon escreve o arquivo: /etc/apcctrl/power-fail
  3. O daemon se encerra automaticamente
  4. O servidor entra no runlevel 0
  5. O servidor encerra os serviços
  6. O ultimo script que o servidor chama, é o: /etc/init.d/halt
  7. O script halt inicia o script: /etc/init.d/ups-monitor
  8. O script apccontrol chama o apcctrl, com o parâmetro de killpower (que na existência do arquivo /etc/apcctrl/power-fail comanda o nobreak para tanto)
  9. O apcctrl envia o comando para o nobreak
  10. O script ups-monitor encerra (ou aguarda um tempo)
  11. O script halt continua a execução
  12. Por fim, o servidor é desligado

Sugestão para acompanhar o Shutdown

Altere o script /etc/apcctrl/apccontrol para que quando este chamar o apcctrl com o parâmetro killpower, esse seja chamado com o debug no máximo. Isso ocorre porque nesse ponto os discos estão no modo só de leitura e é possível escrever em log.

...
${APCUPSD} -d 100 --killpower
...

Controlando o shutdown de um segundo servidor

Você pode instalar o ApcCtrl em outro servidor e acessar os dados do servidor master, o qual está com o nobreak plugado na USB.

Para isso, instale o apcctrl normalmente e no arquivo de configuração, coloque o driver e o device como sendo net e o IP do servidor master. Como, por exemplo:

...
UPSTYPE net
DEVICE 192.168.22.1:3551
...

Você pode ainda, parametrizar de forma diferente. Já que o segundo servidor não receberá o comando de shutdown e sim a leitura do nobreak. Nessa condição, você deve desligar o segundo servidor antes do primeiro, para que o segundo servidor não perca a comunicação com o nobreak

   

Páginas do artigo
   1. Compilação e Instalação
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Configurando uma multi-funcional HP 1315 no Slackware 10.2

Placas de vídeo que já perderam o suporte no Linux

Placa Intel PRO/Wireless 3945ABG no Debian Linux

Instalando placa de captura de TV no Linux

Access Point com cartão Atheros em Slackware 12.0

  
Comentários
[1] Comentário enviado por viniciusraupp em 14/10/2016 - 16:30h

Ótimo artigo, eu tenho um no break em meu PC, realizei todos os passos e funcionou perfeitamente.
Apenas um detalhe que acredito que tu consegue ajustar no artigo, no seu artigo há várias referencias a pasta "apcupsd", mas acredito que o correto é "apcctrl".
Bom trabalho.

[2] Comentário enviado por brauliobo em 11/09/2019 - 08:02h

nao vi a opção de desligar o beep do alarme, como fazer isso?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts