Logic Machine Forum
Wake on LAN - Printable Version

+- Logic Machine Forum (https://forum.logicmachine.net)
+-- Forum: LogicMachine eco-system (https://forum.logicmachine.net/forumdisplay.php?fid=1)
+--- Forum: Scripting (https://forum.logicmachine.net/forumdisplay.php?fid=8)
+--- Thread: Wake on LAN (/showthread.php?tid=33)



Wake on LAN - George - 12.07.2015

Please improve where possible.


Function : Wakes up a PC from the Logic Machine
Goal : Save power by starting PC's only when needed

Requirements :
1. PC must support Wake on LAN.  You can verify this in the Bios or by sending a WoL-Packet (Magic Packet) from a Windows or Linux tool.
2. WoL must be enabled

Actions :
1. Send Magic Packet
2. Wait a number of seconds
3. Check if portnumber on PC is available
4. If not, log error condition

To do :
1. return actionable error code

Installation :

1. Add the the code underneath to the function library
2. Create a script with the following line :
Wol('aa:bb...:ff', '10.1.x.y', '60', '80')

Aa:bb...:ff  MAC-address
10.1.x.y IP address (to verify the fail/success state)
'60' number of seconds before checking if the required port number is running
'80' port number to verify

Code

Code:
function wol(mac, ip, timeout, port)

  -- helper function definitions
  function wol_send(mac_dest)

     local broadcast_ip = "255.255.255.255"
     local port = 9
     local udp = assert(socket.udp())
     udp:setoption('broadcast', true)

     local mac_array = string.split(mac_dest, ":")
     local mac = ""
     for i,v in ipairs(mac_array) do mac = mac..string.char(tonumber(v, 16));  end
     local mac1 = ""
     for i = 1,16 do
        mac1 = mac1..mac
     end
     local mac2 = string.rep(string.char(0xff),6)..string.rep(mac, 16)
     assert(udp:sendto(mac2, broadcast_ip, port))
  end

  -- tries to open TCP connecton to specified IP:port
  function tcp_knock(ip, port)
     local tcp = assert(socket.tcp())
     tcp:settimeout(10)
     local success = tcp:connect(ip, port)
     Log("tcp knock to " .. ip .. " is " .. (success and "success" or "fail"))
     return success
  end

  assert(type(mac) == 'string', "mac address (string) should be specified");
  assert(type(ip)  == 'string', "ip address (string) should be specified");

  wol_send(mac)
  timeout = tonumber(timeout) or 0
  if (timeout > 0) then
     print("Sleeping " .. timeout .. " seconds")
     os.sleep(timeout)
     local knock_success = tcp_knock(ip, port)
     if ( not knock_success ) then
        local subject = "
        local alertmessage = "Wake Up fail: " .. ip .. "/" .. mac
     end
  end
end