SuPeRMiNoR3

DNS

Dec 8th, 2014
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.88 KB | None | 0 0
  1. local m = {}
  2. m.dns_table = {}
  3. m.rdns = {}
  4. fs = require("filesystem")
  5. serial = require("serialization")
  6. component = require("component")
  7. event = require("event")
  8. modem = component.modem
  9.  
  10. function decode(data)
  11. status, result = pcall(serial.unserialize, data)
  12. return status, result
  13. end
  14.  
  15. function encode(data)
  16. return serial.serialize(data)
  17. end
  18.  
  19. function write_file(path, data)
  20. f = fs.open(path, "w")
  21. f:write(data)
  22. f:close()
  23. end
  24.  
  25. function read_file(path)
  26. f = io.open(path)
  27. t = f:read("*all")
  28. f:close()
  29. return t
  30. end
  31.  
  32. function _lookup(name)
  33. return m.dns_table[name]
  34. end
  35.  
  36. function _reverse(name)
  37. return m.rdns[name]
  38. end
  39.  
  40. function reverse(name)
  41. result, addr = pcall(_lookup, name)
  42. if result then return addr else return false end
  43. end
  44.  
  45. function lookup(name)
  46. result, addr = pcall(_lookup, name)
  47. if result then return addr else return false end
  48. end
  49.  
  50. function register(name, addr)
  51. m.dns_table[name] = addr
  52. m.rdns[addr] = name
  53. f = io.open("/dns-table", "w")
  54. f:write(encode(m.dns_table))
  55. f:close()
  56. end
  57.  
  58. function send(addr, data)
  59. modem.send(addr, 43, encode(data))
  60. end
  61.  
  62. function csend(addr, data)
  63. modem.send(addr, 42, encode(data))
  64. end
  65.  
  66. function cbroadcast(data)
  67. modem.broadcast(42, encode(data))
  68. end
  69.  
  70. m.dns_addr = false
  71.  
  72. function m.lookup(name)
  73.   found = false
  74.   found_name = nil
  75.   modem.open(43)
  76.   cbroadcast({action="lookup", name=name, tunnel=true, broadcast=true})
  77.   e, _, address, port, distance, message = event.pull(5, "modem_message")
  78.   modem.close(43)
  79.   result, message = decode(message)
  80.   if result then
  81.     if message.action == "lookup" then
  82.      found = true
  83.      found_name = message.response
  84.     end
  85.   end
  86.   if found then
  87.     return found_name
  88.   else
  89.     return false
  90.   end
  91. end
  92.  
  93. function m.register(name)
  94.   cbroadcast({action="register", name=name, tunnel=true, broadcast=true})
  95.   --add ack
  96. end
  97.  
  98. function m.server()
  99.   print("Starting Super DNS Server")
  100.   if fs.exists("dsad/dns-table") then
  101.     result, tmp = decode(read_file("/dns-table"))
  102.     if result and tmp ~= false then
  103.       print("Loaded dns table from file")
  104.       print(tmp)
  105.       m.dns_table = tmp
  106.     end
  107.   end
  108.  
  109.   modem.open(42)
  110.  
  111.   while true do
  112.     e, _, address, port, distance, message = event.pull("modem_message")
  113.     result, message = decode(message)
  114.     if result then
  115.       if message.action == "register" then
  116.         print("Registering "..message.name.." to "..address)
  117.         register(message.name, address)
  118.       end
  119.  
  120.       if message.action == "lookup" then
  121.         n = lookup(message.name)
  122.         print(address.. " Looked up "..message.name)
  123.         send(address, {action="lookup", response=n})
  124.       end
  125.  
  126.       if message.action == "reverse" then
  127.         n = lookup(message.name)
  128.         print(address.. " Reverse looked up "..message.name)
  129.         send(address, {action="reverse", response=n})
  130.       end
  131.  
  132.     end
  133.  
  134.   end
  135. end
  136.  
  137. return m
Advertisement
Add Comment
Please, Sign In to add comment