zebra命令儲存原理和使用方法

2021-06-20 06:42:25 字數 3025 閱讀 2675

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...