summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-04-10 19:53:48 +0800
committerruki <[email protected]>2022-04-10 19:53:48 +0800
commit2bafcb78b88396b8e953d86d50f59401f6eeab9b (patch)
treed79eebc0b9a29550ee6cd97d9bb0d827cbe366ee
parent7bb2d23a6e90e7ec44724a8a8d9447b1641dc8bb (diff)
improve disconnect
-rw-r--r--xmake/modules/private/service/client/client.lua23
-rw-r--r--xmake/modules/private/service/client/remote_build_client.lua42
-rw-r--r--xmake/modules/private/service/connect_service.lua19
-rw-r--r--xmake/modules/private/service/message.lua27
-rw-r--r--xmake/modules/private/service/server/remote_build_server.lua22
-rw-r--r--xmake/modules/private/service/server/server.lua4
6 files changed, 99 insertions, 38 deletions
diff --git a/xmake/modules/private/service/client/client.lua b/xmake/modules/private/service/client/client.lua
index f0e4e0d32..4b0168981 100644
--- a/xmake/modules/private/service/client/client.lua
+++ b/xmake/modules/private/service/client/client.lua
@@ -30,6 +30,29 @@ local client = client or object()
function client:init()
end
+-- set the given client address
+function client:address_set(address)
+ local splitinfo = address:split(':', {plain = true})
+ if #splitinfo == 2 then
+ self._ADDR = splitinfo[1]
+ self._PORT = splitinfo[2]
+ else
+ self._ADDR = "127.0.0.1"
+ self._PORT = splitinfo[1]
+ end
+ assert(self._ADDR and self._PORT, "invalid client address!")
+end
+
+-- get the address address
+function client:addr()
+ return self._ADDR
+end
+
+-- get the address port
+function client:port()
+ return self._PORT
+end
+
-- get class
function client:class()
return client
diff --git a/xmake/modules/private/service/client/remote_build_client.lua b/xmake/modules/private/service/client/remote_build_client.lua
index aa98fed66..2de1cf022 100644
--- a/xmake/modules/private/service/client/remote_build_client.lua
+++ b/xmake/modules/private/service/client/remote_build_client.lua
@@ -34,6 +34,10 @@ local super = remote_build_client:class()
function remote_build_client:init()
super.init(self)
+ -- init address
+ local address = assert(config.get("remote_build.client.connect"), "config(remote_build.client.connect): not found!")
+ super.address_set(self, address)
+
-- load project config
local projectdir = os.projectdir()
local projectfile = os.projectfile()
@@ -52,14 +56,20 @@ function remote_build_client:class()
end
-- connect to the remote server
-function remote_build_client:connect(addr, port)
+function remote_build_client:connect()
local statusfile = self:statusfile()
+ if os.isfile(statusfile) then
+ print("%s: has been connected!", self)
+ return
+ end
+ local addr = self:addr()
+ local port = self:port()
local sock = socket.connect(addr, port)
local connected = false
print("%s: connect %s:%d ..", self, addr, port)
if sock then
local stream = socket_stream(sock)
- if stream:send_msg(message.new_ping()) and stream:flush() then
+ if stream:send_msg(message.new_connect()) and stream:flush() then
local msg = stream:recv_msg()
if msg then
vprint(msg:body())
@@ -70,6 +80,7 @@ function remote_build_client:connect(addr, port)
if connected then
print("%s: connected!", self)
io.save(statusfile, {addr = addr, port = port})
+ self:_syncfiles()
else
print("%s: connect %s:%d failed", self, addr, port)
os.tryrm(statusfile)
@@ -79,11 +90,30 @@ end
-- disconnect server
function remote_build_client:disconnect()
local statusfile = self:statusfile()
- if os.isfile(statusfile) then
+ if not os.isfile(statusfile) then
+ print("%s: has been disconnected!", self)
+ return
+ end
+ local addr = self:addr()
+ local port = self:port()
+ local sock = socket.connect(addr, port)
+ local disconnected = false
+ print("%s: disconnect %s:%d ..", self, addr, port)
+ if sock then
+ local stream = socket_stream(sock)
+ if stream:send_msg(message.new_disconnect()) and stream:flush() then
+ local msg = stream:recv_msg()
+ if msg then
+ vprint(msg:body())
+ disconnected = true
+ end
+ end
+ end
+ if disconnected then
os.rm(statusfile)
print("%s: disconnected!", self)
else
- print("%s: has been disconnected!", self)
+ print("%s: disconnect %s:%d failed", self, addr, port)
end
end
@@ -118,6 +148,10 @@ function remote_build_client:workdir()
return self._WORKDIR
end
+-- sync files
+function remote_build_client:_syncfiles()
+end
+
function remote_build_client:__tostring()
return "<remote_build_client>"
end
diff --git a/xmake/modules/private/service/connect_service.lua b/xmake/modules/private/service/connect_service.lua
index deddc0fd8..fdb657999 100644
--- a/xmake/modules/private/service/connect_service.lua
+++ b/xmake/modules/private/service/connect_service.lua
@@ -20,29 +20,12 @@
-- imports
import("core.base.option")
-import("core.base.socket")
import("core.base.scheduler")
-import("private.service.config")
import("private.service.client.remote_build_client")
-function _get_address()
- local addr, port
- local address = assert(config.get("remote_build.client.connect"), "config(remote_build.client.connect): not found!")
- local splitinfo = address:split(':', {plain = true})
- if #splitinfo == 2 then
- addr = splitinfo[1]
- port = splitinfo[2]
- else
- addr = "127.0.0.1"
- port = splitinfo[1]
- end
- assert(addr and port, "invalid connect address!")
- return addr, port
-end
-
function main()
scheduler.co_start(function ()
- remote_build_client():connect(_get_address())
+ remote_build_client():connect()
end)
end
diff --git a/xmake/modules/private/service/message.lua b/xmake/modules/private/service/message.lua
index a6af6fceb..65d5e12c6 100644
--- a/xmake/modules/private/service/message.lua
+++ b/xmake/modules/private/service/message.lua
@@ -25,7 +25,8 @@ import("core.base.object")
local message = message or object()
-- the message code
-message.CODE_PING = 1
+message.CODE_CONN = 1 -- connect
+message.CODE_DISCONN = 2 -- disconnect
-- init message
function message:init(body)
@@ -37,9 +38,14 @@ function message:code()
return self:body().code
end
--- is ping message?
-function message:is_ping()
- return self:code() == message.CODE_PING
+-- is connect message?
+function message:is_connect()
+ return self:code() == message.CODE_CONN
+end
+
+-- is disconnect message?
+function message:is_disconnect()
+ return self:code() == message.CODE_DISCONN
end
-- get message body
@@ -59,14 +65,21 @@ function _new(body)
return instance
end
--- new ping message
-function new_ping()
+-- new connect message
+function new_connect()
return _new({
- code = message.CODE_PING,
+ code = message.CODE_CONN,
xmakever = xmake.version():shortstr()
})
end
+-- new disconnect message
+function new_disconnect()
+ return _new({
+ code = message.CODE_DISCONN
+ })
+end
+
function main(body)
return _new(body)
end
diff --git a/xmake/modules/private/service/server/remote_build_server.lua b/xmake/modules/private/service/server/remote_build_server.lua
index 00f051a4d..606dd3c41 100644
--- a/xmake/modules/private/service/server/remote_build_server.lua
+++ b/xmake/modules/private/service/server/remote_build_server.lua
@@ -34,14 +34,20 @@ function remote_build_server:init(daemon)
if self:daemon() then
config.load()
end
- local listen = assert(config.get("remote_build.server.listen"), "config(remote_build.server.listen): not found!")
- super.listen_set(self, listen)
+ local address = assert(config.get("remote_build.server.listen"), "config(remote_build.server.listen): not found!")
+ super.address_set(self, address)
super.handler_set(self, self.on_handle)
end
--- handle ping message
-function remote_build_server:handle_ping(stream, msg)
- local ok = stream:send_msg(message.new_ping()) and stream:flush()
+-- handle connect message
+function remote_build_server:handle_connect(stream, msg)
+ local ok = stream:send_msg(message.new_connect()) and stream:flush()
+ vprint("%s: %s send %s", self, stream:sock(), ok and "ok" or "failed")
+end
+
+-- handle disconnect message
+function remote_build_server:handle_disconnect(stream, msg)
+ local ok = stream:send_msg(message.new_disconnect()) and stream:flush()
vprint("%s: %s send %s", self, stream:sock(), ok and "ok" or "failed")
end
@@ -49,8 +55,10 @@ end
function remote_build_server:on_handle(stream, msg)
vprint("%s: %s on handle message(%d)", self, stream:sock(), msg:code())
vprint(msg:body())
- if msg:is_ping() then
- self:handle_ping(stream, msg)
+ if msg:is_connect() then
+ self:handle_connect(stream, msg)
+ elseif msg:is_disconnect() then
+ self:handle_disconnect(stream, msg)
end
end
diff --git a/xmake/modules/private/service/server/server.lua b/xmake/modules/private/service/server/server.lua
index b9982b53c..cbd1fcd3c 100644
--- a/xmake/modules/private/service/server/server.lua
+++ b/xmake/modules/private/service/server/server.lua
@@ -45,8 +45,8 @@ function server:handler_set(handler)
end
-- set the given listen address
-function server:listen_set(listen)
- local splitinfo = listen:split(':', {plain = true})
+function server:address_set(address)
+ local splitinfo = address:split(':', {plain = true})
if #splitinfo == 2 then
self._ADDR = splitinfo[1]
self._PORT = splitinfo[2]