1、生成能够在 Linux 上进行测试的模拟 CIM 信号如果您将在硬件管理中用到 Common Information Model 标准,那么您使用(或开发)的管理应用程序通常需要具有监听和处理硬件指示信号的能力。在理想的条件下,您可以获得能够正常运行的硬件,不过我们常常不具备这种理想的条件。那么,如果您没有能够正常运行的硬件,应该怎么做呢?您可以创建模拟的硬件指示信号来测试管理应用程序的监听器组件。我将演示如何使用随 OpenPegasus 源代码附带的供应程序在 OpenPegasus CIMOM (Common Information Model Object Manager) 上生成模拟
2、指示信号。CIM(Common Information Model)概述CIM(Common Information Model)是一个用于在网络或企业环境中描述管理信息的模型。CIM 由一个规范和一个模式构成。规范定义如何与其他管理模型集成;模式提供实际的模型描述。Managed Object Format (MOF) 通常用于表示 CIM 模式,因为 MOF 可以直接编译到 CIMOM 存储库。CIMOM 是一个中介(服务器),它在自己的储存库中使用已编译的信息模型来在客户机和供应程序之间引导请求和响应。CIMOM 位于客户机和供应程序之间。供应程序位于 CIMOM 的后端;它实际上负责与
3、受控的资源通信来获取数据,比如磁盘驱动器和 CPU。供应程序将获取到的数据发送到 CIMOM,然后由 CIMOM 转发到客户机。当 CIMOM 收到来自客户机的请求之后,如果它的储存库中不存在所请求的数据,CIMOM 将把该请求转发给适合的供应程序。客户机通常是将请求发送给 CIMOM 并接收响应的管理应用程序。大部分情况下,指示信号监听器是该客户机的一部分,并且监听器仅能接收信息 它不能发送任何请求。图 1 展示了该模型的概图。图 1. CIMOM 模型概览回页首生成指示信号的步骤生成指示信号涉及到三个主要步骤:1. 编译并安装随 OpenPegasus 源代码附带的供应程序RT_Indic
4、ation。2. 开发一个简单的 Java 程序,用于在向 CIMOM 发送请求时生成指示信号。3. 开发一个简单的 Java 程序,用于监听生成的指示信号。回页首步骤 1. 编译并安装 RT_Indication 供应程序首先,从 OpenPegasus.org 下载并安装 OpenPegasus(参考资料部分提供相关的链接)。在本文中,我使用 OpenPegasus 源代码版本 pegasus-2.9.0.tar.gz;这些步骤也适用于任何其他版本的 OpenPegasus。您可以从适当的二进制发行版安装 OpenPegasus,也可以从源代码编译和安装 OpenPegasus。该源代码包
5、含一个介绍先决条件和编译说明的文档。安装了 OpenPegasus 之后,需要填充基础的模式储存库。在 CIMOM 上安装供应程序需要三个步骤: 将供应程序 MOF 编译到 CIMOM 储存库。 在 CIMOM 上注册供应程序。 将与 MOF 无关的源代码编译到 CIMOM 的共享库。编译供应程序 MOF将 pegasus-2.9.0.tar.gz 解压到任意目录(如果在安装 OpenPegasus 时还没有完成该步骤)。创建一个环境变量PEGASUS_ROOT。将PEGASUS_ROOT设置为解压缩后的 pegasus-2.9.0.tar.gz 文件的根目录。导出PEGASUS_ROOT。该
6、根目录下面应该直接包含这些目录: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_HO
7、ME/bin已经包含在PATH中。现在,需要将供应程序 MOF 编译到名称空间SDKExamples/DefaultCXX,但是供应程序 MOF 源自基础的 CIM 模式 MOF,所以应该先编译基础的 CIM 模式 MOF,然后再编译供应程序 MOF。必须严格遵循编译顺序。切换到 “/” 目录(不是必要的)。发出如清单 2 所示的命令(假设从$PEGASUS_ROOT/Schemas/CIM217编译基础的模式):清单 2. 将基础的模式编译到 SDKExamples 名称空间 LinuxMint:/ # cimmof -n SDKExamples/DefaultCXX $PEGASUS_RO
8、OT/Schemas/CIM217/DMTF/qualifiers.mofLinuxMint:/ # cimmof -n SDKExamples/DefaultCXX $PEGASUS_ROOT/Schemas/CIM217/DMTF/Core/CIM_ManagedElement.mofLinuxMint:/ # cimmof -n SDKExamples/DefaultCXX $PEGASUS_ROOT/Schemas/CIM217/CIM_Event.mof 按照清单 3 的方式编译供应程序 MOF:清单 3. 将供应程序 MOF 编译到 SDKExamples 名称空间 LinuxMi
9、nt:/ # 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
10、。在这个例子中,将使用 g+ 和 GNU Make 编译共享库,如清单 5 所示。切换到目录 $PEGASUS_ROOT/src/SDK/samples/Providers/DefaultC+/IndicationProvider,然后输入make并返回。清单 5. 编译共享库 LinuxMint:/pegasus/src/SDK/samples/Providers/DefaultC+/IndicationProvider # makeg+ -c -o /cimserver/pegasus/obj/sdk/IndicationProviderMain.o -O2 -W -Wall -Wno-u
11、nused -D_GNU_SOURCE -DTHREAD_SAFE -D_REENTRANT -fPIC -m32 -I /pegasus/src -DPEGASUS_PLATFORM_LINUX_IX86_GNU IndicationProviderMain.cppg+ -c -o /cimserver/pegasus/obj/sdk/IndicationProvider.o -O2 -W -Wall -Wno-unused -D_GNU_SOURCE -DTHREAD_SAFE -D_REENTRANT -fPIC -m32 -I /pegasus/src -DPEGASUS_PLATFO
12、RM_LINUX_IX86_GNU IndicationProvider.cppg+ -shared -Xlinker -rpath -Xlinker /cimserver/pegasus/lib -m32 -DPEGASUS_PLATFORM_LINUX_IX86_GNU -o/cimserver/pegasus/lib/sdk/libSDKIndicationProvider.so /cimserver/pegasus/obj/sdk/IndicationProviderMain.o /cimserver/pegasus/obj/sdk/IndicationProvider.o -ldl
13、-lpthread -lcrypt -L/cimserver/pegasus/lib -lpegcommon -L/cimserver/pegasus/lib -lpegprovidermake -i unlinkmake1: Entering directory /pegasus/src/SDK/samples/Providers/DefaultC+/IndicationProviderrm -f /cimserver/pegasus/lib/libSDKIndicationProvider.somake1: Leaving directory /pegasus/src/SDK/sample
14、s/Providers/DefaultC+/IndicationProviderln -f -s /cimserver/pegasus/lib/sdk/libSDKIndicationProvider.so /cimserver/pegasus/lib/libSDKIndicationProvider.so共享库libSDKIndicationProvider.so被添加到 $PEGASUS_HOME/lib/sdk,并且它的一个链接被添加到 $PEGASUS_HOME/lib。使用cimserver -s停止 CIMOM,然后使用cimserver再次启动它(如清单 1所示)。图 2 显示了
15、SDKExamples/DefaultCXX名称空间的屏幕截图,来自 UltimateCIM Explorer(参见参考资料)。图 2. 来自 UltimateCIM 的屏幕截图回页首步骤 2. 开发用于生成指示信号的 Java 程序可以通过调用 CIMOM 上的RT_TestIndication的SendTestIndication方法生成RT_TestIndication实例。可以使用 SBLIM(发音为 “sublime”)CIM 客户机库来调用该方法。(SBLIM 是一个综合项目,它包含许多支持在 Linux 上使用 Web-Based Enterprise Management (W
16、BEM) 的系统管理工具)。下载 SBLIM CIM 客户机库(参考资料部分提供相关的链接),解压缩它,然后获取 JAR lib/sblim-cim-client2-2.1.1.jar 并添加到CLASSPATH。可以以清单 6 所示的方式调用SendTestIndication。清单 6. 调用 SendTestIndication 的客户机代码 / Creating a CIM client instanceWBEMClient cli = WBEMClientFactory.getClient(CIM-XML);CIMObjectPath cop = new CIMObjectPath(
17、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_S
18、ET);cli.initialize(cop, subject, null);CIMArgument input = new CIMArgument10;CIMArgument output = new CIMArgument10;/ Invoking SendTestIndication on RT_TestIndicationObject obj = cli.invokeMethod(new CIMObjectPath( /SDKExamples/DefaultCXX:RT_TestIndication), SendTestIndication, input, output);if (ob
19、j.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 # makeg+ -O2 -W -Wall -Wno-unused -D_GN
20、U_SOURCE -DTHREAD_SAFE -D_REENTRANT -fPIC -m32 -c -o /cimserver/pegasus/obj/sdk/SendTestIndications.o -I /pegasus/src -DPEGASUS_PLATFORM_LINUX_IX86_GNU SendTestIndications.cppg+ -Xlinker -rpath -Xlinker /cimserver/pegasus/lib -m32 -o/cimserver/pegasus/bin/sdk/SendTestIndications /cimserver/pegasus/o
21、bj/sdk/SendTestIndications.o -L/cimserver/pegasus/lib -lpegcommon -L/cimserver/pegasus/lib -lpegclient -ldl -lpthread -lcrypt可执行文件SendTestIndications被添加到目录 $PEGASUS_HOME/bin/sdk。回页首步骤 3. 开发用于监听指示信号的 Java 程序我在本小节中讨论的指示信号监听器能够监听RT_TestIndication。RT_TestIndication基本上源自CIM_Indication。监听程序必须注册RT_TestIndi
22、cation。创建和注册监听器涉及到 3 个步骤。以下 3 段代码清单应该作为独立的线程的一部分创建,从而让监听器能够持续监听指示信号: 创建一个 CIM 指示信号过滤器实例 创建一个 CIM 指示信号事件处理程序实例 创建一个 CIM 指示信号订阅实例创建过滤器实例CIM 指示信号过滤器过滤提交到监听器的指示信号。要创建 CIM 指示信号过滤器,可以先获取CIM_IndicationFilter类的一个实例,然后为它设置适当的属性。为了安全起见,最好查看是否存在同名的过滤器。如果已经存在同名的过滤器,您应该删除该过滤器实例或在创建过滤器时使用新的名称。清单 8 展示了如何创建过滤器实例。清单
23、 8. 创建过滤器实例 / Setting property values to the filter instanceCIMProperty name = new CIMProperty(Name, CIMDataType.STRING_T, TestFilter);CIMProperty namespace = new CIMProperty(SourceNamespace, CIMDataType.STRING_T, SDKExamples/DefaultCXX);CIMProperty query = new CIMProperty(Query, CIMDataType.STRING_
24、T, SELECT * FROM RT_TestIndication);CIMProperty language = new CIMProperty(QueryLanguage, CIMDataType.STRING_T, WQL);CIMProperty properties = new CIMProperty name, namespace, query, language;CIMObjectPath path = new CIMObjectPath(/SDKExamples/DefaultCXX:CIM_IndicationFilter);/ Creating an instance o
25、f CIM_IndicationFilterCIMObjectPath copFilter = cli.createInstance(new CIMInstance(path, properties);创建事件处理程序实例当 CIMOM 调用事件处理程序时,将把指示信号的一个实例和CIM_ListenerDestination的一个实例传递给它。然后,事件处理程序可以使用适当的导出格式将该指示信号实例传递给监听程序。清单 9 展示了如何创建事件处理程序实例。清单 9. 创建事件处理程序实例 WBEMListener listener = WBEMListenerFactory.getListe
26、ner(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 = ne
27、w CIMProperty(Name, CIMDataType.STRING_T, TestListener);CIMProperty creationClassName = new CIMProperty (CreationClassName, CIMDataType.STRING_T, CIM_ListenerDestinationCIMXML);CIMProperty destination = new CIMProperty(Destination, CIMDataType.STRING_T, host);CIMProperty properties = new CIMProperty
28、 name, creationClassName, destination ;CIMObjectPath path = new CIMObjectPath( /SDKExamples/DefaultCXX:CIM_ListenerDestinationCIMXML);CIMObjectPath copHandler = cli.createInstance(new CIMInstance(path, properties);创建订阅实例在这里,订阅RT_TestIndication的监听程序描述它希望处理的指示信号的类型,以及 CIMOM 提交指示信号的事件处理程序。清单 10 演示了订阅RT
29、_TestIndication。清单 10. 创建订阅实例 CIMProperty filter = new CIMProperty(Filter, new CIMDataType(CIM_IndicationFilter), copFilter);CIMProperty handler = new CIMProperty(Handler, new CIMDataType(CIM_ListenerDestinationCIMXML), copHandler);CIMProperty properties = new CIMProperty filter, handler ;CIMObjectP
30、ath path = new CIMObjectPath(/root/PG_InterOp:CIM_IndicationSubscription);CIMObjectPath copSubscription = cli.createInstance(new CIMInstance(path, properties);回页首使用模拟 CIM 指示信号测试监听器最后,您可以使用模拟指示信号测试监听器了。启动 cimserver(如果它还没有运行的话)。启动指示信号监听程序。现在,使用指示信号生成程序生成一个信号。从指示信号监听器控制台查看输出。图 3 显示了来自我们的实现的输出的屏幕截图。图 3. 样例输出就这么简单!您已经成功创建了模拟的硬件指示器,并使用它们来测试 CIM 管理应用程序的监听器组件
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2