Vérifier manuellement l’état du service XML Citrix

La CAG de Citrix fourni nativement un moyen de vérifier l’état des services XML agrégé derrière une IP, mais, les services réseaux ne sont pas forcément très chaud pour utiliser un outil d’équilibrage de charge et/ou d’agrégation sur lequel ils n’ont pas la main…

Heureusement pour nous, la vérification de l’état d’un service XML Citrix est relativement simple. Il faut envoyer un requête HTTP POST au fichier “scripts/wpnbr.dll”. En fait, nous envoyons une requête pour une application, par exemple MyApp. Les données de la requête sont envoyées en xml :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE NFuseProtocol SYSTEM "NFuse.dtd"> 
<NFuseProtocol version="4.1"> 
<RequestAddress> 
 <Flags>no-load-bias</Flags>
 <Name> 
 <AppName>MyApp</AppName> 
 </Name> 
 </RequestAddress> 
</NFuseProtocol>

En cas de succès, la réponse contient un tag TicketTag

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE NFuseProtocol SYSTEM "NFuse.dtd">
<NFuseProtocol version="5.0">
    <ResponseAddress>
      <ServerAddress addresstype="dot">XXX.XXX.XXX.XXX</ServerAddress>
      <ServerType>win32</ServerType>
      <ConnectionType>tcp</ConnectionType>
      <ClientType>ica30</ClientType>
      <TicketTag>IMAHostId:XXXXX</TicketTag>
      <FarmLoadHint>XXXX</FarmLoadHint>
    </ResponseAddress>
</NFuseProtocol>

Pour faire cette vérification en powershell, il faut que nous créions une requête HTTP et que nous l’envoyions à notre XMLBroker. Powershell, enfin plutôt le net framework, nous fournit un objet System.Net.WebRequest.

[System.Net.WebRequest]$webRequest = [System.Net.WebRequest]::Create($url)

Nous n’avons plus qu’à préciser la méthode, le type de contenu, la taille du contenu et enfin le contenu, puis d’envoyer la requête.

$webRequest.ServicePoint.Expect100Continue = $false
$webRequest.ContentType ="text/xml"
$webRequest.Method = "POST"
$enc = [System.Text.Encoding]::GetEncoding($codePageName)
[byte[]]$bytes = $enc.GetBytes($data)
$webRequest.ContentLength = $bytes.Length
[System.IO.Stream]$reqStream = $webRequest.GetRequestStream()
$reqStream.Write($bytes, 0, $bytes.Length)
$reqStream.Flush()

Après, nous devons vérifier que la réponse du service XML contient la chaîne TicketTag

$resp = $webRequest.GetResponse()
$rs = $resp.GetResponseStream()
[System.IO.StreamReader]$sr = New-Object System.IO.StreamReader -argumentList $rs
@{$true="Success";$false="Failed"}[ $sr.ReadToEnd() -match 'TicketTag']

Voici un exemple de script vérifiant une liste de XMLBroker :

Leave a Reply

Your email address will not be published. Required fields are marked *