Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local component = require("component")
- local event = require("event")
- local szn = require("serialization")
- dnstablefile = io.open("dns.table", "r")
- dnstableraw = dnstablefile:read("*a")
- print("Serialized DNS table: " .. dnstableraw)
- dns = szn.unserialize(dnstableraw)
- netport = 1000
- dnsport = 53
- component.modem.open(netport)
- component.modem.open(dnsport)
- if not component.modem.isOpen(netport) then
- print("ERROR: could not open netport!")
- os.exit()
- end
- if not component.modem.isOpen(dnsport) then
- print("ERROR: could not open dnsport!")
- os.exit()
- end
- function dnsResolve(resolveName, dnstable)
- local resolveAddr = nil
- for i, row in pairs(dnstable) do
- if row.hostname == resolveName then
- resolveAddr = row.addr
- end
- end
- return resolveAddr
- end
- function dnsLookup(lookupAddr, dnstable)
- local lookupName = nil
- for i, row in pairs(dnstable) do
- if row.addr == lookupAddr then
- lookupName = row.hostname
- end
- end
- return lookupName
- end
- function parsePacket(packet)
- local pktDest = packet[1]
- local pktMesg = packet[2]
- return pktDest, pktMesg
- end
- function parseDNS(packet)
- -- pktType list:
- -- LOOKUP -- format: msg={type="LOOKUP", addr}
- -- RESOLVE -- format: msg={type="RESOLVE", hostname}
- return packet[1], packet[2]
- end
- while true do
- print()
- print("pulling!")
- local _, _, devFrom, pPort,_, msg = event.pull("modem")
- -- dns packet format: {"LOOKUP" | "RESOLVE", addr/hostname}
- -- dns response packet: (RE stands for response) {"LOOKUP_RE" | "RESOLVE_RE", returned addr/hostname}
- if pPort == dnsport then
- print("RECEIVED PACKET ON DNSPORT:")
- local pDNStype, pDNScontent = parseDNS(szn.unserialize(msg))
- print("From: " .. devFrom)
- print("Type: " .. pDNStype)
- print("Content: " .. pDNScontent)
- if pDNStype == "LOOKUP" then
- print("Running DNS lookup...")
- local pDNSname = dnsLookup(pDNScontent, dns)
- print("Found hostname: " .. pDNSname)
- local lookupRePkt = {"LOOKUP_RE", pDNSname}
- print("Sending LOOKUP_RE packet to " .. devFrom)
- component.modem.send(devFrom, dnsport, szn.serialize(lookupRePkt))
- elseif pDNStype == "RESOLVE" then
- print("Running DNS resolve...")
- local pDNSaddr = dnsResolve(pDNScontent, dns)
- print("Found address: " .. pDNSaddr)
- local resolveRePkt = {"RESOLVE_RE", pDNSaddr}
- print("Sending RESOLVE_RE packet to " .. devFrom)
- component.modem.send(devFrom, dnsport, szn.serialize(resolveRePkt))
- else
- print("Invalid DNS command")
- end
- elseif pPort == netport then
- -- parse received packet
- -- packet format: {"destination_hostname", "data"}
- -- packet response: "SUCCESS" | "FAILURE"
- local pDest, pMsg = parsePacket(szn.unserialize(msg))
- local pDestAddr = dnsResolve(pDest, dns)
- print("RECEIVED PACKET ON NETPORT:")
- print("From: " .. devFrom .. " (" .. dnsLookup(devFrom, dns) .. ")")
- print("Destination: " .. pDest .. " (" .. pDestAddr .. ")")
- print("Message: " .. pMsg)
- print("Forwarding message to " .. pDestAddr .. "...")
- component.modem.send(pDestAddr, netport, pMsg)
- component.modem.send(devFrom, netport, "SUCCESS")
- else
- print("Port was neither netport nor dnsport! This shouldn't happen, is a port open that shouldn't be?")
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement