diff --git a/Start-VirtualMachines.ps1 b/Start-VirtualMachines.ps1 new file mode 100644 index 0000000..d4644e3 --- /dev/null +++ b/Start-VirtualMachines.ps1 @@ -0,0 +1,140 @@ +[CmdletBinding(SupportsShouldProcess=$true)] +Param() + +# User to log in as on the VM host +$USERNAME = 'dustin' +# VM host name/IP address +$SERVER = 'atria' +# List of virtual machines to start +$TO_START = @( + 'Rigel', + 'Bellatrix' +) + +# SSH public key of the VM host, in PuTTY registry format +$HOST_KEY = @' +0x10001,0xbb0ae72e54993cdef1f0040f0a1ef78e86f030e00d14c80534450d097117d08aee +61c60d8d85372e719691186ec6c64b0bf7de8c2bdbf61b3cc0b86252b09bcc003133133d85d0 +edf5cca5a1e82aa18711a9135062448633a7b9eb164c7ab41df1c7283a19c7e010ffdbba26f7 +75366aa8b01fd4681e7d234b592f07f43668057d96d605cb54d7825bc438ae433bc42f8579a9 +652e7ba841fcedec8e9a6718a82bc14d71bf22a7261f2c035abc4ca1460ccadee21da9077d6d +fd1880ea26012d2cfd2e3bbcdaebe3df1c78115b1c2302f99363ca30c0ef31d612a8a6f870d8 +60752e8633ad5749d7d66e6028420a4d4c262d0fb7abe0291a657b55cf490e4873 +'@ +# Private key to use to authenticate to the VM host +$PPK = @' +UHVUVFktVXNlci1LZXktRmlsZS0yOiBzc2gtcnNhDQpFbmNyeXB0aW9uOiBub25lDQpDb21tZW50 +OiBsb2NhbHN5c3RlbUBhcmN0dXJ1cw0KUHVibGljLUxpbmVzOiAxMg0KQUFBQUIzTnphQzF5YzJF +QUFBQUJKUUFBQWdFQXpyQVlwRjZ6QWMvZUtvWmZJeWpsczJWc0hPM2JtSWFiN3h5ZA0KZkpPL0dG +VzdUYlRhSVpLamMzdEVkZmZCSmZTbFB0QXhwUVFqNmNPbW9mOTVvazFpMzdMNlBEak8vbE9qTStJ +aw0KalNFNUN1QU5zN3FyTWNZMEgxMzNkN0tlRWt4dTVmNTgyWktmdmtrRTludDhaY20xenB6TlhY +UHZCY29IMmVlVg0KQ3d6QTdDelc1azNuN3dVSFNCYktoeHB4VFp2RnZ1a25nWkpxUVR0V1V3eSsy +OUtkcmhqZEdZcWV0QUJ4dXZkcQ0KQldoWEl1WWtqTG1RR2lrZmxERGk0MmFLa1pmVS9qR00zYVVD +Y0RES3NXTjFRV0ZrOFYxS0FySklzQU9PVVVsSQ0Kckl1OTI4TUo3SU41S1h2QTJhMmphZlNrVEZw +ZklPZG9QblhoZ2liTFdOQXJ0citTb01BeUl3Um10WG5WenlCdg0KWWhzZ2xybVcyM2VIWFc0MHMw +R21zK0R5WHhIMXJhS0N2MGZtK0JFelF3dDlpR25uSUkyOU9TR1J1TmVRUXFhKw0KdE5WVlBEUDBJ +UmhaUkdnMWt3Qjh0QTQvVTZGS1R3TEgyUDRMVm05VGNkejk4STRESmRZb2Z4ZG14cktvQXoySA0K +c3BtYitoM2VzckxkY0hRbjBFeCtTNkJxalUybGQrd2YvTnJZVHhOZlQycjMyRC95VFNTaEdLRHFW +ZGJTNFlaRQ0KTHlCUDJwUUFUTVNHUktsNnNlb1JvZVpMQkpFM2F2MVBoaGpMbTNpT1VrNVo0Z1Bk +dXhVMTg3UlEvRGs5UEZObw0KSXF0L2wrYUZTZzR4Q0xEdXl2MEQ4Z3M5OWRjdjRWSy9nZWsyWlhD +anV2RlFYNHU5NGZhbE9ieE5NSC82YVhzeQ0Kd3JwbDhHcz0NClByaXZhdGUtTGluZXM6IDI4DQpB +QUFDQVFDOTdlMGhhOGNXYS95Vng1V3htelB3OVdwRUdOZWc2bVhHOTdOUDRiYUZFSUthYnRaSVhU +eEFtc2xKDQp6dWpXeFNJNXVHVDRnRmhhUlJXcG5xY2ZoV0hHcEhjK1FncFJmVW5jcGtzWjV5MS9u +WFJmOTZRN2s0blhvblN6DQpMb05xd3NiRmdoSGNzRC9EblF0NnRxbXBwSms2WnBNelIvQm1MMFY4 +SU9uU3pYTUNpaEdWWEZpV2MxTE1uMUpTDQpvcTFPUEIxKy84TndKYTIvWnZWaEVxR0x1cDY3cUNV +ZVk3UnVEajcrMVlRRStCaTRTUnFxMUFmZ3NDcmJNOWRwDQpMY3R4Q0EvVTA1WXpkUWtvMHVQRm1h +b0V1bHpDSGwrdmMyVmplT09rcERUeGxTc0JTM0RuTExTRy9Cai9ZVW9PDQpWbTEybUR1OVh3WFlo +LytvQi9raExmNm43azlob2ZTQXJNMy9NYjRtSGl1emdXeTZVSUNBMXVRMmVPVGRsY2NsDQpPSFI4 +T1FoU09CY0lHSXB0SEF1MUxCcVF4MEkyanJEY1F2RDRjZVVUL0VBclh5QldqVFZiMElDODhEeUpq +eVNFDQpMZGNJS3ZVSzJHTzNCRGZKS09RMzBiNnVLNlJBN09qbUlOMUF6Lzk3TnYvbm12TUdwS0RW +QndyazBqb3hWS2ZEDQo1c1hGNXpYUTBtQ2NhTm9oaXphNzlFOGZ0UittWUxnc0NWVEhScVdtMSt1 +MXI5NC9LWHBqU0Q0V05EaTRCb1hVDQpVMjJUeG5QL0pEc3U2YW9HaERuZVNlVDI0NnVEQkhwM1Jl +MVIrTnRvOXFRSitUcjIxUmJFeWhnK2trSlN2WmptDQpiSUMwU3BjYi9xbDVoUFhsTXVLcEJKZlJX +c29vd2M3SWc5WTNTdWhNbXpjUEJkTDhIUUFBQVFFQTY2R0NTOEIxDQpoTm5yOXlCT0FCMGNmdDRn +SDNMZFAwUlJDYW1WSDlvWTFlNDh1Z1hzekI4MGthMk11cTZXUmx6QUsyMmpoWXBlDQpQN242VUE5 +ZmI3WktBdHZEeDh3enpPaHhQMy83OUdjVXdUL3hXb3NFVS83MWZJaXBYOFp2ZWF3K3BGdVRKV0Jz +DQptb0NUQmk5SnUybjAycEswS0ZOVS9weURnaWt1T2ZZUno2QWhHQnROUkF3M3Jsb2tuZ0crQldq +eFpOWi9iZGVFDQp5UWJ0TXNmbGZTbTBOeVIzcys1a3Rxa3c2ejluc1FmSk9KMHFjMnI0amI2cXVn +eUFQYk5HSDdaelRwcVFLMVkyDQprVWY3Vmt3ZC9HK3ZUUVRDSDh1VmVRd2wyYnM1VGwrOU9ZRlht +cFpoUU1uUXpSZjg4blcrQk9VR0d3WFFkdFAxDQozTjlCQzVURERJMDRkUUFBQVFFQTRJNFVzVTJi +TDhzVUNIbmYwZThKMUE3RnVZV1FNdWhENTlHVVhnTHNPak1YDQpiemFVOTZtWURpMnRaSlByTEpV +bEEwUFRGdklQL2NablM3VEwySFE1cG54cVZ4QUd3d3RBdzFUN0ZTTHlPTktHDQpqNVFWQjFjek56 +dlhDZWYveHJxK3FIVWVzQ1NpbnpjUHhzbDBXemljSnJzV3Q1VFhKMXNJREZOQXJ4VzZ0eDJaDQpP +bDlRckRrUkFqcUxjRVdrNWw5aTdTQkxLT3REZlNhK3d0MnBrUENIUms4ZHVuSnRickhsNktvQVV2 +R2lEN0tiDQowMmZwak1UYW1BYWNaZUlsemtiODluQjRVM2lEQ2hXSy84UGJ0bTNiL09mQTFqd0I4 +eEx3dmw2UXpsSXBIMVZqDQp1WjNnTGxIdUNrbkoxRFZxNEVnbithZkxUSmVrSE9JZ1hVdCtZNzVw +WHdBQUFRQTZHZXVIQmhxSzN2YWpBd1g0DQpGa1BMSW9vdUtYcWxLcHB2TmJvaFcrUVc1UjhuOXZm +T09OT2pMOGVrN2tvSWtObXgwT0FxUnQ3azd3ZGpNd3NBDQpzblBtMWl3RnN3dXppUnRZcTN1UlR4 +M3N5OTY2eE1yQ0ozTjZsTTVka2V3OVI4Q0FFNFg0SFFwWWd0M3dwVVlYDQowamxFNmNSL0xGUC9M +czh6NWFuZVhjY0tHQnpscFpsN2xKVUd5RXRtLzROa2d4OXAvYmI5ZkN1MVArRXZ4Z0V3DQpqbnYr +TkYzYWh1SGx1WGx3TWkvdUFSWTIvcGhxemtSbXFJb2ZjQ2l2a0dlV0VvRFBHR2FvNTg1OVNBZzll +MjMyDQpyRWhCcVZlTlc2ZmhOaXpsNHR1dkl0TTlTTEQ2M2lwZmprK1JrQmNTeWNOYnJZVHN0RkZL +Ykl3OEQrSDJXa29GDQpKU1FaDQpQcml2YXRlLU1BQzogNjI2ZDQ5YTQwOWNiZGExMzhkNTNiMzZh +MGFkNjdjOTRkYWNlMGQ4Nw0K +'@ + + +#=============================================================================# + + +Function Save-HostKey +{ + Param( + [Parameter(Mandatory=$true)][String] $Hostname, + [Parameter(Mandatory=$true)][String] $Pubkey, + [Int] $Port = 22, + [String] $KeyType = 'rsa2' + ) + $path = 'HKCU:\Software\SimonTatham\PuTTY\SshHostKeys' + if (-not (Test-Path $path -PathType Container)) { + New-Item -Type Container -Force -Path $path + } + New-ItemProperty -Path $path ` + -Name "${KeyType}@${Port}:${Hostname}" ` + -Value $PubKey ` + -PropertyType String ` + -Force ` + -ErrorAction Stop ` + | Out-Null + Write-Verbose "Saved $KeyType key for ${Hostname}:${Port}" +} + + +Function Save-TempPpk +{ + Param( + [Parameter(Mandatory=$true)][Byte[]] $KeyData, + [String] $Path = ${env:TEMP} + ) + + $filename = Join-Path $Path ("{0}.ppk" -f [Guid]::NewGuid()) + Set-Content -Path $filename -Value $KeyData -Encoding Byte ` + -ErrorAction Stop + Write-Verbose "Wrote private key file $filename" + return $filename +} + + +Function Main +{ + Save-HostKey $SERVER ($HOST_KEY -split '\s+' -join '').Trim() + + $commands = $TO_START | ForEach-Object { + "start $_" + } + + $keyfile = Save-TempPpk ([Convert]::FromBase64String($PPK)) + try { + Write-Output $commands | & ${env:ProgramFiles(x86)}\PuTTY\plink.exe ` + -i $keyfile ` + -l $USERNAME ` + -batch ` + $SERVER ` + virsh -c qemu:///system + } finally { + Remove-Item -ErrorAction Stop $keyfile + Write-Verbose "Removed $keyfile" + } +} + +Main