生成能够在 Linux 上进行测试的模拟 CIM 信号.docx
《生成能够在 Linux 上进行测试的模拟 CIM 信号.docx》由会员分享,可在线阅读,更多相关《生成能够在 Linux 上进行测试的模拟 CIM 信号.docx(12页珍藏版)》请在冰点文库上搜索。
![生成能够在 Linux 上进行测试的模拟 CIM 信号.docx](https://file1.bingdoc.com/fileroot1/2023-5/21/88e48cfc-14b7-49df-8cf7-3ab318607ec6/88e48cfc-14b7-49df-8cf7-3ab318607ec61.gif)
生成能够在Linux上进行测试的模拟CIM信号
如果您将在硬件管理中用到CommonInformationModel标准,那么您使用(或开发)的管理应用程序通常需要具有监听和处理硬件指示信号的能力。
在理想的条件下,您可以获得能够正常运行的硬件,不过我们常常不具备这种理想的条件。
那么,如果您没有能够正常运行的硬件,应该怎么做呢?
您可以创建模拟的硬件指示信号来测试管理应用程序的监听器组件。
我将演示如何使用随OpenPegasus源代码附带的供应程序在OpenPegasusCIMOM(CommonInformationModelObjectManager)上生成模拟指示信号。
CIM(CommonInformationModel)概述
CIM(CommonInformationModel)是一个用于在网络或企业环境中描述管理信息的模型。
CIM由一个规范 和一个模式 构成。
规范定义如何与其他管理模型集成;模式提供实际的模型描述。
ManagedObjectFormat(MOF)通常用于表示CIM模式,因为MOF可以直接编译到CIMOM存储库。
CIMOM是一个中介(服务器),它在自己的储存库中使用已编译的信息模型来在客户机和供应程序之间引导请求和响应。
CIMOM位于客户机和供应程序之间。
供应程序位于CIMOM的后端;它实际上负责与受控的资源通信来获取数据,比如磁盘驱动器和CPU。
供应程序将获取到的数据发送到CIMOM,然后由CIMOM转发到客户机。
当CIMOM收到来自客户机的请求之后,如果它的储存库中不存在所请求的数据,CIMOM将把该请求转发给适合的供应程序。
客户机通常是将请求发送给CIMOM并接收响应的管理应用程序。
大部分情况下,指示信号监听器是该客户机的一部分,并且监听器仅能接收信息——它不能发送任何请求。
图1展示了该模型的概图。
图1.CIMOM模型概览
回页首
生成指示信号的步骤
生成指示信号涉及到三个主要步骤:
1.编译并安装随OpenPegasus源代码附带的供应程序 RT_Indication。
2.开发一个简单的Java™程序,用于在向CIMOM发送请求时生成指示信号。
3.开发一个简单的Java程序,用于监听生成的指示信号。
回页首
步骤1.编译并安装RT_Indication供应程序
首先,从OpenPegasus.org下载并安装OpenPegasus(参考资料 部分提供相关的链接)。
在本文中,我使用OpenPegasus源代码版本pegasus-2.9.0.tar.gz;这些步骤也适用于任何其他版本的OpenPegasus。
您可以从适当的二进制发行版安装OpenPegasus,也可以从源代码编译和安装OpenPegasus。
该源代码包含一个介绍先决条件和编译说明的文档。
安装了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。
该根目录下面应该直接包含这些目录:
cgi、doc、Dummy、installs、InterfaceArchive、mak、rpm、Schemas、src、testandfilesConfigure和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-nSDKExamples/DefaultCXX\
$PEGASUS_ROOT/Schemas/
CIM217/DMTF/qualifiers.mof
LinuxMint:
/#cimmof-nSDKExamples/DefaultCXX\
$PEGASUS_ROOT/Schemas/CIM217/DMTF/
Core/CIM_ManagedElement.mof
LinuxMint:
/#cimmof-nSDKExamples/DefaultCXX\
$PEGASUS_ROOT/Schemas/CIM217/CIM_Event.mof
按照清单3的方式编译供应程序MOF:
清单3.将供应程序MOF编译到SDKExamples名称空间
LinuxMint:
/#cimmof-nSDKExamples/DefaultCXX\
$PEGASUS_ROOT/src/SDK/samples/Providers
/Load/SampleProviderSchema.mof
注册供应程序
要在CIMOM上注册供应程序,发出以下命令:
清单4.在CIMOM上注册供应程序
LinuxMint:
/#cimmof-nroot/PG_InterOp\
$PEGASUS_ROOT/src/SDK/samples/Providers
/Load/IndicationProviderR.mof
编译共享库
可以使用C++编译器将共享库编译到CIMOM。
在这个例子中,将使用g++和GNUMake编译共享库,如清单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_GNUIndicationProviderMain.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_GNUIndicationProvider.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-iunlink
make[1]:
Enteringdirectory`/pegasus/src/SDK/samples/Providers/DefaultC++/Indic
ationProvider'
rm-f/cimserver/pegasus/lib/libSDKIndicationProvider.so
make[1]:
Leavingdirectory`/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 名称空间的屏幕截图,来自UltimateCIMExplorer(参见 参考资料)。
图2.来自UltimateCIM的屏幕截图
回页首
步骤2.开发用于生成指示信号的Java程序
可以通过调用CIMOM上的 RT_TestIndication 的 SendTestIndication 方法生成 RT_TestIndication 实例。
可以使用SBLIM(发音为“sublime”)CIM客户机库来调用该方法。
(SBLIM是一个综合项目,它包含许多支持在Linux®上使用Web-BasedEnterpriseManagement(WBEM)的系统管理工具)。
下载SBLIMCIM客户机库(参考资料 部分提供相关的链接),解压缩它,然后获取JARlib/sblim-cim-client2-2.1.1.jar并添加到 CLASSPATH。
可以以清单6所示的方式调用SendTestIndication。
清单6.调用SendTestIndication的客户机代码
//CreatingaCIMclientinstance
WBEMClientcli=WBEMClientFactory.getClient("CIM-XML");
CIMObjectPathcop=newCIMObjectPath("http","cimomIP","cimomPort",
"SDKExamples/DefaultCXX",null,null);
Principalprincipal=newUserPrincipal("username");
PasswordCredentialpassword=newPasswordCredential("userPassword");
Subjectsubject=newSubject(false,Collections.singleton(principal),
Collections.singleton(password),Collections.EMPTY_SET);
cli.initialize(cop,subject,null);
CIMArgument
>[]input=newCIMArgument[10];
CIMArgument
>[]output=newCIMArgument[10];
//InvokingSendTestIndicationonRT_TestIndication
Objectobj=cli.invokeMethod(newCIMObjectPath(
"/SDKExamples/DefaultCXX:
RT_TestIndication"),"SendTestIndication",input,output);
if(obj.toString().equals("0"))
{
System.out.println("Indicationgeneratedsuccessfully...");
}
此外,还可以通过编译随pegasus-2.9.0.tar.gz附带的客户机程序生成 RT_TestIndication。
可以使用g++和GNUMake编译该客户机代码,如清单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_GNUSendTestIndications.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。
回页首
步骤3.开发用于监听指示信号的Java程序
我在本小节中讨论的指示信号监听器能够监听 RT_TestIndication。
RT_TestIndication 基本上源自 CIM_Indication。
监听程序必须注册 RT_TestIndication。
创建和注册监听器涉及到3个步骤。
以下3段代码清单应该作为独立的线程的一部分创建,从而让监听器能够持续监听指示信号:
∙创建一个CIM指示信号过滤器实例
∙创建一个CIM指示信号事件处理程序实例
∙创建一个CIM指示信号订阅实例
创建过滤器实例
CIM指示信号过滤器过滤提交到监听器的指示信号。
要创建CIM指示信号过滤器,可以先获取 CIM_IndicationFilter 类的一个实例,然后为它设置适当的属性。
为了安全起见,最好查看是否存在同名的过滤器。
如果已经存在同名的过滤器,您应该删除该过滤器实例或在创建过滤器时使用新的名称。
清单8展示了如何创建过滤器实例。
清单8.创建过滤器实例
//Settingpropertyvaluestothefilterinstance
CIMProperty
>name=newCIMProperty("Name",CIMDataType.STRING_T,
"TestFilter");
CIMProperty
>namespace=newCIMProperty("SourceNamespace",
CIMDataType.STRING_T,"SDKExamples/DefaultCXX");
CIMProperty
>query=newCIMProperty("Query",CIMDataType.STRING_T,
"SELECT*FROMRT_TestIndication");
CIMProperty
>language=newCIMProperty("QueryLanguage",
CIMDataType.STRING_T,"WQL");
CIMProperty
>[]properties=newCIMProperty[]{name,namespace,query,language};
CIMObjectPathpath=newCIMObjectPath("/SDKExamples/DefaultCXX:
CIM_IndicationFilter");
//CreatinganinstanceofCIM_IndicationFilter
CIMObjectPathcopFilter=cli.createInstance(newCIMInstance(path,properties));
创建事件处理程序实例
当CIMOM调用事件处理程序时,将把指示信号的一个实例和 CIM_ListenerDestination 的一个实例传递给它。
然后,事件处理程序可以使用适当的导出格式将该指示信号实例传递给监听程序。
清单9展示了如何创建事件处理程序实例。
清单9.创建事件处理程序实例
WBEMListenerlistener=WBEMListenerFactory.getListener("CIM-XML");
intport=listener.addListener(newIndicationListener()
{
publicvoidindicationOccured(StringindicationURL,CIMInstanceindication)
{System.out.println(indication.toString());}
},0,"http");
Stringhost="http:
//"+InetAddress.getLocalHost().getHostAddress()+":
"+port+"/create";
CIMProperty
>name=newCIMProperty("Name",CIMDataType.STRING_T,
"TestListener");
CIMProperty
>creationClassName=newCIMProperty
("CreationClassName",CIMDataType.STRING_T,"CIM_ListenerDestinationCIMXML");
CIMProperty
>destination=newCIMProperty("Destination",
CIMDataType.STRING_T,host);
CIMProperty
>[]properties=newCIMProperty[]{name,creationClassName,
destination};
CIMObjectPathpath=newCIMObjectPath(
"/SDKExamples/DefaultCXX:
CIM_ListenerDestinationCIMXML");
CIMObjectPathcopHandler=cli.createInstance(newCIMInstance(path,properties));
创建订阅实例
在这里,订阅 RT_TestIndication 的监听程序描述它希望处理的指示信号的类型,以及CIMOM提交指示信号的事件处理程序。
清单10演示了订阅 RT_TestIndication。
清单10.创建订阅实例
CIMProperty
>filter=newCIMProperty("Filter",
newCIMDataType("CIM_IndicationFilter"),copFilter);
CIMProperty
>handler=newCIMProperty("Handler",
newCIMDataType("CIM_ListenerDestinationCIMXML"),copHandler);
CIMProperty
>[]properties=newCIMProperty[]{filter,handler};
CIMObjectPathpath=newCIMObjectPath("/root/PG_InterOp:
CIM_IndicationSubscription");
CIMObjectPathcopSubscription=cli.createInstance(newCIMInstance(path,properties));
回页首
使用模拟CIM指示信号测试监听器
最后,您可以使用模拟指示信号测试监听器了。
启动cimserver(如果它还没有运行的话)。
启动指示信号监听程序。
现在,使用指示信号生成程序生成一个信号。
从指示信号监听器控制台查看输出。
图3显示了来自我们的实现的输出的屏幕截图。
图3.样例输出
就这么简单!
您已经成功创建了模拟的硬件指示器,并使用它们来测试CIM管理应用程序的监听器组件