summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-04-12 00:50:12 +0800
committerruki <[email protected]>2022-04-12 00:50:12 +0800
commit449eb2068480bf8c8e253d5b2a13493a0f40f5cb (patch)
treef4399461fd2832853263dac9dece8a511c3597cc
parent4fc1bdc41ccf9156f9aa330c57fd0bc3b0619ed4 (diff)
improve session
-rw-r--r--xmake/modules/private/service/message.lua20
-rw-r--r--xmake/modules/private/service/remote_build/client.lua13
-rw-r--r--xmake/modules/private/service/remote_build/server.lua77
-rw-r--r--xmake/modules/private/service/remote_build/session.lua14
4 files changed, 107 insertions, 17 deletions
diff --git a/xmake/modules/private/service/message.lua b/xmake/modules/private/service/message.lua
index 20b38e8bb..5f7cd8968 100644
--- a/xmake/modules/private/service/message.lua
+++ b/xmake/modules/private/service/message.lua
@@ -59,11 +59,31 @@ function message:is_sync()
return self:code() == message.CODE_SYNC
end
+-- is success?
+function message:success()
+ return self:body().status == true
+end
+
+-- set status, ok or failed
+function message:status_set(ok)
+ self:body().status = ok
+end
+
-- get message body
function message:body()
return self._BODY
end
+-- get message errors
+function message:errors()
+ return self:body().errors
+end
+
+-- set message errors
+function message:errors_set(errors)
+ self:body().errors = errors
+end
+
-- clone a message
function message:clone()
local body = table.copy(self:body())
diff --git a/xmake/modules/private/service/remote_build/client.lua b/xmake/modules/private/service/remote_build/client.lua
index 27d216310..9b7b38dd2 100644
--- a/xmake/modules/private/service/remote_build/client.lua
+++ b/xmake/modules/private/service/remote_build/client.lua
@@ -74,7 +74,11 @@ function remote_build_client:connect()
local msg = stream:recv_msg()
if msg then
vprint(msg:body())
- connected = true
+ if msg:success() then
+ connected = true
+ else
+ print("%s: connect %s:%d failed, %s", self, addr, port, msg:errors() or "unknown")
+ end
end
end
end
@@ -86,7 +90,6 @@ function remote_build_client:connect()
session_id = session_id})
print("%s: connected!", self)
else
- os.tryrm(statusfile)
print("%s: connect %s:%d failed", self, addr, port)
end
end
@@ -110,7 +113,11 @@ function remote_build_client:disconnect()
local msg = stream:recv_msg()
if msg then
vprint(msg:body())
- disconnected = true
+ if msg:success() then
+ disconnected = true
+ else
+ print("%s: disconnect %s:%d failed, %s", self, addr, port, msg:errors())
+ end
end
end
end
diff --git a/xmake/modules/private/service/remote_build/server.lua b/xmake/modules/private/service/remote_build/server.lua
index 6502901c7..0e4cf0a73 100644
--- a/xmake/modules/private/service/remote_build/server.lua
+++ b/xmake/modules/private/service/remote_build/server.lua
@@ -24,6 +24,7 @@ import("private.service.message")
import("private.service.server")
import("private.service.stream", {alias = "socket_stream"})
import("private.service.remote_build.session", {alias = "server_session"})
+import("lib.detect.find_tool")
-- define module
local remote_build_server = remote_build_server or server()
@@ -36,6 +37,9 @@ function remote_build_server:init(daemon)
config.load()
end
+ -- check requires
+ self:_check_requires()
+
-- init address
local address = assert(config.get("remote_build.server.listen"), "config(remote_build.server.listen): not found!")
super.address_set(self, address)
@@ -52,26 +56,41 @@ function remote_build_server:class()
return remote_build_server
end
+-- check requires
+function remote_build_server:_check_requires()
+
+ -- check git
+ local git = find_tool("git")
+ assert(git, "git not found!")
+
+ -- check sshkeys
+ -- TODO
+end
+
-- handle connect message
function remote_build_server:_handle_connect(stream, msg)
local session_id = msg:session_id()
+ local session_ok, session_errs = self:_session_open(session_id)
local respmsg = msg:clone()
respmsg:body().xmakever = xmake.version():shortstr()
- local ok = stream:send_msg(respmsg) and stream:flush()
- if ok then
- self:_session_open(session_id)
+ respmsg:status_set(ok)
+ if not session_ok and session_errs then
+ respmsg:errors_set(session_errs)
end
+ local ok = stream:send_msg(respmsg) and stream:flush()
vprint("%s: %s: <session %s>: send %s", self, stream:sock(), session_id, ok and "ok" or "failed")
end
-- handle disconnect message
function remote_build_server:_handle_disconnect(stream, msg)
local session_id = msg:session_id()
+ local session_ok, session_errs = self:_session_close(session_id)
local respmsg = msg:clone()
- local ok = stream:send_msg(respmsg) and stream:flush()
- if ok then
- self:_session_close(session_id)
+ respmsg:status_set(ok)
+ if not session_ok and session_errs then
+ respmsg:errors_set(session_errs)
end
+ local ok = stream:send_msg(respmsg) and stream:flush()
vprint("%s: %s: <session %s>: send %s", self, stream:sock(), session_id, ok and "ok" or "failed")
end
@@ -103,20 +122,50 @@ end
-- open session
function remote_build_server:_session_open(session_id)
- self._SESSIONS[session_id] = server_session(session_id)
+ local session = server_session(session_id)
+ local errors
+ local ok = try
+ {
+ function ()
+ session:open()
+ return true
+ end,
+ catch
+ {
+ function (errs)
+ errors = tostring(errs)
+ end
+ }
+ }
+ if ok then
+ self._SESSIONS[session_id] = session
+ end
+ return ok, errors
end
-- close session
function remote_build_server:_session_close(session_id)
- -- remove the session caches
local session = self:_session(session_id)
- if session then
- local workdir = session:workdir()
- if workdir then
- os.tryrm(workdir)
- end
+ local errors
+ local ok = try
+ {
+ function ()
+ if session then
+ session:close()
+ end
+ return true
+ end,
+ catch
+ {
+ function (errs)
+ errors = tostring(errs)
+ end
+ }
+ }
+ if ok then
+ self._SESSIONS[session_id] = nil
end
- self._SESSIONS[session_id] = nil
+ return ok, errors
end
function remote_build_server:__tostring()
diff --git a/xmake/modules/private/service/remote_build/session.lua b/xmake/modules/private/service/remote_build/session.lua
index d90f1162b..1c6bfafc7 100644
--- a/xmake/modules/private/service/remote_build/session.lua
+++ b/xmake/modules/private/service/remote_build/session.lua
@@ -36,6 +36,20 @@ function session:id()
return self._ID
end
+-- open session
+function session:open()
+end
+
+-- close session
+function session:close()
+
+ -- remove the session caches
+ local workdir = self:workdir()
+ if workdir then
+ os.tryrm(workdir)
+ end
+end
+
-- get work directory
function session:workdir()
local workdir = config.get("remote_build.server.workdir")