예제 #1
0
        public async Task <string> PostCliCmd()
        {
            using var textReader = HttpContext.OpenRequestText();
            var line = textReader.ReadLine();

            if (line is not null)
            {
                var cliClient = new CLIClient();
                // FIXME! here we need to await the finishing of the request, not just adding the request to a queue!!!
                //        Otherwise the response will be empty as the request will not be processed yet
                //		  CLIProcessor should support async waiting for request completion (via awaiting the mutex  the request?)
                var r = _master.AddCliRequest(cliClient, line);
                await r.WaitAsync();

                return(cliClient.Response);
            }
            return(string.Empty);
        }
예제 #2
0
파일: Master.cs 프로젝트: pjanec/dirigent
        void ProcessIncomingMessage(Message msg)
        {
            Type t = msg.GetType();

            //if( t != typeof(AppsStateMessage)) // do not log frequent messages; UPDATE: this msg is optionally replaced by UDP so should be rare or non-existing
            //{
            //    log.Debug( $"Incoming: {msg}" );
            //}

            switch (msg)
            {
            case ClientIdent m:
            {
                // client connected!
                OnClientIdentified(m);

                // remember initial client state as conneted
                var cs = new ClientState();
                cs.Ident      = m;
                cs.Connected  = true;
                cs.LastChange = DateTime.Now;
                _allClientStates.AddOrUpdate(m.Name, cs);

                break;
            }

            case ClientStateMessage m:
            {
                if (m.State != null && m.State.Ident != null)              // sanity check
                {
                    m.State.Connected = true;                              // we just received from the client
                    _allClientStates.AddOrUpdate(m.State.Ident.Name, m.State);
                }
                break;
            }

            // agent is sending the state of its apps
            case AppsStateMessage m:
            {
                //Debug.Assert( m.AppsState is not null );
                if (m.AppsState is not null)
                {
                    var localTimeDelta = DateTime.UtcNow - m.TimeStamp;

                    foreach (var(appId, appState) in m.AppsState)
                    {
                        appState.LastChange += localTimeDelta;                                 // recalc to master's time

                        _allAppStates.AddOrUpdate(appId, appState);
                    }
                }
                break;
            }

            case StartAppMessage m:
            {
                var vars = m.UseVars ? m.Vars ?? new() : null;                         // pass null if not vars change is required
                StartApp(m.Sender, m.Id, m.PlanName, m.Flags, vars);
                break;
            }

            case KillAppMessage m:
            {
                KillApp(m.Sender, m.Id, m.Flags);
                break;
            }

            case RestartAppMessage m:
            {
                var vars = m.UseVars ? m.Vars ?? new() : null;                         // pass null if not vars change is required
                RestartApp(m.Sender, m.Id, vars);
                break;
            }

            case CLIRequestMessage m:
            {
                var cliClient = new CLIClient(_server, m.Sender);
                AddCliRequest(cliClient, m.Text);
                break;
            }

            case StartPlanMessage m:
            {
                var vars = m.UseVars ? m.Vars ?? new() : null;                         // pass null if not vars change is required
                StartPlan(m.Sender, m.PlanName, vars);
                break;
            }

            case StopPlanMessage m:
            {
                StopPlan(m.Sender, m.PlanName);
                break;
            }

            case KillPlanMessage m:
            {
                KillPlan(m.Sender, m.PlanName);
                break;
            }

            case RestartPlanMessage m:
            {
                var vars = m.UseVars ? m.Vars ?? new() : null;                         // pass null if not vars change is required
                RestartPlan(m.Sender, m.PlanName, vars);
                break;
            }

            case SetAppEnabledMessage m:
            {
                SetAppEnabled(m.Sender, m.PlanName, m.Id, m.Enabled);
                break;
            }

            case KillAllMessage m:
            {
                KillAll(m.Sender, m.Args);
                break;
            }

            case ReloadSharedConfigMessage m:
            {
                ReloadSharedConfig(m.Sender, m.Args);
                break;
            }

            case RemoteOperationErrorMessage m:
            {
                // agent is sending an error - forward to the requestor
                if (!string.IsNullOrEmpty(m.Requestor))
                {
                    _server.SendToSingle(m, m.Requestor);
                }
                break;
            }

            case StartScriptMessage m:
            {
                if (!string.IsNullOrEmpty(m.Id))
                {
                    StartScript(m.Sender, m.Id, m.Args);
                }
                break;
            }

            case KillScriptMessage m:
            {
                if (!string.IsNullOrEmpty(m.Id))
                {
                    KillScript(m.Sender, m.Id);
                }
                break;
            }

            case SetVarsMessage m:
            {
                SetVars(m.Sender, m.Vars);
                break;
            }

            case TerminateMessage m:
            {
                Terminate(m.Sender, m.Args);
                break;
            }

            case ShutdownMessage m:
            {
                Shutdown(m.Sender, m.Args);
                break;
            }

            case ApplyPlanMessage m:
            {
                ApplyPlan(m.Sender, m.PlanName, m.AppIdTuple);
                break;
            }

            case SelectPlanMessage m:
            {
                SelectPlan(m.Sender, m.PlanName);
                break;
            }
            }
        }