zebra在設計命令格式時,將命令節點node和命令command分開,整個命令結構是乙個樹狀,如圖
noden表示命令節點,cmdn表示具體命令,在zebra的整個命令列設計當中,zebra用向量的概念將命令和節點連線起來,乙個全域性向量cmdvec,指向整個命令結構,cmdvec的每個索引值都是乙個具體的命令節點,在每個命令節點的結構中又存在各自的命令向量cmdvector,該向量指向隸屬於該節點的命令,cmd_vector終端額每個索引值都是乙個具體的命令。程式索引順序為cmdvec->noden->cmd1。
命令的註冊過程
zebra要成功註冊乙個命令,需要以下幾個步驟:
(1)安裝乙個新節點(如無需安裝可省略這步)
(2)寫一條命令的實現
(3)將一條命令掛到節點下
/* struct for vector */
struct vector
;
在zebra.h中定義,表示乙個向量結構,在該結構中,max表示目前使用的最大slot,alloced 表示被分配到的slot,max<=alloced,index通過索引方式。儲存value.
命令節點
struct cmd_node
;
該結構在command.h中定義,用來表示乙個命令節點,節點的型別由node_type列舉指出,節點的標識字元由prompt表示,func表示該節點對應的操作方法。該節點下的命令由vector定義的cmd_voctor表示,例如,在全域性配置模式下,命令節點的定義可以是:
struct cmd_node config_node=
;
此外,command.h中還定義了乙個重要的結構,就是cmd_element結構,該結構定義了一條命令的全部資訊,定義如下
struct cmd_element
string描述了命令的實現串,比如我們要顯示摸個配置資訊「show where you are from」;
func 是實現string的具體方法;doc是string的解釋,zebra將string和doc解析儲存,由strvec這個向量指向。下面我們逐步使用zebra。
安裝乙個命令節點
zebra中安裝乙個命令節點的介面:void install_node(struct cmd_node *node, int (*func)(struct vty*))
我們知道。整個zebra的框架是由乙個向量指向乙個節點,該節點又存在另乙個向量,這個向量又有自己的儲存結構。從而將整個zebra的命令連線起來,祈禱提綱挈領的作用。zebra中由vector定義了乙個全域性向量,名為cmdvec,也就是上文中說的cmdvec。命令節點的實質是將乙個cmd_node結構的位址。儲存到cmdvec中乙個未被使用的slot-index[i]裡。
你可以將自己的命令安裝在zebra原帶的節點下,也可以新增自己新的節點,我以我的名字命名了乙個新的節點。在command.c中定義:
struct cmd_node menger_node=
;
將menger_node新增到node_type中,然後用install_node將這個節點安裝到cmdvec中,install_node(&menger_node,null);
寫一條命令的實現方法
zebtas實現命令的方法由command.h中的乙個巨集來實現
/*defun for vty command inte***ce*/
#define defun(funcname,cmdname,cmdstr,helpstr)\
int funcname(struct cmd_cmd_element*,struct vty *,int,char **)\
struct cmd_element cmdname=\
;\ int funcname\
(struct cmd_element *self,struct vty *vty,int argc,char **argv)
這個巨集很有意思,它表明了乙個命令的結構,命令的描述,命令的解釋和命令的具體實現方法。編輯command.c檔案,照著樣子寫一條命令實現方法。
例如我實現的乙個簡單方法:
defun(menger_hello,
menger_hello_cmd,
"menger say hello",
"greet\n"
"greet to someone\n")
但是這樣子還不夠,要進入menger_node節點還得靠乙個觸發命令
degun(menger_enable,
menger_enable_cmd,
"menger",
"turn on privileged mode command\n")
安裝命令
命令安裝的實質是將乙個cmd_element結構儲存到cmd_node結構中的成員cmd_vec向量的乙個未被使用的slot裡。
呼叫介面:void install_element(enum node_type, struct cmd_element *cmd);
將剛才寫好的命令安裝到定義的節點下,在command.c中新增;
/*為了進入自定義節點,需要安裝觸發節點*/
install_element(enable_node,&menger_enable_cmd);
install_element(menger_node,&menger_hello_cmd);
Linux chown命令詳解使用格式和方法
指令名稱 chown使用許可權 root 使用方式 chown cfhvr help version user group file 利用 chown 可以將檔案的擁有者加以改變。這個指令只有是由系統管理者 root 所使用,一般使用者沒有許可權可以改變別人的檔案擁有者,也沒有許可權可以自己的檔案擁...
Ubuntu sudo命令詳解使用格式和方法
ubuntu預設不能直接用root帳戶登入,必須從第乙個建立的使用者 既安裝時建立的那個使用者 通過su或sudo來獲得root許可權。在ubuntu中對系統進行操作很多時候都要使用這個命令,由此可見對於新來說很有必要來認識這個命令。這或許不太方便,但這樣增加了安全性,避免使用者由於誤操作而損壞系統...
資料儲存localStorage的使用方法
初始化資料庫。如果路徑為空,它將建立乙個記憶體資料庫 void localstorageinit const char fullpath 釋放分配的資源 void localstoragefree 設定儲存內容 void localstoragesetitem const char key,cons...