2015-04-30 20:38:03 -04:00
# Functions used in AutoLab PowerShell scripts
#
#
2018-06-24 00:42:53 -04:00
# Version 3.0
2015-04-30 20:38:03 -04:00
#
2018-06-24 00:42:53 -04:00
function browserAndFlash {
if ( ( ( [ System.Environment ] :: OSVersion . Version . Major * 10 ) + [ System.Environment ] :: OSVersion . Version . Minor ) -ge 62 ) {
Write-BuildLog " Install Firefox browser "
start-process " B:\automate\_common\Firefox Setup 59.0.3.exe " -ArgumentList " -ms " -Wait -Verb RunAs
do {
start-sleep 10
} until ( ( get-process " msiexec " -ea SilentlyContinue ) -eq $Null )
Write-BuildLog " Installing Adobe Flash Player. "
Start-Process msiexec -ArgumentList '/i b:\Automate\_Common\install_flash_player_29_plugin.msi /qb' -Wait
do {
start-sleep 10
} until ( ( get-process " msiexec " -ea SilentlyContinue ) -eq $Null )
}
}
Function deployPowerCLI {
Write-BuildLog " Installing PowerCLI "
$PCLIver = 0
if ( ( Test-Path " b:\VMware-PowerCLI-6.7.*.exe " ) -and ( ( ( [ System.Environment ] :: OSVersion . Version . Major * 10 ) + [ System.Environment ] :: OSVersion . Version . Minor ) -ge 62 ) ) {
Write-BuildLog " VMware PowerCLI 6.7 installer found; installing. "
$PCLIver = 67
Start-Process ( Get-ChildItem b: \ VMware-PowerCLI - 6.7 . * . exe ) . FullName -ArgumentList '/q /s /w /L1033 /V" /qb"' -Wait -Verb RunAs
} elseif ( ( Test-Path " b:\VMware-PowerCLI-6.5.*.exe " ) -and ( ( ( [ System.Environment ] :: OSVersion . Version . Major * 10 ) + [ System.Environment ] :: OSVersion . Version . Minor ) -ge 62 ) ) {
Write-BuildLog " VMware PowerCLI 6.5 installer found; installing. "
$PCLIver = 65
Start-Process ( Get-ChildItem b: \ VMware-PowerCLI - 6.5 . * . exe ) . FullName -ArgumentList '/q /s /w /L1033 /V" /qb"' -Wait -Verb RunAs
} elseif ( ( Test-Path " b:\VMware-PowerCLI-6.3.*.exe " ) -and ( ( ( [ System.Environment ] :: OSVersion . Version . Major * 10 ) + [ System.Environment ] :: OSVersion . Version . Minor ) -ge 62 ) ) {
Write-BuildLog " VMware PowerCLI 6.3 installer found; installing. "
$PCLIver = 63
Start-Process ( Get-ChildItem b: \ VMware-PowerCLI - 6.3 . * . exe ) . FullName -ArgumentList '/q /s /w /L1033 /V" /qb"' -Wait -Verb RunAs
} elseif ( ( Test-Path " b:\VMware-PowerCLI-6.0.*.exe " ) -and ( ( ( [ System.Environment ] :: OSVersion . Version . Major * 10 ) + [ System.Environment ] :: OSVersion . Version . Minor ) -ge 62 ) ) {
Write-BuildLog " VMware PowerCLI 6.0 installer found; installing. "
$PCLIver = 60
Start-Process ( Get-ChildItem b: \ VMware-PowerCLI - 6.0 . * . exe ) . FullName -ArgumentList '/q /s /w /L1033 /V" /qb"' -Wait -Verb RunAs
} elseif ( Test-Path " b:\VMware-PowerCLI-5.8.*.exe " ) {
Write-BuildLog " VMware PowerCLI 5.8 installer found; installing. "
$PCLIver = 58
Start-Process ( Get-ChildItem b: \ VMware-PowerCLI - 5.8 . * . exe ) . FullName -ArgumentList '/q /s /w /L1033 /V" /qb"' -Wait -Verb RunAs
} elseif ( Test-Path " b:\VMware-PowerCLI-5.5.*.exe " ) {
Write-BuildLog " VMware PowerCLI 5.5 installer found; installing. "
$PCLIver = 55
Start-Process ( Get-ChildItem b: \ VMware-PowerCLI - 5.5 . * . exe ) . FullName -ArgumentList '/q /s /w /L1033 /V" /qb"' -Wait -Verb RunAs
} elseif ( Test-Path " b:\VMware-PowerCLI-5.0.*.exe " ) {
Write-BuildLog " VMware PowerCLI 5.0 installer found; installing. "
$PCLIver = 50
Start-Process ( Get-ChildItem b: \ VMware-PowerCLI - 5.0 . * . exe ) . FullName -ArgumentList '/q /s /w /L1033 /V" /qb"' -Wait -Verb RunAs
} else {
If ( ( Read-Host " Would you like to go to the PowerCLI download site (y/n)? " ) -like " y " ) {
$IE = new-object -com internetexplorer . application
if ( ( ( [ System.Environment ] :: OSVersion . Version . Major * 10 ) + [ System.Environment ] :: OSVersion . Version . Minor ) -ge 62 ) { $IE . navigate2 ( " https://my.vmware.com/group/vmware/get-download?downloadGroup=PCLI670R1 " ) }
if ( ( ( [ System.Environment ] :: OSVersion . Version . Major * 10 ) + [ System.Environment ] :: OSVersion . Version . Minor ) -lt 62 ) { $IE . navigate2 ( " https://my.vmware.com/group/vmware/get-download?downloadGroup=PCLI58R1 " ) }
$IE . visible = $true
} Else {
Write-Host " OK, but the build will not work correctly without PowerCLI "
}
}
Write-BuildLog " Add PowerCLI $PCLIver initialization to PowerShell environment "
$null = New-Item -ItemType directory -Path " C:\Users\administrator\Documents\WindowsPowerShell\ "
$null = New-Item -ItemType directory -Path " C:\Users\Default\Documents\WindowsPowerShell\ "
$null = Copy-Item " B:\automate\_common\profile.ps1 " -Destination " C:\Users\administrator\Documents\WindowsPowerShell\ "
$null = Copy-Item " B:\automate\_common\profile.ps1 " -Destination " C:\Users\Default\Documents\WindowsPowerShell "
return $PCLIver
}
2015-04-30 20:38:03 -04:00
function Write-BuildLog {
param ( [ string ] $message )
if ( ! ( Test-Path C: \ Buildlog . txt ) ) {
New-Item -Path C: \ Buildlog . txt -ItemType File
}
2018-06-24 00:42:53 -04:00
$out = ( get-date -f HH : mm : ss ) + " " + $message
Write-Host $out
$out | Out-File C: \ BuildLog . txt -Encoding Default -append
2015-04-30 20:38:03 -04:00
}
2018-06-24 00:42:53 -04:00
# This Function from the PowerCLI Blog
# http://blogs.vmware.com/vipowershell/2009/08/how-to-list-datastores-that-are-on-shared-storage.html
#
2015-04-30 20:38:03 -04:00
function Get-ShareableDatastore {
# Get all datastores.
$datastores = Get-Datastore
# Load the HostStorageSystems of all hosts.
$hosts = Get-VMHost | Get-View -property ConfigManager
$storageSystems = @ ( )
foreach ( $h in $hosts ) {
$sdi = Get-View $h . ConfigManager . StorageSystem -Property StorageDeviceInfo
Write-Debug ( " GSD: SDI for host $h is " + $sdi )
$storageSystems + = $sdi
}
foreach ( $dso in $datastores ) {
$ds = $dso | Get-View -Property Info
# Check if this datastore is NFS.
$dsInfo = $ds . Info
Write-Debug ( " GSD: Is it NFS? " + $dsInfo . getType ( ) )
if ( $dsInfo -is [ VMware.Vim.NasDatastoreInfo ] ) {
Write-Output $dso
continue
}
# Get the first extent of the datastore.
$firstExtent = $dsInfo . Vmfs . Extent [ 0 ]
Write-Debug ( " GSD: first extent: " + $firstExtent . DiskName )
# Find a host that maps this LUN.
foreach ( $hss in $storageSystems ) {
$lun = $hss . StorageDeviceInfo . ScsiLun | Where { $_ . CanonicalName -eq $firstExtent . DiskName }
if ( $lun ) {
Write-Debug ( " GSD: found " + $lun . DeviceName + " on " + $hss . MoRef . Value )
Write-Debug ( " GSD: LUN details: Name: " + $lun . DisplayName + " , Type: " + $lun . DeviceType + " , Vendor: " + $lun . Vendor + " , Model: " + $lun . Model )
# Search the adapter topology of this host, looking for the LUN.
$adapterTopology = $hss . StorageDeviceInfo . ScsiTopology . Adapter |
Where { $_ . Target |
Where { $_ . Lun |
Where { $_ . ScsiLun -eq $lun . key }
}
} | Select -First 1
# We've found a host that has this LUN. Find how it maps to an adapter.
$adapter = $hss . StorageDeviceInfo . HostBusAdapter | Where { $_ . Key -eq $adapterTopology . Adapter }
Write-Debug ( " GSD: HBA type is: " + $adapter . getType ( ) )
# It's shared if it's Fibre Channel or iSCSI (we checked for NFS earlier)
if ( $adapter -is [ VMware.Vim.HostFibreChannelHba ] -or $adapter -is [ VMware.Vim.HostInternetScsiHba ] ) {
Write-Debug " GSO: $dso is sharable "
Write-Output $dso
}
# Otherwise it's not shared and we quit walking through hosts.
break
}
}
}
}
Function Check-File ( $a , $b ) {
if ( test-Path $a ) {
Write-Host ( $b + " found. " ) -foregroundcolor " green "
} else {
2018-06-24 00:42:53 -04:00
Write-Host ( " **** " + $b + " missing. " ) -foregroundcolor " red "
2015-04-30 20:38:03 -04:00
$Global:Pass = $False
}
}
Function Check-OptionalFile ( $a , $b ) {
if ( test-Path $a ) {
Write-Host ( $b + " found. " ) -foregroundcolor " green "
} else {
2018-06-24 00:42:53 -04:00
Write-Host ( " **** " + $b + " missing. " ) -foregroundcolor " Yellow "
2015-04-30 20:38:03 -04:00
}
}
Function Check-ServiceRunning ( $a ) {
$SVC = Get-Service -name $a -ErrorAction " SilentlyContinue "
if ( $SVC . Status -eq " Running " ) {
Write-Host ( " Service " + $a + " running. " ) -foregroundcolor " green "
} else {
2018-06-24 00:42:53 -04:00
Write-Host ( " **** Service " + $a + " not running. " ) -foregroundcolor " red "
2015-04-30 20:38:03 -04:00
$Global:Pass = $False
}
}
Function Check-DNSRecord ( $a ) {
$FWDIP = " "
$ErrorActionPreference = " silentlycontinue "
$FWDIP = [ System.Net.Dns ] :: GetHostAddresses ( $a )
$ErrorActionPreference = " continue "
if ( $FWDIP -eq " " ) {
2018-06-24 00:42:53 -04:00
Write-Host ( " **** No DNS for " + $a ) -foregroundcolor " red "
2015-04-30 20:38:03 -04:00
$Global:Pass = $False
} else {
Write-Host ( " DNS OK for " + $a ) -foregroundcolor " green "
}
}
function Test-Administrator {
$user = [ Security.Principal.WindowsIdentity ] :: GetCurrent ( ) ;
( New-Object Security . Principal . WindowsPrincipal $user ) . IsInRole ( [ Security.Principal.WindowsBuiltinRole ] :: Administrator )
}
#
# This section from Luc Dekens http://www.lucd.info/2011/08/11/vmx-raiders-revisited/
#
Function Register-VMs ( $a ) {
# Collect .vmx paths of registered VMs on the datastore
$registered = @ { }
$Datastore = Get-Datastore -name $a
Get-VM -Datastore $Datastore | % { $_ . Extensiondata . LayoutEx . File | where { $_ . Name -like " *.vmx " } | % { $registered . Add ( $_ . Name , $true ) } }
# Set up Search for .VMX Files in Datastore
New-PSDrive -Name TgtDS -Location $Datastore -PSProvider VimDatastore -Root '\' | Out-Null
$unregistered = @ ( Get-ChildItem -Path TgtDS : -Recurse | where { $_ . FolderPath -notmatch " .snapshot " -and $_ . Name -like " *.vmx " -and ! $registered . ContainsKey ( $_ . DatastoreFullPath ) } )
Remove-PSDrive -Name TgtDS
#Register all .vmx Files as VMs on the datastore
foreach ( $VMXFile in $unregistered ) { $null = New-VM -VMFilePath $VMXFile . DatastoreFullPath -VMHost $vmhost -Location " vm " -RunAsync }
}
#
# This section from dEPLOYMENT gUYS BLOG http://blogs.technet.com/b/deploymentguys/archive/2010/07/15/reading-and-modifying-ini-files-with-scripts.aspx
#
function Convert-IniFile ( $file ) {
$REGEX_INI_COMMENT_STRING = " ; "
$REGEX_INI_SECTION_HEADER = " ^\s*(?! $( $REGEX_INI_COMMENT_STRING ) )\s*\[\s*(.*[^\s*])\s*]\s* $ "
$REGEX_INI_KEY_VALUE_LINE = " ^\s*(?! $( $REGEX_INI_COMMENT_STRING ) )\s*([^=]*)\s*=\s*(.*)\s* $ "
$ini = @ { }
switch -regex -file $file {
" $( $REGEX_INI_SECTION_HEADER ) " {
$section = $matches [ 1 ]
$ini [ $section ] = @ { }
}
" $( $REGEX_INI_KEY_VALUE_LINE ) " {
$name , $value = $matches [ 1 . .2 ]
if ( $name -ne $null -and $section -ne $null )
{ $ini [ $section ] [ $name ] = $value }
}
}
$ini
}
#Menu selection from http://poshtips.com/2011/09/03/howto-make-menus-in-powershell/
function isNumeric ( $x ) {
$x2 = 0
$isNum = [ System.Int32 ] :: TryParse ( $x , [ ref ] $x2 )
return $isNum
}
function SelectFromList {
param ( [ string[] ] $List , [ string ] $Title = " Choices " , [ switch ] $verbose = $false )
Write-Host $Title . padright ( 80 ) -back green -fore black
$digits = ( [ string ] $List . length ) . length
$fmt = " {0, $digits } "
#display selection list
for ( $LN = 0 ; $LN -lt $List . length ) {
Write-Host ( " $fmt $( $List [ $LN ] ) " -f + + $ln )
Write-Host " "
}
#query user until valid selection is made
do {
Write-Host ( " Please select from list (1 to {0}) or `" q `" to quit " -f ( $list . length ) ) -back black -fore green -nonewline
$sel = read-host " "
if ( $sel -eq " q " ) {
Write-Host " quitting selection per user request... " -back black -fore yellow
Exit
} elseif ( isNumeric $sel ) {
if ( ( [ int ] $sel -gt 0 ) -and ( [ int ] $sel -le $list . length ) ) {
if ( $verbose ) {
Write-Host ( " You selected item #{0} ({1}) " -f $sel , $List [ $sel - 1 ] ) -back black -fore green }
} else {
$sel = $null
}
}
else { $sel = $null }
} until ( $sel )
if ( isNumeric $sel ) {
$sel -1
} else {
$null
}
}
Function Get-VMPlatform ( $VMType ) {
If ( ( Get-WmiObject Win32_BIOS ) . Manufacturer . Tolower ( ) -like " bochs* " ) { $VMType = " Ravello " }
Elseif ( ( Get-WmiObject Win32_BIOS ) . Serialnumber . Tolower ( ) -like " vmware* " ) { $VMType = " VMware " }
Else { $VMType = " Unknown " }
return $VMType
}