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
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