Wordclock/webserver.lua

176 lines
6.1 KiB
Lua

--TODO:
configFile="config.lua"
function startWebServer()
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on("receive", function(conn,payload)
if (payload:find("GET /") ~= nil) then
--here is code for handling http request from a web-browser
if (sendWebPage == nil) then
print("Loading webpage ...")
-- Load the webcontent
mydofile("webpage")
end
ssid, password, bssid_set, bssid = wifi.sta.getconfig()
endOfPage=false
sendWebPage(conn,1)
conn:on("sent", function(conn)
if (endOfPage==true) then
conn:close()
-- Clear the webpage generation
sendWebPage=nil
print("Clean webpage from RAM")
collectgarbage()
else
sendWebPage(conn,10)
end
end)
else if (payload:find("POST /") ~=nil) then
--code for handling the POST-request (updating settings)
_, postdatastart = payload:find("\r\n\r\n")
--Next lines catches POST-requests without POST-data....
if postdatastart==nil then postdatastart = 1 end
local postRequestData=string.sub(payload,postdatastart+1)
local _POST = {}
for i, j in string.gmatch(postRequestData, "(%w+)=([^&]+)&*") do
_POST[i] = j
end
postRequestData=nil
--- Do the magic!
if (_POST.action ~= nil and _POST.action == "Reboot") then
node.restart()
end
print("Inform user via Web")
if (sendWebPage == nil) then
print("Loading webpage ...")
-- Load the webcontent
mydofile("webpage")
end
conn:on("sent", function(conn)
conn:close()
-- Clear the webpage generation
sendWebPage=nil
print("Clean webpage from RAM")
end)
if ((_POST.ssid~=nil) and (_POST.sntpserver~=nil) and (_POST.timezoneoffset~=nil)) then
print("New config!")
if (_POST.password==nil) then
_, password, _, _ = wifi.sta.getconfig()
print("Restoring password : " .. password)
_POST.password = password
password = nil
end
-- Safe configuration:
file.remove(configFile .. ".new")
sec, _ = rtctime.get()
file.open(configFile.. ".new", "w+")
file.write("-- Config\n" .. "wifi.sta.config(\"" .. _POST.ssid .. "\",\"" .. _POST.password .. "\")\n" .. "sntpserverhostname=\"" .. _POST.sntpserver .. "\"\n" .. "timezoneoffset=\"" .. _POST.timezoneoffset .. "\"\n")
if ( _POST.fcolor ~= nil) then
-- color=string.char(_POST.green, _POST.red, _POST.blue)
print ("Got fcolor: " .. _POST.fcolor)
local hexColor=string.sub(_POST.fcolor, 4)
local red = tonumber(string.sub(hexColor, 1, 2), 16)
local green = tonumber(string.sub(hexColor, 3, 4), 16)
local blue = tonumber(string.sub(hexColor, 5, 6), 16)
color=string.char(green, red, blue)
end
if ( _POST.colorMin1 ~= nil) then
local hexColor=string.sub(_POST.colorMin1, 4)
local red = tonumber(string.sub(hexColor, 1, 2), 16)
local green = tonumber(string.sub(hexColor, 3, 4), 16)
local blue = tonumber(string.sub(hexColor, 5, 6), 16)
file.write("color1=string.char(" .. green .. "," .. red .. "," .. blue .. ")\n")
end
if ( _POST.colorMin2 ~= nil) then
local hexColor=string.sub(_POST.colorMin2, 4)
local red = tonumber(string.sub(hexColor, 1, 2), 16)
local green = tonumber(string.sub(hexColor, 3, 4), 16)
local blue = tonumber(string.sub(hexColor, 5, 6), 16)
file.write("color2=string.char(" .. green .. "," .. red .. "," .. blue .. ")\n")
end
if ( _POST.colorMin3 ~= nil) then
local hexColor=string.sub(_POST.colorMin3, 4)
local red = tonumber(string.sub(hexColor, 1, 2), 16)
local green = tonumber(string.sub(hexColor, 3, 4), 16)
local blue = tonumber(string.sub(hexColor, 5, 6), 16)
file.write("color3=string.char(" .. green .. "," .. red .. "," .. blue .. ")\n")
end
if ( _POST.colorMin4 ~= nil) then
local hexColor=string.sub(_POST.colorMin4, 4)
local red = tonumber(string.sub(hexColor, 1, 2), 16)
local green = tonumber(string.sub(hexColor, 3, 4), 16)
local blue = tonumber(string.sub(hexColor, 5, 6), 16)
file.write("color4=string.char(" .. green .. "," .. red .. "," .. blue .. ")\n")
end
if ( _POST.colorMode ~= nil) then
file.write("colorMode=true\n")
else
file.write("colorMode=nil\n") -- unset colorMode
end
time = getTime(sec, timezoneoffset)
file.write("color=string.char(" .. string.byte(color,1) .. "," .. string.byte(color, 2) .. "," .. string.byte(color, 3) .. ")\n")
file.write("print(\"Config from " .. time.year .. "-" .. time.month .. "-" .. time.day .. " " .. time.hour .. ":" .. time.minute .. ":" .. time.second .. "\")\n")
if (_POST.threequater ~= nil) then
file.write("threequater=true\n")
else
file.write("threequater=nil\n") -- unset threequater
end
file.close()
sec=nil
file.remove(configFile)
print("Rename config")
if (file.rename(configFile .. ".new", configFile)) then
print("Successfully")
dofile(configFile) -- load the new values
sendWebPage(conn,2) -- success
else
print("Error")
sendWebPage(conn,3) -- error
end
else
ssid, password, bssid_set, bssid = wifi.sta.getconfig()
sendWebPage(conn,4) -- not all parameter set
end
else
print("Hello via telnet")
--here is code, if the connection is not from a webbrowser, i.e. telnet or nc
global_c=conn
function s_output(str)
if(global_c~=nil)
then global_c:send(str)
end
end
node.output(s_output, 0)
global_c:on("receive",function(c,l)
node.input(l)
end)
global_c:on("disconnection",function(c)
node.output(nil)
global_c=nil
end)
print("Welcome to Word Clock")
end
end
end)
conn:on("disconnection", function(c)
node.output(nil) -- un-register the redirect output function, output goes to serial
end)
end)
end