NSX Advanced Load Balancer 包括用于在 DataScript 中解析 XML 负载的 XML 解析程序。通过使用此功能,您可以深入了解 XML 负载,或者根据 XML 正文中的参数执行某些操作。

NSX Advanced Load Balancer 添加了用于处理 XML 的 XML 解析程序。XML 解析程序需要包装程序。为此,在 DataScript 的开头使用 NSX Advanced Load Balancer XML 解析程序:

local avixmlparser = require("avixmlparser")
success, document = avixmlparser.parse(body)​
success, contents = avixmlparser.search(document, xpath)​

avixmlparser 具有两个函数:

  • 解析

  • 搜索

函数

参数

返回

解析

请求正文

返回两个值:

  1. 第一个值显示解析是否成功。

  2. 第二个值是已解析的信息。如果解析失败,则第二个值是错误信息。

搜索

  1. 文档对象。

  2. XPath:您可以使用 XPath 表达式从 XML 负载中提取密码和用户名等相关属性。

返回两个值:

  1. 第一个值显示解析是否成功。

  2. 第二个值显示搜索结果。

用例

  • 用例 1 - Horizon - 负载均衡 UAG 服务器:

    XML 是 Horizon 的控制协议。负载中的信息(如用户名、客户端类型等)可用于执行任何自定义操作(Horizon Client:Windows/MAC)。

    注:

    如果要对 Horizon 相关用例使用 DataScript,请确保已为 /ice URL 禁用请求正文缓冲,如果未禁用,将不会建立隧道连接。

    要通过 DataScript 选择性地禁用正文缓冲,请在“请求”事件下添加以下内容。

    HTTP_REQ event:
    local function starts_with(str, start)
       return str:sub(1, #start) == start
    end
    
    if starts_with(avi.http.get_uri(), "/ice/tunnel") then
      avi.http.set_request_body_buffer_size(0)
    end
    



  • 用例 2 - 最常见的示例是在 NSX Advanced Load Balancer 应用程序日志中打印用户名。

    用于从 XML API 请求中提取用户名的 DataScript 如下所示:

    图 1.
    local avixmlparser = require("avixmlparser")
    local body = avi.http.get_req_body(2048)
    local xpath = "/broker/do-submit-authentication/screen[name='windows-password']/params/param[name='username']/values/value"
    local succ_parse, document = avixmlparser.parse(body)
    if succ_parse then
       local succ_search, contents = avixmlparser.search(document, xpath)
       if succ_search then
           for i, v in ipairs(contents) do
               if v ~= nil then
                 avi.http.set_userid(v) end
           end
       else avi.vs.log(contents)
       end
    else avi.vs.log(document)
    end

    在此示例中,我们首先获取请求正文并对其进行解析。如果解析成功,我们将使用 xpath 搜索正文,如果搜索成功,我们将获取搜索结果。如果搜索失败,则可能会记录错误信息。

    日志如下所示:





  • 用例 3 - 添加包含某些 MAC 地址的字符串组。编写引用该字符串组的 DataScript。

    只有提供了 MAC 地址的用户才必须进行身份验证。必须关闭其他连接。

参阅上面的示例 XML,MAC 地址的 xpath 为

  local xpath = “/broker/do-submit-authentication/environment-information/info[@name=‘MAC_Address’]”
  • 用例 4 - 多因素身份验证

解析 securid-password 以进行多因素身份验证时,将使用以下 DataScript 在虚拟服务日志上打印用户名或用户 ID

local avixmlparser = require("avixmlparser")
local body = avi.http.get_req_body(2048)
local xpath = "/broker/do-submit-authentication/screen[name='securid-passcode']/params/param[name='username']/values/value"
local succ_parse, document = avixmlparser.parse(body)

if succ_parse then
   local succ_search, contents = avixmlparser.search(document, xpath)
   if succ_search then
       for i, v in ipairs(contents) do
           if v ~= nil then
             avi.http.set_userid(v) end
       end
   end
end