OC-Minitel/realtime/OpenOS/etc/rc.d/realtime-sync.lua

71 lines
1.5 KiB
Lua

local serial = require "serialization"
local component = require "component"
local computer = require "computer"
local realtime = require "realtime"
local event = require "event"
local timer = nil
local cfg = {}
cfg.url = "https://google.com"
cfg.frequency = 300
cfg.offset = 0
local function saveConfig()
local f = io.open("/etc/realtime-sync.cfg","wb")
if not f then
return false
end
f:write(serial.serialize(cfg))
f:close()
end
local function loadConfig()
local f = io.open("/etc/realtime-sync.cfg","rb")
if not f then
saveConfig()
return false
end
for k,v in pairs(serial.unserialize(f:read("*a"))) do
cfg[k] = v
end
f:close()
end
local function convertToEpoch(s)
p="%a+, (%d+) (%a+) (%d+) (%d+):(%d+):(%d+) GMT"
day,month,year,hour,min,sec=s:match(p)
months={Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12}
month=months[month]
return os.time({day=day,month=month,year=year,hour=hour,min=min,sec=sec})
end
local function updateTime()
local ut,rq = computer.uptime(), component.internet.request(cfg.url)
while true do
if rq.finishConnect() then
break
end
end
local _, _, headers = rq.response()
local date = headers.Date
if type(date) == "table" then
date=date[1]
end
realtime.update(convertToEpoch(date), ut, cfg.offset*60*60)
rq.close()
end
function sync()
updateTime()
print(os.date("%Y-%m-%d %H:%M",realtime.time()))
end
function start()
loadConfig()
if not timer then
timer = event.timer(cfg.frequency, updateTime, math.huge)
end
sync()
end
function stop()
event.cancel(timer)
timer = nil
end