Zabbix API について色々調べてたけど…
「あれ?これってアイテムのデータ追加できなくない?」
という問題にぶち当たった。Slack みたいにデータを追加できるものかと思ったのだが、どうも "request": "sender data"
を受け付けない。Zabbix のドキュメントルートを探してみても sender data
という文字列は見当たらない。ということは Zabbix Sender が使えないデバイスはデータの追加が出来ないのでは?
いやいやでも Python のモジュールとかあるじゃん。
ってことで Python 系の Zabbix モジュールを色々探して読んでみた。
このコードを見て、サーバーに送る部分で何をやってるかというと、
- Zabbix サーバーの 10051 ポートに接続する
- JSON ぶん投げる
以上。マジでこれしかやってないっぽい。
ってことは nc
コマンドで接続して JSON 投げるだけで出来るんじゃね?
$ nc 10.0.3.3 10051 <<! { "request": "sender data" , "data": [ { "host": "raspberrypi" , "key": "room_temperature" , "value": "0" } ] , "clock": `date +%s` } ! ZBXDZ{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000074"}
Zabbix Sender 要らないやんけええええええええ
Zabbix Sender とは一体…。
つまり Zabbix Sender さんのお仕事は -s
、-k
、-o
オプションで受けった引数から JSON を生成して -z
のサーバに投げてるだけということだ。これなら Zabbix Sender をインストールできないデバイスでも使えそう。
FlashAir の Lua でも使おうと思ってるので Lua でソケット通信を簡単に書いてみる。Lua は全然やったことがないから作法とかがよくわからない。
#!/usr/bin/lua local socket = require("socket") local client = assert(socket.connect("10.0.3.3", 10051)) local json = [[ { "request": "sender data" , "data": [ { "host": "alarmpi" , "key": "room_temperature" , "value": "0" } ] } ]] client:send(json) socket.sleep(0.5) local line = client:receive() print(line) client:close()
一応 Zabbix にデータは入るんだけど、client:receive()
が nil
で返ってきちゃうなぁ…。そもそも FlashAir で socket
が使えるのかどうかわからんな…。HTTP リクエストはできるから REST かなぁ。
$ lua zabbix_sender.lua nil