public void ClientDisconnected(Client client) { lock (_activeCommandsLock) for (int i = ActiveCommands.Count - 1; i >= 0; i--) { var activeCommand = ActiveCommands[i]; lock (activeCommand.ClientsLock) if (activeCommand.Clients.Contains(client)) { activeCommand.Clients.Remove(client); ActiveCommandEventManager.RemoveClient(activeCommand, client); } if (activeCommand.Clients.Count == 0) { ActiveCommands.Remove(activeCommand); if (activeCommand.DynamicCommand.Status == DynamicCommandStatus.Active) { //don't change the status when stopped activeCommand.DynamicCommand.Status = DynamicCommandStatus.Done; } ActiveCommandEventManager.RemoveActiveCommand(activeCommand); } } }
public ActiveCommandEventManagerBrake(ActiveCommandEventManager activeCommandEventManager) { _activeCommandEvents = new List <ActiveCommandEvent>(); activeCommandEventManager.ActiveCommandAdded += ActiveCommandEventManagerOnActiveCommandAdded; activeCommandEventManager.ActiveCommandRemoved += ActiveCommandEventManagerOnActiveCommandRemoved; activeCommandEventManager.ClientAdded += ActiveCommandEventManagerOnClientsUpdated; activeCommandEventManager.ClientRemoved += ActiveCommandEventManagerOnClientsUpdated; _waitTimer = new Timer(TimerCallback, null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan); }
public void ReceivedResult(DynamicCommandEvent dynamicCommandEvent, Client client) { _cacheManager.AddCommandEvent(dynamicCommandEvent); if (dynamicCommandEvent.Status == ActivityType.Active || dynamicCommandEvent.Status == ActivityType.Stopped) { lock (_activeCommandsLock) { var activeCommand = ActiveCommands.FirstOrDefault(x => x.DynamicCommand.Id == dynamicCommandEvent.DynamicCommand); if (activeCommand == null) { var dynamicCommand = _databaseManager.GetDynamicCommandById(dynamicCommandEvent.DynamicCommand); if (dynamicCommand == null) { //when there is no command on this server with the id, we stop it because it may be removed by an administrator client.StopActiveCommand(dynamicCommandEvent.DynamicCommand); return; } ActiveCommands.Add(activeCommand = new ActiveCommandInfo(dynamicCommand)); } switch (dynamicCommandEvent.Status) { case ActivityType.Active: lock (activeCommand.ClientsLock) activeCommand.Clients.Add(client); ActiveCommandEventManager.AddClient(activeCommand, client); CheckClientExecuteActiveCommand(activeCommand, client); break; case ActivityType.Stopped: lock (activeCommand.ClientsLock) activeCommand.Clients.Remove(client); ActiveCommandEventManager.RemoveClient(activeCommand, client); if (activeCommand.Clients.Count == 0) { ActiveCommands.Remove(activeCommand); if (activeCommand.DynamicCommand.Status == DynamicCommandStatus.Active) { //don't change the status when stopped activeCommand.DynamicCommand.Status = DynamicCommandStatus.Done; } ActiveCommandEventManager.RemoveActiveCommand(activeCommand); } break; } } } }
public DynamicCommandManager(DatabaseManager databaseManager, TcpServer tcpServer) { _databaseManager = databaseManager; _tcpServer = tcpServer; DynamicCommands = databaseManager.GetDynamicCommands(true); ActiveCommands = new List <ActiveCommandInfo>(); _dynamicCommandScheduler = new DynamicCommandScheduler(DynamicCommands); _dynamicCommandScheduler.ExecuteDynamicCommand += DynamicCommandSchedulerExecuteDynamicCommand; _cacheManager = new CacheManager(databaseManager); DynamicCommandPluginSender = new DynamicCommandPluginSender(databaseManager); ActiveCommandEventManager = new ActiveCommandEventManager(); _specialCommands = new Dictionary <Guid, SpecialCommand>( new[] { (SpecialCommand) new WakeOnLanSpecialCommand() }.ToDictionary(x => x.CommandId, y => y)); _dynamicCommandScheduler.Activate(); }
public void OnClientJoin(Client client) { Logger.Debug("Client CI-{0} joined, check if there are commands to execute", client.Id); lock (_dynamicCommandsLock) { foreach ( var command in DynamicCommands.Where( x => (x.TransmissionEvent.GetType() == typeof(OnJoinTransmissionEvent)) && IsClientInTargets(client, x.Target) && CheckConditions(client.GetOnlineClientInformation(), client.ComputerInformation.ClientConfig, x.Conditions))) { if (ExecuteStaticCommand(new[] { client }, DynamicCommandToPotentialCommand(command, _databaseManager.GetDynamicCommandParameter(command.Id))) .Count == 1) { _databaseManager.AddDynamicCommandEvent(command.Id, client.Id, ActivityType.Sent, null); } } foreach ( var command in DynamicCommands.Where( x => x.TransmissionEvent.GetType() == typeof(EveryClientOnceTransmissionEvent) && IsClientInTargets(client, x.Target) && CheckConditions(client.GetOnlineClientInformation(), client.ComputerInformation.ClientConfig, x.Conditions))) { if (!_databaseManager.ClientCommandExecuted(client.Id, command.Id)) { if (ExecuteStaticCommand(new[] { client }, DynamicCommandToPotentialCommand(command, _databaseManager.GetDynamicCommandParameter(command.Id))).Count == 1) { _databaseManager.AddDynamicCommandEvent(command.Id, client.Id, ActivityType.Sent, null); } } } } if (client.ComputerInformation.ActiveCommands?.Count > 0) { lock (_activeCommandsLock) foreach (var activeCommandId in client.ComputerInformation.ActiveCommands) { var activeCommand = ActiveCommands.FirstOrDefault(x => x.DynamicCommand.Id == activeCommandId); if (activeCommand == null) { var dynamicCommand = _databaseManager.GetDynamicCommandById(activeCommandId); if (dynamicCommand == null) { //when there is no command on this server with the id, we stop it because it may be removed by an administrator client.StopActiveCommand(activeCommandId); return; } ActiveCommands.Add(activeCommand = new ActiveCommandInfo(dynamicCommand)); ActiveCommandEventManager.AddActiveCommand(activeCommand); } lock (activeCommand.ClientsLock) activeCommand.Clients.Add(client); CheckClientExecuteActiveCommand(activeCommand, client); ActiveCommandEventManager.AddClient(activeCommand, client); } } }