192 lines
5.2 KiB
PowerShell
192 lines
5.2 KiB
PowerShell
$ErrorActionPreference = 'Stop'
|
|
$WarningPreference = 'SilentlyContinue'
|
|
$VerbosePreference = 'SilentlyContinue'
|
|
$DebugPreference = 'SilentlyContinue'
|
|
$InformationPreference = 'SilentlyContinue'
|
|
|
|
function Log-Info
|
|
{
|
|
Write-Host -NoNewline -ForegroundColor Blue "INFO: "
|
|
Write-Host -ForegroundColor Gray ("{0,-44}" -f ($args -join " "))
|
|
}
|
|
|
|
function Log-Warn
|
|
{
|
|
Write-Host -NoNewline -ForegroundColor DarkYellow "WARN: "
|
|
Write-Host -ForegroundColor Gray ("{0,-44}" -f ($args -join " "))
|
|
}
|
|
|
|
function Log-Error
|
|
{
|
|
Write-Host -NoNewline -ForegroundColor DarkRed "ERRO: "
|
|
Write-Host -ForegroundColor Gray ("{0,-44}" -f ($args -join " "))
|
|
}
|
|
|
|
function Log-Fatal
|
|
{
|
|
Write-Host -NoNewline -ForegroundColor DarkRed "FATA: "
|
|
Write-Host -ForegroundColor Gray ("{0,-44}" -f ($args -join " "))
|
|
|
|
exit 255
|
|
}
|
|
|
|
function Is-Administrator
|
|
{
|
|
$p = New-Object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
|
|
return $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
|
|
}
|
|
|
|
function ConvertTo-JsonObj
|
|
{
|
|
param (
|
|
[parameter(Mandatory = $false, ValueFromPipeline = $true)] [string]$JSON
|
|
)
|
|
|
|
if (-not $JSON) {
|
|
return $null
|
|
}
|
|
|
|
try {
|
|
$ret = $JSON | ConvertFrom-Json -ErrorAction Ignore -WarningAction Ignore
|
|
return $ret
|
|
} catch {
|
|
return $null
|
|
}
|
|
}
|
|
|
|
function Set-Env
|
|
{
|
|
param(
|
|
[parameter(Mandatory = $true)] [string]$Key,
|
|
[parameter(Mandatory = $false)] [string]$Value = ""
|
|
)
|
|
|
|
try {
|
|
[Environment]::SetEnvironmentVariable($Key, $Value, [EnvironmentVariableTarget]::Process)
|
|
} catch {
|
|
Log-Error "Could not set $Key = $Value in Process target: $($_.Exception.Message)"
|
|
}
|
|
|
|
try {
|
|
[Environment]::SetEnvironmentVariable($Key, $Value, [EnvironmentVariableTarget]::Machine)
|
|
} catch {
|
|
Log-Error "Could not set $Key = $Value in Machine target: $($_.Exception.Message)"
|
|
}
|
|
}
|
|
|
|
function Get-Env
|
|
{
|
|
param(
|
|
[parameter(Mandatory = $true)] [string]$Key
|
|
)
|
|
|
|
try {
|
|
$val = [Environment]::GetEnvironmentVariable($Key, [EnvironmentVariableTarget]::Process)
|
|
if ($val) {
|
|
return $val
|
|
}
|
|
} catch {
|
|
Log-Error "Could not get $Key in Process target: $($_.Exception.Message)"
|
|
}
|
|
|
|
try {
|
|
$val = [Environment]::GetEnvironmentVariable($Key, [EnvironmentVariableTarget]::Machine)
|
|
if ($val) {
|
|
return $val
|
|
}
|
|
} catch {
|
|
Log-Error "Could not get $Key in Machine target: $($_.Exception.Message)"
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
function Get-VmComputeNativeMethods()
|
|
{
|
|
$ret = 'VmCompute.PrivatePInvoke.NativeMethods' -as [type]
|
|
if (-not $ret) {
|
|
$signature = @'
|
|
[DllImport("vmcompute.dll")]
|
|
public static extern void HNSCall([MarshalAs(UnmanagedType.LPWStr)] string method, [MarshalAs(UnmanagedType.LPWStr)] string path, [MarshalAs(UnmanagedType.LPWStr)] string request, [MarshalAs(UnmanagedType.LPWStr)] out string response);
|
|
'@
|
|
$ret = Add-Type -MemberDefinition $signature -Namespace VmCompute.PrivatePInvoke -Name "NativeMethods" -PassThru
|
|
}
|
|
return $ret
|
|
}
|
|
|
|
function Invoke-HNSRequest
|
|
{
|
|
param
|
|
(
|
|
[ValidateSet('GET', 'POST', 'DELETE')]
|
|
[parameter(Mandatory = $true)] [string] $Method,
|
|
[ValidateSet('networks', 'endpoints', 'activities', 'policylists', 'endpointstats', 'plugins')]
|
|
[parameter(Mandatory = $true)] [string] $Type,
|
|
[parameter(Mandatory = $false)] [string] $Action,
|
|
[parameter(Mandatory = $false)] [string] $Data = "",
|
|
[parameter(Mandatory = $false)] [Guid] $Id = [Guid]::Empty
|
|
)
|
|
|
|
$hnsPath = "/$Type"
|
|
if ($id -ne [Guid]::Empty) {
|
|
$hnsPath += "/$id"
|
|
}
|
|
if ($Action) {
|
|
$hnsPath += "/$Action"
|
|
}
|
|
|
|
$response = ""
|
|
$hnsApi = Get-VmComputeNativeMethods
|
|
$hnsApi::HNSCall($Method, $hnsPath, "$Data", [ref]$response)
|
|
|
|
$output = @()
|
|
if ($response) {
|
|
try {
|
|
$output = ($response | ConvertFrom-Json)
|
|
if ($output.Error) {
|
|
Log-Error $output;
|
|
} else {
|
|
$output = $output.Output;
|
|
}
|
|
} catch {
|
|
Log-Error $_.Exception.Message
|
|
}
|
|
}
|
|
|
|
return $output;
|
|
}
|
|
|
|
function Transfer-File
|
|
{
|
|
param (
|
|
[parameter(Mandatory = $true)] [string]$Src,
|
|
[parameter(Mandatory = $true)] [string]$Dst
|
|
)
|
|
|
|
if (Test-Path -PathType leaf -Path $Dst) {
|
|
$dstHasher = Get-FileHash -Path $Dst
|
|
$srcHasher = Get-FileHash -Path $Src
|
|
if ($dstHasher.Hash -eq $srcHasher.Hash) {
|
|
return
|
|
}
|
|
}
|
|
|
|
try {
|
|
$null = Copy-Item -Force -Path $Src -Destination $Dst
|
|
} catch {
|
|
Log-Fatal "Could not transfer file $Src to $Dst : $($_.Exception.Message)"
|
|
}
|
|
}
|
|
|
|
Export-ModuleMember -Function Log-Info
|
|
Export-ModuleMember -Function Log-Warn
|
|
Export-ModuleMember -Function Log-Error
|
|
Export-ModuleMember -Function Log-Fatal
|
|
Export-ModuleMember -Function Is-Administrator
|
|
Export-ModuleMember -Function ConvertTo-JsonObj
|
|
Export-ModuleMember -Function Set-Env
|
|
Export-ModuleMember -Function Get-Env
|
|
Export-ModuleMember -Function Get-VmComputeNativeMethods
|
|
Export-ModuleMember -Function Invoke-HNSRequest
|
|
Export-ModuleMember -Function Transfer-File
|