LoginSignup
14
14

More than 5 years have passed since last update.

network機器のWeb API化

Last updated at Posted at 2017-07-19

これはなにか

自作gemのxloginを利用し、Web APIを提供していないネットワーク機器にも外付けのAPIを提供するツール。

動作イメージ

Screenshot from 2017-07-20 21-01-28.png

図のように、対象機器に対してパラメータ付きでコマンドを解釈・実行し、必要な情報のみキャプチャすることができる。

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対応?手が空いたときにやります。

Screenshot from 2017-07-20 21-02-04.png

なお、Architectureの欄にはlib/templatesディレクトリにある機器のファームウェアテンプレートを指定する。
IOS等のファームウェアに追加対応する場合は、ビルトインしているvyos.rbを参考に作成すればよい。

対象ネットワーク機器に投入するCommandを登録する

ここでは実際に機器に投入するコマンドを入力する。
パラメータとして実行時に指定する項目は{{ }}で囲んで変数として定義しておくことができる。

Screenshot from 2017-07-20 21-02-18.png

またCapturesで指定した名前付き正規表現で任意の文字列をコマンドの出力結果から抽出できる。

HostとCommandをQueryに紐付ける

最後にこれまで登録したHostとCommandを紐付けるQueryを作成すればOK。

Screenshot from 2017-07-20 21-11-13.png

完了すれば下図のようになっているはず。
ここで実行ボタン(青の紙飛行機)を押せば冒頭の実行結果画面が表示される。(パラメータが不足している場合は入力を促される)

Screenshot from 2017-07-20 21-01-44.png

実装、利用技術について

そのうち追記します。

参考

https://github.com/haccht/xlogin.git
https://github.com/haccht/networkapi.git

ネットワークAPIを試作してみた with Ruby/Rails/Redis/expect
http://qiita.com/kooshin/items/21f96c5c32c20a1968a0

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14