コマンドの作成(#1)
トークン
コマンドの追加 では hello コマンドを追加した。具体的には CliPlugin ディレクトリ以下にコマンドを追加する処理を含んだ Python プログラムを置くだけである。それ以降に起動した EOS CLI では hello コマンドが有効になる。
以下、そこで用いた HelloCli.py の構造を説明することでコマンド作成に必要なトークンについて説明する。
bash-3.2# cat -n 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 ) )
bash-3.2#
このプログラムの内容を示す。
1: まずコマンド処理に最低限必要な BasicCli, CliParser クラスを読み込み、
2: hello という名前と、そのコマンドが help として出すべき文字列をトークンとして作成する。
3: また hello コマンドの実体となる関数 doHello を用意する。
4: その実体は単に World とプリントするだけ。
5: 準備したトークンと実体となる関数を一組にして非特権モードで登録する。
この場でのトークンとは、コマンドとして投入された文字列から切り出すべき単語を指す。コマンドをEOS CLIに登録する事は、このトークンを追加することと同義である。
Rule
ただし CliParser.KeywordRule( ) の名前から分かるように、このトークンの実体はルールである。つまりこのトークンはコマンドから切り出す文字列と、トークン相互の関連性に関するルールか らなる考えれば良い。site-packages ディレクトリにある CliParser.py プログラムの Rule クラスにその定義があり、さまざまな関数が用意されている。
Ruleは、CLI でコマンドを入力する際に、次に入力できる命令の規則を決めるためのものである。つまり CLI はMode ごとに Rule のツリーを持っている。つまり Rule 自体も Rule のツリーを持っており、Rule 通りにたどっていけば正しくコマンドが実行されるようになっている。
Rule クラスに用意されている関数およびその使い方などは別に述べる。(そのうちに追加したい・・)
トップレベルへの登録
特権・非特権モード
トップレベルへのコマンドの登録には以下の二つのモードがある。
- BasicCli.EnableMode.addCommand( ( tokenHello, doHello ) )
- BasicCli.UnprivMode.addCommand( ( tokenHello, doHello ) )
前者は特権モード (EnableMode) にだけ現れ、特権モードでだけ実行可能になるコマンドとしてトークンを登録する。
後者は非特権モード(UnprivMode)と、特権モードの両方で実行可能なものとして登録する。
隠しコマンド
EOS CLI でのヘルプ(?)や completion (タブキーを押すと行われるコマンド自動補完)を一切行わない、つまりそのコマンドの存在を表に出さない「隠しコマンド」としての登録も可能である。以下 のようにルールをCliParser.HiddenRule( ) で囲んで addCommand() すれば良い。以下に特権モードおよび非特権モード登録での例を示す。
- BasicCli.EnableMode.addCommand( CliParser.HiddenRule( tokenHello, doHello ) )
- BasicCli.UnprivMode.addCommand( CliParser.HiddenRule( tokenHello, doHello ) )
SHOW コマンドへの登録
他に show コマンドへ登録するための関数も用意されている。
先に述べたように Rule はもともと木構造になっているため、これは show コマンドのトークン(ルール)に、自分が定義したトークン(ルール)を追加するものだと考えれば良い。もちろん show コマンドはトップレベルに登録されているはずなので、つまり二段目に登録していることになる。
SHOW HELLO
試みに show hello コマンドを登録してみる。以下の内容で
/usr/lib/python2.5/site-packages/CliPlugin ディレクトリ以下に ShowHelloCli.py などとして作成する。
import BasicCli, CliParser
def showHello( mode ):
print "Hello World.\n"
tokenHello = CliParser.KeywordRule( 'hello', helpdesc='Show your hello' )
BasicCli.registerShowCommand( tokenHello, showHello )
今までの例と異なるのはたった一点、登録のための BasicCli.registerShowCommand( ) 関数である。これで show hello コマンドとして登録される。以下に実行結果を示す。show 後の ? に反応していることがわかる。
localhost>show ?
...
hello Show your hello
....
localhost>show hello ?
| Output modifiers
<cr>
localhost>show hello
Hello World.
localhost>
特権コマンドとしての登録
特権モードでしか機能しない(かつ現れない)show コマンドを登録するには以下のように privileged=True と引数を一つ追加すれば良い。
BasicCli.registerShowCommand( tokenHello, showHello, privileged=True )
隠しコマンドとしての登録
隠しコマンドとして show コマンドを登録するには引数にhidden=True を追加すれば良い。
BasicCli.registerShowCommand( tokenHello, showHello, hidden=True )
特権モードに隠しコマンドを登録したい場合は priviledged と hidden の両方を与えれば良い。
実装
privileged や hidden パラメタの指定によって registerShowCommand() がどのように振る舞いを変えるか興味があれば BasicCli.py の registerShowCommand() の実装およびコメントを読むと良い。全体構造を見る良い入り口の一つである。