Compare commits

...

5 Commits

Author SHA1 Message Date
Asif Bacchus e5bc1f76df struct(wakeup): add params for connectivity testing 2021-09-05 18:33:46 -06:00
Asif Bacchus cda29f2ef1 fix(wakeup): fix error handling from Send-MagicPacket
- adapt to changes in error handling in upstream module
2021-09-05 18:33:24 -06:00
Asif Bacchus 56bc398bf0 struct(wakeup): use list for target computers
- prevent future multiple read of database file
2021-09-05 17:25:15 -06:00
Asif Bacchus 939ff159f5 struct(wakeup): basic WOL invocation script
- generate dummy database of computers
- basic script to wake up computers found in database
2021-09-05 17:06:38 -06:00
Asif Bacchus f0ddf5ab5a chore(git): add gitignore and attributes, Rider IDE settings 2021-09-05 17:05:38 -06:00
8 changed files with 342 additions and 0 deletions

100
.gitattributes vendored Normal file
View File

@ -0,0 +1,100 @@
# Common settings that generally should always be used with your language specific settings
# Auto detect text files and perform LF normalization
# https://www.davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/
* text=auto
#
# The above will handle all files NOT found below
#
# Documents
*.bibtex text diff=bibtex
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
*.md text diff=markdown
*.tex text diff=tex
*.adoc text
*.textile text
*.mustache text
*.csv text
*.tab text
*.tsv text
*.txt text
*.sql text
*.ps1 text eol=crlf
# Graphics
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.tif binary
*.tiff binary
*.ico binary
# SVG treated as an asset (binary) by default.
*.svg text
# If you want to treat it as binary,
# use the following line instead.
# *.svg binary
*.eps binary
# Scripts
*.bash text eol=lf
*.fish text eol=lf
*.sh text eol=lf
# These are explicitly windows files and should use crlf
*.bat text eol=crlf
*.cmd text eol=crlf
# web frontend stack -- force LF so SRI hashes are always correct
*.html text eol=lf
*.htm text eol=lf
*.css text eol=lf
*.min.css text eol=lf
*.js text eol=lf
*.min.js text eol=lf
*.php text eol=lf
# Visual Studio projects (Rider also)
*.cs diff=csharp
*.sln merge=union
*.csproj merge=union
*.vbproj merge=union
*.fsproj merge=union
*.dbproj merge=union
# Serialisation
*.json text
*.toml text
*.xml text
*.yaml text
*.yml text
# Archives
*.7z binary
*.gz binary
*.tar binary
*.tgz binary
*.zip binary
# Text files where line endings should be preserved
*.patch -text
#
# Exclude files from exporting
#
.gitattributes export-ignore
.gitignore export-ignore
.gitkeep export-ignore
.idea export-ignore
.vscode export-ignore

73
.gitignore vendored Normal file
View File

@ -0,0 +1,73 @@
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

View File

@ -0,0 +1,13 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/modules.xml
/projectSettingsUpdater.xml
/contentModel.xml
/.idea.ps-vpn-wol.iml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectDictionaryState">
<dictionary name="asif" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CommitMessageInspectionProfile">
<profile version="1.0">
<inspection_tool class="BodyLimit" enabled="true" level="ERROR" enabled_by_default="true" />
<inspection_tool class="SubjectBodySeparation" enabled="true" level="ERROR" enabled_by_default="true" />
<inspection_tool class="SubjectLimit" enabled="true" level="ERROR" enabled_by_default="true" />
</profile>
</component>
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

15
WOLDatabase.xml Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<WOLDatabase>
<Configuration>
<BroadcastAddress>127.0.0.1</BroadcastAddress>
<Port>7</Port>
<DnsSuffix>.internal.mydomain.net</DnsSuffix>
</Configuration>
<Computers>
<Computer name="reception01" friendlyName="Front-desk computer" mac="aa:00:00:00:00:01"/>
<Computer name="accounting01" friendlyName="accounting workstation 1" mac="bb:00:00:00:00:01"/>
<Computer name="accounting02" friendlyName="" mac="bb:00:00:00:00:02"/>
<Computer name="manager01" friendlyName="management workstation 1" mac="cc:00:00:00:00:01"/>
<Computer name="tech" friendlyName="I.T. technician workstation" mac="ff:ff:ff:ff:ff:01"/>
</Computers>
</WOLDatabase>

114
wakeup.ps1 Normal file
View File

@ -0,0 +1,114 @@
<#
#>
param
(
# Computer to wake up
[Alias("Computer")]
[String]
$targetComputer = "",
# Skip RDP connectivity readiness check
[Alias("Check", "Readiness")]
[Switch]
$ConnectivityCheck = $false,
# RDP connectivity readiness check timeout
[Int]
$Timeout = 300
)
function exitError($errMessage, $PSItem, $exitCode = 1)
{
if ( [String]::IsNullOrEmpty($errMessage))
{
Write-Host -ForegroundColor Red "`n`rABNORMAL EXIT: exitError function called without exit message!`n`r"
exit 99
}
Write-Host -ForegroundColor Red "`r`nERROR: ${errMessage}."
if ($PSItem)
{
Write-Host -ForegroundColor Red "`r`nAdditional information:`r`n$PSItem"
}
Write-Host
Exit $exitCode
}
$wolModuleName = "wol-magicPacket"
$wolDatabase = "WOLDatabase.xml"
# exit on error if Send-MagicPacket module is not loaded
if (!(Get-Module -Name $wolModuleName))
{
try
{
Import-Module -Name $wolModuleName -ErrorAction Stop
}
catch
{
$errMessage = "Unable to load '$wolModuleName'"
exitError $errMessage $PSItem
}
}
# exit if database cannot be found/read
if (!(Test-Path -Path $wolDatabase -PathType Leaf))
{
$errMessage = "Unable to find or read Wake-On-LAN database file ($wolDatabase)"
exitError $errMessage
}
# get target computer name if not already specified
if ( [String]::IsNullOrWhiteSpace($targetComputer))
{
do
{
$targetComputer = Read-Host -Prompt 'Computer to wake-up'
} while ( [String]::IsNullOrWhiteSpace($targetComputer))
}
Write-Host
# read database and assemble list of target computers
[xml]$db = Get-Content -Path $wolDatabase
$broadcastIP = $db.WOLDatabase.Configuration.BroadcastAddress
$port = $db.WOLDatabase.Configuration.Port
$dnsSuffix = $db.WOLDatabase.Configuration.DnsSuffix
$targetComputers = [System.Collections.Generic.List[PSObject]]::new()
$db.WOLDatabase.Computers.Computer | Where-Object { $_.name -match "$targetComputer" } | ForEach-Object { $targetComputers.Add($_) }
$removeFromTargetComputers = [System.Collections.Generic.List[String]]::new()
# send WOL magic packets
$targetComputers | ForEach-Object {
$wolError = @()
$name = $_.name
$friendlyName = $_.friendlyName
if ( [String]::IsNullOrWhiteSpace($friendlyName))
{
Write-Host "Processing request to wake-up '$name'... " -NoNewline
}
else
{
Write-Host "Processing request to wake-up '$friendlyName'... " -NoNewline
}
# send magic packet
$_.mac | Send-MagicPacket -BroadcastIP $broadcastIP -Port $port -ErrorAction SilentlyContinue -ErrorVariable +wolError
if ($wolError.Count -eq 0)
{
Write-Host -ForegroundColor Green "[OK]"
}
else
{
Write-Host -ForegroundColor Red "[ERROR]"
$removeFromTargetComputers.Add($name)
}
}
# remove computers from targetComputers if WOL packet was not successfully sent
$removeFromTargetComputers | ForEach-Object {
$removeName = $_
$targetComputers.Remove(($targetComputers | Where-Object { $_.name -eq $removeName })) | Out-Null
}
# process RDP readiness check
$targetComputers
Exit 0