public/Set-RSHost.ps1

function Set-RSHost {
    <#
    .SYNOPSIS
        Update a host object on RedSeal
    .PARAMETER HostObject
        Host object to update. May be an array of hosts.
    .PARAMETER XML
        Display generated XML, but do not post
    .INPUTS
        Full host object.
    .OUTPUTS
        One result object.
#>


    [cmdletbinding(SupportsShouldProcess = $true)]
    Param(
    
        [Parameter(ValueFromPipeline = $true, Mandatory = $false, Position = 0)]
        [PSCustomObject[]]
        $HostObject,

        [Parameter(Mandatory = $false)]
        [switch]
        $XML = $false

    )

    begin {
        if ($null -eq $Credentials) {
            Connect-RSServer
        }
    }

    process {

        $hostXml = New-Object XML
        $decl = $hostXml.CreateXmlDeclaration("1.0", $null, $null)
        $decl.Encoding = "ISO-8859-1"
        $e = $hostxml.CreateElement("Host")
        $hostXml.InsertBefore($decl, $hostXml.DocumentElement) | Out-Null
        $hostXml.AppendChild($e) | Out-Null
        
        #create a processing directive for the mandatory header
        $pi = $hostXml.CreateProcessingInstruction("RedSeal", 'mediaType="application/x-RedSealv5.0+xml"')
        $hostXml.InsertBefore($pi, $hostXml.ChildNodes[1]) | Out-Null

        foreach ($singleHost in $HostObject) {
            
            $e = $hostXml.CreateElement("Name")
            $e.InnerText = $singleHost.hostname
            $hostXml.SelectSingleNode("/Host[last()]").AppendChild($e) | Out-Null
            
            #set host value, if specified
            if ($singleHost.SpecifiedValue) {
                $e = $hostXml.CreateElement("Value")
                $e.InnerText = $singleHost.SpecifiedValue
                $hostXml.SelectSingleNode("/Host[last()]").AppendChild($e) | Out-Null
            }
            
            $e = $hostXml.CreateElement("Interfaces")
            $hostXml.SelectSingleNode("/Host[last()]").AppendChild($e) | Out-Null
            
            #foreach interface (only support 1 interface in this iteration)
            $e = $hostXml.CreateElement("Interface")
            $hostXml.SelectSingleNode("/Host/Interfaces[last()]").AppendChild($e) | Out-Null
            $e = $hostXml.CreateElement("Address")
            $e.InnerText = $singleHost.IPAddress
            $hostXml.SelectSingleNode("/Host/Interfaces/Interface[last()]").AppendChild($e) | Out-Null
            
            $e = $hostXml.CreateElement("Applications")
            $hostXml.SelectSingleNode("/Host[last()]").AppendChild($e) | Out-Null
            
            #foreach application
            <#
            
            $e = $hostXml.CreateElement("Applications")
            $e.InnerText = <appname>
            $hostXml.SelectSingleNode("/Host/Applications[last()").AppendChild($e) | Out-Null
            
            $e = $hostXml.CreateElement("IP")
            $e.InnerText = <appIP>
            $hostXml.AppendChild($e) | Out-Null
            
            #ports and protocols
            $e = $hostXml.CreateElement("PortAndProtocol")
            $e.InnerText = <appname>
            $hostXml.AppendChild($e) | Out-Null
            
            $interface.address.innertext() = $host.Address
            $applications
            $application.IP
            $application.portandprotocol
            $application.portandprotocol.port
            $application.portandprotocol.protocol
            
            #vulnerabilities
            $application.vulnerabilities
            #>


            #set the host comments (aka Description)
            $e = $hostXml.CreateElement("Comments")
            $e.InnerText = $singleHost.Comments
            $hostXml.SelectSingleNode("/Host[last()]").AppendChild($e) | Out-Null

        }

        $respbody = $($hostXml.InnerXML.ToString().Replace("><",">`r`n<"))

        #post the updated XML
        if ($XML) {
            $respBody
        } else {
            $uri = "https://" + $script:server + "/data/host"
            $result = Send-RSRequest -uri $uri -Method POST -Body $respbody
            #$result = Invoke-RestMethod -uri $uri -Credential $script:credentials -method Post -ContentType "multipart/form-data" -Body $respBody
            
            #parse response
            Write-Debug "Response is $result"
            
            [pscustomobject]@{
                Status      = $result.ImportResult.Status
                StartTime   = $result.ImportResult.StartTime
                ExecutionMS = $result.ImportResult.ExecutionMS
                Notes       = $result.ImportResult.Notes
                Details     = $result.ImportResult.Details
            }
        }
    }
}