# ================================
# Zabbix sender in pure PowerShell
# ================================
# ----- Configuration -----
$ZabbixServer = "zabbix.contoso.com"
$ZabbixPort = 10051
$HostName = "myhost"
$ItemKey = "test.key"
$Value = "123"
# ----- Build JSON payload -----
$payloadObject = @{
request = "sender data"
data = @(
@{
host = $HostName
key = $ItemKey
value = $Value
}
)
}
$json = $payloadObject | ConvertTo-Json -Compress
Write-Host "JSON payload:"
Write-Host $json
Write-Host ""
# ----- Build Zabbix packet -----
# Protocol header: ZBXD + 0x01
$header = [System.Text.Encoding]::ASCII.GetBytes("ZBXD")
$header += 0x01
# Payload length (64-bit little-endian)
$dataBytes = [System.Text.Encoding]::UTF8.GetBytes($json)
$lengthBytes = [BitConverter]::GetBytes([Int64]$dataBytes.Length)
# Final packet
$packet = $header + $lengthBytes + $dataBytes
# ----- Connect to server -----
$client = New-Object System.Net.Sockets.TcpClient
try {
Write-Host "Connecting to $ZabbixServer`:$ZabbixPort ..."
$client.Connect($ZabbixServer, $ZabbixPort)
$stream = $client.GetStream()
# Send packet
Write-Host "Sending data..."
$stream.Write($packet, 0, $packet.Length)
$stream.Flush()
# ----- Receive response -----
$responseBuffer = New-Object byte[] 4096
$bytesRead = $stream.Read(
$responseBuffer,
0,
$responseBuffer.Length
)
Write-Host "Bytes received: $bytesRead"
if ($bytesRead -lt 13) {
Write-Host "Invalid response from server"
exit 1
}
# Validate header
$responseHeader = [System.Text.Encoding]::ASCII.GetString(
$responseBuffer,
0,
4
)
if ($responseHeader -ne "ZBXD") {
Write-Host "Unexpected protocol header"
exit 1
}
# Extract payload length
$payloadLength = [BitConverter]::ToInt64(
$responseBuffer,
5
)
# Safety check
if ($payloadLength -gt ($bytesRead - 13)) {
$payloadLength = $bytesRead - 13
}
# Extract JSON response
$responseJson = [System.Text.Encoding]::UTF8.GetString(
$responseBuffer,
13,
$payloadLength
)
Write-Host ""
Write-Host "Server response:"
Write-Host $responseJson
}
catch {
Write-Host ""
Write-Host "ERROR:"
Write-Host $_.Exception.Message
}
finally {
if ($stream) {
$stream.Close()
}
$client.Close()
}
No comments:
Post a Comment