Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Wireless-Modem-API (DNS SERVER)
- This server picks requests up and registering associates
- their wished address with their modem address (rejects if address
- is taken.) (NOTE: They aren't deleted until restart)
- Performance probably not great.
- It also constantly sends a broadcast to let clients know of it's
- modem-address. (I may change that in the future, so stay tuned! :) )
- INFORMATION:
- You need a computer and screen with color support AND you need my
- multitasking API, which should be located at /lib/oc_multitasking_api.lua
- By Piorjade
- ]]
- conf = {
- _PORT = 8080, ----Clients must have the same
- }
- component = require("component")
- computer = require("computer")
- ser = require("serialization")
- multitask = require("oc_multitasking_api")
- os = require("os")
- term = require("term")
- event = require("event")
- net = {}
- card = nil
- c = 0
- gpu = term.gpu()
- function log(str)
- local tCol = gpu.getForeground()
- gpu.setForeground(0x66ff66)
- term.write("[LOG] ")
- gpu.setForeground(tCol)
- print(str)
- end
- function err(str)
- local tCol = gpu.getForeground()
- gpu.setForeground(0xff3300)
- term.write("[ERROR] ")
- gpu.setForeground(tCol)
- print(str)
- end
- for addr, b in component.list("modem") do
- card = component.proxy(addr)
- break
- end
- if not card then return false, "no modem found" end
- card.open(conf._PORT)
- if card.isOpen(conf._PORT) then
- log("Opened on port: "..tostring(conf._PORT))
- else
- err("FAILED TO OPEN PORT: "..tostring(conf._PORT))
- end
- print("DNS server is running, press enter to quit properly.")
- meta = {
- type = "dns_server",
- host = "Piorjade",
- }
- list = { ----List of all currently registered URLs
- --[[ EXAMPLE
- 0abc-blah-blah-blah = "ww2.google.co.uk"
- ]]
- }
- cmds = { ----Short commands
- rURL = function(url, addr)
- for each, addr in pairs(list) do
- if addr == url then
- return false
- end
- end
- list[addr] = url
- return true
- end,
- dURL = function(url, addr)
- if list[addr] == url then
- list[addr] = nil
- return true
- else
- return false
- end
- end,
- gADDR = function(url)
- for each, addr in pairs(list) do
- if addr == url then
- return each
- end
- end
- end,
- gURL = function(addr)
- return list[addr]
- end,
- gAll = function()
- return list
- end
- }
- local astr = [[
- while true do
- card.broadcast(conf._PORT, "DNS_SERVER", ser.serialize(meta))
- for a, b in ipairs(list.errorLog) do
- err("internal_function: "..b)
- end
- sleep(2)
- end]]
- local bstr = [[
- while true do
- local _, myAddr, sAddr, port, distance, command, arg1, arg2 = event.pull("modem_message")
- if port == conf._PORT then
- if command == "rURL" then
- local ok, msg = cmds[command](arg1, sAddr)
- log(tostring(sAddr).." requested register for "..arg1..".")
- if not ok then
- err("Registration of "..arg1.." failed.")
- card.send(sAddr, conf._PORT, "DNS_REGISTER_FAILED")
- else
- log("Registration of "..arg1.." succeeded.")
- card.send(sAddr, conf._PORT, "DNS_REGISTER_SUCCESS")
- end
- elseif command == "dURL" then
- local ok, msg = cmds[command](arg1, sAddr)
- log(tostring(sAddr).." requested delete for "..arg1..".")
- if not ok then
- err("Deletion of "..arg1.." failed.")
- card.send(sAddr, conf._PORT, "DNS_DELETE_FAILED")
- else
- log("Deletion of "..arg1.." succeeded.")
- card.send(sAddr, conf._PORT, "DNS_DELETE_SUCCESS")
- end
- elseif command == "gADDR" then
- local ok, msg = cmds[command](arg1)
- log(tostring(sAddr).." requested address of "..arg1)
- if not ok then
- err("Address of "..arg1.." not found.")
- card.send(sAddr, conf._PORT, "DNS_URL_NOT_FOUND")
- else
- log("Address of "..arg1.." found.")
- card.send(sAddr, conf._PORT, ok)
- end
- elseif command == "gURL" then
- local ok, msg = cmds[command](arg1)
- log(tostring(sAddr).." requested URL of "..arg1)
- if not ok then
- err("URL of "..arg1.." not found.")
- card.send(sAddr, conf._PORT, "DNS_ADDR_NOT_FOUND")
- else
- log("URL of "..arg1.." found.")
- card.send(sAddr, conf._PORT, ok)
- end
- elseif command == "gAll" then
- local list = cmds[command]()
- list = ser.serialize(list)
- log(tostring(sAddr).." requested list of all URLs")
- card.send(sAddr, conf._PORT, list)
- end
- end
- end]]
- local env = {}
- setmetatable(env, {__index = _ENV})
- local cstr = [[
- local keyboard = require("keyboard")
- while true do
- local _, addr, char, code, pn = event.pull()
- if _ == "key_down" and keyboard.keys[code] == "enter" then
- log("QUIT BY USER")
- multitask.quit()
- break
- end
- end
- ]]
- list = multitask.createTasklist()
- multitask.createTask(list, "function a", astr, env)
- multitask.createTask(list, "function b", bstr, env)
- multitask.createTask(list, "function c", cstr, env)
- multitask.runAll(list)
- card.close(conf._PORT)
Advertisement
Add Comment
Please, Sign In to add comment