歡迎您光臨本站 註冊首頁

OpenWbem 的介紹及其 CMPI 介面的 CIM provider 的開發實現

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
通用信息模型 (Common Information Module) 相關的技術正在被廣泛地應用於設備管理,網路控制,信息處理等領域, CIM 模型已經被 IT 界各大公司廣泛用作上層管理軟體的基礎信息模型,如 IBM,HP,EMC 等。當設備提供商需要將其設備納入信息模型和管理體系時, CIM provider 的開發就顯得尤為重要。雖然如今 CIM 技術及其 provider 開發已經成為一項熱門技術。但是大量的文檔集中在 sfcb 及 pegasus 方面。基於 Openwbem 的 provider 開發的資料是少之又少。本文希望能填補一些空白,讓需要基於 Openwbem 的 CIM provider 開發者快速越過開發前期的技術瓶頸障礙。

概述

本文介紹了 OpenWbem 相關的基本概念及其 CMPI 介面的 CIM provider 的開發。從 OpenWbem 的安裝入手,到其 CIM provider 的編寫,編譯,註冊和調試,希望對基於 Openwbem 的 CIM provider 初次開發者有所幫助。





Openwbem 及相關標準的介紹

WBEM/CIM 及其相關標準

WBEM (Web-Based Enterprise Management) 是由分散式管理工作組 (DMTF) 負責開發的一套使用 Internet 標準技術的一體化企業計算管理環境。它提供了基於 WEB 技術的完整的工業統一管理工具。促進了完全不同技術和平台的數據交換。

CIM (Common Information Module) 通用信息模型作為 WBEM 的核心定義了一種分層次的、面向對象的信息模型和架構,該架構可以為企業網路管理整個範圍內的系統,網路,應用程序和服務的信息管理提供公共定義,而且允許用戶擴充。它描述了管理的概念模型,可以使得用戶可以通過網路在彼此的系統之間交換語義豐富的管理信息。目前 CIM 模型已經被 IT 界各大公司 IBM, HP, EMC 等廣泛用作上層管理軟體的基礎信息模型,相關的技術正在被廣泛地應用於設備管理,網路控制,資料庫信息處理等領域。

Openwbem 的相關概念及用途

CIMOM 即公共信息模型對象管理器,在 CIM 模型的實現中是最重要的部件。它是一個描述信息系統構成單元的對象資料庫,為其他程序提供了一個訪問信息系統構成單元的公共介面集,實現在 HTTP 操作和 CIMXML HTTP 編碼之上的 CIM 操作,還有一個為客戶端和供給端提供的介面類庫。

CIMOM 的實現項目很多,有 OpenPegasus, SFCB 和 Openwbem 等。其中 Openwbem 是一個企業級 wbem (Web Based Enterprise Management) 實現的開源項目。它在 Linux 平台 SUSE 企業伺服器9和10 中都已經存在。

CIM provider 為數據提供者,當客戶管理者需要 CIMOM 提供管理信息時,它在可以從廣泛的設備上提取出需要的信息返回給 CIMOM, 進而提供給客戶端程序。

下圖為 CIM 模型管理體系中的各個部件的位置:


圖 1 CIM 模型管理體系

Openwbem 的安裝及配置

由於 Openwbem 在 SUSE linux 安裝包中已經存在,它的安裝變得十分便利,可以直接通過 Yast2 安裝。在使用之前,必須確保以下3個包已經裝在開發平台上,它們是 openwbem, openwbem-devel, cim-schema。

Openwbem 的基本操作

若想看出 Openwbem 是否安裝成功,可以通過查看幫助信息 ”-h” 來達到目的:


圖 2. 查看 Openwbem 是否安裝命令

在幫助信息的選項中, -d 能讓 CIMOM 這個後台程序運行在前台,因而能顯性的實時追蹤到 debug 信息和狀態。選項 –c 後面必須指定配置文件的路徑,否則 CIMOM 將默認地認為配置文件為 /etc/openwbem/openwbem.conf.

通常,我們不會對配置文件作過多的修改,在 Openwbem 安裝完畢后直接後台運行。


圖 3. 啟動 openwbem 命令

雖然 CIMOM 已經正常運行,但是它的資料庫里既沒有用戶的命名空間,也沒有標準的 CIM schema 的類庫集。而這些必須通過 OpenWbem 的命令手動操作建立。


圖 4. 創建 namespace 命令


圖 5. 註冊基類命令

註冊基類命令操作可能會持續一段時間,並且用戶可以看到不斷輸出的實時狀態信息。若處理期間發生錯誤,錯誤斷點通過輸出信息可以很快被找到。





CIM Provider 開發現狀及主要介面介紹

Openwbem 所支持的 provider 介面介紹

在 CIM 模型的管理體系中, CIMOM 使用合適的介面來訪問各種類型的提供者 (provider) 中的數據。當然, Openwbem 也不例外,他支持的 provider 介面有 CMPI(Common Manageability Programming Interface), C++, NPI (network provider interface) 等。

CMPI 介面的概念和優勢

CMPI 介面是 Open Group 發布的基於 CIM provider 的標準介面。它獨立於各個 CIMOM 的不同的實現方式,並被大多數 CIMOM 所接受,包括 OpenPegasus, OpenWBEM 和 SFCB 等都已經支持了 CMPI 介面。因此,基於 CMPI 介面開發的提供者 (provider) 也就成為了移植性最好,用途最廣泛的和最流行的 provider 。這也是本文專註於 CMPI 介面的 provider 開發的原因。





基於 Openwbem CMPI 介面的 CIM provider 開發實現樣例

編寫代碼過程及其注意事項

我們知道, CIM Provider 根據功能需求基本分為 Instance Provider, Method provider, Indication Provider, Association Provider 等。其中最為廣泛應用和最具有代表性的為 Instance Provider, 因此,本文以 Instance Provider 為例,介紹基於 Openwbem CMPI 介面的 provider 開發實現。

在開發 provider 之前,我們必須指定 CMPI 介面函數庫的路徑,如下:


清單 1. CMPI 介面函數庫的路徑
#include <openwbem/cmpidt.h>  #include <openwbem/cmpift.h>  #include <openwbem/cmpimacs.h>  

隨後,我們通過 CMPI 介面函數庫可以看出 Instance provider 的介面函數為 EnumerateInstanceNames,EnumerateInstances,GetInstance,SetInstance,CreateInstance,DeleteInstance 等。這些函數可以被部分實現,也可以被全部實現。根據需要,以下為其中 EnumerateInstanceNames 函數的實現樣例:


清單 2. EnumerateInstanceNames 函數的實現樣例
// ----------------------------------------------------------------------------  // EnumInstanceNames()  // Return a list of all the instances names (return their object paths only).  // ----------------------------------------------------------------------------  static CMPIStatus EnumInstanceNames(           CMPIInstanceMI * self,   /* [in] Handle to this provider (i.e. 'self'). */           CMPIContext * context,  /* [in] Additional context info, if any. */           CMPIResult * results,       /* [out] Results of this operation. */           CMPIObjectPath * reference)   /* [in] Contains target namespace and classname. */  {  CMPIStatus status = {CMPI_RC_OK, NULL}; /* Return status of CIM operations. */    printf("In EnumInstanceNames... \n");    //parsing namespace  char * namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL));     /* Create a new CMPIInstance to store this resource. */  CMPIObjectPath * op = CMNewObjectPath(_BROKER, namespace,  “Test_Service”, &status);  CMPIInstance * instance = CMNewInstance(_BROKER, op, &status);    CMSetProperty(instance, "SystemName",(CMPIValue *)"TestSystem", CMPI_chars);  CMSetProperty(instance, "SystemCreationClassName",(CMPIValue *)"Test", CMPI_chars);  CMSetProperty(instance, "Name",(CMPIValue *)"Example", CMPI_chars);  CMSetProperty(instance, "CreationClassName",(CMPIValue *)"TestService", CMPI_chars);    CMPIObjectPath * objectpath = CMGetObjectPath(instance, &status);  CMSetNameSpace(objectpath, namespace);                    CMReturnObjectPath(results, objectpath);  CMReturnDone(results);    return status;    }  

通過上例可以看出,用戶調用 EnumInstanceNames 這個函數介面后,我們就創建了一個 “Test_Service” 類 的 Instance, 隨後給這個 Instance 設定了4個 property, 分別為:

SystemName = "TestSystem",  SystemCreationClassName = "Test",  Name = "Example",  CreationClassName = "TestService"。  

最後將這個 Instance 的 ObjectPath 通過 “CMReturnObjectPath(results, objectpath);” 返回給了用戶。

在完成了一個介面函數的實體實現后,provider 的開發並沒有完全結束。我們必須在代碼最後建立 provider 的功能表,才能被 CIMOM 所識別。如下:


清單 3. 建立 provider 的功能表
CMInstanceMIStub( , Instance_provder_name, _BROKER, Initialize(&mi, ctx));  

如何安裝註冊 provider

在完成 provider 的代碼編寫之後,我們需要將其安裝註冊,才能真正的在 CIMOM 需要時為它所調用提供數據。

首先,我們必須將 provider 的代碼編譯成動態連接庫(.so 文件),動態庫的名字必須以 lib 打頭,後跟 Instance_provder_name ,然後將此文件放在 /usr/lib/cmpi/ 或 /usr/lib/openwbem/cmpiproviders 文件夾下。 CIMOM 會去這兩個路徑尋找它所需要的 provider 函數。

在可執行的 provider 函數編譯安裝到位后,我們必須將其在 CIMOM 的 repository 中進行註冊。而被註冊的 provider 信息就寫在 mof 文件中,如下:


清單 4. mof 實現樣例
[provider("cmpi:: Instance_provder_name ")]    class Test_Service : CIM_Service  {  };  

Mof 文件的內容信息表明,provider 的可執行文件為 libInstance_provder_name.so ,它遵守 CMPI 介面標準。它所實現的 cim 類對象為Test_Service 類,繼承於 CIM_Service 類。

有一點必須強調一下,讀者可能已經注意到 Instance_provder_name 不論在 provider 編寫過程中還是註冊安裝中都已經出現過多次。 Instance_provder_name 包含了多重意義,既代表了 provider 的名字,也是動態庫的名字。我們必須在 Instance_provder_name 出現的所有地方保持一致。否則,會造成 CIMOM 拿到 provider 信息不匹配,造成錯誤。

在 mof 文件完成後,可以通過 openwbem 的工具將其註冊進 CIMOM。


圖 6. 註冊用戶類命令

使用 wbemcli 測試及 debug 過程

到現在為止,provider 的開發已經全部完成。用戶已經可以利用 CIMOM 向 provider 索要信息。如下:


清單 5. 測試 provider 結果
linux:~ # wbemcli ein http://root:password@localhost:5988/root/cimv2:Test_Service    localhost:5988/root/cimv2: Test_Service.SystemCreationClassName="Test",  SystemName="TestSystem",CreationClassName="TestService",Name=" Example "  

可以看出,provider 提供的信息正是我們在 provider 內部實現4個 property 的功能。若此時功能不符合用戶預期,用戶可以通過查看 debug 信息去發掘問題,方法如下:

首先,確保 CIMOM 運行在前台,正如我們在介紹 Openwbem 的基本操作時提到的那樣,利用 –d 來達到此效果。


圖 7. 前台運行 CIMOM 命令

此時我們可以發現,很多實時信息被不斷的顯示在屏幕上。當我們用 wbemcli 調用上例中的 provider 時,可以看到屏幕輸出入下:


清單 6. Debug 輸出信息
[3050199952] Request Handler /usr/lib/openwbem/requesthandlers/libowrequesthandlercimxml.so   |-------10--------20--------30--------40--------50--------60--------70--------80--------9|  |-------- XML error:  The previous line is longer than the max of 90 characters ---------|                           handling request for content type application/xml  [3050199952] safeLibCreate::create called.  createFuncName = createIndicationRepLayer  [3050199952] Got function name. calling function enumerateinstancenames  [3050199952] CIMServer doing operation: EnumerateInstanceNames on  \                                              root/cimv2:Test_Service for user: root  [3050199952] CIMRepository got class: Test_Service from namespace: root/cimv2  [3050199952] CIMServer InstNameEnumerator enumerated derived instance names:  \                                              root/cimv2:Test_Service  [3050199952] CMPIProviderIFC::getProvider loading     \                                              library: /usr/lib/cmpi/libTest_Service.so  In Initialize...  [3050199952] CMPI provider ifc: provider Test_Service loaded and initialized  [3050199952] CMPIProviderIFC found instance provider Test_Service  [3050199952] CMPIInstanceProviderProxy::enumInstanceNames()  [3050199952] CMPIPrepareContext. User:   Full User:   Flgs: 0  In EnumInstanceNames …  [3050199952] CMPIBrokerEnc: mbEncNewObjectPath()  [3050199952] CMPIBrokerEnc: mbEncNewInstance()  [3050199952] CMPIBroker: mbGetClass()  [3050199952] safeLibCreate::create called.  createFuncName = createIndicationRepLayer  [3050199952] CIMServer doing operation: GetClass on root/cimv2:Test_Service for user: root  [3050199952] CIMRepository got class: Test_Service from namespace: root/cimv2  In EnumInstanceNames...  [3050199952] CIMRepository enumerated classes: root/cimv2:Test_Service  

用戶可以注意到,這些信息不僅是 CIMOM 運行過程中輸出的一些 log 信息,還有一些是 Provider 本身輸出的信息。如倒數第2行的 ”In EnumInstanceNames...” 是在上例 provider 代碼中 printf("In EnumInstanceNames... \n"); 實現的結果。





總結

Openwbem 存在於 SUSE Linux 安裝包中,安裝與使用極其方便。 基於 Openwbem 的 CIM provider 的開發不論在編寫規則還是調試方面都可以與聞名的 SFCB 或 Pegasus 相媲美。可以作為基於 CIM 開發的不錯的選擇。(責任編輯:A6)



[火星人 ] OpenWbem 的介紹及其 CMPI 介面的 CIM provider 的開發實現已經有1803次圍觀

http://coctec.com/docs/linux/show-post-69112.html