zabbix_sender, windows powershell

# ================================
# 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: