/** * Send an update credentail message to the child process. */ private void updateCredentials() { try { var cred = config.AWSCredentials; if (cred != null && KPLRepMessageBuilder.CheckAndUpdateCredentialIfChanged(cred)) { var m = KPLRepMessageBuilder.makeSetCredentialsMessage(cred.Akid, cred.SecretKey, cred.SessionToken, false); lock (outgoingMessages) outgoingMessages.Enqueue(m); //var metricCred = config.AWSMetricsCredentials ?? config.AWSCredentials; //if (metricCred == null) // outgoingMessages.Add(makeSetCredentialsMessage(metricCred.Akid, metricCred.SecretKey, metricCred.SessionToken, true)); } else { } Thread.Sleep((int)config.credentialsRefreshDelay); } catch (ThreadInterruptedException e) { log.warn("Exception during updateCredentials", e); } }
private void startChildProcess() { var credentials = config.AWSCredentials; var metricsCreds = config.AWSMetricsCredentials; if (metricsCreds == null) { metricsCreds = credentials; } var startInfo = new ProcessStartInfo(pathToExecutable); string c = protobufToHex(config.toProtobufMessage()); string k = protobufToHex(KPLRepMessageBuilder.makeSetCredentialsMessage(credentials.Akid, credentials.SecretKey, credentials.SessionToken, false)); string w = protobufToHex(KPLRepMessageBuilder.makeSetCredentialsMessage(metricsCreds.Akid, metricsCreds.SecretKey, metricsCreds.SessionToken, true)); do { inPipe = "amz-aws-kpl-in-pipe-" + uuid8Chars(); } while (File.Exists(@"\\.\pipe\" + inPipe)); do { outPipe = "amz-aws-kpl-out-pipe-" + uuid8Chars(); } while (File.Exists(@"\\.\pipe\" + outPipe)); startInfo.Arguments = " -o \"" + inPipe + "\" -i \"" + outPipe + "\" -c \"" + c + "\" -k \"" + k + "\" -w \"" + w; startInfo.UseShellExecute = false; foreach (var ev in environmentVariables) { startInfo.EnvironmentVariables[ev.Key] = ev.Value; } new Thread(() => { try { StartNamedPipeServerStreams(); StartSendReceiveMessageLoops(); } catch (IOException e) { fatalError("Unexpected error connecting to child process", e, false); } }).Start(); try { startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; process = Process.Start(startInfo); } catch (Exception e) { fatalError("Error starting child process", e, false); } stdOutReader = new LogInputStreamReader(process.StandardOutput, "StdOut", (logger, message) => { logger.info(message); }, log); stdErrReader = new LogInputStreamReader(process.StandardError, "StdErr", (logger, message) => { logger.warn(message); }, log); Task.Run(() => stdOutReader.Run()); Task.Run(() => stdErrReader.Run()); process.WaitForExit(); stdOutReader.shutdown(); stdErrReader.shutdown(); try { if (inPipeServer != null) { inPipeServer.Close(); } if (outPipeServer != null) { outPipeServer.Close(); } } catch (Exception) { } fatalError("Child process exited."); }