TWSNMPのWeb API
TWSNMPで管理しているマップの情報を他のパソコンで動作しているTWSNMPから取得するためのWeb APIを作った時の話です。
今朝、猫に2時半に起こされたので書いています。猫は横から真面目に書いているか見張っています。
TWSNMP間の連携
最初の目的はTWSNMPのマップの情報を別のパソコンで動作しているTWSNMPから取得できればよいと考えていました。取得した情報でマップ上のアイコンの色を変えれば別のパソコンで動作しているマップの状態を階層的に把握できて大規模なネットワークでもTWSNMPで管理できると考えたからです。TWSNMP間の通知のイメージは、
のような感じです。
プロトコルを考える
別々のパソコンで動作するプログラム間の通信にはプロトコルが必要です。プロトコルは通信の決まりのようなものです。「元気ですか?」と言えば「元気です!」と答える。
大昔だとTCP/IPで独自のプロトコルを作ることがありました。TWSNMP専用のプロトコルを設計するということです。でも、今は、HTTPプロトコルの上のREST APIが主流です。
なので、TWSNMPもREST APIで通信することにしました。
REST APIのパッケージ
GO言語の標準パッケージにはHTTPサーバーの機能があります。
これを使えば実現はできますが、もう少し楽に作りたいと考えました。そこで、Googleに聞いてみました。"golang rest api json"
手軽なのが見つかりました。
使い方は簡単で
package main
import (
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
)
func main() {
api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
api.SetApp(rest.AppSimple(func(w rest.ResponseWriter, r *rest.Request) {
w.WriteJson(map[string]string{"Body": "Hello World!"})
}))
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
}
のぐらいでREST APIサーバーが実現できます。
ここで夢が膨らむ
このパッケージのドキュメントを読んでいると
API and static files
Combine Go-Json-Rest with other handlers.
という説明を見つけました。なるほどHTML、画像、CSS、JavaScriptも使えるということです。ここで夢が膨らみました。TWSNMPのマップは、
のようにHTMLなどWebの技術で表示しています。ならば、Webブラウザーでマップも表示できるはずだと思った瞬間からアドレナリンがでて作り始めていました。結果
のようにブラウザーからマップを表示できるようにしました。
作ったREST API
マップも表示するようにしたので沢山APIが必要なように思われますが、作ったAPIは2つだけです。
% curl -k --basic -u a:a https://127.0.0.1:8192/api/mapstatus
{
"High": 0,
"Low": 2,
"Warn": 5,
"Normal": 12,
"Repair": 3,
"Unkown": 0,
"DBSize": 780550144,
"DBSizeStr": "781 MB",
"State": "low"
}
curl -k --basic -u a:a https://127.0.0.1:8192/api/mapdata
{
"LastTime": 1596138925,
"MapName": "test1",
"BackImg": false,
"Nodes": {
"15cae6260cc1a068": {
"ID": "15cae6260cc1a068",
"Name": "NTT Router",
"Descr": "Discovered at 2019-10-06T09:07:51+09:00",
"Icon": "sync",
"State": "normal",
"X": 414,
"Y": 146,
"IP": "192.168.1.1",
"MAC": "00:25:36:AB:77:53(Oki Electric Industry Co., Ltd.)"
},
設定を作る
Webサーバー機能を有効にする設定は、拡張設定のダイアログに追加しました。
設定できるのは、ポート番号とユーザーID、パスワードです。
ゼロトラストに対応する
セキュリティが大事というご時世なので暗号なしで通信するのはちょっと心配です。なので、TWSNMP間の通信は暗号にしました。REST APIのHTTPサーバー機能は標準のパッケージを使っているので秘密鍵と証明書を作成すれば比較的簡単にTLS(昔でいうSSL)に対応できます。秘密鍵と証明書の作成はTWSNNMPの中で行うようにしました。この話は長くなるので別の機会に書きます。
この記事を書き終わったところで、猫が「ご苦労」と鳴きました。
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。