ようへいの日々精進XP

よかろうもん

YAMAHA WLX202 の一部のシステム情報を JSON で返す API サーバーを作ってみた

tl;dr

YAMAHA の無線 LAN アクセスポイント WLX202 を触る機会がありました.

network.yamaha.com

YAMAHAルーターと組み合わせて, LAN マップ機能を使えば一括管理出来たりして最高な無線 LAN アクセスポイントだと思っています. ただ, この機器の CPU 使用率やメモリ使用率, アクセスポイントに接続しているクライアント数をモニタリングしたいと思った時に壁にぶち当たりました.

その壁とは, あくまでも「かっぱ調査」の範囲だと, CPU 使用率やメモリ使用率, 2.4GHz 帯, 5GHz 帯のそれぞれ接続しているクライアントの数を SNMP で取れないという壁です. 拡張 MIB を追加すれば取れるのかもしれませんが, シュッと取れない歯痒さに奮起した結果, Web 管理画面に出力されているシステム情報の HTML を解析して JSON で返せるようにしてみたメモです.

以下, WLX402 のシステム情報出力画面ですが, WLX202 でも似たような画面です.

f:id:inokara:20190212235325p:plain

上記の写真は http://www.rtpro.yamaha.co.jp/AP/docs/wlx402/wlan-controller/index.html より引用させて頂きました. ありがとうございます.

作ったもの

github.com

詳細はREADME をご一読下さい.

wlx は Docker コンテナを利用して動かすとバックグラウンドプロセスとして動かすよりも簡単にサービス化出来ます.

make image && make run

コンテナは WLX202 にアクセス可能なホストで起動して下さい. 無事に起動したら, 以下のように curl 等の HTTP クライアントで貴方の WLX202 の情報を取得して下さい.

curl -s -XPOST http://localhost:20200/wlx/${対象機器の IP アドレス} \
  -d "user=${ログインユーザー}" \
  -d "pass=${ログインパスワード}"

以下のような JSON が返ってくるはずです.

{
  "results": [
    {
      "ip_address": "対象機器の IP アドレス",
      "machine_name": "WLX202_XXXXXXXXXXX",
      "cpu_utilization": "10",
      "memory_usage": "39",
      "connected": "10",
      "connected_5g": "15"
    }
  ]
}

やったこと

Go で HTML を解析する

システム情報のページの HTML は以下のようになっています. (一部抜粋.)

...
<!-- wireless 5G information -->
<div class="settings">
    <h3><strong>無線情報 (5GHz)</strong></h3>
    <div class="settings-content">
    <table width="100%" summary="Settings" class="two_col_12">
        <tr>
            <td class="head">無線状態</td>
            <td>有効</td>
        </tr>
        <tr>
            <td class="head">無線モード</td>
            <td>11a+n+ac</td>
        </tr>
...
        <tr>
            <td class="head">接続端末台数</td>
            <td>14 台</td>
        </tr>
    </table>
    </div>
    <div class="clearfix">&nbsp;</div>
</div>
...

この HTML ページを解析する為に https://github.com/PuerkitoBio/goquery を利用しました. wlx のコード的には https://github.com/inokappa/wlx/blob/master/main.go#L98-L109 らへんです. CPU 稼働率, メモリ使用率が 1 つの TABLE 属性の中に含まれていて, 2.4GHz 帯の接続数, 5GHz 帯の接続数はそれぞれ個別の TABLE 属性に含まれています. もっとクールな情報の取得方法があるとは思いますが, ひとまず欲しいデータは取れたので満足しています.

Echo で API サーバーを実装する

JSON 化出来たので, その JSON を HTTP 経由で取得したいと思ったので, https://github.com/labstack/echo を使って API サーバーを作ってみました. サンプルをコピーしてこねくり回しただけの代物なので, エラー処理等が不十分で満足していません. ただ, Echo を使えば, 単純なレスポンスを返すサーバーであれば, 自分のようなスーパー素人でも実装出来るのは素晴らしいです. もっと, 使いこなせるようになりたいです.

で, wlx をどのように使うのか

監視で利用します.

Datadog Agent とカスタムの Agent Check を使って, WLX202 のリソースを監視したいと考えています. カスタム の Agent Check は wlx のエンドポイントにアクセスする HTTP クライアントと JSON をパースする処理を書くことでサクッと実装出来そうです.

以上

もしかしたら, 俺たちの YAMAHA さんのことなので, ファームウェアの更新で CPU 稼働率やメモリ使用率等, wlx を介して取得していた情報が SNMP で取れるようになるかもしれません. その暁には wlx を捨てて SNMP で取得したいと思いますので YAMAHA さん, 何卒, よろしくお願い致します.

ということで, また, クソコードを書いてしまいましたが, コードで何かを解決するというのは気持ちが良いものですよね. 引き続き, 精進します.