miscellaneous-scripts/ua-connectivity-check/Common.ps1

196 lines
4.4 KiB
PowerShell

#
# Common.ps1
#
# Override the built-in cmdlet with a custom version
function Write-ErrorMsg($message) {
[Console]::ForegroundColor = 'red'
Write-Output $message
[Console]::ResetColor()
}
function Convert-ByteArrayToHex {
[cmdletbinding()]
param(
[parameter(Mandatory=$true)]
[Byte[]]
$bytes
)
#$hexString = [System.Text.StringBuilder]::new($bytes.Length * 2)
$hexString = New-Object System.Text.StringBuilder($bytes.Length * 2)
ForEach($byte in $bytes){
$hexString.AppendFormat("{0:x2}", $byte) | Out-Null
}
$hexString.ToString()
}
function Convert-HexToByteArray {
[cmdletbinding()]
param(
[parameter(Mandatory=$true)]
[String]
$hexString)
# $bytes = [byte[]]::new($hexString.Length / 2)
$bytes = New-Object byte[]($hexString.Length / 2)
For($i=0; $i -lt $hexString.Length; $i+=2){
$bytes[$i/2] = [convert]::ToByte($hexString.Substring($i, 2), 16)
}
$bytes
}
function Build-SharesMessage {
param(
[string] $lniata,
[string] $message)
$bytes = Convert-HexToByteArray($lniata);
#TODO: add message to LNIATA
$bytes
}
function IsPortOpen {
param(
[parameter(Mandatory=$true)]
[string]
$hostName,
[parameter(Mandatory=$true)]
[int]
$port,
[parameter(Mandatory=$false)]
[int]
$timeout = 5000)
$result = $null
# REMOVED: TCPClient's ConnectAsync not available in older powershell
# $client = New-Object System.Net.Sockets.TCPClient
# $timeout =
# $isOpen = $client.ConnectAsync($hostName, $port).Wait($timeout)
$client = New-Object System.Net.Sockets.TCPClient
$isOpen = $false
try {
$asyncResult = $client.BeginConnect($hostName, $port, $null, $null)
if (!$asyncResult.AsyncWaitHandle.WaitOne($timeout, $false))
{
throw [System.TimeoutException]::new();
}
$client.EndConnect($asyncResult) | Out-Null
$isOpen = $client.Connected
}
catch {
$isOpen = $false
}
finally {
$client.Close();
}
if ($isOpen) {
$result = "Success"
}
else {
$result = "Fail"
}
"$($result): $($hostName):$($port)"
}
function Send-UdpDatagram {
Param (
[string] $ip,
[int] $port)
$address = [System.Net.IPAddress]::Parse($ip)
$endPoints = New-Object System.Net.IPEndPoint($address, $port)
$socket = New-Object System.Net.Sockets.UDPClient
#$data = [Text.Encoding]::ASCII.GetBytes($message)
$data = Build-SharesMessage("ba0252fe");
#$sendMessage = $socket.Send($data, $data.Length, $endPoints)
$socket.Send($data, $data.Length, $endPoints) > $null
$Socket.Close()
}
function Read-Hosts-File-To-Hash {
Param (
[string] $fileName,
[switch] $includeCommentedLines)
$hostHash = @{}
if (-not (Test-Path -Path $fileName)) {
Write-ErrorMsg "Error: file not found: $($fileName)"
return $null
}
# $lines = Get-Content -Path $fileName
$lines = [IO.File]::ReadAllLines($fileName)
foreach ($line in $lines) {
$line = $line.Trim()
$isCommented = $false
if ($line.Length -lt 7) {
continue
}
$chars = $line.ToCharArray()
if ($chars[0] -eq '#') {
if (-not $includeCommentedLines) {
continue
}
$isCommented = $true
}
$line = $line.Trim('#')
if ($line.Length -lt 7) {
continue
}
$ix = $line.IndexOf('#')
if ($ix -gt 0) {
if ($ix -lt 7) {
continue
}
$line = $line.Substring(0, $ix)
}
$words = ($line -split ' ')
$ip = $words[0]
try {
[IPAddress]$ip > $null
}
catch {
continue
}
if ($isCommented) {
$hostHash.Add($ip, $null)
continue
}
if ($words.Count -eq 1) {
continue
}
$names = New-Object System.Collections.Generic.List[String]
for ($i = 1; $i -lt $words.Count; ++$i) {
$word = $words[$i].Trim()
if ($word) {
$names.Add($words[$i])
}
}
if ($hostHash.ContainsKey($ip)) {
foreach ($name in $names) {
$hostHash[$ip].Add($name)
}
}
else {
$hostHash.Add($ip, $names)
}
}
$hostHash
}
$workingDir = Get-Location
$uaHostsFileName = Join-Path -Path $workingDir -ChildPath 'ua_hosts.txt'
$hostsFileName = "$($Env:windir)\system32\drivers\etc\hosts"
if (Test-Path -Path $uaHostsFileName) {
$ipHashTable = Read-Hosts-File-To-Hash $uaHostsFileName $true
$uaHostHashTable = Read-Hosts-File-To-Hash $uaHostsFileName $false
} else {
Write-ErrorMsg "UA host entry file missing: $uaHostsFileName"
$ipHashTable = $null
$uaHostHashTable = $null
}
if (Test-Path -Path $hostsFileName) {
$hostHashTable = Read-Hosts-File-To-Hash $hostsFileName.ToString() $false
} else {
Write-ErrorMsg "System hosts file missing: $hostsFileName"
$hostHashTable = $null
}