public static void Client(Config config, Action <ITestShell, string> action) { using (var disposer = new Disposer()) { var client = SocketTools.ConnectWithTimeout(config.ShellIP, config.ShellPort, 2000); var endpoint = client.Client.LocalEndPoint as IPEndPoint; var stream = SocketTools.SslWithTimeout(client, 2000); var read = new StreamReader(stream); var write = new StreamWriter(stream); //var passfile = ExecutableTools.Relative("Password.txt"); //var password = File.ReadAllText(passfile).Trim(); //write.WriteLine(password); var shell = new TestShell(); var reader = new Runner(new Runner.Args { ThreadName = "SOCKIN" }); var writer = new Runner(new Runner.Args { ThreadName = "SOCKOUT" }); reader.Run(() => { var line = read.ReadLine(); while (line != null) { Logger.Trace("<c {0}", line); shell.WriteLine("<c {0}", line); line = read.ReadLine(); } }); writer.Run(() => { var line = shell.ReadLine(); while (line != null) { Logger.Trace("c> {0}", line); write.WriteLine(line); write.Flush(); line = shell.ReadLine(); } }); disposer.Push(reader); disposer.Push(client); disposer.Push(writer); disposer.Push(shell); //netcore linux prints ipv6 in endpoint.tostring action(shell, $"{config.ShellIP}:{endpoint.Port}"); } }
public static void Shell(string path, string args, Action <ITestShell> action) { using (var disposer = new Disposer()) { var process = new DaemonProcess(new DaemonProcess.Args { Executable = path, Arguments = args, }); Logger.Trace("Shell process {0} {1}", process.Id, process.Name, process.Info.FileName); Logger.Trace("Shell path {0}", process.Info.FileName); Logger.Trace("Shell args {0}", process.Info.Arguments); var shell = new TestShell(); var reader = new Runner(new Runner.Args { ThreadName = "SDTOUT" }); var erroer = new Runner(new Runner.Args { ThreadName = "STDERR" }); var writer = new Runner(new Runner.Args { ThreadName = "STDIN" }); reader.Run(() => { var line = process.ReadLine(); while (line != null) { Logger.Trace("<o {0}", line); shell.WriteLine("<o {0}", line); line = process.ReadLine(); } shell.WriteLine(Environ.NewLines); }); erroer.Run(() => { var line = process.ReadError(); while (line != null) { Logger.Trace("<e {0}", line); shell.WriteLine("<e {0}", line); line = process.ReadError(); } }); writer.Run(() => { var line = shell.ReadLine(); while (line != null) { Logger.Trace("i> {0}", line); process.WriteLine(line); line = shell.ReadLine(); } }); disposer.Push(erroer); disposer.Push(reader); disposer.Push(process); disposer.Push(writer); disposer.Push(shell); action(shell); } }