Advertisement
TwoThe

OC remote FS

Sep 3rd, 2014
330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.98 KB | None | 0 0
  1. function split(text, delimiter)
  2.   local result = {}
  3.   delimiter = delimiter or " "
  4.   string.gsub(text, "([^"..delimiter.."]+)", function(match) table.insert(result, match) end)
  5.   return result
  6. end
  7.  
  8. local term = require "term"
  9. function print(...)
  10.   term.write(table.concat({...}))
  11.   term.write("\n")
  12. end
  13.  
  14. local component = require "component"
  15. if (not component.isAvailable("internet")) then
  16.   print("No internet card found.")
  17.   return false
  18. elseif (not component.internet.isTcpEnabled()) then
  19.   print("TCP connections are forbidden by config settings.")
  20.   return false
  21. end
  22.  
  23. local host, port = ...
  24. host = host or "78.34.84.168" -- DEBUG: remove!
  25. if (not host) then
  26.   print("Usage: remotefs <host> [<port>]")
  27.   return false
  28. end
  29. port = tonumber(port) or 3425
  30.  
  31. local computer = require "computer"
  32. local internet = component.internet
  33. local handle = internet.connect(host..":"..port) -- OC BUG #533 needs to be in this format
  34. if (not handle) then
  35.   print("Failed to connect.")
  36.   return false
  37. end
  38. while not internet.finishConnect(handle) do os.sleep(0.1) end-- OC BUG #535 takes some time
  39.  
  40. function write(content)
  41.   local bytesToWrite = #content
  42.   local bytesWritten
  43.   while (bytesToWrite > 0) do
  44.     bytesWritten = internet.write(handle, content)
  45.     if (bytesWritten > 0) then
  46.       bytesToWrite = bytesToWrite - bytesWritten
  47.       if (bytesToWrite > 0) then
  48.         content = string.sub(content, bytesWritten + 1)
  49.       end
  50.     end  
  51.   end  
  52. end
  53.  
  54. function writeln(content)
  55.   internet.write(handle, content)
  56.   internet.write(handle, "\n")
  57. end
  58.  
  59. function read()
  60.   if (#readbuffer > 0) then
  61. print("read from buffer")
  62.     local result = readbuffer
  63.     readbuffer = ""
  64.     return result
  65.   else
  66. print("read from stream")
  67.     return internet.read(handle)
  68.   end
  69. end
  70.  
  71. local readbuffer = ""
  72. function readln()
  73. print("readln")
  74.   local chunk
  75.   local s, e = string.find(readbuffer, "\n", 1, true)
  76.   while (not s) do
  77.     chunk = internet.read(handle)
  78.     if (chunk) then
  79.       readbuffer = readbuffer .. chunk
  80. if (#readbuffer > 0) then print("readln: ", readbuffer) end
  81.     else
  82.       terminate()
  83.       return false
  84.     end
  85.     s, e = string.find(readbuffer, "\n", 1, true)
  86.   end
  87. print("readln complete: ", string.sub(readbuffer, 1, s - 1))
  88.   local line = string.sub(readbuffer, 1, s - 1)
  89.   if (#readbuffer > s) then
  90.     readbuffer = string.sub(readbuffer, s + 1)
  91.   else
  92.     readbuffer = ""
  93.   end
  94.   return line
  95. end
  96.  
  97. function terminate()
  98. print("terminate")
  99.   running = false
  100.   if (handle) then
  101.     internet.close(handle)
  102.     handle = nil
  103.   end
  104. end
  105.  
  106. function request(content)
  107. print("request: ", content)
  108.   writeln(content)
  109.   return readln()
  110. end
  111.  
  112. function requestOk(content)
  113.   local result = request(content)
  114.   if (not result) then
  115.     return false
  116.   else
  117.     return ("OK" == string.upper(result))
  118.   end
  119. end
  120.  
  121. local computer = require "computer"
  122. if (not requestOk("remotefs 1 "..computer.address())) then
  123.   print("Server denied login.")
  124.   terminate()
  125.   return false
  126. end
  127.  
  128. local fs = require "filesystem"
  129.  
  130. local COMMANDS = setmetatable({}, {__index = function(t, v) writeln("NO") print("Received unknown command: ", v) end})
  131.  
  132. function COMMANDS.list(dir)
  133. print("LIST ", dir)
  134.   if (not fs.isDirectory(dir)) then
  135.     writeln("NO")
  136.     return false
  137.   end
  138.   local response = {}
  139.   local filename
  140.   for file in fs.list(dir) do
  141.     if ((file ~= ".") and (#file > 0)) then
  142.       filename = fs.canonical(dir..file)
  143.       if (string.sub(filename, 1, 4) ~= "/mnt") then -- this would cause some flooding and recursion
  144.         if ((string.sub(filename, -1) ~= "/") and fs.isDirectory(filename)) then
  145.           filename = filename .. "/"
  146.         end
  147.         table.insert(response, filename..":"..fs.lastModified(file))
  148.       end
  149.     end
  150.   end
  151.   response = table.concat(response, " ")
  152.   writeln(response)
  153. print("LIST wrote ", response)
  154.   return true
  155. end
  156.  
  157. function COMMANDS.get(filename)
  158. print("GET ", filename)
  159.   local file = io.open(filename, "rb")
  160.   if (not file) then
  161.     writeln("NO")
  162.     return false
  163.   end
  164.   local content = file:read("*a")
  165.   file:close()
  166.   writeln("PUT "..filename.." "..tostring(#content))
  167.   write(content)
  168.   return true
  169. end
  170.  
  171. function COMMANDS.put(filename, size)
  172. print("PUT ", filename, " ", size)
  173.   local size = tonumber(size)
  174.   if (not size) then
  175.     writeln("NO")
  176.     return false
  177.   end
  178.   local file = io.open(filename, "wb+")
  179.   if (not file) then
  180.     writeln("NO")
  181.     return false
  182.   end
  183.   local content = ""
  184.   while (#content < size) do
  185.     content = content .. read()
  186.   end
  187.   if (file:write(content)) then
  188.     writeln("OK")
  189.   else
  190.     writeln("NO")
  191.   end
  192.   file:close()
  193. end
  194.  
  195. function executeCommand(command, ...)
  196. print("Command: ", command, " ", ...)
  197.   COMMANDS[string.lower(command)](...)
  198. end
  199.  
  200. running = true
  201.  
  202. local line, s, e
  203. while running do
  204.   line = readln()
  205.   if (line) then
  206.     executeCommand(table.unpack(split(line)))
  207.   else
  208.     print("Server terminated connection")
  209.     terminate()
  210.   end
  211. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement