Public/Configure/New-VeeamAgentConfig.ps1

function New-VeeamAgentConfig {
    [CmdletBinding(SupportsShouldProcess)]
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True,ParameterSetName='Network')]
        [uri]$NetworkPath,
        [Parameter(Mandatory=$True,ParameterSetName='Cloud')]
        [Parameter(ParameterSetName='Network')]
        [pscredential]$Credential,
        [Parameter(Mandatory=$True,ParameterSetName='Cloud')]
        [string]$ServerName,
        [Parameter(Mandatory=$True,ParameterSetName='Cloud')]
        [string]$RemoteRepositoryName,
        [Parameter(ParameterSetName='Cloud')]
        [int]$ServerPort = 6180,
        [Parameter(ParameterSetName='Local')]
        [System.IO.FileInfo]$LocalBackupDestination,
        [string]$ConfigPath = $(Join-Path $env:TEMP VeeamConfig.xml),
        [string]$EncryptionKey,
        [string]$EncryptionHint,
        [int]$RestorePoints = 14,
        [string]$Brand = 'Veeam Agent',
        [string]$JobName,
        [string]$JobDesc = "Created by $env:USERNAME at $(Get-Date), using the VeeamAgent PowerShell module.",
        [switch]$HealthChecks,
        [ValidateScript({
            if( -Not ($_ | Test-Path) ){
                throw "Existing config does not exist"
            }
            return $true
        })]
        [System.IO.FileInfo]$AppendToExisting
    )
    Begin{
        $Invocation = (Get-Variable MyInvocation -Scope 1).Value
        $ConfigRoot = "$(Split-Path $Invocation.MyCommand.Path)\Private\Configuration Templates\"
    }

    Process{
        Try{
            if ($PSCmdlet.ParameterSetName -eq 'Network') {
                $Type = 'Network'
                # TODO
                if (![bool]$NetworkPath.IsUnc) {
                    return Write-Output "ERROR: Network Path given is not a UNC path. '\\Server\Share'"
                }
                [xml]$xml = Get-Content "$($ConfigRoot)\Network.xml"
                $xml.ExecutionResult.data.JobInfo.TargetInfo.Path = $NetworkPath.LocalPath
                if (!$Credential) {
                    $null = $xml.ExecutionResult.data.JobInfo.TargetInfo.CredentialsInfo.RemoveAll()
                } else {
                    $xml.ExecutionResult.data.JobInfo.TargetInfo.CredentialsInfo.UserName = ConvertTo-VeeamEncodedString $Credential.UserName
                    $xml.ExecutionResult.data.JobInfo.TargetInfo.CredentialsInfo.Password = ConvertTo-VeeamEncodedString $Credential.GetNetworkCredential().Password
                }
            }
            if($PSCmdlet.ParameterSetName -eq 'Local') {
                $Type = 'Local'
                $DriveName = $LocalBackupDestination.FullName[0..2] -join ''
                $RelativePath = "$($LocalBackupDestination.FullName.replace($DriveName, ''))\"
                [xml]$xml = Get-Content "$($ConfigRoot)\Local.xml"
                $xml.ExecutionResult.data.JobInfo.TargetInfo.DriveName = $DriveName
                $xml.ExecutionResult.data.JobInfo.TargetInfo.RelativePath = $RelativePath
            }
            if($PSCmdlet.ParameterSetName -eq 'Cloud') {
                $Type = 'Cloud'
                [xml]$xml = Get-Content "$($ConfigRoot)\CloudConnect.xml"

                # Cloud config
                $xml.ExecutionResult.Data.JobInfo.TargetInfo.ServerName = $ServerName
                $xml.ExecutionResult.Data.JobInfo.TargetInfo.ServerPort = $ServerPort.ToString()
                $xml.ExecutionResult.Data.JobInfo.TargetInfo.RemoteRepositoryName = $RemoteRepositoryName
                $xml.ExecutionResult.Data.JobInfo.TargetInfo.GateList = "$($ServerName):$($ServerPort)"
                $xml.ExecutionResult.Data.JobInfo.TargetInfo.ServerCredentials.UserName = ConvertTo-VeeamEncodedString $Credential.UserName
                $xml.ExecutionResult.Data.JobInfo.TargetInfo.ServerCredentials.Password = ConvertTo-VeeamEncodedString $Credential.GetNetworkCredential().Password
            }

            $xml.ExecutionResult.Version = "$(Get-VeeamAgentVersion)"
            $xml.ExecutionResult.Data.JobInfo.ObjectName = $env:COMPUTERNAME
            if (-not $JobName) { $JobName = "$Type Backup Job $env:COMPUTERNAME"}
            $xml.ExecutionResult.Data.JobInfo.JobName = $JobName
            $xml.ExecutionResult.Data.JobInfo.JobDesc = $JobDesc
            if ($EncryptionKey) {
                $xml.ExecutionResult.Data.JobInfo.StorageInfo.Encryption.Key.Hint = ConvertTo-VeeamEncodedString $EncryptionHint
                $xml.ExecutionResult.Data.JobInfo.StorageInfo.Encryption.Key.Password = ConvertTo-VeeamEncodedString $EncryptionKey
            } else {
                $xml.ExecutionResult.Data.JobInfo.StorageInfo.Encryption.Enabled = 'False'
                $null = $xml.ExecutionResult.Data.JobInfo.StorageInfo.Encryption.Key.RemoveAll()
            }
            if ($HealthChecks) {
                $xml.ExecutionResult.Data.JobInfo.ScheduleInfo.HealthCheck.MonthlyInfo.Week = $(Get-Random -Minimum 1 -Maximum 4).ToString()
                $xml.ExecutionResult.Data.JobInfo.ScheduleInfo.HealthCheck.MonthlyInfo.DayOfWeek = $(Get-Random -Minimum 1 -Maximum 7).ToString()
            } else {
                $ChildNode = $xml.ExecutionResult.Data.JobInfo.ScheduleInfo.SelectSingleNode('HealthCheck')
                $null = $xml.ExecutionResult.Data.JobInfo.ScheduleInfo.RemoveChild($ChildNode)
            }
            $xml.ExecutionResult.Data.JobInfo.RetentionInfo.RestorePointsCount = $RestorePoints.ToString()
            $xml.ExecutionResult.Data.ApplicationSettings.LogoText = $Brand

            if ($AppendToExisting -and (Test-Path $AppendToExisting)) {
                $xml2 = $xml
                [xml]$xml = Get-Content $AppendToExisting
                $ImportTo = $Xml.SelectSingleNode("/ExecutionResult/Data")
                $ImportFrom = $Xml2.SelectSingleNode("/ExecutionResult/Data/JobInfo")
                if($xml.ExecutionResult.Data.JobInfo.JobName -contains $xml2.ExecutionResult.Data.JobInfo.JobName) {
                    return Write-Error 'JobName already exists'
                }
                $null = $ImportTo.AppendChild($XML.ImportNode($ImportFrom, $true))
            }

            if ($PSCmdlet.ShouldProcess($ConfigPath, "New-VeeamAgentConfig")) {
                $xml.Save($ConfigPath)
            }
        }

        Catch{
            $ErrorMessage = "There was an error building the config."
            $ErrorMessage += $_
            return Write-Error $ErrorMessage
        }
    }

    End{
        If($?){
            Write-Output "Configuration file created: $ConfigPath"
        }
    }
}