Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Root DNS server.
- By Mitchfizz05. Licensed under the GNU General Pubic License v3.
- ]]
- term.clear()
- term.setCursorPos(1,1)
- print("Root DNS server starting...")
- -- Scan for modem.
- print("Scanning for modem...")
- local modemSide = nil
- for n,side in ipairs(rs.getSides()) do
- if peripheral.getType(side) == "modem" then
- -- Modem detected!
- modemSide = side
- break
- end
- end
- if modemSide == nil then
- -- No modem detected. Exit program.
- print("No modem detected.")
- return
- end
- -- Open modem.
- rednet.open(modemSide)
- print("Opened modem on the " .. modemSide .. " side.")
- -- Scan for other root DNS servers.
- print("Scanning for other DNS servers...")
- rednet.broadcast("dns.search")
- local timer = os.startTimer(1)
- while true do
- local e,id,msg,proto = os.pullEvent()
- if e == "rednet_message" then
- if msg == "dns.pong" then
- -- Another DNS server found!
- print("Other DNS servers found on the network!")
- print("Only 1 DNS server can be on a network at once.")
- return
- end
- elseif e == "timer" and id == timer then
- break
- end
- end
- print("No other DNS servers found.")
- -- Stores all current domain names.
- domains = {}
- -- Load domains from file.
- print("Reading DNS file...")
- local file = fs.open("data/zones", "r")
- if not file then
- -- Fatal error! Zonefile cannot be read!
- print("Fatal error! Zonefile cannot be read!")
- return
- end
- -- Iterate through lines.
- local line = ""
- while true do
- -- Read line.
- line = file:readLine()
- -- Check that the line was read.
- if not line then
- break
- end
- -- Split the domain record.
- local domain = string.sub(line, 0, string.find(line, ":") - 1)
- local target = string.sub(line, string.find(line, ":") + 1)
- -- Register the domain into the domains array.
- domains[domain] = target
- end
- -- Close the zonefile.
- file:close()
- -- Server started.
- print("Root DNS server started!")
- -- Begin rednet loop.
- while true do
- local id,msg = rednet.receive()
- if msg == "ping" then
- -- Ping request.
- rednet.send(id, "pong")
- elseif msg == "dns.search" then
- -- DNS server scan.
- rednet.send(id, "dns.pong")
- elseif string.sub(msg, 0, #"dns.lookup:") == "dns.lookup:" then
- -- DNS lookup.
- local domain = string.sub(msg, #"dns.lookup:" + 1)
- print("Request to lookup domain: " .. domain)
- -- Check that the domain name exists.
- if (domains[domain]) then
- rednet.send(id, "dns.probe:" .. domains[domain])
- else
- -- Domain doesn't exist!
- rednet.send(id, "dns.probe.failed")
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement