Сценарий Powershell для мониторинга VPN в Palo Alto - PullRequest
0 голосов
/ 25 января 2019

У меня проблемы с получением необходимого вывода из моего сценария PowerShell. Я хочу вывести состояние активное или неактивное для десятков и десятков VPN-туннелей типа "сеть-сеть".

Я пытаюсь адаптироватьсяскрипт, найденный здесь: http://www.hospitableit.com/howto/monitoring-an-ipsec-tunnel-on-a-palo-alto-firewall-using-prtg/,, который контролирует один VPN-туннель между сайтами, поэтому PRTG использует этот датчик: https://www.paessler.com/manuals/prtg/exe_script_advanced_sensor будет контролировать столько, сколько у нас.

$SecurePassword = Get-Content "C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\vpnmonitor_password.txt <file:///C:/Program%20Files%20(x86)/PRTG%20Network%20Monitor/Custom%20Sensors/EXEXML/vpnmonitor_password.txt> " | ConvertTo-SecureString
$Marshal = [System.Runtime.InteropServices.Marshal]
$Bstr = $Marshal::SecureStringToBSTR($SecurePassword)
$Password = $Marshal::PtrToStringAuto($Bstr)
$Marshal::ZeroFreeBSTR($Bstr)

$VPNTunnelState = & 'C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\curl.exe' -k -X GET "https://hostname/api/?type=op&cmd=<show><running><tunnel><flow><all></all></flow></tunnel></running></show>&key=$Password" | Out-File vpnmonitor.xml
[xml]$XmlDocument = Get-Content -Path .\vpnmonitor.xml
$a = $XmlDocument.SelectNodes('//entry')

foreach($Node in $a) {
if($Node.state -eq 'active') {
    $NodeState = "1"
                }
          Else {
          $NodeState = "0"
          }
}

Write-Host "<prtg>"
Write-Host "<result>"
           "<channel>"+ $a.name +"</channel>"
           "<value>" + $NodeState +"</value>"
           "</result>"
Write-Host "</prtg>" 

$ a отображает всю информацию обо всех VPN-туннелях.

$ a.name также работает, как и $ a.state.

Если я делаю $ node или $ nodetate, то этовсегда отображать информацию из последнего VPN-туннеля.

Информация для одного VPN-туннеля выглядит следующим образом (один пример):

peerip : xxx.xxx.xxx.xxx
name : VPN_tunnel_name
outer-if : ethernet1/1
gwid: 26
localip: xxx.xxx.xxx.xxx
state: active
inner-if: tunnel.31
mon: off
owner : 1
id : 34

PRTG отображает имя канала, содержащее имя всехVPN-туннели и состояние последнего ($ nodetate).

Возможно, мне придется изменить эту последнюю часть, поэтому я делаю это индивидуально для каждого туннеля, что хорошо для меня, если нет другого варианта, ноЯ попробовал с

Write-Host "<prtg>"
Write-Host "<result>"
           "<channel>"+ $a.name[28] +"</channel>"
           "<value>" + $a.state[28] +"</value>"
           "</result>"
Write-Host "</prtg>" 

И яполучить ошибку синтаксического анализатора XML в PRTG, утверждая, что JSON не соответствует ожидаемой структуре (недопустимый JSON).

$ nodetate [28] ничего не показывает, все может работать, если будет отображаться 1(активный) или 0 (неактивный).

Я с удовольствием предоставлю дополнительную информацию.

...