Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local component = require("component")
- local event = require("event")
- local m = component.modem
- local ttf = require("ttf")
- local fs = require("filesystem")
- lookup = {}
- dns = {}
- mac_me = ""
- for k,v in component.list("modem") do
- mac_me = k
- 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
- function getIPPart(a, t)
- local ip = split(a, ".")
- local len = 0
- for k,v in pairs(ip) do
- len = len + 1
- end
- if (t == "last") then
- return ip[len]
- else
- return ip[len - (tonumber(t) - 1)]
- end
- end
- function getNodeCount(a)
- local ip = split(a, ".")
- local len = 0
- for k,v in pairs(ip) do
- len = len + 1
- end
- return len
- end
- function getUnitParentIP(a)
- local ip = split(a, ".")
- local ret = ""
- for k,v in pairs(ip) do
- if (v == getIPPart(a, "last")) then
- break
- end
- if (v == getIPPart(a, "2")) then
- ret = ret .. v
- else
- ret = ret .. v .. "."
- end
- end
- return ret
- end
- function stop()
- event.ignore("touch", stop)
- event.ignore("modem_message", listen)
- print("(:) Stopping...")
- end
- function start()
- m.open(1110)
- print("(:) Start...")
- if (fs.exists("/home/QuarksRouter/lookup.table")) then
- lookup = ttf.load("/home/QuarksRouter/lookup.table")
- print("(:) Lookups loaded")
- else
- print("(X) No lookups!")
- end
- if (fs.exists("/home/QuarksRouter/dns.table")) then
- dns = ttf.load("/home/QuarksRouter/dns.table")
- print("(:) DNS Lookups loaded!")
- else
- print("(X) No DNS lookups!")
- end
- print("(:) Booted up!")
- print("(:) MAC: " .. mac_me)
- event.listen("touch", stop)
- event.listen("modem_message", listen)
- end
- function listen(_, _, from, _, _, msg)
- packet = split(msg, ";")
- print("(:) Received packet! Resolving packet type... [" .. msg .."]")
- if (packet[3] == "DATA") then
- print("(:) TYPE: DATA")
- handleData(from, packet, msg)
- elseif (packet[3] == "DNSLOOKUP") then
- print("(:) TYPE: DNSLOOKUP")
- handleLookup(from, packet)
- elseif (packet[3] == "DNSANSWER") then
- print("(:) TYPE: DNSANSWER")
- handleAnswer(from, packet)
- elseif (packet[3] == "DNSREG") then
- print("(:) TYPE: DNSREG")
- handleReg(from, packet)
- elseif (packet[3] == "FINDPARENT") then
- print("(:) TYPE: FINDPARENT")
- handleFind(from, packet)
- else
- print("(X) Unknown packet type (" .. packet[3] .. ")")
- end
- end
- function handleData(from, p, mm)
- print("(:) Rerouting packet to client in my subnet... (" ..
- lookup[tonumber(split(p[2], ".")[1]) ].. ")[".. mm .."]")
- m.send(lookup[tonumber(split(p[2], ".")[1])], 1110, mm)
- end
- function handleLookup(from, p, mm)
- if (dns[p[4]] == nil) then
- m.send(from,1110,"0;".. p[1] ..";DNSANSWER;QDNS:DOMAINNOTFOUND")
- else
- ip = dns[p[4]]
- m.send(from,1110,"0;".. p[1] ..";DNSANSWER;QNDS:".. ip)
- print("(:) " .. p[4] .. " is " .. ip)
- end
- end
- function handleAnswer(from, p, mm)
- print("(!) Skipping DNSANSWER packet. Does your network have cycles or it wasn't set up correctly?")
- end
- function handleReg(from, p, mm)
- if (dns[p[4]] == nil) then
- dns[p[4]] = p[1]
- m.send(from,1110,"0;".. p[1] ..";DNSANSWER;QDNS:SUCCESSREG")
- else
- print("(X) Domain ".. p[4] .." already registered ")
- m.send(from,1110,"0;".. p[1] ..";DNSANSWER;QDNS:ALREADYREGISTERED")
- end
- end
- function handleFind(from, p)
- if (p[4] == "find") then
- m.send(from, 1110, "FINDROUTER:ME")
- elseif (p[4] == mac_me) then
- print("(:) Registering new client... (" .. from .. ")")
- local id = 1
- for k,v in pairs(lookup) do
- id = id + 1
- end
- local userip = tostring(id)
- lookup[id] = from
- print("(:) Allocated IP " .. userip .. " for MAC " .. from)
- m.send(from, 1110, userip)
- end
- print("(:) Handled FINDPARENT:[" .. p .. "]")
- end
- -- MAIN
- start()
- event.pull("touch")
- print("(:) Saving lookups...")
- ttf.save(lookup, "/home/QuarksRouter/lookup.table")
- ttf.save(dns, "/home/QuarksRouter/dns.table")
- print("(:) Stopped!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement