using System.Diagnostics; using System.Net.WebSockets; using Common; namespace RemoteServer; public class RemoteSyncServer { #pragma warning disable CA2211 // Non-constant fields should not be visible public static string TempRootFile = "C:/TempPack"; public static string SqlPackageAbPath = "SqlPackageAbPath"; #pragma warning restore CA2211 // Non-constant fields should not be visible private StateHelpBase StateHelper; public void SetStateHelpBase(StateHelpBase stateHelper) { try { StateHelper = stateHelper; if (SyncConfig != null) { var LastExec = NotNullSyncConfig.ExecProcesses.Find(x => { return x.StepBeforeOrAfter == "A" && x.Step == (stateHelper.Step - 1) && x.ExecInLocalOrServer == "S"; }); ExecProcess(LastExec); var CurrentExec = NotNullSyncConfig.ExecProcesses.Find(x => { return x.StepBeforeOrAfter == "B" && x.Step == stateHelper.Step && x.ExecInLocalOrServer == "S"; }); ExecProcess(CurrentExec); } } catch (Exception ex) { Close(ex.Message); } } public void ExecProcess(ExecProcess? ep) { if (ep != null) { ProcessStartInfo startInfo = new() { StandardOutputEncoding = System.Text.Encoding.UTF8, Arguments = ep.Argumnets, FileName = ep.FileName, // The command to execute (can be any command line tool) // The arguments to pass to the command (e.g., list directory contents) RedirectStandardOutput = true, // Redirect the standard output to a string UseShellExecute = false, // Do not use the shell to execute the command CreateNoWindow = true // Do not create a new window for the command }; using Process process = new() { StartInfo = startInfo }; // Start the process process.Start(); // Read the output from the process string output = process.StandardOutput.ReadToEnd(); // Wait for the process to exit process.WaitForExit(); if (process.ExitCode == 0) { Pipe.SendMsg( StateHelper.CreateMsg( $"{ep.Step}-{ep.StepBeforeOrAfter}-{ep.ExecInLocalOrServer}-{ep.FileName} {ep.Argumnets} 执行成功!" ) ) .Wait(); } else { Pipe.SendMsg( StateHelper.CreateMsg( $"{ep.Step}-{ep.StepBeforeOrAfter}-{ep.ExecInLocalOrServer}-{ep.FileName} {ep.Argumnets} 失败 {output}!" ) ) .Wait(); throw new Exception("错误,信息参考上一条消息!"); } } } public StateHelpBase GetStateHelpBase() { return StateHelper; } public Config? SyncConfig; public Config NotNullSyncConfig { get { if (SyncConfig == null) { throw new ArgumentNullException("SyncConfig"); } return SyncConfig; } } /// /// 发布源连接 /// public readonly AbsPipeLine Pipe; /// /// 父工程,用于释放资源 /// public readonly RemoteSyncServerFactory Factory; public string Name; public string Pwd; public RemoteSyncServer( AbsPipeLine pipe, RemoteSyncServerFactory factory, string name, string pwd ) { Pipe = pipe; Factory = factory; Name = name; Pwd = pwd; StateHelper = new ConnectAuthorityHelper(this); } public async Task Connect() { try { var rs = Pipe.Work( (byte[] b) => { return StateHelper.ReceiveMsg(b); } ); await foreach (var r in rs) { } } catch (Exception e) { Close(e.Message); } } public void Close(string? CloseReason) { try { Pipe.Close(CloseReason); } catch (Exception e) { //TODO 日志 Console.WriteLine(e.Message); } finally { Factory.RemoveSyncServer(this); } } }