private void Heartbeat_Elapsed(object sender, ElapsedEventArgs e) { int statusCode = 0; try { // Update LastReportedOn Heartbeat.LastReportedOn = DateTime.UtcNow; // Send HeartBeat to the Server statusCode = AgentsAPIManager.SendAgentHeartBeat( _authAPIManager, _connectionSettingsManager.ConnectionSettings.AgentId, Heartbeat); if (statusCode != 201) { _connectionSettingsManager.ConnectionSettings.ServerConnectionEnabled = false; _connectionSettingsManager.UpdateConnectionSettings(_connectionSettingsManager.ConnectionSettings); } } catch (Exception ex) { _fileLogger.LogEvent("HeartBeat", $"Status Code: {statusCode} || Exception: {ex.ToString()}", LogEventLevel.Error); _connectionSettingsManager.ConnectionSettings.ServerConnectionEnabled = false; _connectionSettingsManager.UpdateConnectionSettings(_connectionSettingsManager.ConnectionSettings); // Invoke event to Stop Server Communication ServerConnectionLostEvent?.Invoke(this, EventArgs.Empty); } }
public ServerResponse Connect(ServerConnectionSettings connectionSettings) { // Initialize File Logger for Debug Purpose _fileLogger.Initialize(new EnvironmentSettings().GetEnvironmentVariablePath(connectionSettings.DNSHost, connectionSettings.UserName)); // Log Event _fileLogger.LogEvent("Connect", "Attempt to connect to the Server"); _connectionSettingsManager.ConnectionSettings = connectionSettings; // Initialize AuthAPIManager _authAPIManager.Initialize(_connectionSettingsManager.ConnectionSettings); try { // Authenticate Agent _authAPIManager.GetToken(); // API Call to Connect var connectAPIResponse = AgentsAPIManager.ConnectAgent(_authAPIManager, _connectionSettingsManager.ConnectionSettings = _authAPIManager.ConnectionSettings); // Update Server Settings _connectionSettingsManager.ConnectionSettings.ServerConnectionEnabled = true; _connectionSettingsManager.ConnectionSettings.AgentId = connectAPIResponse.Data.AgentId.ToString(); _connectionSettingsManager.ConnectionSettings.AgentName = connectAPIResponse.Data.AgentName.ToString(); // Start Server Communication StartServerCommunication(); // Send Response to Agent return(new ServerResponse(_connectionSettingsManager.ConnectionSettings, connectAPIResponse.StatusCode.ToString())); } catch (Exception ex) { // Update Server Settings _connectionSettingsManager.ConnectionSettings.ServerConnectionEnabled = false; _connectionSettingsManager.ConnectionSettings.AgentId = string.Empty; _connectionSettingsManager.ConnectionSettings.AgentName = string.Empty; string errorMessage; var errorCode = ex.GetType().GetProperty("ErrorCode")?.GetValue(ex, null)?.ToString() ?? string.Empty; errorMessage = ex.GetType().GetProperty("ErrorContent")?.GetValue(ex, null)?.ToString() ?? ex.Message; // Log Event (Error) _fileLogger.LogEvent("Connect", $"Error occurred while connecting to the Server; " + $"Error Code = {errorCode}; Error Message = {errorMessage}", LogEventLevel.Error); // Send Response to Agent return(new ServerResponse(null, errorCode, errorMessage)); } }
private void SendHeartbeat() { int statusCode = 0; try { // Update LastReportedOn Heartbeat.LastReportedOn = DateTime.UtcNow; // Send HeartBeat to the Server var apiResponse = AgentsAPIManager.SendAgentHeartBeat( _authAPIManager, _connectionSettingsManager.ConnectionSettings.AgentId, Heartbeat); statusCode = apiResponse.StatusCode; if (statusCode != 200) { _connectionSettingsManager.ConnectionSettings.ServerConnectionEnabled = false; _connectionSettingsManager.UpdateConnectionSettings(_connectionSettingsManager.ConnectionSettings); } else if (apiResponse.Data?.AssignedJob != null) { ExecutionManager.JobsQueueManager.EnqueueJob(apiResponse.Data.AssignedJob); // Log Event _fileLogger.LogEvent("Job Fetch", "Job fetched and queued for execution"); } } catch (Exception ex) { _fileLogger.LogEvent("HeartBeat", $"Status Code: {statusCode} || Exception: {ex.ToString()}", LogEventLevel.Error); _connectionSettingsManager.ConnectionSettings.ServerConnectionEnabled = false; _connectionSettingsManager.UpdateConnectionSettings(_connectionSettingsManager.ConnectionSettings); // Invoke event to Stop Server Communication ServerConnectionLostEvent?.Invoke(this, EventArgs.Empty); } }
public ServerResponse Disconnect(ServerConnectionSettings connectionSettings) { // Log Event _fileLogger.LogEvent("Disconnect", "Attempt to disconnect from the Server"); try { // API Call to Disconnect var apiResponse = AgentsAPIManager.DisconnectAgent(_authAPIManager, _connectionSettingsManager.ConnectionSettings); // Update settings _connectionSettingsManager.ConnectionSettings.ServerConnectionEnabled = false; _connectionSettingsManager.ConnectionSettings.AgentId = string.Empty; _connectionSettingsManager.ConnectionSettings.AgentName = string.Empty; // Stop Server Communication StopServerCommunication(); // UnInitialize Configuration _authAPIManager.UnInitialize(); // Form Server Response return(new ServerResponse(_connectionSettingsManager.ConnectionSettings, apiResponse.StatusCode.ToString())); } catch (Exception ex) { var errorCode = ex.GetType().GetProperty("ErrorCode")?.GetValue(ex, null)?.ToString() ?? string.Empty; var errorMessage = ex.GetType().GetProperty("ErrorContent")?.GetValue(ex, null)?.ToString() ?? ex.Message; // Log Event (Error) _fileLogger.LogEvent("Disconnect", $"Error occurred while disconnecting from the Server; " + $"Error Code = {errorCode}; Error Message = {errorMessage}", LogEventLevel.Error); // Form Server Response return(new ServerResponse(null, errorCode, errorMessage)); } }
private void ExecuteJob() { // Log Event _fileLogger.LogEvent("Job Execution", "Job execution started"); // Peek Job var job = JobsQueueManager.PeekJob(); // Log Event _fileLogger.LogEvent("Job Execution", "Attempt to fetch Automation Detail"); // Get Automation Info var automation = AutomationsAPIManager.GetAutomation(_authAPIManager, job.AutomationId.ToString()); // Update LastReportedMessage and LastReportedWork _agentHeartbeat.LastReportedMessage = "Job execution started"; _agentHeartbeat.LastReportedWork = automation.Name; // Log Event _fileLogger.LogEvent("Job Execution", "Attempt to download/retrieve Automation"); string connectedUserName = _connectionSettingsManager.ConnectionSettings.UserName; string userDomainName = _connectionSettingsManager.ConnectionSettings.DNSHost; // Download Automation and Extract Files and Return File Paths of ProjectConfig and MainScript automation.AutomationEngine = string.IsNullOrEmpty(automation.AutomationEngine) ? "OpenBots" : automation.AutomationEngine; string configFilePath; string executionDirPath; var mainScriptFilePath = AutomationManager.DownloadAndExtractAutomation(_authAPIManager, automation, job.Id.ToString(), userDomainName, connectedUserName, out executionDirPath, out configFilePath); // Install Project Dependencies List <string> assembliesList = null; if (automation.AutomationEngine == "OpenBots") { NugetPackageManager.InstallProjectDependencies(configFilePath, userDomainName, connectedUserName); assembliesList = NugetPackageManager.LoadPackageAssemblies(configFilePath, userDomainName, connectedUserName); } // Log Event _fileLogger.LogEvent("Job Execution", "Attempt to update Job Status (Pre-execution)"); // Create Automation Execution Log (Execution Started) _executionLog = ExecutionLogsAPIManager.CreateExecutionLog(_authAPIManager, new AutomationExecutionLog( null, false, null, DateTime.UtcNow, null, null, null, null, null, job.Id, job.AutomationId, job.AgentId, DateTime.UtcNow, null, null, null, "Job has started processing")); // Update Job Status (InProgress) JobsAPIManager.UpdateJobStatus(_authAPIManager, job.AgentId.ToString(), job.Id.ToString(), JobStatusType.InProgress, new JobErrorViewModel()); // Update Job Start Time JobsAPIManager.UpdateJobPatch(_authAPIManager, job.Id.ToString(), new List <Operation>() { new Operation() { Op = "replace", Path = "/startTime", Value = DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'") } }); // Log Event _fileLogger.LogEvent("Job Execution", "Attempt to execute process"); AgentViewModel agent = AgentsAPIManager.GetAgent(_authAPIManager, job.AgentId.ToString()); var userCredential = CredentialsAPIManager.GetCredentials(_authAPIManager, agent.CredentialId.ToString()); MachineCredential credential = new MachineCredential { Name = userCredential.Name, Domain = userCredential.Domain, UserName = userCredential.UserName, PasswordSecret = userCredential.PasswordSecret }; // Run Automation RunAutomation(job, automation, credential, mainScriptFilePath, executionDirPath, assembliesList); // Log Event _fileLogger.LogEvent("Job Execution", "Job execution completed"); // Log Event _fileLogger.LogEvent("Job Execution", "Attempt to update Job Status (Post-execution)"); // Update Job End Time JobsAPIManager.UpdateJobPatch(_authAPIManager, job.Id.ToString(), new List <Operation>() { new Operation() { Op = "replace", Path = "/endTime", Value = DateTime.UtcNow.ToString("yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'") }, new Operation() { Op = "replace", Path = "/isSuccessful", Value = true } }); // Delete Job Directory try { Directory.Delete(executionDirPath, true); } catch (Exception) { // Appended 'Long Path Specifier' before the Directory Path Directory.Delete(@"\\?\" + executionDirPath, true); } // Update Automation Execution Log (Execution Finished) _executionLog.CompletedOn = DateTime.UtcNow; _executionLog.Status = "Job has finished processing"; ExecutionLogsAPIManager.UpdateExecutionLog(_authAPIManager, _executionLog); // Update Job Status (Completed) JobsAPIManager.UpdateJobStatus(_authAPIManager, job.AgentId.ToString(), job.Id.ToString(), JobStatusType.Completed, new JobErrorViewModel()); _fileLogger.LogEvent("Job Execution", "Job status updated. Removing from queue."); // Dequeue the Job JobsQueueManager.DequeueJob(); _isSuccessfulExecution = true; _agentHeartbeat.LastReportedMessage = "Job execution completed"; }