Advertisement
Guest User

dns.lua

a guest
Mar 29th, 2015
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.48 KB | None | 0 0
  1. local component = require("component")
  2. local computer = require("computer")
  3. local event = require("event")
  4. local serialization = require("serialization")
  5. local m = component.modem
  6. local isRunning = false
  7. local name = ""
  8. local isServer = false
  9. local dnsList = {}
  10.  
  11. function start()
  12.   if(isRunning) then
  13.     print("Already running")
  14.     return
  15.   end
  16.   if m == nil then
  17.     print("No modem")
  18.     return
  19.   end
  20.   if not m.isOpen(1) then
  21.     m.open(1)
  22.   end
  23.   dnsList = {}
  24.   event.listen("modem_message", onMessage)
  25.   local c = loadConfig()
  26.   local conf = c or {}
  27.   isServer = conf.isServer or false
  28.   name = conf.name or ""
  29.   saveConfig(setDefault(setDefault(conf, "isServer", isServer),"name", name))
  30.   if isServer then
  31.     m.broadcast(1, "dns")
  32.   else
  33.     m.broadcast(1, "dns", 1, name)
  34.   end
  35.   isRunning = true
  36. end
  37.  
  38. function stop()
  39.   if not isRunning then
  40.     print("Not running")
  41.     return
  42.   end
  43.   if m == nil then
  44.      print("No modem")
  45.     return
  46.   end
  47.   if m.isOpen(1) then
  48.     m.close()
  49.   end
  50.   event.ignore("modem_message", onMessage)
  51.   isRunning = false
  52. end
  53.  
  54. function send(address, port, ...)
  55.   if isServer then
  56.     onMessage(nil, m.address, m.address, 1, 0, address, port, ...)
  57.     return
  58.   end
  59.   m.broadcast(1, address, port, ...)
  60. end
  61.  
  62. function onMessage(_, localAddress, from, port, distance, to, toPort, ...)
  63.   if not isRunning then
  64.     return
  65.   end
  66.   if port ~= 1 then
  67.     return
  68.   end
  69.   if isServer then
  70.     if to == "dns" and toPort == 1 then
  71.       addClient(from, ...)
  72.       return
  73.     end
  74.     if to == name then
  75.       computer.pushSignal("modem_message", localAddress, from, toPort, distance, ...)
  76.       return
  77.     end
  78.     local na  = dnsList[to]
  79.     if na == nil then return end
  80.     m.send(na, toPort, ...)
  81.     return
  82.   else
  83.     if to == "dns" and toPort == nil then
  84.       m.broadcast(1, "dns", 1, name)
  85.     end
  86.   end
  87. end
  88.  
  89. function addClient(client, na)
  90.   dnsList[na] = client
  91. end
  92.  
  93. function loadConfig()
  94.   local env = {}
  95.   local result, reason = loadfile('/etc/dns.cfg', 't', env)
  96.   if result then
  97.     result, reason = xpcall(result, debug.traceback)
  98.     if result then
  99.       return env
  100.     end
  101.   end
  102.   return nil, reason
  103. end
  104.  
  105. function saveConfig(conf)
  106.   local file, reason = io.open('/etc/dns.cfg', 'w')
  107.   if not file then
  108.     return nil, reason
  109.   end
  110.   for key, value in pairs(conf) do
  111.     file:write(tostring(key) .. " = " .. serialization.serialize(value) .. "\n")
  112.   end
  113.   file:close()
  114.   return true
  115. end
  116.  
  117. function setDefault(conf, name, data)
  118.   conf[name] = data
  119.   return conf
  120. end
  121.  
  122. function getName(n)
  123.   n.name = name
  124. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement