Advertisement
Guest User

netrouter.lua

a guest
Jan 22nd, 2020
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.26 KB | None | 0 0
  1. local component = require("component")
  2. local event = require("event")
  3. local szn = require("serialization")
  4.  
  5.  
  6. dnstablefile = io.open("dns.table", "r")
  7. dnstableraw = dnstablefile:read("*a")
  8. print("Serialized DNS table: " .. dnstableraw)
  9. dns = szn.unserialize(dnstableraw)
  10.  
  11. netport = 1000
  12. dnsport = 53
  13. component.modem.open(netport)
  14. component.modem.open(dnsport)
  15. if not component.modem.isOpen(netport) then
  16.   print("ERROR: could not open netport!")
  17.   os.exit()
  18. end
  19. if not component.modem.isOpen(dnsport) then
  20.   print("ERROR: could not open dnsport!")
  21.   os.exit()
  22. end
  23.  
  24.  
  25. function dnsResolve(resolveName, dnstable)
  26.   local resolveAddr = nil
  27.  
  28.   for i, row in pairs(dnstable) do
  29.     if row.hostname == resolveName then
  30.       resolveAddr = row.addr
  31.     end
  32.   end
  33.   return resolveAddr
  34. end
  35.  
  36. function dnsLookup(lookupAddr, dnstable)
  37.   local lookupName = nil
  38.  
  39.   for i, row in pairs(dnstable) do
  40.     if row.addr == lookupAddr then
  41.       lookupName = row.hostname
  42.     end
  43.   end
  44.   return lookupName
  45. end
  46.  
  47. function parsePacket(packet)
  48.   local pktDest = packet[1]
  49.   local pktMesg = packet[2]
  50.   return pktDest, pktMesg
  51. end
  52.  
  53. function parseDNS(packet)
  54.   -- pktType list:
  55.   --   LOOKUP  -- format: msg={type="LOOKUP", addr}
  56.   --   RESOLVE -- format: msg={type="RESOLVE", hostname}
  57.   return packet[1], packet[2]
  58. end
  59.  
  60.  
  61. while true do
  62.   print()
  63.   print("pulling!")
  64.   local _, _, devFrom, pPort,_, msg = event.pull("modem")
  65.  
  66.   -- dns packet format: {"LOOKUP" | "RESOLVE", addr/hostname}
  67.   -- dns response packet: (RE stands for response) {"LOOKUP_RE" | "RESOLVE_RE", returned addr/hostname}
  68.   if pPort == dnsport then
  69.     print("RECEIVED PACKET ON DNSPORT:")
  70.     local pDNStype, pDNScontent = parseDNS(szn.unserialize(msg))
  71.     print("From: " .. devFrom)
  72.     print("Type: " .. pDNStype)
  73.     print("Content: " .. pDNScontent)
  74.    
  75.     if pDNStype == "LOOKUP" then
  76.       print("Running DNS lookup...")
  77.       local pDNSname = dnsLookup(pDNScontent, dns)
  78.       print("Found hostname: " .. pDNSname)
  79.       local lookupRePkt = {"LOOKUP_RE", pDNSname}
  80.       print("Sending LOOKUP_RE packet to " .. devFrom)
  81.       component.modem.send(devFrom, dnsport, szn.serialize(lookupRePkt))
  82.      
  83.    
  84.     elseif pDNStype == "RESOLVE" then
  85.       print("Running DNS resolve...")
  86.       local pDNSaddr = dnsResolve(pDNScontent, dns)
  87.       print("Found address: " .. pDNSaddr)
  88.       local resolveRePkt = {"RESOLVE_RE", pDNSaddr}
  89.       print("Sending RESOLVE_RE packet to " .. devFrom)
  90.       component.modem.send(devFrom, dnsport, szn.serialize(resolveRePkt))
  91.    
  92.     else
  93.       print("Invalid DNS command")
  94.     end
  95.  
  96.   elseif pPort == netport then
  97.     -- parse received packet
  98.     -- packet format: {"destination_hostname", "data"}
  99.     -- packet response: "SUCCESS" | "FAILURE"
  100.     local pDest, pMsg = parsePacket(szn.unserialize(msg))
  101.     local pDestAddr = dnsResolve(pDest, dns)
  102.     print("RECEIVED PACKET ON NETPORT:")
  103.     print("From: " .. devFrom .. " (" .. dnsLookup(devFrom, dns) .. ")")
  104.     print("Destination: " .. pDest .. " (" .. pDestAddr .. ")")
  105.     print("Message: " .. pMsg)
  106.     print("Forwarding message to " .. pDestAddr .. "...")
  107.     component.modem.send(pDestAddr, netport, pMsg)
  108.     component.modem.send(devFrom, netport, "SUCCESS")
  109.   else
  110.     print("Port was neither netport nor dnsport! This shouldn't happen, is a port open that shouldn't be?")
  111.   end
  112. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement