scripts/Start-VirtualMachines.ps1

141 lines
6.2 KiB
PowerShell

[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