CyberwatchApi.psm1

# Powershell Cyberwatch Api Client

Function SendApiRequest
{
<#
.SYNOPSIS
        Cyberwatch API Powershell Client.
.DESCRIPTION
        Send REST Query to Cyberwatch API
.EXAMPLE
        SendApiRequest -api_url $API_URL -api_key $API_KEY -secret_key $SECRET_KEY -http_method $http_method -request_URI $request_URI
.PARAMETER api_url
        Your Cyberwatch instance base url
#>

Param    (
    [PARAMETER(Mandatory=$true)][string]$api_url = 'https://cyberwatch.local',
    [PARAMETER(Mandatory=$true)][string]$api_key,
    [PARAMETER(Mandatory=$true)][string]$secret_key,
    [PARAMETER(Mandatory=$true)][string]$http_method = 'GET',
    [PARAMETER(Mandatory=$true)][string]$request_URI = '/api/v2/ping'
    )

    $content_type = ''
    # $content = ""
    # $bytes = [System.Text.Encoding]::UTF8.GetBytes($content)
    # $Hasher = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
    # $md5 = $Hasher.ComputeHash($bytes)
    # $content_MD5 = [System.Convert]::ToBase64String($md5)
    $content_MD5 = ''

    $timestamp = [System.DateTime]::UtcNow.ToString('R')
    $message = "$http_method,$content_type,$content_MD5,$request_URI,$timestamp"
    $hmacsha = New-Object System.Security.Cryptography.HMACSHA256
    $hmacsha.key = [Text.Encoding]::ASCII.GetBytes($SECRET_KEY)
    $signature = $hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($message))
    $signature = [Convert]::ToBase64String($signature)

    Invoke-RestMethod -Uri "${API_URL}${request_URI}" -Method $http_method -Headers @{
        "accept"="application/json";
        "Date"=$timestamp
        "Authorization"="Cyberwatch APIAuth-HMAC-SHA256 ${API_KEY}:$signature"
    }
}

Class CbwApiClient {
    [string]$api_url
    [string]$api_key
    [string]$secret_key

    CbwApiClient ([string]$api_url, [string]$api_key, [string]$secret_key)
    {
        $this.api_url = $api_url
        $this.api_key = $api_key
        $this.secret_key = $secret_key
    }

    [object] request([string]$http_method, [string]$request_URI) {
        return SendApiRequest -api_url $this.api_url -api_key $this.api_key -secret_key $this.secret_key -http_method $http_method -request_URI $request_URI
    }

    [object] ping()
    {
        return $this.request('GET', '/api/v2/ping')
    }

    [object] servers()
    {
        return $this.request('GET', '/api/v2/servers')
    }

    [object] server([string]$id)
    {
        return $this.request('GET', "/api/v2/servers/${id}")
    }
}


function Get-CyberwatchApi
{
<#
.SYNOPSIS
        Cyberwatch API Powershell Client.
.DESCRIPTION
        Send REST Query to Cyberwatch API
.EXAMPLE
        Get-CyberwatchApi -api_url $API_URL -api_key $API_KEY -secret_key $SECRET_KEY
.PARAMETER api_url
        Your Cyberwatch instance base url
#>

Param    (
    [PARAMETER(Mandatory=$true)][string]$api_url = 'https://cyberwatch.local',
    [PARAMETER(Mandatory=$true)][string]$api_key,
    [PARAMETER(Mandatory=$true)][string]$secret_key
    )

  return [CbwApiClient]::new($api_url, $api_key, $secret_key)
}