diff options
| author | ruki <[email protected]> | 2022-04-12 00:50:12 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2022-04-12 00:50:12 +0800 |
| commit | 449eb2068480bf8c8e253d5b2a13493a0f40f5cb (patch) | |
| tree | f4399461fd2832853263dac9dece8a511c3597cc | |
| parent | 4fc1bdc41ccf9156f9aa330c57fd0bc3b0619ed4 (diff) | |
improve session
| -rw-r--r-- | xmake/modules/private/service/message.lua | 20 | ||||
| -rw-r--r-- | xmake/modules/private/service/remote_build/client.lua | 13 | ||||
| -rw-r--r-- | xmake/modules/private/service/remote_build/server.lua | 77 | ||||
| -rw-r--r-- | xmake/modules/private/service/remote_build/session.lua | 14 |
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") |
