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);
            }
        }
Exemplo n.º 2
0
        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));
            }
        }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
        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";
        }