zvmRemoteScripts_utils.ps1

Function Assert-ZertoInitialized {
    Write-Host "Starting $($MyInvocation.MyCommand)..."
    $action = {
        $ZVM = Get-VM -Name $ZVM_VM_NAME
        if ($null -eq $ZVM) {
            Write-Error "$ZVM_VM_NAME doesn't exists" -ErrorAction Stop
        }
        $res = Invoke-VMScript -VM $ZVM -ScriptText "whoami" -GuestUser $ZAPPLIANCE_USER -GuestPassword $PersistentSecrets.ZappliancePassword -ErrorAction SilentlyContinue
        if ($res.ScriptOutput.Trim() -ne $ZAPPLIANCE_USER)
        {    
            throw "ZVM failed to be initialized"
        }
    }
    Invoke-Retry -Action $action -ActionName "TestZertoInitialized" -RetryCount 10 -RetryIntervalSeconds 60
}

Function Set-ZertoConfiguration {
    Write-Host "Starting $($MyInvocation.MyCommand)..."
    try {
        $startTime = Get-Date
        Write-Host "Wating for Zerto to start"
        Assert-ZertoInitialized
        Write-Host "Zerto initialization took: $((Get-Date).Subtract($startTime).TotalSeconds) second(s)"

        Write-Host "Configuring Zerto"
        $startTime = Get-Date
        #TODO: we need to rename key that holds VC user password. It sound confusing
        $scriptLocation = "/opt/zerto/zlinux/avs/configure_zerto.py"
        $commandToExecute = "sudo python3 $scriptLocation --vcPassword '$($PersistentSecrets.ZertoPassword)' --avsClientSecret '$($PersistentSecrets.AvsClientSecret)'"
        $result = Invoke-ZVMScriptWithTimeout -ScriptText $commandToExecute -ActionName "Configure ZVM"
        Write-Host "Zerto configuration took: $((Get-Date).Subtract($startTime).TotalSeconds) second(s)"
        
        if($result.ScriptOutput.Contains("Success"))
        {
            Write-Host "Zerto configured successfully"
        }
        else {
            if($result.ScriptOutput.Contains("Error:"))
            {
                Write-Error "Failed to configure ZVM. $result.ScriptOutput" -ErrorAction Stop
            }
            if($result.ScriptOutput.Contains("Warning:")){
                $message = "$result.ScriptOutput"
                Write-Host $message
                Write-Warning $message
            }
            else {
                Write-Error "An error occurred while configuring Zerto. Please reinstall Zerto." -ErrorAction Stop
            }
        }
    }
    catch {
        Write-Error "Failed to configure Zerto. Error: $_" -ErrorAction
    }
}

Function Test-ZertoPassword{
    Process {
        Write-Host "Starting $($MyInvocation.MyCommand)..."
        $scriptLocation = "/opt/zerto/zlinux/avs/try_zerto_login.py"
        $commandToExecute = "sudo python3 $scriptLocation --zertoAdminPassword '$($PersistentSecrets.ZertoAdminPassword)'"
        try
        {
            $result = Invoke-ZVMScriptWithTimeout -ScriptText $commandToExecute -ActionName "Validate Zerto password" -TimeoutMinutes 5        
            if($result.ScriptOutput.Contains("Success"))
            {
                Write-Host "Zerto password is valid"
            }
            else {
                throw "Please, provide valid Zerto password."
            }
        }
        catch {
            Write-Error "An error happende during Zerto password validataion. Exception = $_" -ErrorAction Stop
        }
    }
}

Function Update-VcPasswordInZvm{
    Process {
        Write-Host "Starting $($MyInvocation.MyCommand)..."
        $startTime = Get-Date
        $scriptLocation = "/opt/zerto/zlinux/avs/change_vc_password.py"
        $commandToExecute = "sudo python3 $scriptLocation --vcPassword '$($PersistentSecrets.ZertoPassword)' --zertoAdminPassword '$($PersistentSecrets.ZertoAdminPassword)' --avsClientSecret '$($PersistentSecrets.AvsClientSecret)'"
        try
        {
            $result = Invoke-ZVMScriptWithTimeout -ScriptText $commandToExecute -ActionName "Update VC password in ZVM" -TimeoutMinutes 20    
            Write-Host "Zerto reconfiguration took: $((Get-Date).Subtract($startTime).TotalSeconds) second(s)"
            
            if($result.ScriptOutput.Contains("Success"))
            {
                Write-Host "New VC password set succesfully."
            }
            else {
                if($result.ScriptOutput.Contains("Error:"))
                {
                    throw $result.ScriptOutput -replace "Error: ", ""
                }
                throw "An error occurred while updating VC password. Please try again."
            }
        }
        catch {
            Write-Error "Failed update VC password, please try again. Exception = $_" -ErrorAction Stop
        }
    }
}