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); }
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; } } }