• 易迪拓培训,专注于微波、射频、天线设计工程师的培养
首页 > 测试测量 > 技术文章 > 在Apache上为WSMAN 实现开发新的模块

在Apache上为WSMAN 实现开发新的模块

录入:edatop.com    点击:

  APAChe 是世界上目前应用最广泛的 web 服务器之一,WSMAN 即 WEB 服务管理规范,该规范规定了远程软硬件管理的通用方法。随着两者的广泛应用,如何使两者工作在同一系统且相辅相成显得尤为重要。本文将给出开发新的 mod_wsman 模块的方法和步骤以达到上述目的。

  前言

  WSMAN 规范是基于 web 服务的协议,底层传输采用 HTTP 协议和 HTTPS 协议,所以说它是一种防火墙友好的协议。一般情况下,WSMAN 服务工作在 80 端口,若此时系统中,已经运行了其他 web 服务,比如 Apache 服务,且也是工作在 80 端口,那么必须先关闭这些 web 服务,才能正常启动 WSMAN 服务。为了能使两者同时正常工作,Openwsman 项目采用了基于库函数调用的方法。Openwsman 是 WSMAN 规范的开放源代码实现,能够以独立运行的进程态工作,同时,它还提供了一系列库函数调用接口,其他进程可以调用这些接口。 Apache 第三方模块中有一个名叫 mod_wsman,Apache 可以通过在 mod_wsman 中直接调用 Openwsman 库函数以实现 WSMAN 规范。但是这种方式下的 mod_wsman 有很多缺点,首先 mod_wsman 调用 Openwsman 库函数,不能独立于 Openwsman 开发编译。其次,现存的 mod_wsman 是基于 Apache1.3 开发的,不能满足 Apache2.0 及更高版本的需求。

  本文开发的基于 Apache2.0 的 mod_wsman 将完全独立于 Openwsman,适用于各种 WSMAN 规范的实现(本文将以 Openwsman 为例)。

  Mod_wsman 的开发结构

  本文提出的 mod_wsman 开发是基于进程的,其结构如图 1 所示。 Apache 和 WSMAN 服务分别运行在独立进程态。 Apache 工作在 80 端口,而 WSMAN 服务工作在在其他端口,比如端口 8889 。但是用户依旧通过 80 端口发送 WSMAN 请求。 Apache 发现这是一个 WSMAN 的请求,将交由 mod_wsman 处理,而此时该模块的主要功能是转发请求到 WSMAN 进程,应答信息则是沿原路返回。从功能上讲,此处的 mod_wsman 有点类似于代理,mod_wsman 并不需要太关注具体的 WSMAN 实现。此处有两点需要说明,首先,在此情况下,端口 8889 是否对外开放,一般来说,此处 8889 端口不应该对外开放,当然用户可以根据具体需求决定。其次,关于 Apache 和 WSMAN 功能重叠部分,比如认证等,两者都提供了各种方法,在这种结构下,对于 WSMAN 请求,只要有一处实现了该功能即可,用户在实际应用中可以根据实际需求选择,本文的例子中,在两个进程分别各自实现该功能。

  图 1. mod_wsman 的开发结构  

  Apache 及 Openwsman 的安装配置

  Apache 提供两种安装第三方模块的方法。

  静态编译安装如清单 1 所示。

  清单 1. 静态编译安装 Apache

  $:./configure --with-module=module_type:/home/test/mod_wsman.c

  $:make install

  此模式下,mod_wsman 静态编译进 Apache 服务器,有利于减少服务器运行时的开销。但是此方法要求你必须在此处给出最终的模块源文件,且若编译安装后修改了 mod_wsman.c,我们也不得不重新编译整个 Apache 服务器。

  动态编译安装解决了这个问题。

  清单 2. 动态编译安装 Apache

  $:./configure --enable-so

  $:make install

  动态编译安装要求 mod_so 被静态编译进 Apache 核心的,这是--enable-so的作用。除了 core 以外的任何模块都能以动态库的模式存在。任意一个动态库模块,都可以在httpd.conf中使用 mod_so 的LoadModule指令,在服务器启动或重新启动时被加载。采用此方法安装 Apache,可以利用 Apache 提供的 apxs 编译 mod_wsman.c 文件,后文将给出具体方法。

  Apache 安装完毕,输入命令/usr/local/apapche2/bin/apachectl start启动 Apache 。/usr/local/apapche2/是安装目录,运行 configure 命令时用户可重置此值。

  在 Openwsman 官网上下载最新版本的 Openwsman 源程序,版本 2.1.0 。解压后,编译安装 Openwsman 如清单 3 所示。

  清单 3. 编译安装 Openwsman

  $:./configure

  $:make install

  你需要对 openwsman.conf 做一些初始配置,比如说 Openwsman 提供各种各样的认证方式,Basic 模式是其中一种。在默认情况下,Basic 认证读basic_password_file设置的passwd文件,我们可以利用htpasswd命令生成所需的passwd文件。当然用户可以选择自己的认证方式,重写认证动态库,并将其设为basic_authenticator的值。设置Basic模式有一点还需要注意,注释digest_password_file这一行,这是由于 Openwsman 认证的顺序是先Digest模式,然后是Basic模式。如果 Openwsman 还需要与底层的 CIMOM 一起工作,我们还需要配置其中的[cim]块。

  将配置好的 openwsman.conf 文件置于/usr/local/etc/openwsman下面。你就可以通过/usr/local/sbin/openwsmand命令启动 Openwsman,此时 Openwsman 工作在端口 8889 。

  编写 mod_wsman.c 文件

  Apache 和 Openwsman 配置安装完毕,在这一节,开始编写 mod_wsman.c 文件。 Apache 模块的编写方法可以参考其自带模块,可以下载最终编写的源代码。

  模块编写中最重要的是编写 wsman 的hook函数wsman_handler(request_rec *r),其传入参数是指向 Apache 消息本身的指针,该函数的开始就是判断请求类型,若不是 wsman 请求,该模块返回DECLINED,代码如清单 4 所示。

 

  清单 4. 编写 hook 函数

  if( strcmp(r->handler, "wsman-handler"))

  return DECLINED;

  若是 wsman 请求,则取出请求的信息,以便转发给 Opnewsman 进程,主要包括Content-Type,User-Agent,userid,password等,当然最重要的是取得请求的内容,此部分内容请参考源程序。

  取得各类信息之后,我们需要转发请求至 Openwsman,此处就是新的 mod_wsman 与旧版本的最本质的区别。首先介绍几个结构体,结构体QUERY由request和response组成,它们分别为结构体REQUEST和RESPONSE,REQUEST包含所有请求信息,RESPONSE用来保存收到的结果。

  真正实现转发并取得结果的是函数long get_response(QUERY * query_p, WSMAN_CONF * wsman_conf_p),QUERY 指针是其中一个输入参数,另一个参数WSMAN_CONF主要转递一些配置信息,此处我们以传递 Openwsman 实际工作端口为例。此函数中,我们调用 LibCurl 库以实现请求转发功能。 LibCurl 是开源的客户端 URL 传输库,支持 SCP, SFTP, HTTP, HTTPS, TFTP 等各种协议,具备线程安全、IpV6 兼容、易于使用的特点。 LibCurl 的使用方法可参考其相关主页。函数代码参考附件。

  mod_wsman 的编译及配置

  mod_wsman.c 编写完毕,开始编译工作,上文中提到 Apache 提供了工具apxs,我们可以采用该工具编译 mod_wsman.c, 如清单 5 所示。

  清单 5. 利用 apxs 编译 mod_wsman

  ./bin/apxs -lcurl -c mod_wsman.c

  ./bin/apxs -a -i – n wsman mod_wsman.la

  第一步的作用是编译 mod_wsman.c 文件 , 生成动态库 mod_wsman.so, 此处采用 Apache 提供的工具 apxs,所以隐去与 Apache 相关的头文件及一些选项的设置。第二步的作用有两个,其一就是将生成的动态库拷贝到/usr/local/apache2/modules下面;其二,在 Apache 配置文件 httpd.conf 中加入如清单 6 所示的一句代码。

  清单 6. Apache 配置文件中的模块设置

  LoadModule wsman_module modules/mod_wsman.so

  这样在 apache 启动时就会自动加载动态库 mod_wsman.so 。

  以上第二步可以手动实现,事实上第一步也可以手动实现,而不必采用 Apache 提供的工具apxs, 清单 7 实现可以实现该功能。

  清单 7. 手动编译 mod_wsman

  gcc -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE

  -g -O2 -pthread -I/usr/local/apache2/include -c mod_wsman.c

  gcc -shared -o mod_wsman.so mod_wsman.o -L//lib – lcurl

  为了使 mod_wsman 模块正常工作,还需要在httpd.conf文件中为模块添加相关配置。如下所示清单 8. 利用 apxs 编译 mod_wsman

  

  SetHandler wsman-handler

  AuthType Basic

  AuthName "OPENWSMAN"

  AuthUserFile /etc/openwsman/simple_auth.passwd

  Require valid-user

  Order allow,deny

  Allow from all

  SetHandler项使得 mod_wsman 能够过滤其他请求,其余的选项则设定访问权限的问题,可以根据实际情况选择其他方法。

  完成了模块的配置,重新启动 apache 服务器,wsman 客户端可以通过 80 端口发送请求并取得结果,同时 Apache 服务器原先的功能比如 web

  服务依旧正常工作。

  小结

  本文描述的开发 mod_wsman 的方法最主要的优点是模块独立于具体的 wsman 服务器开发,具有更大的灵活性,应用也更加广泛。同时,该方法也

  提示我们,只要开发相应的模块,很多服务都可以挂在 Apache 服务器下面,这一点有利于 Apache 服务器的通用性。

点击浏览:矢量网络分析仪、频谱仪、示波器,使用操作培训教程

上一篇:在汽车信息娱乐应用中用低成本的PLD管理 像数据
下一篇:基于C8051F系列单片机的标签打印机接口设计

微波射频测量操作培训课程详情>>
射频和天线工程师培训课程详情>>

  网站地图