Колхозим мониторинг ИБП с протоколом Megatec в Zabbix

, Ippon, Powercom Krauler. Zabbix.

, 1) 2) , SNMP . serial , Ippon APC. APC SNMP , 11-20 . .

:

  1. ,
  2. , RS-232 , — zabbix_trapper.
  3. , , .


, /.

:

  • 1.

. , , DB9. , . F M , , , .



. Vmware ESXi, . 2 . , , , . Zabbix . Ubuntu ( ) - .

: COM- ESXi -> Com- -> , -> zabbix trap. , . .

, , ( , rj-45 DB9), , , .

  • 2. -

, , . Zabbix .
, , .
array=( $(/home/appliance/uniups) )

, MMM.M NNN.N PPP.P QQQ RR.R S.SS TT.T
#include <stdio.h>   /*   / */
#include <string>
#include <iostream>
#include <cstring>

using namespace std;
#include <unistd.h>  /*    UNIX */
#include <fcntl.h>   /*    */
#include <errno.h>   /*    */
#include <termios.h> /*   POSIX- */
#include <sys/types.h>
#include <sys/stat.h>

int fd; /*     */
char buf[512];/*      */
int main (int argc, char* argv[])
 {
    int iIn,iOut;
    string UPSAnswer;
    if (argc>=2)
{
        fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY); /*'open_port()' -    */
        if (fd == -1)   {
           printf("error port\n");
           perror("open_port: Unable to open port - ");   }
     else
        {
         struct termios options; /*   */
         tcgetattr(fd, &options); /*  */

         cfsetispeed(&options, B2400); /*  */
         cfsetospeed(&options, B2400); /*  */

         options.c_cflag &= ~PARENB; /*  */
         options.c_cflag &= ~CSTOPB; /* 2- ,  1 */
         options.c_cflag &= ~CSIZE; /*  */
         options.c_cflag |= CS8; /* 8*/
         tcsetattr(fd, TCSANOW, &options); /*  */
        }

        char Params[64];

        if(argc>=3)
        {
            if (!strcmp(argv[2],"status"))
            {
                iOut = write(fd, "Q1\r", 3);
                usleep(800000);
                if (iOut < 0)  fputs("write() of 4 bytes failed!\n", stderr);
                iIn=read(fd,buf,250); /*    */

                 strncpy(Params,&buf[38],11);
                 Params[46]=0;
            }
            else if (!strcmp(argv[2],"help"))
            {
                printf (" .   !\r\n");
            }
            else if (!strcmp(argv[2],"name"))
            {
                iOut = write(fd, "I\r", 3);
                usleep(800000);
                if (iOut < 0)  fputs("write() of 4 bytes failed!\n", stderr);
                iIn=read(fd,buf,250); /*    */
                strncpy(Params,&buf[0],60);

            }
            else if (!strcmp(argv[2],"stat2"))
            {
                iOut = write(fd, "F\r", 3);
                usleep(800000);
                if (iOut < 0)  fputs("write() of 4 bytes failed!\n", stderr);
                iIn=read(fd,buf,250); /*    */
                strncpy(Params,&buf[1],60);
         Params[20]=0;
            }
            else
            {
                printf ("? \r\n");
            }
        }
        else
        {
           /*    Q1 */
                usleep(1800);
                iIn=read(fd,buf,250);
                usleep(1800);
           iOut = write(fd, "Q1\r", 3);
           usleep(800000);
           if (iOut < 0)  fputs("write() of 4 bytes failed!\n", stderr);
           iIn=read(fd,buf,250); /*    */

           strncpy(Params,&buf[1],36);
           Params[36]=' ';
        }
    close(fd);
    printf("%s\r\n",Params);
}
else
printf("Usage %s /dev/ttySx", argv[0]);

}


, , . linux — . Ippon, Powercom , , PowerCom Megatec, «I» «F», «Q1». "/dev/ttyS0" "/dev/ttyS1" , , .

/home/appliance/ , uniups.cpp.
g++ -o uniups uniups.cpp 
.

(, , )

root@zabbix:~# ./uniups /dev/ttyS0
204.4 204.4 204.4 035 49.9 54.8 54.5
root@zabbix:~# ./uniups /dev/ttyS0 name
I
root@zabbix:~# ./uniups /dev/ttyS1 name
#POWERCOM        SXL-2000A  LCD  V4.3
root@zabbix:~# ./uniups /dev/ttyS1
216.3 216.3 216.3 000 50.0 54.2 30.0
root@zabbix:~# ./uniups /dev/ttyS1 stat2
220.0 009 048.0 50.0
root@zabbix:~#

, , , . 2400, 8N1, off. , Powercom, Ippon «I» , Krauler "# R1.1.1".

, Krauler , — ,
SS.S or S.SS For on-line units battery voltage/cell is provided in the form S.SS. For standby units actual battery voltage is provided in the form SS.S

. .

  • 3.

. zabbix_sender .
zabbix_sender -z _ -p 10051 -s ___ -k  -o 

, , , , Vmware .

zabbix_sender ,

Base64.

echo "<req>\n<host>S3JhdWxlck1lbW9SVDIwMDA=</host>\n<key>RnJlcQ==</key>\n<data>NDkuNA==</data>\n</req>\n" | nc -q 0 192.168.53.23 10051
192.168.53.23 — Zabbix. .
zabbix_sender.pl , :
#!/usr/bin/perl

use IO::Socket;
use IO::Select;
use MIME::Base64;

my ($zabbixserver,$hostname,$item,$data) = @_;

$zabbixserver= @ARGV[0];
$hostname= @ARGV[1];
$item= @ARGV[2];
$data= @ARGV[3];

 my $timeout=10;
 my $request=sprintf("<req>\n<host>%s</host>\n<key>%s</key>\n<data>%s</data>\n</req>\n",
 encode_base64($hostname),encode_base64($item),encode_base64($data));

 my $sock = new IO::Socket::INET ( PeerAddr => $zabbixserver, PeerPort => '10051', Proto => 'tcp', Timeout => $timeout);
 die "Could not create socket: $!\n" unless $sock;
 $sock->send($request);
 my @handles=IO::Select->new($sock)->can_read($timeout);
 if (scalar(@handles) > 0)
 {
  $sock->recv($result,1024);
  print "answer from zabbix server $zabbixserver: $result\n";
 }
 else
 {
  print "no answer from zabbix server\n";
 }
 $sock->close();

Perl .

, Cron.

, . , 2 .

#!/bin/bash
array=( $(//uniups /dev/ttyS0) )
Names=( InVolt FaultVolt OutVolt Current Freq UBatt UTemp NA )
correct[5]="24.0"
j=0;
echo "Checking UPS on serial A - ${#array[@]}"
if  [ ${#array[@]} -gt "7" ]
then
param=""
for i in "${array[@]}"
do
   if [[ ${correct[$j]} ]]
      then
         param=$( echo "scale = 0; $i * ${correct[$j]}" | bc)
       else.
      param=$i
    fi
   //zabbix_sender.pl 192.168.53.23 KraulerMemoRT2000 ${Names[$j]} $param
   j=$j+1;
done
else
echo "No data on A"
fi


:
  • array — , , Names — Item, Zabbix . KraulerMemoRT2000 — , .
  • , , Zabbix , , , NA, , , .
  • ${#array[@]}, . , . : , , . , , . , , .
  • correct[5]=«24.0» (5 ), (battery voltage/cell). 6 , 4 , 24. . , 48 . , , , .


cron . .

, . , - .

Source: https://habr.com/ru/post/fr397637/


All Articles