local component = require("component") local serial = require("serialization") local event = require("event") local modem = component.modem local fs = require("filesystem") database = {} local isRunning = false --- message should be: either {data="ip", msg="REQUEST""} or {"DECLARE : "} --- response will be : request_pass: {data="",msg="DOMAINNAME FOUND"} --request_fail: {data="", msg="DOMAINNAME NON EXIST"} --declare_pass: {data="true",msg="addr DECLARED "} --declare_fail: {data="false", msg="UNABLE TO DECLARE ip"} --generic_fail: {data="", msg="MALFORMED REQUEST"} local function log(text) local f = io.open("/tmp/dns.log", "w") f:write(text .. "\n") f:close() end local function add_to_db(domain, addr) database[domain] = addr local f = io.open('/etc/dns/dns.db', 'w') f:write(serial.serialize(database)) f:close() end local function get_dns(domainname) addr = database[domainname] if addr ~= nil then return addr end return nil,"DOMAINNAME NOT EXIST" end local function add_dns(addr, domainname) local _, err = get_dns(domainname) if err == "DOMAINNAME NOT EXIST" then add_to_db(domainname, addr) return addr, domainname else log("unable to declare " .. domainname .. " " .. addr) return nil,nil, "UNABLE TO DECLARE" end end local function handle_dns_request(_, _, from, port, dist, message) request = serial.unserialize(message) if request.msg == "DECLARE" then log(from .. " declares " .. request.data) local addr, dns, err = add_dns(from, request.data) if err then log(from .. " decleration fail") modem.send(from, port, serial.serialize({data="", msg="UNABLE TO DECLARE"})) else log(from .. " decleration success") modem.send(from, port, serial.serialize({data=from, msg=from .. " DECLARED " .. dns})) end elseif request.msg == "RESOLVE" then log(from .. " ask for resolve for " .. request.data) local addr,err = get_dns(request.data) if err ~= nil then log(from .. " resolve fail") modem.send(from, port, serial.serialize({data="",msg="DOMAINNAME NOT EXIST"})) else log(from .. " resolve pass") modem.send(from, port, serial.serialize({data=addr, msg="DOMAINNAME FOUND"})) end elseif request.msg == "EXIT" then event.ignore("modem_message", handle_dns_request) else modem.send(from, port, serial.serialize({data="",msg="MALFORMED REQUEST"})) end end function start() print("Starting DNS Service...") print("Checking config files...") if not fs.exists("/etc/dns/") then print("creating /etc/dns/") fs.makeDirectory("/etc/dns/") end print("> /etc/dns/dns.db") if not fs.exists("/etc/dns/dns.db") then print("creating dns.db") io.open("/etc/dns/dns.db", "w"):write("{}") end print("Loading existing DNS entries") f = io.open('/etc/dns/dns.db', 'r') database = serial.unserialize(f:read("*a")) f:close() if database ~= nil then for k,v in pairs(database) do print(k .. " : ".. v) end else database = {} end if not isRunning then modem.open(90) event.listen("modem_message", handle_dns_request) isRunning = true -- while true do -- local _,_,from,port,dist,mesg = event.pull("modem_message") -- handle_dns_request(_,_,from,port,dist,mesg) -- os.sleep(0.5) -- end end end function stop() print("Stopping DNS Serice...") event.ignore("modem_message", handle_dns_request) modem.close(90) end function status() if isRunning then status = "running" else status = "offline" end print("DNS Service status: " .. status) end