NSX Advanced Load Balancer には、DataScript の XML ペイロードを解析するための XML パーサーが含まれています。この機能を使用すると、XML ペイロードに関するインサイトを取得したり、XML 本文のパラメータに基づいて何らかのアクションを実行したりできます。

NSX Advanced Load Balancer では、XML の処理に使用される XML パーサーが追加されました。XML パーサーにはラッパーが必要です。これを使用する場合、NSX Advanced Load Balancer XML パーサーは DataScript の先頭で使用されます。

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

avixmlparser には、次の 2 つの機能があります。

  • 構文解析

  • 検索

機能

パラメータ

戻り値

構文解析

要求の本文

次の 2 つの値を返します。

  1. 最初の値は、解析が成功したかどうかを示します。

  2. 2 番目の値は、解析された情報です。解析に失敗した場合、2 番目の値はエラー情報になります。

検索

  1. ドキュメント オブジェクト。

  2. XPath:XPath 式を使用して、XML ペイロードからパスワードやユーザー名などの関連属性を抽出できます。

次の 2 つの値を返します。

  1. 最初の値は、解析が成功したかどうかを示します。

  2. 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