これはなにか
自作gemのxloginを利用し、Web APIを提供していないネットワーク機器にも外付けのAPIを提供するツール。
動作イメージ
図のように、対象機器に対してパラメータ付きでコマンドを解釈・実行し、必要な情報のみキャプチャすることができる。
JSON APIもサポートしているので以下のようにCLIからも情報取得でき、captured
を切り出せばinfluxdb等の時系列DBによる可視化が容易にできる。
$ curl -s -XGET http://localhost:3000/FDytULGzpXufoA.json?intf=eth1 | jq .
{
"status": "success",
"query": "show interfaces ethernet eth1",
"body": "show interfaces ethernet eth1\n\u001b=\reth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN gro\u001b[m \bup default \u001b[m\n link/ether dc:9f:db:28:0f:de brd ff:ff:ff:ff:ff:ff\u001b[m\n inet 192.168.1.1/24 brd 192.168.1.255 scope global eth1\u001b[m\n valid_lft forever preferred_lft forever\u001b[m\n inet6 2001::1/64 scope global \u001b[m\n valid_lft forever preferred_lft forever\u001b[m\n inet6 fe80::de9f:dbff:fe28:fde/64 scope link \u001b[m\n valid_lft forever preferred_lft forever\u001b[m\n Description: LAN1\u001b[m\n\u001b[m\n RX: bytes packets errors dropped overrun mcast\u001b[m\n 5463830257 38892904 0 1849 0 83149\u001b[m\n TX: bytes packets errors dropped carrier collisions\u001b[m\n 81354474060 61170118 0 0 0 0\u001b[m\n\r\u001b[K\u001b>haccht@erl-3:~$ \n",
"captured": {
"input_bytes": 5463830257,
"input_errors": 0,
"input_drops": 1849,
"output_bytes": 81354474060,
"output_errors": 0,
"output_drops": 0
}
}
インストール
DBにはmysqlを利用しているので、予めmysqlもしくはmariadbをインストールしておく必要がある。
$ git clone https://github.com/haccht/networkapi.git
$ cd networkapi
$ bundle install --path vendor/bundle
$ MYSQL_PASSWORD='<password>' bundle exec rails db:create
$ MYSQL_PASSWORD='<password>' bundle exec rails db:migrate
$ MYSQL_PASSWORD='<password>' bundle exec rails server -b 0.0.0.0 -p 3000
ブラウザから http://localhost:3000/ にアクセスしてうまくトップページが表示されていればOK。
利用方法
対象ネットワーク機器のHostを登録する
これは自宅のedgerouter-lite3を登録した様子。
対象機器へのコネクションはURI形式で指定する。
xlogin側が対応できていないので現状とりあえずtelnetのみサポート。ssh対応?手が空いたときにやります。
なお、Architecture
の欄にはlib/templates
ディレクトリにある機器のファームウェアテンプレートを指定する。
IOS等のファームウェアに追加対応する場合は、ビルトインしているvyos.rb
を参考に作成すればよい。
対象ネットワーク機器に投入するCommandを登録する
ここでは実際に機器に投入するコマンドを入力する。
パラメータとして実行時に指定する項目は{{ }}
で囲んで変数として定義しておくことができる。
またCaptures
で指定した名前付き正規表現で任意の文字列をコマンドの出力結果から抽出できる。
HostとCommandをQueryに紐付ける
最後にこれまで登録したHostとCommandを紐付けるQueryを作成すればOK。
完了すれば下図のようになっているはず。
ここで実行ボタン(青の紙飛行機)を押せば冒頭の実行結果画面が表示される。(パラメータが不足している場合は入力を促される)
実装、利用技術について
そのうち追記します。
参考
https://github.com/haccht/xlogin.git
https://github.com/haccht/networkapi.git
ネットワークAPIを試作してみた with Ruby/Rails/Redis/expect
http://qiita.com/kooshin/items/21f96c5c32c20a1968a0