示例#1
0
        /**
         * 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);
            }
        }
示例#2
0
        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.");
        }