趙苗苗,陳 鵬,顏昌隆
(1.武漢郵電科學研究院,湖北武漢 430074;2.烽火通信科技股份有限公司,湖北武漢 430074)
伴隨著大數(shù)據(jù)和各類云服務的爆炸式增長,數(shù)據(jù)中心互聯(lián)設備應運而生[1-2],該設備種類繁多,且分別提供不同的配置命令,傳統(tǒng)的CLI(命令行界面)網(wǎng)絡管理方式對管理人員和用戶要求比較高,無法滿足數(shù)據(jù)中心網(wǎng)絡的運維要求,該文提出了基于GoAhead 嵌入式Web 服務器的網(wǎng)絡管理架構(gòu),這種基于Web 的網(wǎng)絡管理系統(tǒng)通過標準的網(wǎng)絡瀏覽器就可以對設備進行訪問,可以有效地顯示網(wǎng)絡管理數(shù)據(jù),提高了網(wǎng)絡管理效率[3-6]。該文重點介紹了嵌入式Web 網(wǎng)絡管理系統(tǒng)中JSON(Javascript Object Notation)與命令行的適配機制及實現(xiàn),選擇JSON 作為AJAX(Asynchronous Javascript And Xml)的數(shù)據(jù)傳輸格式,有效地提高了傳輸效率[7-11]?;谠摍C制實現(xiàn)了設備數(shù)據(jù)的可視化,讓系統(tǒng)具有移植性和擴展性,對于不同配置命令的設備可實現(xiàn)個性化定制,開發(fā)簡單、便于維護。
該軟件系統(tǒng)主要由Webclient 模塊、GoAhead Webserver模塊、CLI模塊及底層Interface Service 等各項業(yè)務和協(xié)議模塊組成,實現(xiàn)了嵌入式Web 網(wǎng)管系統(tǒng)的基本功能,其架構(gòu)如圖1 所示。
圖1 嵌入式Web網(wǎng)絡管理系統(tǒng)架構(gòu)
該軟件系統(tǒng)采用了異步AJAX 技術,客戶端可以在不更新加載整個頁面的情況下與服務器交換數(shù)據(jù),并更新部分網(wǎng)頁,從而可以較好地同步交互造成的響應慢的問題。AJAX 的核心對象是XmlHttpRequest,通過XmlHttpRequest 對象,瀏覽器的JavaScript 可以后臺與服務器交換數(shù)據(jù),無需等待服務器的響應[12-13]。因此,在服務器和瀏覽器之間交換的數(shù)據(jù)大量減少,大大提高了頁面的響應速度。
用戶在客戶端通過瀏覽器(例如Google Chrome、Mozilla Firefox 等)對目標設備進行訪問,通過在地址欄輸入設備的IP(Internet Protocol,網(wǎng)際互連協(xié)議)地址,Webserver 將設備的配置頁面信息通過HTTP(Hypertext Transfer Protocol,超文本傳送協(xié)議)傳送到Web 瀏覽器,然后顯示在用戶終端;用戶使用時在相應的配置頁面進行參數(shù)配置操作,當用戶在Web 瀏覽器配置界面中輸入數(shù)據(jù)時,先由JavaScript 程序?qū)ζ溥M行預處理,檢查輸入數(shù)據(jù)是否符合要求,對于不符合要求的數(shù)據(jù),在前臺頁面進行返錯提示;Web 服務器執(zhí)行ASP(Active Server Page)過程、GoForms 過程實現(xiàn)接口,獲取待查詢的或者配置的JSON 數(shù)據(jù);通過映射文件將JSON 數(shù)據(jù)轉(zhuǎn)換成命令行,用于查詢數(shù)據(jù)或處理用戶設置,其中使用CLI 組件提供的IPS(Inter Process Signal,進程間信號消息)接口與CLI 模塊交互,并且CLI 與業(yè)務模塊之間不感知HTTP 數(shù)據(jù);將查詢結(jié)果或處理結(jié)果以HTTP 響應的方式返回給頁面,當請求返回時,客戶端使用JavaScript 來更新相應的用戶界面。
該軟件系統(tǒng)的適配模塊主要是由AJAX Actions解析器、映射文件以及CLI 模塊組成,AJAX Actions解析器負責解析和組裝前臺頁面發(fā)送的JSON 格式數(shù)據(jù),通過映射文件interface_map.xml 將JSON 格式數(shù)據(jù)轉(zhuǎn)換為對應的CLI 命令行字符串,然后下發(fā)到CLI 模塊,并將CLI 模塊回復的操作結(jié)果發(fā)送到前臺頁面進行解析與響應。該方案能夠有效地提高Web網(wǎng)管系統(tǒng)的數(shù)據(jù)傳送和處理效率,減少客戶端的請求和響應時間。
JSON 與CLI 命令行的映射過程如下:
1)在climap.js文件中定義了一個對象configObj,用來與命令行進行映射,該對象支持set、show、no 等方法;
2)根據(jù)funName 查找映射文件interface_map.xml對應的id,并獲得對應的CLI 命令行字符串,其中,interface_map.xml 文件的參數(shù)說明如表1 所示。
表1 映射文件參數(shù)說明
配置操作流程如圖2 所示。
圖2 配置操作流程
如圖2 所示,用戶在配置設備時,首先在Web 前端配置頁面完成設備參數(shù)的配置,點擊提交按鈕,用一個按鍵函數(shù)submitForm 來觸發(fā)AJAX 數(shù)據(jù)請求,這個過程使用configObj 對象的set 方法,以CallHome配置為例:
configObj.set("set_callhome","callhome","");
根據(jù)funName 和id 找到映射文件interface_map.xml中對應的CLI 命令行字符串:
<set funName="set_callhome">
<mo2cli_entry id="callhome" mode="CONFIG_M ODE" cliName="netconf-ch-ssh" cat-id="ip" cat=""/></set>
取出字符串并以JSON 鍵值對的形式存放在cli.array 數(shù)組中:
"cli_array":[{type:"set",cli:"config terminal net conf-ch-ssh "}]
通過POST 請求把JSON 數(shù)據(jù)發(fā)送到webs2cli_uniform_interface 接口,后臺解析JSON 字符串并下發(fā)到CLI 模塊,命令行執(zhí)行完之后返回響應,由handle_config_result 函數(shù)處理返回的響應,配置錯誤時后臺返回錯誤提示數(shù)據(jù)給前臺頁面,配置成功則調(diào)用show 命令刷新前臺頁面,前臺解析并顯示配置數(shù)據(jù)。
如圖3 所示,用戶在Web 前端點擊查詢功能頁面,頁面首先調(diào)用initTable 函數(shù)初始化表格,在show_config_info 函數(shù)中實現(xiàn)show 命令的轉(zhuǎn)換。
圖3 查詢操作流程
以CallHome 查詢功能為例,使用configObj 的show 方法:
configObj.show("show_callhome","show_callhome","");
根據(jù)funName 和id 找到映射文件interface_map.xml中對應的CLI 命令行字符串:
<show funName="show_callhome">
<mo2cli_entry id="show_callhome" mode="CON FIG_MODE" cliName="debug show netconf-ch-ssh"cat=" ; ;"/></show>
因為JSON 不能識別/r/n,故用其實體 ; 來表示。從而獲得對應的CLI命令行字符串:
"cli_array":[{"type":"get","cli":"debug show netco nf-ch-ssh "}]
通過AJAX 請求將命令行下發(fā)后,后臺返回的是字符串,此時webs2cli_uniform_interface 接口提供通道作用,handle_show_info 函數(shù)負責解析,將字符串解析成JSON 類型數(shù)組并返回給前臺頁面,前臺HTML 頁面負責用戶界面的組織及數(shù)據(jù)格式化的輸出。
該軟件系統(tǒng)選擇JSON 作為AJAX 的數(shù)據(jù)傳輸格式,同時選取cJSON 作為JSON 的封裝和解析庫。cJSON 是一個開源、簡潔、功能全面的JSON 封裝/解析器。JSON 與命令行模型適配過程中使用的接口函數(shù)如下:
1)JSON 數(shù)據(jù)包解析接口
cJSON*cJSON_Parse(const char*value)
用于解析JSON 數(shù)據(jù)包,并按照cJSON 結(jié)構(gòu)體的結(jié)構(gòu)序列化整個數(shù)據(jù)包,其中的參數(shù)是JSON 鍵值對字符串。
2)JSON 對象遍歷接口
char*cJSON_Print(cJSON*item)
用于將創(chuàng)建好的cJSON 對象封裝成字符串形式的JSON 數(shù)據(jù),并打印出來,其中的參數(shù)是cJSON 結(jié)構(gòu)數(shù)據(jù)。
3)查找指定的JSON 對象接口
cJSON*cJSON_GetObjectItem(const cJSON*const object,const char*const string);
用于解析cJSON 結(jié)構(gòu)體中指定名稱的JSON 對象,返回JSON 格式數(shù)據(jù),其中第一個參數(shù)是cJSON結(jié)構(gòu)數(shù)據(jù),第二個參數(shù)是指定的JSON 對象名稱。
4)查找JSON數(shù)組中指定索引的JSON對象接口
cJSON*cJSON_GetArrayItem(const cJSON *array,int index);
用于解析cJSON 數(shù)組中指定名稱的JSON 對象,返回JSON 格式數(shù)據(jù),其中第一個參數(shù)是cJSON 數(shù)組,第二個參數(shù)是待查找的JSON 對象的索引。
上述接口實現(xiàn)了JSON 數(shù)據(jù)的封裝和解析,通過webs2cli_uniform_interface 接口調(diào)用實現(xiàn),JSON 支持嵌套,即一個JSON 格式中,允許再嵌套一個JSON 格式的數(shù)據(jù),理論上支持無限層次的JSON 嵌套[14-16]。
該文以CallHome 配置和查詢功能為例來說明管理軟件系統(tǒng)的測試。CallHome 是一種常用的Netconf 設備,主動連接控制器的配置選項。
1)測試工具:Google Chrome/Secure CRT Portable 7.0.4。
2)測試設備:數(shù)據(jù)中心互聯(lián)設備。
將測試設備與PC 端連接,通過軟件Secure CRT Portable 對測試設備進行訪問,瀏覽器登錄設置連接的IP 地址即可訪問測試設備。通過下面的測試用例來測試該功能的可用性:
1)在瀏覽器的CallHome 配置頁面中執(zhí)行配置下發(fā)操作,在CLI 中觀察其效果是否一致;
2)在CLI 中用命令行的方式執(zhí)行配置下發(fā)操作,觀察是否在Web 頁面中能夠同步顯示。
如圖4 所示,在Web 頁面根據(jù)參數(shù)要求填寫CallHome 的控制器IP 地址及端口,填寫完成后,點擊新增按鈕,頁面顯示配置成功提示,并且頭部列表上顯示剛剛新增的配置數(shù)據(jù),這里默認網(wǎng)絡類型為公網(wǎng)且值為1。然后在CLI 界面通過debug show netconfch-ssh命令來查詢,結(jié)果顯示與Web頁面一致。如圖5所示,在CLI界面通過命令行方式配置控制器IP地址、端口及網(wǎng)絡類型(私網(wǎng):CTVPN193),配置下發(fā)后通過命令行查詢方式,得到顯示結(jié)果與Web頁面相同。
圖4 Web頁面配置查詢功能測試展示圖
圖5 CLI界面配置查詢功能測試展示圖
通過上述測試結(jié)果可得出如下結(jié)論:
1)Web 網(wǎng)管和傳統(tǒng)的CLI 網(wǎng)管在功能上可實現(xiàn)同步,操作結(jié)果完全一致,均能滿足用戶的要求;
2)Web 網(wǎng)管方式操作簡單易上手,數(shù)據(jù)直觀,擁有更好的用戶體驗。
該文介紹了一種基于GoAhead 的嵌入式Web 網(wǎng)管系統(tǒng)的實現(xiàn)架構(gòu),并重點介紹了該軟件系統(tǒng)中JSON 與命令行的適配機制與實現(xiàn),基于此,可以根據(jù)不同客戶的需求實現(xiàn)不同設備管理系統(tǒng)軟件的快速定制和開發(fā)。針對不同嵌入式設備和不同的業(yè)務需求,只需要根據(jù)設備的配置命令,修改映射文件和底層的封裝接口,即可將該方法成功應用到新的管理系統(tǒng)中,開發(fā)簡單、便于維護,有效降低了嵌入式設備的運行和維護成本,提高了Web網(wǎng)管系統(tǒng)的開發(fā)和維護效率。