OCMachineTransferer/upload.lua
2019-12-26 16:12:23 +00:00

188 lines
3.2 KiB
Lua

local ic = require("internet")
local c = require("component")
local shell = require("shell")
local fs = require("filesystem")
local os = require("os")
if not c.isAvailable("internet") then
return
end
local i = c.internet
if(i == nil or ic == nil) then
return
end
if(not i.isTcpEnabled()) then
return
end
local args, options = shell.parse(...)
local filename = ""
local file_parentpath = ""
local ipaddress = "127.0.0.1"
local port = 100
if #args == 0 then
io.write("Usage: upload <filename> <ipaddress> <port>")
return
elseif #args == 1 then
ipaddress = "127.0.0.1"
port = 100
elseif #args == 2 then
ipaddress = args[2]
port = 100
elseif #args == 3 then
ipaddress = args[2]
port = args[3] + 0
end
filename = shell.resolve(args[1])
file_parentpath = fs.path(filename)
if fs.exists(file_parentpath) and not fs.isDirectory(file_parentpath) then
io.stderr:write("Invalid Folder Path!\n")
return 1
end
if fs.isDirectory(filename) then
io.stderr:write("File is a directory!\n")
return 1
end
function catch(block)
return block[1]
end
function try(block)
status, result = pcall(block[1])
if not status then
block[2](result)
end
return result
end
local function readc(con)
local herr = false
local data = ""
while not herr do
try {
function()
local tmp = ""
tmp = con:read(1)
if tmp ~= nil then
if tmp ~= "" then
data = data..tmp
end
end
end,
catch {
function(ex)
herr = true
end
}
}
end
if data == "" then
data = nil
end
return data
end
local function shandshake(con)
print("Sending Handshake...\n")
con:write("2")
return nil
end
local function rhandshake(con)
local ret = nil
try {
function()
ret = con:read(1)
end,
catch {
function(ex)
ret = nil
end
}
}
if ret == nil then
print("Handshake Not Received!\n")
return false
else
if ret == "" or ret == "0" then
print("Handshake Not Received!\n")
return false
else
print("Handshake Received...\n")
return true
end
end
end
local function rmsgs(con)
local ret = nil
try {
function()
ret = con:read(1)
end,
catch {
function(ex)
ret = nil
end
}
}
if ret == nil then
print("Message Failed!\n")
return false
else
if ret == "" or ret == "0" then
print("Message Failed!\n")
return false
else
print("Message Succeeded!\n")
return true
end
end
end
print("Opening Connection!\n")
local connection = ic.open(ipaddress, port)
if connection then
try {
function()
connection:setTimeout(5)
shandshake(connection)
if not rhandshake(connection) then
connection:close()
return 1
end
print("Reading File...\n")
local f, reason = io.open(filename, "r")
local data = ""
if f then
data = f:read("*a")
f:close()
else
print("File Read Failed!\n")
connection:close()
return 1
end
print("Sending Data...\n")
connection:write(data)
rmsgs(connection)
end,
catch {
function(ex)
io.stderr:write("Error Caught: "..ex..".\n")
end
}
}
::ci::
print("Terminating...\n")
connection:close()
return
else
io.stderr:write("Connection Failed!\n")
return 1
end