64 lines
1.5 KiB
Lua
64 lines
1.5 KiB
Lua
local vcomponent = require "vcomponent"
|
|
local serial = require "serialization"
|
|
local computer = require "computer"
|
|
local rpc = require "rpc"
|
|
local cfgpath = _OSVERSION:sub(1,7) == "PsychOS" and "/boot/cfg/rica.cfg" or "/etc/rica.cfg"
|
|
|
|
local cfg = {addr = vcomponent.uuid(), hosts={}}
|
|
|
|
local function rf() return false end
|
|
local function rt() return true end
|
|
local function genFn(host, id, name)
|
|
return function(...)
|
|
return rpc.call(host, "rica_"..name, id, ...)
|
|
end
|
|
end
|
|
|
|
function reload()
|
|
local f = io.open(cfgpath, "rb")
|
|
if not f then return false end
|
|
cfg = serial.unserialize(f:read("*a"))
|
|
f:close()
|
|
return true
|
|
end
|
|
local function saveCfg()
|
|
local f = io.open(cfgpath, "wb")
|
|
if not f then return false end
|
|
f:write(serial.serialize(cfg))
|
|
f:close()
|
|
return true
|
|
end
|
|
|
|
function addhost(addr)
|
|
reload()
|
|
cfg.hosts[#cfg.hosts+1] = addr
|
|
saveCfg()
|
|
end
|
|
|
|
function start()
|
|
reload()
|
|
vcomponent.register(cfg.addr, "internet", {
|
|
isTcpEnabled = rf,
|
|
isHttpEnabled = rt,
|
|
request = function (url, pd)
|
|
assert(#cfg.hosts > 0, "no proxies available")
|
|
local host = cfg.hosts[math.random(#cfg.hosts)]
|
|
local id, e = rpc.call(host, "rica_request", url, pd)
|
|
if not id then
|
|
return {read=rf,response=rf,close=rf,finishConnect=function() error(e) end}
|
|
end
|
|
local rt = {finishConnect = rt}
|
|
for k,v in ipairs{"read","response","close","finishConnect"} do
|
|
rt[v] = genFn(host,id,v)
|
|
end
|
|
return rt
|
|
end
|
|
})
|
|
end
|
|
|
|
function stop()
|
|
vcomponent.unregister(cfg.addr)
|
|
end
|
|
|
|
return {start=start,stop=stop,reload=reload,addhost=addhost}
|