現在位置: ホーム Documents コマンドの追加

コマンドの追加

EOSに独自のコマンドを追加する / adding your command to EOS CLI

(verified 2010 Apr. / EOS 4.3.0 / DCS-7120T-4S 03.01)

コマンド

EOS のコマンドは基本的には Python コードで書かれている。システムに Login すると CLI (コマンドラインインタプリタ)が動作し、ユーザと対話するが、ここにコマンドを入力すると、対応する Python プログラムが実行される。

この経路と仕組みを理解することで、独自のコマンドをシステムに追加することができる。

また、標準的に用意されている privilege 設定によって、特定ユーザに特定の機能を持ったコマンドだけを実行可能とすることが可能である、と、思う。(未確認)

実体

コマンドの実体は /usr/lib/python2.5/site-packages/CliPlugin ディレクトリ以下にある。例えば Ntp.py には ntp 関連コマンドが記述されている。なお DonkeyCli.py というサンプルに近い隠しコマンドもあるので参考にすると良い。

ともかく結論から言えば Ntp.py などを真似て新しいコマンドを実装した Python プログラムをこのディレクトリ以下に置けば、それ以降に起動した CLI からそのコマンドは有効になる。以下に設置した Python プログラムがコマンドとして登録される経路を示す。

login から

ユーザが login すると、login shell として /usr/bin/RunCli を経て /usr/bin/Cli が起動される。(/etc/shellsにも登録されている)

/usr/bin/Cli の中身は単に PATH を設定して Cli.py を起動しているだけであり、このCli.pyがEOS CLI の実体である。例えば単に /usr/bin/Cli を起動すると EOS CLI が起動する。

bash-3.2# /usr/bin/Cli
localhost>show vlan
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 vlan1 active Cpu, Et1
2 vlan2 active Cpu, Et11, Et12, Et13
3 vlan3 active Cpu, Et17

localhost>

スキャン・登録

/usr/lib/python2.5/site-packages/Cli.py は起動されると、その __init__() 関数の中で loadPlugins() 関数を呼び出しており、これが /usr/lib/python2.5/site-packages/CliPlugin ディレクトリ以下をスキャンし、必要なコマンドの登録処理を行う。

例えば Ntp.py を見ると、プログラム中に BasicCli.registerShowCommand() 関数による SHOW コマンドへの NTP オプションの追加や、BasicCli.GlobalConfigMode.addCommand() 関数による configuration モードへの NTP 設定コマンドの追加などが含まれている。

つまり独自コマンドを登録するには、この Plugin ディレクトリに新しい Python ファイルを置き、そこに必要なコマンド登録処理を記述すれば良いことがわかる。

準備

以下にプログラムを設置するために必要な bash アクセスやファイルシステムの read write 化などの準備作業を示す。

bash は enable モードから bash コマンドで起動することができる。具体的には Arista の CLI が動作した状態で enable コマンドを実行し、そのうえで bash コマンドを実行すればよい。多くの作業は特権を必要とするので su しておくと良い。

mypc$ slogin -l admin arista.example.com
Password:
localhost>enable
localhost#bash

Arista Networks EOS shell

[admin@localhost ~]$ su
Password:
bash-3.2#

ファイルシステムは read only モードでマウントされているので、下記のようにして read write モードで remount しておく。

bash-3.2# mount -o rw,remount / 
bash-3.2#

プログラムの設置

コマンドの登録を含む Python プログラムを /usr/lib/python2.5/site-packages/CliPlugin ディレクトリ以下に設置する。Python ファイルはどのような方法で作成・設置しても構わないだろうが、例えば以下のような方法がある。

  1. Arista の bash から vi によって直接編集
  2. 外部のエディタで作成したものを copy & paste (Arista 側では cat > sample などとして待ち構えておく)
  3. USB メモリに入れてコピー(USB ストレージを差して cp /mnt/flash/sample . など)
  4. Web ディレクトリに置いて wget で取得(Arista には /usr/bin/wget が標準的に用意されている)

例:Hello World

古き良き慣習に従って Hello World から始める。下記の内容で HelloCli.py ファイルを作成する。左端の行番号に従って以下に解説する。

1: import BasicCli, CliParser
2: tokenHello = CliParser.KeywordRule( 'hello', helpdesc='Says hello' )
3: def doHello( mode ):
4:         print "World.\n"
5: BasicCli.UnprivMode.addCommand( ( tokenHello, doHello ) )

1行目は最低限必要なクラスの import である。
2 行目の CliParser.KeywordRule() は単なる単語をコマンドやパラメタとして扱えるように定義する。この空白で区切られたコマンドやパラメタのことをトークンと呼ぶ。ここでは hello というトークンに help メッセージとして「Says hello」を合わせて登録する。EOS CLI ではすべてのコマンドやパラメタについて動的にヘルプメッセージを提供してくれる(コマンド入力途中で ? キーを押すと表示される)が、その登録である。
3〜4行目の doHello() 関数こそが hello コマンドを投入したときに呼び出される関数である。
5行目の BasicCli.UnprivMode.addCommand() 関数によって、2行目で定義したトークン(ここではコマンド名)が、その実体 doHello() とともに非特権モードのコマンドとして登録される。

作業例

以下に vi エディタでプログラムを直接書いた例を示す。

bash-3.2# cd /usr/lib/python2.5/site-packages/CliPlugin/
bash-3.2# vi HelloCli.py
bash-3.2# cat HelloCli.py
import BasicCli, CliParser
tokenHello = CliParser.KeywordRule( 'hello', helpdesc='Says hello' )
def doHello( mode ):
print "World.\n"
BasicCli.UnprivMode.addCommand( ( tokenHello, doHello ) )
bash-3.2#

確認

この状態で bash から /usr/bin/Cli を起動すれば EOS CLI が起動し、いま登録した hello コマンドが試せる。

bash-3.2# /usr/bin/Cli 
localhost>hello
World.

localhost>exit
bash-3.2#

また、localhost> プロンプトに続けて ? をタイプすれば、ヘルプメッセージの中に hello が表示されていることがわかる。hello と全部タイプする前に hel あたりで TAB キーを押せば、残りのコマンド名の補完もやってくれる。

bash-3.2# /usr/bin/Cli 
localhost>?
....
hello Says hello
....
localhost>

これで一つのコマンドを EOS CLI に追加することができた。

next step

これだけではもちろん殆ど役に立たない。進むべき次のステップとしては以下のようなものが考えられる。

  • 恒久的なコマンドの設置:SWIX formatExtension によるコマンドの追加
  • コマンドにオプションを持たせる
  • SysDB など Arista の機能を使う

近日中に追加したい。