Function Set-VMKeystrokes { param( [Parameter(Mandatory=$true)][String]$VMName, [Parameter(Mandatory=$true)][String]$StringInput, [Parameter(Mandatory=$false)][Boolean]$ReturnCarriage, [Parameter(Mandatory=$false)][Boolean]$DebugOn ) # Map subset of USB HID keyboard scancodes # https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2 $hidCharacterMap = @{ "a"="0x04"; "b"="0x05"; "c"="0x06"; "d"="0x07"; "e"="0x08"; "f"="0x09"; "g"="0x0a"; "h"="0x0b"; "i"="0x0c"; "j"="0x0d"; "k"="0x0e"; "l"="0x0f"; "m"="0x10"; "n"="0x11"; "o"="0x12"; "p"="0x13"; "q"="0x14"; "r"="0x15"; "s"="0x16"; "t"="0x17"; "u"="0x18"; "v"="0x19"; "w"="0x1a"; "x"="0x1b"; "y"="0x1c"; "z"="0x1d"; "1"="0x1e"; "2"="0x1f"; "3"="0x20"; "4"="0x21"; "5"="0x22"; "6"="0x23"; "7"="0x24"; "8"="0x25"; "9"="0x26"; "0"="0x27"; "!"="0x1e"; "@"="0x1f"; "#"="0x20"; "$"="0x21"; "%"="0x22"; "^"="0x23"; "&"="0x24"; "*"="0x25"; "("="0x26"; ")"="0x27"; "_"="0x2d"; "+"="0x2e"; "{"="0x2f"; "}"="0x30"; "|"="0x31"; ":"="0x33"; "`""="0x34"; "~"="0x35"; "<"="0x36"; ">"="0x37"; "?"="0x38"; "-"="0x2d"; "="="0x2e"; "["="0x2f"; "]"="0x30"; "\"="0x31"; "`;"="0x33"; "`'"="0x34"; ","="0x36"; "."="0x37"; "/"="0x38"; " "="0x2c"; } $vm = Get-View -ViewType VirtualMachine -Filter @{"Name"="^$($VMName)$"} # Verify we have a VM or fail if(!$vm) { Write-host "Unable to find VM $VMName" return } $hidCodesEvents = @() foreach($character in $StringInput.ToCharArray()) { # Check to see if we've mapped the character to HID code if($hidCharacterMap.ContainsKey([string]$character)) { $hidCode = $hidCharacterMap[[string]$character] $tmp = New-Object VMware.Vim.UsbScanCodeSpecKeyEvent # Add leftShift modifer for capital letters and/or special characters if( ($character -cmatch "[A-Z]") -or ($character -match "[!|@|#|$|%|^|&|(|)|_|+|{|}|||:|~|<|>|?|*]") ) { $modifer = New-Object Vmware.Vim.UsbScanCodeSpecModifierType $modifer.LeftShift = $true $tmp.Modifiers = $modifer } # Convert to expected HID code format $hidCodeHexToInt = [Convert]::ToInt64($hidCode,"16") $hidCodeValue = ($hidCodeHexToInt -shl 16) -bor 0007 $tmp.UsbHidCode = $hidCodeValue $hidCodesEvents+=$tmp if($DebugOn) { Write-Host "Character: $character -> HIDCode: $hidCode -> HIDCodeValue: $hidCodeValue" } } else { Write-Host "The following character `"$character`" has not been mapped, you will need to manually process this character" break } } # Add return carriage to the end of the string input (useful for logins or executing commands) if($ReturnCarriage) { # Convert return carriage to HID code format $hidCodeHexToInt = [Convert]::ToInt64("0x28","16") $hidCodeValue = ($hidCodeHexToInt -shl 16) + 7 $tmp = New-Object VMware.Vim.UsbScanCodeSpecKeyEvent $tmp.UsbHidCode = $hidCodeValue $hidCodesEvents+=$tmp } # Call API to send keystrokes to VM $spec = New-Object Vmware.Vim.UsbScanCodeSpec $spec.KeyEvents = $hidCodesEvents Write-Host "Sending `'$StringInput`' ...`n" $results = $vm.PutUsbScanCodes($spec) } Function New-VyOSConfiguration { <# .NOTES =========================================================================== Created by: William Lam Organization: VMware Blog: www.virtuallyghetto.com Twitter: @lamw =========================================================================== .DESCRIPTION This function automates the installation and configuration of VyOS from ISO .PARAMETER VMName The name of the VyOS VM .PARAMETER ManagementPassword The password to configure for the vyos user .PARAMETER ConfigFile The path to VyOS configuration file .PARAMETER ManagementAddress The IP Address of the WAN Interface (eth0) .PARAMETER ManagementGateway The Gateway Addrss of the WAN Interface (eth0) .PARAMETER ManagementDNSDomain The DNS Domain on the WAN network .PARAMETER ManagementDNSServer The DNS Server on the WAN Network .PARAMETER ManagementJumpHostIP The IP Address of Windows Jumphost that can be used to RDP into various VLANs .EXAMPLE New-VyOSConfiguration -VMName VyOS-Router -ConfigFile vyos.template -ManagementAddress 192.168.30.155/24 -ManagementGateway 192.168.30.1 -ManagementDNSDomain primp-industries.com -ManagementDNSServer 192.168.30.2 -ManagementJumpHostIP 192.168.30.199 -ManagementPassword VMware1! #> param( [Parameter(Mandatory=$true)][String]$VMName, [Parameter(Mandatory=$true)][String]$ConfigFile, [Parameter(Mandatory=$true)][String]$ManagementAddress, [Parameter(Mandatory=$true)][String]$ManagementGateway, [Parameter(Mandatory=$true)][String]$ManagementDNSDomain, [Parameter(Mandatory=$true)][String]$ManagementDNSServer, [Parameter(Mandatory=$true)][String]$ManagementJumpHostIP, [Parameter(Mandatory=$true)][String]$ManagementPassword, [Switch]$Troubleshoot ) # Login to console and install VyOS before starting configuration if(-Not $Troubleshoot) { Set-VMKeystrokes -VMName $VMName -StringInput "vyos" -ReturnCarriage $true Set-VMKeystrokes -VMName $VMName -StringInput "vyos" -ReturnCarriage $true Set-VMKeystrokes -VMName $VMName -StringInput "install image" -ReturnCarriage $true Set-VMKeystrokes -VMName $VMName -StringInput "yes" -ReturnCarriage $true Start-Sleep -Seconds 5 Set-VMKeystrokes -VMName $VMName -StringInput "Auto" -ReturnCarriage $true Start-Sleep -Seconds 1 Set-VMKeystrokes -VMName $VMName -StringInput "sda" -ReturnCarriage $true Start-Sleep -Seconds 5 Set-VMKeystrokes -VMName $VMName -StringInput "yes" -ReturnCarriage $true Start-Sleep -Seconds 5 Set-VMKeystrokes -VMName $VMName -StringInput " " -ReturnCarriage $true Start-Sleep -Seconds 10 Set-VMKeystrokes -VMName $VMName -StringInput "vyos-router" -ReturnCarriage $true Start-Sleep -Seconds 5 Set-VMKeystrokes -VMName $VMName -StringInput " " -ReturnCarriage $true Start-Sleep -Seconds 10 Set-VMKeystrokes -VMName $VMName -StringInput "$ManagementPassword" -ReturnCarriage $true Start-Sleep -Seconds 5 Set-VMKeystrokes -VMName $VMName -StringInput "$ManagementPassword" -ReturnCarriage $true Start-Sleep -Seconds 5 Set-VMKeystrokes -VMName $VMName -StringInput "sda" -ReturnCarriage $true Start-Sleep -Seconds 5 Set-VMKeystrokes -VMName $VMName -StringInput "configure" -ReturnCarriage $true Start-Sleep -Seconds 1 } foreach ($cmd in Get-Content -Path $ConfigFile | Where-Object { $_.Trim() -ne '' }) { if($cmd.Contains('[MANAGEMENT_ADDRESS]')) { $cmd = $cmd.replace('[MANAGEMENT_ADDRESS]',$ManagementAddress) if($Troubleshoot) { $cmd } else { Set-VMKeystrokes -VMName $VMName -StringInput $cmd -ReturnCarriage $true Start-Sleep -Seconds 1 } } elseif($cmd.Contains('[MANAGEMENT_IP]')) { $ManagementAddress = $ManagementAddress.substring(0,$ManagementAddress.IndexOf('/')) $cmd = $cmd.replace('[MANAGEMENT_IP]',$ManagementAddress) if($Troubleshoot) { $cmd } else { Set-VMKeystrokes -VMName $VMName -StringInput $cmd -ReturnCarriage $true Start-Sleep -Seconds 1 } } elseif($cmd.Contains('[MANAGEMENT_GATEWAY]')) { $cmd = $cmd.replace('[MANAGEMENT_GATEWAY]',$ManagementGateway) if($Troubleshoot) { $cmd } else { Set-VMKeystrokes -VMName $VMName -StringInput $cmd -ReturnCarriage $true Start-Sleep -Seconds 1 } } elseif($cmd.Contains('[JUMPHOST_VM_IP]')) { $cmd = $cmd.replace('[JUMPHOST_VM_IP]',$ManagementJumpHostIP) if($Troubleshoot) { $cmd } else { Set-VMKeystrokes -VMName $VMName -StringInput $cmd -ReturnCarriage $true Start-Sleep -Seconds 1 } } elseif($cmd.Contains('[MANAGEMENT_DNS_DOMAIN]')) { $cmd = $cmd.replace('[MANAGEMENT_DNS_DOMAIN]',$ManagementDNSDomain) $cmd = $cmd.replace('[MANAGEMENT_DNS_SERVER]',$ManagementDNSServer) if($Troubleshoot) { $cmd } else { Set-VMKeystrokes -VMName $VMName -StringInput $cmd -ReturnCarriage $true Start-Sleep -Seconds 1 } } elseif($cmd.Contains('[MANAGEMENT_DNS_SERVER]')) { $cmd = $cmd.replace('[MANAGEMENT_DNS_SERVER]',$ManagementDNSServer) if($Troubleshoot) { $cmd } else { Set-VMKeystrokes -VMName $VMName -StringInput $cmd -ReturnCarriage $true Start-Sleep -Seconds 1 } } else { if($Troubleshoot) { $cmd } else { Set-VMKeystrokes -VMName $VMName -StringInput $cmd -ReturnCarriage $true Start-Sleep -Seconds 1 } } } }