Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function split(text, delimiter)
- local result = {}
- delimiter = delimiter or " "
- string.gsub(text, "([^"..delimiter.."]+)", function(match) table.insert(result, match) end)
- return result
- end
- local term = require "term"
- function print(...)
- term.write(table.concat({...}))
- term.write("\n")
- end
- local component = require "component"
- if (not component.isAvailable("internet")) then
- print("No internet card found.")
- return false
- elseif (not component.internet.isTcpEnabled()) then
- print("TCP connections are forbidden by config settings.")
- return false
- end
- local host, port = ...
- host = host or "78.34.84.168" -- DEBUG: remove!
- if (not host) then
- print("Usage: remotefs <host> [<port>]")
- return false
- end
- port = tonumber(port) or 3425
- local computer = require "computer"
- local internet = component.internet
- local handle = internet.connect(host..":"..port) -- OC BUG #533 needs to be in this format
- if (not handle) then
- print("Failed to connect.")
- return false
- end
- while not internet.finishConnect(handle) do os.sleep(0.1) end-- OC BUG #535 takes some time
- function write(content)
- local bytesToWrite = #content
- local bytesWritten
- while (bytesToWrite > 0) do
- bytesWritten = internet.write(handle, content)
- if (bytesWritten > 0) then
- bytesToWrite = bytesToWrite - bytesWritten
- if (bytesToWrite > 0) then
- content = string.sub(content, bytesWritten + 1)
- end
- end
- end
- end
- function writeln(content)
- internet.write(handle, content)
- internet.write(handle, "\n")
- end
- function read()
- if (#readbuffer > 0) then
- print("read from buffer")
- local result = readbuffer
- readbuffer = ""
- return result
- else
- print("read from stream")
- return internet.read(handle)
- end
- end
- local readbuffer = ""
- function readln()
- print("readln")
- local chunk
- local s, e = string.find(readbuffer, "\n", 1, true)
- while (not s) do
- chunk = internet.read(handle)
- if (chunk) then
- readbuffer = readbuffer .. chunk
- if (#readbuffer > 0) then print("readln: ", readbuffer) end
- else
- terminate()
- return false
- end
- s, e = string.find(readbuffer, "\n", 1, true)
- end
- print("readln complete: ", string.sub(readbuffer, 1, s - 1))
- local line = string.sub(readbuffer, 1, s - 1)
- if (#readbuffer > s) then
- readbuffer = string.sub(readbuffer, s + 1)
- else
- readbuffer = ""
- end
- return line
- end
- function terminate()
- print("terminate")
- running = false
- if (handle) then
- internet.close(handle)
- handle = nil
- end
- end
- function request(content)
- print("request: ", content)
- writeln(content)
- return readln()
- end
- function requestOk(content)
- local result = request(content)
- if (not result) then
- return false
- else
- return ("OK" == string.upper(result))
- end
- end
- local computer = require "computer"
- if (not requestOk("remotefs 1 "..computer.address())) then
- print("Server denied login.")
- terminate()
- return false
- end
- local fs = require "filesystem"
- local COMMANDS = setmetatable({}, {__index = function(t, v) writeln("NO") print("Received unknown command: ", v) end})
- function COMMANDS.list(dir)
- print("LIST ", dir)
- if (not fs.isDirectory(dir)) then
- writeln("NO")
- return false
- end
- local response = {}
- local filename
- for file in fs.list(dir) do
- if ((file ~= ".") and (#file > 0)) then
- filename = fs.canonical(dir..file)
- if (string.sub(filename, 1, 4) ~= "/mnt") then -- this would cause some flooding and recursion
- if ((string.sub(filename, -1) ~= "/") and fs.isDirectory(filename)) then
- filename = filename .. "/"
- end
- table.insert(response, filename..":"..fs.lastModified(file))
- end
- end
- end
- response = table.concat(response, " ")
- writeln(response)
- print("LIST wrote ", response)
- return true
- end
- function COMMANDS.get(filename)
- print("GET ", filename)
- local file = io.open(filename, "rb")
- if (not file) then
- writeln("NO")
- return false
- end
- local content = file:read("*a")
- file:close()
- writeln("PUT "..filename.." "..tostring(#content))
- write(content)
- return true
- end
- function COMMANDS.put(filename, size)
- print("PUT ", filename, " ", size)
- local size = tonumber(size)
- if (not size) then
- writeln("NO")
- return false
- end
- local file = io.open(filename, "wb+")
- if (not file) then
- writeln("NO")
- return false
- end
- local content = ""
- while (#content < size) do
- content = content .. read()
- end
- if (file:write(content)) then
- writeln("OK")
- else
- writeln("NO")
- end
- file:close()
- end
- function executeCommand(command, ...)
- print("Command: ", command, " ", ...)
- COMMANDS[string.lower(command)](...)
- end
- running = true
- local line, s, e
- while running do
- line = readln()
- if (line) then
- executeCommand(table.unpack(split(line)))
- else
- print("Server terminated connection")
- terminate()
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement