1 #!powershell 2 3 # Copyright: (c) 2017, Dag Wieers (@dagwieers) <dag@wieers.com> 4 # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 5 6 #AnsibleRequires -CSharpUtil Ansible.Basic 7 8 $spec = @{ 9 options = @{ 10 mac = @{ type='str'; required=$true } 11 broadcast = @{ type='str'; default='255.255.255.255' } 12 port = @{ type='int'; default=7 } 13 } 14 supports_check_mode = $true 15 } 16 17 $module = [Ansible.Basic.AnsibleModule]::Create($args, $spec) 18 19 $module.Result.changed = $false 20 21 $mac = $module.Params.mac 22 $mac_orig = $module.Params.mac 23 $broadcast = $module.Params.broadcast 24 $port = $module.Params.port 25 26 $broadcast = [Net.IPAddress]::Parse($broadcast) 27 28 # Remove possible separator from MAC address 29 if ($mac.Length -eq (12 + 5)) { 30 $mac = $mac.Replace($mac.Substring(2, 1), "") 31 } 32 33 # If we don't end up with 12 hexadecimal characters, fail 34 if ($mac.Length -ne 12) { 35 $module.FailJson("Incorrect MAC address: $mac_orig") 36 } 37 38 # Create payload for magic packet 39 # TODO: Catch possible conversion errors 40 $target = 0,2,4,6,8,10 | ForEach-Object { [convert]::ToByte($mac.Substring($_, 2), 16) } 41 $data = (,[byte]255 * 6) + ($target * 20) 42 43 # Broadcast payload to network 44 $udpclient = new-Object System.Net.Sockets.UdpClient 45 if (-not $module.CheckMode) { 46 $udpclient.Connect($broadcast, $port) 47 [void] $udpclient.Send($data, 102) 48 } 49 50 $module.Result.changed = $true 51 52 $module.ExitJson() 53