Advertisement
pandorrama

named

Apr 29th, 2023 (edited)
1,148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.25 KB | Gaming | 0 0
  1. # pastebin get 9bf3dHx4 named.lua
  2.  
  3. peripheral.find("modem", rednet.open)
  4. os.setComputerLabel("dns-server")
  5. filename = "dns.db"
  6. computers = {}
  7. rows = 1
  8.  
  9.  
  10. function readDBfromFileToRAM()
  11.     local file = fs.open(filename, "r")
  12.     if file then
  13.         local restored = file.readAll()
  14.         file.close()
  15.         return textutils.unserialise(restored)
  16.     end
  17.     return nil
  18. end
  19.  
  20. function writeToDB(id,name)
  21.     --save to array
  22.     computers[rows] = {}
  23.     computers[rows][1] = tostring(id)
  24.     computers[rows][2] = name
  25.     rows = rows + 1
  26.     --save to file
  27.     local file = fs.open(filename,"w")
  28.     file.write(textutils.serialize(computers))
  29.     file.close()
  30. end
  31.  
  32. function searchInDB(id,name)
  33.     for i=1,#computers do
  34.         if (computers[i][1] == id) or (computers[i][2] == name) then
  35.             print(("already have client %s in database"):format(computers[i][2]))
  36.             return
  37.         end
  38.     end
  39.     writeToDB(id, name)
  40.     print(("registered id: %d with name %s"):format(id, name))
  41. end
  42.  
  43. function querryDB(searchType,target)
  44.     for i=1,#computers do
  45.         if (searchType == "name") and (computers[i][2] == target) then
  46.             return computers[i][1]
  47.         end
  48.         if (searchType == "id") and (computers[i][1] == target) then
  49.             return computers[i][2]
  50.         end
  51.     end
  52.     return "not found"
  53. end
  54.  
  55. function listenForRegister()
  56.     while true do
  57.         local id,name = rednet.receive("dns-register")
  58.         searchInDB(id, name)
  59.     end
  60. end
  61.  
  62. function listenForQuerry()
  63.     while true do
  64.         id, request = rednet.receive("dns-querry")
  65.         print(("client: %d asking for type: %s target %s"):format(id, request[1], request[2]))
  66.         result = querryDB(request[1], request[2])
  67.         rednet.send(id, result, "dns-answer")
  68.     end
  69. end
  70.  
  71. --RUNTIME
  72. ---------------------------
  73. --read saved database to ram
  74. restoredDatabase = readDBfromFileToRAM()
  75. if restoredDatabase then
  76.     computers = restoredDatabase
  77.     rows = #computers + 1
  78. end
  79.  
  80. --write own name to db
  81. searchInDB(os.computerID(), os.computerLabel())
  82.  
  83. --parallel start two listen jobs
  84. parallel.waitForAny(listenForRegister, listenForQuerry)
  85.  
  86. --this should never be reached
  87. print("Somehow the DNS server stopped")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement