From 1987ec157ecfec082a4a6fedda08dd85503a4955 Mon Sep 17 00:00:00 2001 From: Alex 'AdUser' Z Date: Tue, 13 Dec 2022 10:56:09 +1000 Subject: [PATCH] + initial --- .gitignore | 1 + mqtt2zabbix | 61 ++++++++++++++++++++++++++++++++++++++++++ mqtt2zabbix.yml.sample | 13 +++++++++ 3 files changed, 75 insertions(+) create mode 100644 .gitignore create mode 100755 mqtt2zabbix create mode 100644 mqtt2zabbix.yml.sample diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1cda54b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.yml diff --git a/mqtt2zabbix b/mqtt2zabbix new file mode 100755 index 0000000..9954e40 --- /dev/null +++ b/mqtt2zabbix @@ -0,0 +1,61 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use utf8; + +use Net::MQTT::Simple; +use Zabbix::Sender; +use Getopt::Std; +use YAML; + +my ($cfg, $mqtt, $opts, $zbx); + +sub usage { + print "Usage: $0 -c [-h] [-v]\n"; + exit (shift // 0); +} + +sub msg_handler { + my ($topic, $message) = @_; + if (my $map = $cfg->{topics}->{$topic}) { + $zbx->hostname($map->{host}); + my $res = $zbx->send($map->{item}, $message); + unless ($res and $res->{response} eq 'success') { + printf "can't send data to zabbix server: %s", $res->{message} || 'unknown error'; + } + } else { + print "ignore message [$topic] $message\n"; + } + return; +} + +getopts('c:hv', $opts) + or usage(1); + +if ($opts->{h}) { + usage(0); +} + +unless ($opts->{c} and -f $opts->{c}) { + usage(1); +} + +$cfg = YAML::LoadFile($opts->{c}) or do { + print "can't load config\n"; + usage(1); +}; + +$zbx = Zabbix::Sender->new(server => $cfg->{zabbix}->{server}); + +$ENV{MQTT_SIMPLE_ALLOW_INSECURE_LOGIN} = 1; +$mqtt = Net::MQTT::Simple->new($cfg->{mqtt}->{server}); +$mqtt->login($cfg->{mqtt}->{username}, $cfg->{mqtt}->{password}); +foreach my $t (keys %{ $cfg->{topics} }) { + $mqtt->subscribe($t => \&msg_handler); +} +while (1) { + $mqtt->tick(15); +} + +exit 0; diff --git a/mqtt2zabbix.yml.sample b/mqtt2zabbix.yml.sample new file mode 100644 index 0000000..43500d0 --- /dev/null +++ b/mqtt2zabbix.yml.sample @@ -0,0 +1,13 @@ +mqtt: + server: '127.0.0.1' + username: 'zabbix' + password: 'zabbix-password' +topics: + 'sample/mqtt/topic': + host: 'zabbix-host-name' + item: 'zabbix.host.item.key' + 'sample/mqtt/topic2': + host: 'zabbix-host2-name' + item: 'zabbix.host2.item.key' +zabbix: + server: '127.0.0.1'