如果您将在硬件管理中用到 Common Information Model 标准,那么您使用(或开发)的管理应用程序通常需要具有监听和处理硬件指示信号的能力。在理想的条件下,您可以获得能够正常运行的硬件,不过我们常常不具备这种理想的条件。
那么,如果您没有能够正常运行的硬件,应该怎么做呢?您可以创建模拟的硬件指示信号来测试管理应用程序的监听器组件。我将演示如何使用随 OpenPegasus 源代码附带的供应程序在 OpenPegasus CIMOM (Common Information Model Object Manager) 上生成模拟指示信号。
CIM(Common Information Model)概述
CIM(Common Information Model)是一个用于在网络或企业环境中描述管理信息的模型。CIM 由一个规范 和一个模式 构成。规范定义如何与其他管理模型集成;模式提供实际的模型描述。
Managed Object Format (MOF) 通常用于表示 CIM 模式,因为 MOF 可以直接编译到 CIMOM 存储库。CIMOM 是一个中介(服务器),它在自己的储存库中使用已编译的信息模型来在客户机和供应程序之间引导请求和响应。CIMOM 位于客户机和供应程序之间。
供应程序位于 CIMOM 的后端;它实际上负责与受控的资源通信来获取数据,比如磁盘驱动器和 CPU。供应程序将获取到的数据发送到 CIMOM,然后由 CIMOM 转发到客户机。当 CIMOM 收到来自客户机的请求之后,如果它的储存库中不存在所请求的数据,CIMOM 将把该请求转发给适合的供应程序。
客户机通常是将请求发送给 CIMOM 并接收响应的管理应用程序。大部分情况下,指示信号监听器是该客户机的一部分,并且监听器仅能接收信息 —— 它不能发送任何请求。图 1 展示了该模型的概图。
图 1. CIMOM 模型概览
生成指示信号涉及到三个主要步骤:
- 编译并安装随 OpenPegasus 源代码附带的供应程序
RT_Indication。 - 开发一个简单的 Java™ 程序,用于在向 CIMOM 发送请求时生成指示信号。
- 开发一个简单的 Java 程序,用于监听生成的指示信号。
步骤 1. 编译并安装 RT_Indication 供应程序
首先,从 OpenPegasus.org 下载并安装 OpenPegasus(参考资料 部分提供相关的链接)。在本文中,我使用 OpenPegasus 源代码版本 pegasus-2.9.0.tar.gz;这些步骤也适用于任何其他版本的 OpenPegasus。您可以从适当的二进制发行版安装 OpenPegasus,也可以从源代码编译和安装 OpenPegasus。该源代码包含一个介绍先决条件和编译说明的文档。
安装了 OpenPegasus 之后,需要填充基础的模式储存库。
在 CIMOM 上安装供应程序需要三个步骤:
- 将供应程序 MOF 编译到 CIMOM 储存库。
- 在 CIMOM 上注册供应程序。
- 将与 MOF 无关的源代码编译到 CIMOM 的共享库。
将 pegasus-2.9.0.tar.gz 解压到任意目录(如果在安装 OpenPegasus 时还没有完成该步骤)。创建一个环境变量 PEGASUS_ROOT。将 PEGASUS_ROOT 设置为解压缩后的 pegasus-2.9.0.tar.gz 文件的根目录。导出 PEGASUS_ROOT。
该根目录下面应该直接包含这些目录:cgi、doc、Dummy、installs、InterfaceArchive、mak、rpm、Schemas、src、test and files Configure 和 Makefile 等等。
环境变量 PEGASUS_HOME 应该设置为安装 OpenPegasus 的根目录。将环境变量 PEGASUS_PLATFORM 设置为 LINUX_IX86_GNU。导出 PEGASUS_HOME 和 PEGASUS_PLATFORM。
启动 CIM 服务器,如清单 1 所示:
清单 1. 启动 CIMOM
LinuxMint:/ # cimserver |
这假设 $PEGASUS_HOME/bin 已经包含在 PATH 中。
现在,需要将供应程序 MOF 编译到名称空间 SDKExamples/DefaultCXX,但是供应程序 MOF 源自基础的 CIM 模式 MOF,所以应该先编译基础的 CIM 模式 MOF,然后再编译供应程序 MOF。必须严格遵循编译顺序。
切换到 “/” 目录(不是必要的)。发出如清单 2 所示的命令(假设从 $PEGASUS_ROOT/Schemas/CIM217 编译基础的模式):
清单 2. 将基础的模式编译到 SDKExamples 名称空间
LinuxMint:/ # cimmof -n SDKExamples/DefaultCXX \ $PEGASUS_ROOT/Schemas/ CIM217/DMTF/qualifiers.mof LinuxMint:/ # cimmof -n SDKExamples/DefaultCXX \ $PEGASUS_ROOT/Schemas/CIM217/DMTF/ Core/CIM_ManagedElement.mof LinuxMint:/ # cimmof -n SDKExamples/DefaultCXX \ $PEGASUS_ROOT/Schemas/CIM217/CIM_Event.mof |
按照清单 3 的方式编译供应程序 MOF:
清单 3. 将供应程序 MOF 编译到 SDKExamples 名称空间
LinuxMint:/ # cimmof -n SDKExamples/DefaultCXX \ $PEGASUS_ROOT/src/SDK/samples/Providers /Load/SampleProviderSchema.mof |
要在 CIMOM 上注册供应程序,发出以下命令:
清单 4. 在 CIMOM 上注册供应程序
LinuxMint:/ # cimmof -n root/PG_InterOp \ $PEGASUS_ROOT/src/SDK/samples/Providers /Load/IndicationProviderR.mof |
可以使用 C++ 编译器将共享库编译到 CIMOM。在这个例子中,将使用 g++ 和 GNU Make 编译共享库,如清单 5 所示。切换到目录 $PEGASUS_ROOT/src/SDK/samples/Providers/DefaultC++/IndicationProvider,然后输入 make 并返回。
清单 5. 编译共享库
LinuxMint:/pegasus/src/SDK/samples/Providers/DefaultC++/IndicationProvider # make g++ -c -o /cimserver/pegasus/obj/sdk/IndicationProviderMain.o -O2 -W -Wall -Wno- unused -D_GNU_SOURCE -DTHREAD_SAFE -D_REENTRANT -fPIC -m32 -I /pegasus/src -DPEG ASUS_PLATFORM_LINUX_IX86_GNU IndicationProviderMain.cpp g++ -c -o /cimserver/pegasus/obj/sdk/IndicationProvider.o -O2 -W -Wall -Wno-unu sed -D_GNU_SOURCE -DTHREAD_SAFE -D_REENTRANT -fPIC -m32 -I /pegasus/src -DPEGASU S_PLATFORM_LINUX_IX86_GNU IndicationProvider.cpp g++ -shared -Xlinker -rpath -Xlinker /cimserver/pegasus/lib -m32 -DPEGASUS_PLATF ORM_LINUX_IX86_GNU -o/cimserver/pegasus/lib/sdk/libSDKIndicationProvider.so /cim server/pegasus/obj/sdk/IndicationProviderMain.o /cimserver/pegasus/obj/sdk/Indic ationProvider.o -ldl -lpthread -lcrypt -L/cimserver/pegasus/lib -lpegcommon -L/c imserver/pegasus/lib -lpegprovider make -i unlink make[1]: Entering directory `/pegasus/src/SDK/samples/Providers/DefaultC++/Indic ationProvider' rm -f /cimserver/pegasus/lib/libSDKIndicationProvider.so make[1]: Leaving directory `/pegasus/src/SDK/samples/Providers/DefaultC++/Indica tionProvider' ln -f -s /cimserver/pegasus/lib/sdk/libSDKIndicationProvider.so /cimserver/pegas us/lib/libSDKIndicationProvider.so |
共享库 libSDKIndicationProvider.so 被添加到 $PEGASUS_HOME/lib/sdk,并且它的一个链接被添加到 $PEGASUS_HOME/lib。
使用 cimserver -s 停止 CIMOM,然后使用 cimserver 再次启动它(如 清单 1 所示)。图 2 显示了 SDKExamples/DefaultCXX 名称空间的屏幕截图,来自 UltimateCIM Explorer(参见 参考资料)。
图 2. 来自 UltimateCIM 的屏幕截图
可以通过调用 CIMOM 上的 RT_TestIndication 的 SendTestIndication 方法生成 RT_TestIndication 实例。可以使用 SBLIM(发音为 “sublime”)CIM 客户机库来调用该方法。(SBLIM 是一个综合项目,它包含许多支持在 Linux ® 上使用 Web-Based Enterprise Management (WBEM) 的系统管理工具)。
下载 SBLIM CIM 客户机库(参考资料 部分提供相关的链接),解压缩它,然后获取 JAR lib/sblim-cim-client2-2.1.1.jar 并添加到 CLASSPATH。可以以清单 6 所示的方式调用 SendTestIndication。
清单 6. 调用 SendTestIndication 的客户机代码
// Creating a CIM client instance
WBEMClient cli = WBEMClientFactory.getClient("CIM-XML");
CIMObjectPath cop = new CIMObjectPath("http", "cimomIP", "cimomPort",
"SDKExamples/DefaultCXX", null, null);
Principal principal = new UserPrincipal("username");
PasswordCredential password = new PasswordCredential("userPassword");
Subject subject = new Subject(false,Collections.singleton(principal),
Collections.singleton(password),Collections.EMPTY_SET);
cli.initialize(cop, subject, null);
CIMArgument<?>[] input = new CIMArgument[10];
CIMArgument<?>[] output = new CIMArgument[10];
// Invoking SendTestIndication on RT_TestIndication
Object obj = cli.invokeMethod(new CIMObjectPath(
"/SDKExamples/DefaultCXX:RT_TestIndication"), "SendTestIndication", input, output);
if (obj.toString().equals("0"))
{
System.out.println("Indication generated successfully...");
}
|
此外,还可以通过编译随 pegasus-2.9.0.tar.gz 附带的客户机程序生成 RT_TestIndication。可以使用 g++ 和 GNU Make 编译该客户机代码,如清单 7 所示:
清单 7. 编译客户机
LinuxMint:/pegasus/src/SDK/samples/Clients/DefaultC++/SendTestIndications # make g++ -O2 -W -Wall -Wno-unused -D_GNU_SOURCE -DTHREAD_SAFE -D_REENTRANT -fPIC -m32 -c -o /cimserver/pegasus/obj/sdk/SendTestIndications.o -I /pegasus/src -DPEGASU S_PLATFORM_LINUX_IX86_GNU SendTestIndications.cpp g++ -Xlinker -rpath -Xlinker /cimserver/pegasus/lib -m32 -o/cimserver/pegasus/bi n/sdk/SendTestIndications /cimserver/pegasus/obj/sdk/SendTestIndications.o -L/ci mserver/pegasus/lib -lpegcommon -L/cimserver/pegasus/lib -lpegclient -ldl -lpthr ead -lcrypt |
可执行文件 SendTestIndications 被添加到目录 $PEGASUS_HOME/bin/sdk。
我在本小节中讨论的指示信号监听器能够监听 RT_TestIndication。RT_TestIndication 基本上源自 CIM_Indication。监听程序必须注册 RT_TestIndication。
创建和注册监听器涉及到 3 个步骤。以下 3 段代码清单应该作为独立的线程的一部分创建,从而让监听器能够持续监听指示信号:
- 创建一个 CIM 指示信号过滤器实例
- 创建一个 CIM 指示信号事件处理程序实例
- 创建一个 CIM 指示信号订阅实例
CIM 指示信号过滤器过滤提交到监听器的指示信号。要创建 CIM 指示信号过滤器,可以先获取 CIM_IndicationFilter 类的一个实例,然后为它设置适当的属性。为了安全起见,最好查看是否存在同名的过滤器。如果已经存在同名的过滤器,您应该删除该过滤器实例或在创建过滤器时使用新的名称。清单 8 展示了如何创建过滤器实例。
清单 8. 创建过滤器实例
// Setting property values to the filter instance
CIMProperty<?> name = new CIMProperty<String>("Name", CIMDataType.STRING_T,
"TestFilter");
CIMProperty<?> namespace = new CIMProperty<String>("SourceNamespace",
CIMDataType.STRING_T, "SDKExamples/DefaultCXX");
CIMProperty<?> query = new CIMProperty<String>("Query", CIMDataType.STRING_T,
"SELECT * FROM RT_TestIndication");
CIMProperty<?> language = new CIMProperty<String>("QueryLanguage",
CIMDataType.STRING_T, "WQL");
CIMProperty<?>[] properties = new CIMProperty[] {name, namespace, query, language};
CIMObjectPath path = new CIMObjectPath("/SDKExamples/DefaultCXX:CIM_IndicationFilter");
// Creating an instance of CIM_IndicationFilter
CIMObjectPath copFilter = cli.createInstance(new CIMInstance(path, properties));
|
当 CIMOM 调用事件处理程序时,将把指示信号的一个实例和 CIM_ListenerDestination 的一个实例传递给它。然后,事件处理程序可以使用适当的导出格式将该指示信号实例传递给监听程序。清单 9 展示了如何创建事件处理程序实例。
清单 9. 创建事件处理程序实例
WBEMListener listener = WBEMListenerFactory.getListener("CIM-XML");
int port = listener.addListener(new IndicationListener()
{
public void indicationOccured(String indicationURL, CIMInstance indication)
{ System.out.println(indication.toString()); }
}, 0, "http");
String host = "http://"+InetAddress.getLocalHost().getHostAddress()+":"+port+"/create";
CIMProperty<?> name = new CIMProperty<String>("Name", CIMDataType.STRING_T,
"TestListener");
CIMProperty<?> creationClassName = new CIMProperty<String>
("CreationClassName", CIMDataType.STRING_T, "CIM_ListenerDestinationCIMXML");
CIMProperty<?> destination = new CIMProperty<String>("Destination",
CIMDataType.STRING_T, host);
CIMProperty<?>[] properties = new CIMProperty[] { name, creationClassName,
destination };
CIMObjectPath path = new CIMObjectPath(
"/SDKExamples/DefaultCXX:CIM_ListenerDestinationCIMXML");
CIMObjectPath copHandler = cli.createInstance(new CIMInstance(path, properties));
|
在这里,订阅 RT_TestIndication 的监听程序描述它希望处理的指示信号的类型,以及 CIMOM 提交指示信号的事件处理程序。清单 10 演示了订阅 RT_TestIndication。
清单 10. 创建订阅实例
CIMProperty<?> filter = new CIMProperty<CIMObjectPath>("Filter",
new CIMDataType("CIM_IndicationFilter"), copFilter);
CIMProperty<?> handler = new CIMProperty<CIMObjectPath>("Handler",
new CIMDataType("CIM_ListenerDestinationCIMXML"), copHandler);
CIMProperty<?>[] properties = new CIMProperty[] { filter, handler };
CIMObjectPath path = new CIMObjectPath("/root/PG_InterOp:CIM_IndicationSubscription");
CIMObjectPath copSubscription = cli.createInstance(new CIMInstance(path, properties));
|
最后,您可以使用模拟指示信号测试监听器了。启动 cimserver(如果它还没有运行的话)。启动指示信号监听程序。现在,使用指示信号生成程序生成一个信号。从指示信号监听器控制台查看输出。图 3 显示了来自我们的实现的输出的屏幕截图。
图 3. 样例输出
就这么简单!您已经成功创建了模拟的硬件指示器,并使用它们来测试 CIM 管理应用程序的监听器组件。
学习
-
“高效构建 CIM 事件模型”(developerWorks,2008 年 8 月)对实时实现非常有用,因为它演示了如何通过一个特定的连接端口注册多个 CIM 事件处理程序(并展示如何使用 SBLIM CIM 客户机库编写代码)。
-
“Enabling Web Service with Common Information Model”(developerWorks,2009 年 5 月)是另一篇关于 CIM 和互操作性的文章。它展示了如何通过 WS-Management SOAP 消息传输 CIM 操作。
- Distributed Management Task Force 提供的 CIM 教程 对初级和高级管理应用程序和工具开发人员都非常有帮助。它解释了 CIM 规范和相关的信息。
- Open Group 的 OpenPegasus 开放源码项目 是一个开源的 DMTF CIM 和 WBEM 标准的实现,它是用 C++ 编写的,其目标是实现可移植性和高度模块化。该站点提供的一些文档解释 OpenPegasus CIMOM 的内部原理。
- 浏览 WBEM/CIM 类和 MOF 层次结构。
-
SBLIM 是一个综合项目,它包含许多支持在 Linux 上使用 WBEM 的系统管理工具。这些工具帮助您使用基于开放标准的技术管理 Linux 系统。
- 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。
- 在 developerWorks 上查阅所有 Linux 技巧 和 Linux 教程。
- 随时关注 developerWorks 技术活动和网络广播。
获得产品和技术
- 获取 OpenPegasus 源代码。
-
UltimateCIM Explorer 是一个支持开发人员探索 CIMOM、执行查询和以视图的方式查看类层次结构的 Eclipse 插件。
- IBM alphaWorks 维护 CIM Schema Converter,这是一个用于将 DMTF 模式转换成 WMI (Windows Management Instrumentation) 模式的小工具。
- 下载 SBLIM CIM 客户机库。
-
使用可直接从 developerWorks 下载的 IBM 产品评估试用版软件 构建您的下一个 Linux 开发项目。
讨论
- 加入 My developerWorks 社区。查看开发人员参与的博客、论坛、组和 wiki,并与其他 developerWorks 用户交流。

Srikanth Guttula 是位于印度浦那市的 IBM Systems and Technology Group Labs 的系统软件工程师。他从 2007 年 2 月开始加入 IBM。他目前致力于 IBM Systems Director,他在此之前参与开发 BladeCenter 服务器的 Storage Configuration Manager。他拥有计算机科学学士学位。