Ada kebutuhan untuk memantau kebun binatang UPS, Ippon, Powercom dan Krauler tersedia. Sebagai alat pemantauan digunakan Zabbix.Secara alami, masalah perlu diselesaikan 1) murah 2) bahkan lebih murah, sehingga opsi dengan modul SNMP langsung ditolak. Diputuskan untuk menggunakan koneksi port serial, karena ada pengalaman pengembangan untuk Ippon dan APC. Omong-omong, APC di pasar sekunder memiliki modul SNMP dengan harga yang wajar, tetapi untuk UPS yang murah, saya hanya bisa menemukan modul baru dengan harga 11-20 ribu rubel.Selama pekerjaan, tugas tambahan berikut ditetapkan:- temukan dan periksa kabel untuk menghubungkan setiap UPS, karena tidak ada dalam kit
- Untuk mengimplementasikan modul tertentu yang akan memiliki antarmuka RS-232 di satu sisi dan memahami protokol pertukaran data dengan masing-masing UPS, dan di sisi lain, memiliki antarmuka jaringan dan dapat mengirim data dalam bentuk zabbix_trapper.
- Uji pengumpulan data dan model transmisi, bagian-bagian kode, serta format data.
Selama implementasi paragraf kedua dan ketiga, saya ingin mengumpulkan di satu tempat semua data yang akan memungkinkan di masa depan untuk mengimplementasikan perangkat terpisah untuk m / c.Jadi:Tidak ada kabel untuk UPS apa pun. Pada prinsipnya, tugas pertama tidak menimbulkan masalah bagi orang yang dapat menghitung kontak pada konektor DB9. Ternyata, tidak hanya semua orang tahu caranya, termasuk saya. Kontak pada konektor F dan M dicerminkan, tetapi ditandatangani, secara umum, tidak mungkin membuat kesalahan, jika Anda berhati-hati.- Ippon Smart Winner 2000 back power pro, 2-2, 3-3, 5-5. , .
- Krauler Memo RT 2000 krauler.ru, 2-2,3-3, 5-5.
- Powercom SXL-2000A www.pcm.ru/data/docs/cables.zip, forum.pcm.ru. 2-9, 3-6, 5-7. (-).
Offtopic kecil. Tulang punggung server terdiri dari dua host Vmware ESXi, yang ditempatkan di rak dengan dua UPS. Beberapa server memiliki 2 catu daya. Dan sebagian, sayangnya, hanya satu, itulah sebabnya mereka menderita secara berkala. Zabbix saat ini dihosting di salah satu host sebagai mesin virtual. Pada prinsipnya, menggunakan server virtual kecil di Ubuntu (saya menggunakan platform ini untuk layanan) untuk mengimplementasikan tugas apa pun bukanlah masalah.Dengan demikian, skema yang dikembangkan: COM port pada ESXi -> Com port pada mesin virtual -> program C yang mengembalikan data dari UPS -> Script atau program yang mengirimkan jebakan zabbix. Dua poin terakhir harus dikombinasikan di masa depan. Meskipun berfungsi seperti itu.Masalahnya diselesaikan secara berurutan, dengan kabel kabel untuk satu UPS, dengan kabel konektor tambahan untuk server (ada dua dari mereka, ditambah adaptor rj-45 di DB9), memeriksa koneksi, memeriksa program, mengatur elemen-elemen di Zabbiks.- 2. Interogasi port COM oleh program
Hal pertama yang diperlukan adalah memilih server untuk hosting kode yang dapat dieksekusi. Saya tidak memutar otak saya dan memposting semua ini di server Zabbix.Kedua, saya berpikir bagaimana memproses data. Karena desain di Basharray=( $(/home/appliance/uniups) )
yang memecah string menjadi array data, saya memutuskan untuk hanya mengembalikan segmen baris MMM.M NNN.N PPP.P QQQ RR.R S.SS TT.TKode program#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);
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;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
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
{
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]);
}
Saya menemukan bekerja dengan port di Google, Anda dapat membaca dari Bash, tetapi dari Bash itu tidak mungkin untuk mencapai operasi yang stabil. Pada prinsipnya, kode C di linux adalah b. Ippon pertama diuji, kemudian selama studi tentang Powercom UPS, sebuah monitor port diluncurkan, yang menunjukkan bahwa PowerCom juga bekerja melalui protokol Megatec, dan program asli memungut UPS pada saat startup dengan perintah "I" dan "F", dan kemudian secara siklikal "Q1". Saya menggantung nama port dalam bentuk "/ dev / ttyS0" atau "/ dev / ttyS1" pada argumen pertama, argumen kedua memungkinkan Anda untuk meminta parameter tambahan, kode menunjukkan.Dalam direktori / home / appliance / menempatkan program, menyebutnya uniups.cpp. Disusung++ -o uniups uniups.cpp
.Pada prinsipnya, hasilnya adalah seperti ini (ya, saya bekerja di bawah root, bahkan tidak berkomentar)root@zabbix:~
204.4 204.4 204.4 035 49.9 54.8 54.5
root@zabbix:~
I
root@zabbix:~
root@zabbix:~
216.3 216.3 216.3 000 50.0 54.2 30.0
root@zabbix:~
220.0 009 048.0 50.0
root@zabbix:~
Yang penting, pada akhirnya ternyata semua UPS menggunakan protokol yang sama, yang memungkinkan penggunaan satu program. Koneksi pada 2400, 8N1 digunakan, yang lainnya mati. Ada lalat di salep, nama UPS biasanya hanya kembali ke Powercom, Ippon tidak mengerti perintah "I", dan Krauler mengembalikan "# R1.1.1".Selain itu, Krauler mengembalikan tegangan ke elemen, dan sisa UPS ke baterai, dalam dokumentasi itu digambarkan sebagaiSS.S atau S.SS Untuk unit on-line, tegangan / sel baterai disediakan dalam bentuk S.SS. Untuk unit siaga, tegangan baterai aktual disediakan dalam bentuk SS.S
Mengingat hal ini, saya harus menempelkan skrip pada skrip. Tentang itu di bawah ini.- 3. Mengirim data ke Zabbix
Dengan mengirimkan ini ternyata kebun binatang untuk semua kesempatan. Di server, Zabbix menggunakan utilitas zabbix_sender untuk mempercepat proses.zabbix_sender -z _ -p 10051 -s ___ -k -o
Pada prinsipnya, untuk polling dua UPS, ini sudah cukup, pada saat ini, bagaimanapun, saya akan memiliki yang ketiga, dan di masa depan saya akan memiliki yang keempat, jadi saya memilih yang pertama dan, secara kebetulan aneh, satu-satunya server Linux pada host Vmware kedua dan mengirimkannya ke dia port COM.Saya tidak menggunakan agen zabbix atau menyalin zabbix_sender, saya menemukan deskripsi yang terakhir padaSemua garam terdiri dari penyandian data di Base64. Untuk memeriksa, saya menggunakan perintahecho "<req>\n<host>S3JhdWxlck1lbW9SVDIwMDA=</host>\n<key>RnJlcQ==</key>\n<data>NDkuNA==</data>\n</req>\n" | nc -q 0 192.168.53.23 10051
di mana 192.168.53.23 adalah alamat server Zabbix. Dia sedang bekerja.Saya menelepon skrip di atas zabbix_sender.pl dan meletakkannya di server, skrip saya terlihat seperti ini:
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 sudah ada di server.Selanjutnya, kami membutuhkan skrip yang akan menghubungkan semua komponen bersama dan yang dapat ditempatkan di Cron.Berikut adalah contoh untuk satu port, untuk port lain Anda cukup menyalin kode yang sama dan mengganti nama yang berbeda. Saya tidak melakukan siklus, saya hampir tidak membayangkan mobil dengan lebih dari 2 port COM.#!/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
Komentar kecil:- array - array yang dikembalikan oleh program polling UPS, Names - array dengan nama Item, pada elemen server Zabbix dengan nama yang sama harus dimulai. KraulerMemoRT2000 - nama yang tidak terputus, harus cocok dengan nama host di server.
- , , Zabbix , , , NA, , , .
- ${#array[@]}, . , . : , , . , , . , , .
- betul [5] = “24.0” adalah koreksi tegangan untuk baterai (elemen ke-5 dalam susunan) jika UPS mengembalikan tegangan pada elemen (tegangan / sel baterai). Saya memiliki 6 elemen dalam baterai, 4 buah seri, total 24. Pada prinsipnya, ini dijelaskan dalam protokol. Saya merasa tidak perlu membuat elemen terpisah, karena semua UPS yang saya miliki dimonitor oleh template dan semuanya memiliki 48 volt. Ketika memantau UPS dengan voltase yang berbeda, tentu saja, akan diperlukan untuk sedikit mengubah struktur, mungkin optimal untuk memalu parameter baterai di server.
Script di atas ditambahkan ke cron untuk setiap menit eksekusi. Pengaturan Zabbix tidak dipertimbangkan dalam artikel ini.Pada prinsipnya, itu saja. Saya akan senang jika informasi yang dikumpulkan bermanfaat bagi seseorang.