Пример #1
0
        private static void Start(string[] args)
        {
            _container = new Container(x =>
            {
                x.For <IMongoRepository>().Singleton().Use <MongoRepository>()
                .Ctor <string>("mongoConnectionString").Is(System.Configuration.ConfigurationManager.AppSettings["MongoDBConnectionString"])
                .Ctor <string>("mongoUsername").Is(System.Configuration.ConfigurationManager.AppSettings["MongoDBUsername"])
                .Ctor <string>("mongoPassword").Is(System.Configuration.ConfigurationManager.AppSettings["MongoDBPassword"])
                .Ctor <string>("certBase64").Is(System.Configuration.ConfigurationManager.AppSettings["MongoCertBase64"])
                .Ctor <string>("databaseName").Is(System.Configuration.ConfigurationManager.AppSettings["PersistanceDatabaseName"]);

                x.For <IAuditRepository>().Use <AuditRepository>()
                .Ctor <string>("auditCollecitonName").Is(System.Configuration.ConfigurationManager.AppSettings["PersistanceCollectionNameAudit"])
                .Ctor <string>("serviceMessagesCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["ServiceMessagesCollectionName"]);

                x.For <IErrorRepository>().Use <ErrorRepository>()
                .Ctor <string>("errorCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["PersistanceCollectionNameError"]);

                x.For <IHeartbeatRepository>().Use <HeartbeatRepository>()
                .Ctor <string>("heartbeatCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["PersistanceCollectionNameHeartbeat"])
                .Ctor <string>("servicesCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["ServiceDetailsCollectionName"]);

                x.For <IServiceRepository>().Use <ServiceRepository>()
                .Ctor <string>("servicesCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["ServiceDetailsCollectionName"]);

                x.For <IServiceMessageRepository>().Use <ServiceMessageRepository>()
                .Ctor <string>("serviceMessagesCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["ServiceMessagesCollectionName"]);

                x.For <IHeartbeatRepository>().Use <HeartbeatRepository>()
                .Ctor <string>("heartbeatCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["PersistanceCollectionNameHeartbeat"])
                .Ctor <string>("serviceCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["ServiceDetailsCollectionName"]);

                x.For <ITagRepository>().Use <TagRepository>()
                .Ctor <string>("tagCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["TagsCollectionName"]);

                x.For <ISettingsRepository>().Use <SettingsRepository>()
                .Ctor <string>("settingsCollectionName").Is(System.Configuration.ConfigurationManager.AppSettings["SettingsCollectionName"]);

                x.Scan(scan =>
                {
                    scan.TheCallingAssembly();
                    scan.WithDefaultConventions();
                });
            });

            var webAppConfig = new AuditConfig(_container);

            _webApp = WebApp.Start("https://*:" + System.Configuration.ConfigurationManager.AppSettings["Port"], app => webAppConfig.Configuration(app));



            var auditHub     = GlobalHost.ConnectionManager.GetHubContext <AuditHub>();
            var errorHub     = GlobalHost.ConnectionManager.GetHubContext <ErrorHub>();
            var heartbeatHub = GlobalHost.ConnectionManager.GetHubContext <HeartbeatHub>();

            var settingsRepository = _container.GetInstance <ISettingsRepository>();
            var settings           = settingsRepository.Get().GetAwaiter().GetResult();

            if (settings == null)
            {
                settings = new Settings
                {
                    Id                = Guid.NewGuid(),
                    Environments      = new List <Models.Environment>(),
                    KeepAuditsFor     = "7",
                    KeepErrorsFor     = "150",
                    KeepHeartbeatsFor = "7"
                };
                settingsRepository.Update(settings);
            }

            Globals.Settings = settings;

            foreach (var environment in settings.Environments)
            {
                // Two distinct connections one for receiving and one for sending that way publishing isn't delayed if the socket is busy pulling messages
                var receivingConnection = new Connection(environment);
                var sendingConnection   = new Connection(environment);

                var consumerEnvironment = new ConsumerEnvironment
                {
                    Server = environment.Server,
                    AuditMessageHandler     = new AuditMessageHandler(_container.GetInstance <IAuditRepository>(), auditHub),
                    ErrorMessageHandler     = new ErrorMessageHandler(_container.GetInstance <IErrorRepository>(), errorHub),
                    HeartbeatMessageHandler = new HearbeatMessageHandler(_container.GetInstance <IHeartbeatRepository>(), heartbeatHub),
                    ReceivingConnection     = receivingConnection,
                    SendingConnection       = sendingConnection,
                    AuditConsumer           = new ConsumerPool(receivingConnection),
                    ErrorConsumer           = new ConsumerPool(receivingConnection),
                    HeartbeatConsumer       = new ConsumerPool(receivingConnection),
                    Producer = new Producer(sendingConnection)
                };
                string forwardErrorQueue     = null;
                string forwardAuditQueue     = null;
                string forwardHeartbeatQueue = null;

                if (settings.ForwardAudit)
                {
                    forwardAuditQueue = settings.ForwardAuditQueue;
                }

                if (settings.ForwardErrors)
                {
                    forwardErrorQueue = settings.ForwardErrorQueue;
                }

                if (settings.ForwardHeartbeats)
                {
                    forwardHeartbeatQueue = settings.ForwardHeartbeatQueue;
                }

                consumerEnvironment.AuditConsumer.StartConsuming(consumerEnvironment.AuditMessageHandler.Execute, environment.AuditQueue, forwardAuditQueue);
                consumerEnvironment.ErrorConsumer.StartConsuming(consumerEnvironment.ErrorMessageHandler.Execute, environment.ErrorQueue, forwardErrorQueue);
                consumerEnvironment.HeartbeatConsumer.StartConsuming(consumerEnvironment.HeartbeatMessageHandler.Execute, environment.HeartbeatQueue, forwardHeartbeatQueue);

                Globals.Environments.Add(consumerEnvironment);
            }

            Globals.AuditExpiry = settings.KeepAuditsFor;
            var timer = new Timer(AuditCallback, settings, 0, 3600000);

            Globals.Timers["Audit"] = timer;
            Globals.ErrorExpiry     = settings.KeepErrorsFor;
            timer = new Timer(ErrorCallback, settings, 0, 3600000);
            Globals.Timers["Error"] = timer;
            Globals.HeartbeatExpiry = settings.KeepHeartbeatsFor;
            timer = new Timer(HeartbeatCallback, settings, 0, 3600000);
            Globals.Timers["Heartbeat"] = timer;

            _container.GetInstance <IAuditRepository>().EnsureIndex();
            _container.GetInstance <IErrorRepository>().EnsureIndex();
            _container.GetInstance <IHeartbeatRepository>().EnsureIndex();
            _container.GetInstance <IServiceMessageRepository>().EnsureIndex();
            _container.GetInstance <IServiceRepository>().EnsureIndex();
        }
        public async Task <Settings> UpdateSettings(Settings model)
        {
            if (string.IsNullOrEmpty(model.KeepAuditsFor))
            {
                model.KeepAuditsFor = "Forever";
            }

            if (string.IsNullOrEmpty(model.KeepErrorsFor))
            {
                model.KeepErrorsFor = "Forever";
            }

            if (string.IsNullOrEmpty(model.KeepHeartbeatsFor))
            {
                model.KeepHeartbeatsFor = "Forever";
            }

            await _settingsRepository.Update(model);

            if (model.ForwardAudit == false)
            {
                foreach (var consumerEnvironment in Globals.Environments)
                {
                    consumerEnvironment.AuditConsumer.SetForwardQueue(null);
                }
            }

            if (Globals.Settings.ForwardAuditQueue != model.ForwardAuditQueue)
            {
                foreach (var consumerEnvironment in Globals.Environments)
                {
                    consumerEnvironment.AuditConsumer.SetForwardQueue(model.ForwardAuditQueue);
                }
            }

            if (model.ForwardErrors == false)
            {
                foreach (var consumerEnvironment in Globals.Environments)
                {
                    consumerEnvironment.ErrorConsumer.SetForwardQueue(null);
                }
            }

            if (Globals.Settings.ForwardErrorQueue != model.ForwardErrorQueue)
            {
                foreach (var consumerEnvironment in Globals.Environments)
                {
                    consumerEnvironment.ErrorConsumer.SetForwardQueue(model.ForwardErrorQueue);
                }
            }

            if (model.ForwardHeartbeats == false)
            {
                foreach (var consumerEnvironment in Globals.Environments)
                {
                    consumerEnvironment.HeartbeatConsumer.SetForwardQueue(null);
                }
            }

            if (Globals.Settings.ForwardHeartbeatQueue != model.ForwardHeartbeatQueue)
            {
                foreach (var consumerEnvironment in Globals.Environments)
                {
                    consumerEnvironment.HeartbeatConsumer.SetForwardQueue(model.ForwardHeartbeatQueue);
                }
            }

            Globals.Settings = model;

            var auditHub     = GlobalHost.ConnectionManager.GetHubContext <AuditHub>();
            var errorHub     = GlobalHost.ConnectionManager.GetHubContext <ErrorHub>();
            var heartbeatHub = GlobalHost.ConnectionManager.GetHubContext <HeartbeatHub>();

            var environments = Globals.Environments;

            foreach (var environment in model.Environments)
            {
                var consumerEnvironment = environments.FirstOrDefault(x => x.Server == environment.Server &&
                                                                      x.Username == environment.Username &&
                                                                      x.Password == environment.Password &&
                                                                      x.SslEnabled == environment.SslEnabled &&
                                                                      x.CertBase64 == environment.CertBase64 &&
                                                                      x.CertPassword == environment.CertPassword &&
                                                                      x.AuditQueue == environment.AuditQueue &&
                                                                      x.ErrorQueue == environment.ErrorQueue &&
                                                                      x.HeartbeatQueue == environment.HeartbeatQueue);
                if (consumerEnvironment == null)
                {
                    var receivingConnection = new Connection(environment);
                    var sendingConnection   = new Connection(environment);

                    consumerEnvironment = new ConsumerEnvironment
                    {
                        Server = environment.Server,
                        AuditMessageHandler     = new AuditMessageHandler(_auditRepository, auditHub),
                        ErrorMessageHandler     = new ErrorMessageHandler(_errorRepository, errorHub),
                        HeartbeatMessageHandler = new HearbeatMessageHandler(_heartbeatRepository, heartbeatHub),
                        ReceivingConnection     = receivingConnection,
                        SendingConnection       = sendingConnection,
                        AuditConsumer           = new ConsumerPool(receivingConnection),
                        ErrorConsumer           = new ConsumerPool(receivingConnection),
                        HeartbeatConsumer       = new ConsumerPool(receivingConnection),
                        Producer = new Producer(sendingConnection)
                    };

                    string forwardErrorQueue     = null;
                    string forwardAuditQueue     = null;
                    string forwardHeartbeatQueue = null;

                    if (Globals.Settings.ForwardAudit)
                    {
                        forwardAuditQueue = Globals.Settings.ForwardAuditQueue;
                    }

                    if (Globals.Settings.ForwardErrors)
                    {
                        forwardErrorQueue = Globals.Settings.ForwardErrorQueue;
                    }

                    if (Globals.Settings.ForwardHeartbeats)
                    {
                        forwardHeartbeatQueue = Globals.Settings.ForwardHeartbeatQueue;
                    }

                    consumerEnvironment.AuditConsumer.StartConsuming(consumerEnvironment.AuditMessageHandler.Execute, environment.AuditQueue, forwardAuditQueue);
                    consumerEnvironment.ErrorConsumer.StartConsuming(consumerEnvironment.ErrorMessageHandler.Execute, environment.ErrorQueue, forwardErrorQueue);
                    consumerEnvironment.HeartbeatConsumer.StartConsuming(consumerEnvironment.HeartbeatMessageHandler.Execute, environment.HeartbeatQueue, forwardHeartbeatQueue);
                }
            }

            var environmentsToRemove = new List <ConsumerEnvironment>();

            foreach (var consumerEnvironment in environments)
            {
                var environment = model.Environments.FirstOrDefault(x => x.Server == consumerEnvironment.Server &&
                                                                    x.Username == consumerEnvironment.Username &&
                                                                    x.Password == consumerEnvironment.Password &&
                                                                    x.SslEnabled == consumerEnvironment.SslEnabled &&
                                                                    x.CertBase64 == consumerEnvironment.CertBase64 &&
                                                                    x.CertPassword == consumerEnvironment.CertPassword &&
                                                                    x.AuditQueue == consumerEnvironment.AuditQueue &&
                                                                    x.ErrorQueue == consumerEnvironment.ErrorQueue &&
                                                                    x.HeartbeatQueue == consumerEnvironment.HeartbeatQueue);
                if (environment == null)
                {
                    environmentsToRemove.Add(consumerEnvironment);
                }
            }

            foreach (var consumerEnvironment in environmentsToRemove)
            {
                consumerEnvironment.AuditMessageHandler.Dispose();
                consumerEnvironment.ErrorMessageHandler.Dispose();
                consumerEnvironment.HeartbeatMessageHandler.Dispose();
                consumerEnvironment.AuditConsumer.Dispose();
                consumerEnvironment.ErrorConsumer.Dispose();
                consumerEnvironment.HeartbeatConsumer.Dispose();
                consumerEnvironment.Producer.Dispose();
                consumerEnvironment.ReceivingConnection.Dispose();
                consumerEnvironment.SendingConnection.Dispose();
                environments.Remove(consumerEnvironment);
            }

            return(model);
        }