diff --git a/src/sync/esSyncSrv.erl b/src/sync/esSyncSrv.erl index 05396ee..204901e 100644 --- a/src/sync/esSyncSrv.erl +++ b/src/sync/esSyncSrv.erl @@ -38,8 +38,7 @@ srcFiles = #{} :: map() , onsyncFun = undefined , swSyncNode = false - , sockMod = undefined - , sock = undefined + , port = undefined }). %% ************************************ API start *************************** @@ -95,37 +94,11 @@ init(_Args) -> {ok, waiting, #state{}, {doAfter, ?None}}. handleAfter(?None, waiting, State) -> - %% 启动tcp 异步监听 然后启动文件同步应用 启动定时器 等待建立连接 超时 就表示文件同步应用启动失败了 报错 - case gen_tcp:listen(0, ?TCP_DEFAULT_OPTIONS) of - {ok, LSock} -> - {ok, ListenPort} = inet:port(LSock), - case prim_inet:async_accept(LSock, -1) of - {ok, _Ref} -> - {ok, SockMod} = inet_db:lookup_socket(LSock), - spawn(fun() -> - case os:type() of - {win32, _Osname} -> - CmtStr = "start " ++ esUtils:fileSyncPath("fileSync.exe") ++ " ./ " ++ integer_to_list(ListenPort), - CmdRet = os:cmd(CmtStr), - RetMsg = io_lib:format("the os:cmd start fileSync CmtStr:~p ret:~p ~n ", [CmtStr, CmdRet]), - esUtils:logErrors(RetMsg); - _ -> - CmtStr = esUtils:fileSyncPath("fileSync") ++ " ./ " ++ integer_to_list(ListenPort), - CmdRet = os:cmd(CmtStr), - RetMsg = io_lib:format("the os:cmd start fileSync CmtStr:~p ret:~p ~n ", [CmtStr, CmdRet]), - esUtils:logErrors(RetMsg) - end end), - {kpS, State#state{sockMod = SockMod}, {sTimeout, 4000, waitConnOver}}; - {error, Reason} -> - Msg = io_lib:format("init prim_inet:async_accept error ~p~n", [Reason]), - esUtils:logErrors(Msg), - {kpS, State, {sTimeout, 2000, waitConnOver}} - end; - {error, Reason} -> - Msg = io_lib:format("failed to listen ~p (~s) ~n", [Reason, inet:format_error(Reason)]), - esUtils:logErrors(Msg), - {kpS, State, {sTimeout, 2000, waitConnOver}} - end. + %% 启动port 发送监听目录信息 + PortName = esUtils:fileSyncPath("fileSync"), + Opts = [{packet, 4}, binary, exit_status, use_stdio], + Port = erlang:open_port({spawn_executable, PortName}, Opts), + {kpS, State#state{port = Port}, {sTimeout, 4000, waitConnOver}}. handleCall(miGetOnsync, _, #state{onsyncFun = OnSync} = State, _From) -> {reply, OnSync, State}; @@ -153,10 +126,11 @@ handleCast(miRescan, _, State) -> handleCast(_Msg, _, _State) -> kpS_S. -handleInfo({tcp, _Socket, Data}, running, #state{srcFiles = SrcFiles, onsyncFun = OnsyncFun, swSyncNode = SwSyncNode} = State) -> +handleInfo({_Port, {data, Data}}, running, #state{srcFiles = SrcFiles, onsyncFun = OnsyncFun, swSyncNode = SwSyncNode} = State) -> FileList = binary:split(Data, <<"\r\n">>, [global]), %% 收集改动了beam hrl src 文件 然后执行相应的逻辑 - {Beams, Hrls, Srcs} = esUtils:classifyChangeFile(FileList, [], [], []), + {Beams, Hrls, Srcs, Configs} = esUtils:classifyChangeFile(FileList, [], [], [], []), + esUtils:fireOnsync(OnsyncFun, Configs), esUtils:reloadChangedMod(Beams, SwSyncNode, OnsyncFun, []), case ?esCfgSync:getv(?compileCmd) of undefined -> @@ -185,45 +159,40 @@ handleInfo({tcp, _Socket, Data}, running, #state{srcFiles = SrcFiles, onsyncFun end, kpS_S end; -handleInfo({inet_async, LSock, _Ref, Msg}, _, #state{sockMod = SockMod} = State) -> - case Msg of - {ok, Sock} -> - %% make it look like gen_tcp:accept - inet_db:register_socket(Sock, SockMod), - inet:setopts(Sock, [{active, true}]), - prim_inet:async_accept(LSock, -1), - - %% 建立了连接 先发送监听目录配置 +handleInfo({_Port, {data, Data}}, _, #state{port = Port} = State) -> + case Data of + <<"init">> -> + %% port启动成功 先发送监听目录配置 {AddSrcDirs, OnlySrcDirs, DelSrcDirs} = esUtils:mergeExtraDirs(false), AddStr = string:join([filename:nativename(OneDir) || OneDir <- AddSrcDirs], "|"), OnlyStr = string:join([filename:nativename(OneDir) || OneDir <- OnlySrcDirs], "|"), DelStr = string:join([filename:nativename(OneDir) || OneDir <- DelSrcDirs], "|"), AllStr = string:join([AddStr, OnlyStr, DelStr], "\r\n"), - gen_tcp:send(Sock, AllStr), + erlang:port_command(Port, AllStr), esUtils:logSuccess("eSync connect fileSync success..."), case ?esCfgSync:getv(?compileCmd) of undefined -> %% 然后收集一下监听目录下的src文件 SrcFiles = esUtils:collSrcFiles(true), - {nextS, running, State#state{sock = Sock, srcFiles = SrcFiles}}; + {nextS, running, State#state{srcFiles = SrcFiles}}; _ -> {nextS, running, State} end; - {error, closed} -> - Msg = io_lib:format("error, closed listen sock error ~p~n", [closed]), - esUtils:logErrors(Msg), - {stop, normal}; - {error, Reason} -> - Msg = io_lib:format("listen sock error ~p~n", [Reason]), + _ -> + Msg = io_lib:format("error, esSyncSrv receive unexpect port msg ~p~n", [Data]), esUtils:logErrors(Msg), - {stop, {lsock, Reason}} + kpS_S end; -handleInfo({tcp_closed, _Socket}, running, _State) -> - Msg = io_lib:format("esSyncSrv receive tcp_closed ~n", []), +handleInfo({_Port, closed}, running, _State) -> + Msg = io_lib:format("esSyncSrv receive port closed ~n", []), + esUtils:logErrors(Msg), + kpS_S; +handleInfo({'EXIT', _Port, Reason}, running, _State) -> + Msg = io_lib:format("esSyncSrv receive port exit Reason:~p ~n", [Reason]), esUtils:logErrors(Msg), kpS_S; -handleInfo({tcp_error, _Socket, Reason}, running, _State) -> - Msg = io_lib:format("esSyncSrv receive tcp_error Reason:~p ~n", [Reason]), +handleInfo({_Port, {exit_status, Status}}, running, _State) -> + Msg = io_lib:format("esSyncSrv receive port exit_status Status:~p ~n", [Status]), esUtils:logErrors(Msg), kpS_S; handleInfo(_Msg, _, _State) -> diff --git a/src/sync/esUtils.erl b/src/sync/esUtils.erl index 54fc17d..d22b5f1 100644 --- a/src/sync/esUtils.erl +++ b/src/sync/esUtils.erl @@ -341,7 +341,6 @@ mergeExtraDirs(IsAddPath) -> begin case IsAddPath of true -> - case proplists:get_value(outdir, Opts) of undefined -> true; @@ -863,19 +862,21 @@ doMathEveryLine(IoDevice, HrlFileBaseName) -> false end. -classifyChangeFile([], Beams, Hrls, Srcs) -> - {Beams, Hrls, Srcs}; -classifyChangeFile([OneFile | LeftFile], Beams, Hrls, Srcs) -> +classifyChangeFile([], Beams, Hrls, Srcs, Configs) -> + {Beams, Hrls, Srcs, Configs}; +classifyChangeFile([OneFile | LeftFile], Beams, Hrls, Srcs, Configs) -> case filename:extension(OneFile) of <<".beam">> -> Module = binary_to_atom(filename:basename(OneFile, <<".beam">>)), - classifyChangeFile(LeftFile, [Module | Beams], Hrls, Srcs); + classifyChangeFile(LeftFile, [Module | Beams], Hrls, Srcs, Configs); <<".hrl">> -> - classifyChangeFile(LeftFile, Beams, [OneFile | Hrls], Srcs); + classifyChangeFile(LeftFile, Beams, [OneFile | Hrls], Srcs, Configs); + <<".config">> -> + classifyChangeFile(LeftFile, Beams, Hrls, Srcs, [OneFile | Configs]); <<>> -> - classifyChangeFile(LeftFile, Beams, Hrls, Srcs); + classifyChangeFile(LeftFile, Beams, Hrls, Srcs, Configs); _ -> - classifyChangeFile(LeftFile, Beams, Hrls, [OneFile | Srcs]) + classifyChangeFile(LeftFile, Beams, Hrls, [OneFile | Srcs], Configs) end. addNewFile([], SrcFiles) ->