settings.define("lns_server.modem_location", { description = "Modem location", type = "string", default = "right" }) modem_location = settings.get("lns_server.modem_location") settings.define("lns_server.rednet_hostname", { description = "Rednet hostname", type = "string", default = "test" }) settings.define("lns_server.require_auth", { description = "Require authentication", type = "boolean", default = false }) require_auth = settings.get("lns_server.require_auth") settings.define("lns_server.auth_server", { description = "Authentication server", type = "string", default = "auth.box" }) rednet.host("lns", settings.get("lns_server.rednet_hostname")) rednet.open(modem_location) local data = {} function log(str) io.write("[" .. os.time() .. "] " .. str .. "\n") end function save_data() db = fs.open("lns.db", "w") db.write(textutils.serialize(data)) db.close() end function load_data() if fs.exists("lns.db") then db = fs.open("lns.db", "r") db_contents = db.readAll() db.close() data = textutils.unserialize(db_contents) end end function split (inputstr, sep) if sep == nil then sep = "%s" end local t={} for str in string.gmatch(inputstr, "([^"..sep.."]+)") do table.insert(t, str) end return t end load_data() while true do client_id, msg = rednet.receive() request = msg if request.action == nil or request.hostname == nil then rednet.send(client_id, "invalid request") end if request.action == "lookup" then -- check if hostname in data if request.hostname == nil then rednet.send(client_id, nil) log("Sent nil to " .. client_id) else rednet.send(client_id, data[request.hostname]) log("Sent " .. request.hostname .. " to " .. client_id) end end if request.action == "reload" then load_data() rednet.send(client_id, "ok") log("Reloaded data") end if request.action == "register" then local auth_passed = false if require_auth then local authID = data[auth_server] if authID ~= nil then rednet.send(authID, { action = "token", token = request.token }) local auth_response = rednet.receive() local errorPos, errorEnd = string.find(auth_response, "invalid") if errorPos then log("Error: " .. auth_response) else auth_passed = true end else log("Error: Auth server not found to " .. client_id) end else auth_passed = true end if auth_passed then data[request.hostname] = client_id log("Registered " .. request.hostname .. " as " .. client_id) save_data() rednet.send(client_id, "ok") else rednet.send(client_id, "auth required") end end end