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 つの値を返します。
|
検索 |
|
次の 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 を次に示します。
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