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}