コード例 #1
0
            public void ReturnsRoutesAndLogsWithInclusions()
            {
                //ReflectionTypeLoadException exception = null;
                //var attempts = 0;

                //do
                //{
                //    attempts++;
                //    exception = null;

                //    try
                //    {
                var logger  = new InMemoryLogger();
                var scanner = new RouteScanner {
                    Logger = logger
                };

                scanner.Include(Assembly.GetExecutingAssembly());
                logger.Logs.ShouldBeEmpty();

                var routes = scanner.Scan();

                routes.ShouldNotBeNull();
                routes.Count.ShouldBe(2);
                logger.Logs.ShouldNotBeEmpty();
                //    }
                //    catch (ReflectionTypeLoadException ex)
                //    {
                //        exception = ex;
                //        Thread.Sleep(231);
                //    }
                //} while (exception != null || attempts > 5);

                //if (exception != null) throw exception;
            }
コード例 #2
0
        public void ScannerShouldInstantiateScannerControllerWithInjectedDependencies()
        {
            const string TestRoute = "/scannercontroller/get2";

            var test = new TestDependency();

            IoC.RegisterInstance <ITestDependency>(nameof(ITestDependency), test);

            var logger = new TestLogger();

            IoC.RegisterInstance <IChromelyLogger>(nameof(IChromelyLogger), logger);

            var scanner       = new RouteScanner(Assembly.GetExecutingAssembly());
            var routeCommands = scanner.Scan();

            foreach (var route in routeCommands.Item1)
            {
                ServiceRouteProvider.AddRoute(route.Key, route.Value);
            }

            foreach (var command in routeCommands.Item2)
            {
                ServiceRouteProvider.AddCommand(command.Key, command.Value);
            }

            var request = new ChromelyRequest(new RoutePath(Method.GET, TestRoute), null, null);

            var routePath   = new RoutePath(Method.GET, TestRoute);
            var get2        = ServiceRouteProvider.GetRoute(routePath);
            var getResponse = get2.Invoke(request);

            Assert.Equal(TestDependency.TestDependencyResponse, getResponse.Data.ToString());
            Assert.Equal(ScannerControllerWithDependencyInjection.Get2Response, logger.Message);
        }
コード例 #3
0
            public void ReturnsRoutesAndLogs()
            {
                //ReflectionTypeLoadException exception = null;
                //var attempts = 0;

                //do
                //{
                //    attempts++;
                //    exception = null;

                //    try
                //    {
                var logger  = new InMemoryLogger();
                var scanner = new RouteScanner {
                    Logger = logger
                };

                logger.Logs.ShouldBeEmpty();

                var routes = scanner.Scan();

                routes.ShouldNotBeNull();
                routes.ShouldNotBeEmpty();
                routes.Count.ShouldBeGreaterThanOrEqualTo(2);
                logger.Logs.ShouldNotBeEmpty();
                //    }
                //    catch (ReflectionTypeLoadException ex)
                //    {
                //        exception = ex;
                //        Thread.Sleep(417);
                //    }
                //} while (exception != null || attempts > 5);

                //if (exception != null) throw exception;
            }
コード例 #4
0
        public void AllAdminRoutesHaveCorrectAuthorizationStatus()
        {
            var routes = RouteScanner.Scan(attr =>
                                           attr.Path.Contains("/admin/") && (attr.RequiredAuthorization != AuthorizationStatus.ClusterAdmin &&
                                                                             attr.RequiredAuthorization != AuthorizationStatus.Operator &&
                                                                             attr.RequiredAuthorization != AuthorizationStatus.DatabaseAdmin));

            Assert.Empty(routes);
        }
コード例 #5
0
        public void AllAdminAuthorizationStatusHaveCorrectRoutes()
        {
            var routes = RouteScanner.Scan(attr =>
                                           !attr.Path.Contains("/admin/") && (attr.RequiredAuthorization == AuthorizationStatus.Operator ||
                                                                              attr.RequiredAuthorization == AuthorizationStatus.Operator ||
                                                                              attr.RequiredAuthorization == AuthorizationStatus.DatabaseAdmin));

            Assert.Empty(routes);
        }
        public void FullScan()
        {
            var sampleDataStream = TestUtils.LoadResourceStream("TestData.MapBuilder_PartialMapRead.txt");
            var dataRoot         = new DefReader().LoadDataFromStream(sampleDataStream, CancellationToken.None);
            var mapResult        = new TradeMapBuilder().Build(dataRoot, CancellationToken.None);

            var routeScanner = new RouteScanner();

            routeScanner.SetLogging(TestUtils.GetTraceLogger());
            var scanResult = routeScanner.Scan(mapResult, new RouteScannerOptions(), CancellationToken.None);
        }
コード例 #7
0
            public void ReturnsRoutesAndLogsWithExclusions()
            {
                var logger  = new InMemoryLogger();
                var scanner = new RouteScanner {
                    Logger = logger
                };

                logger.Logs.ShouldBeEmpty();

                var routesBefore = scanner.Scan();

                scanner.Exclude(Assembly.GetExecutingAssembly());

                var routesAfter = scanner.Scan();

                routesBefore.ShouldNotBeNull();
                routesAfter.ShouldNotBeNull();
                (routesBefore.Count - routesAfter.Count).ShouldBe(2);
                logger.Logs.ShouldNotBeEmpty();
            }
コード例 #8
0
ファイル: HostBase.cs プロジェクト: tjloved/Chromely
        /// <summary>
        /// The scan assemblies.
        /// </summary>
        public void ScanAssemblies()
        {
            if ((HostConfig?.ServiceAssemblies == null) || (HostConfig?.ServiceAssemblies.Count == 0))
            {
                return;
            }

            foreach (var assembly in HostConfig?.ServiceAssemblies)
            {
                if (!assembly.IsScanned)
                {
                    var scanner = new RouteScanner(assembly.Assembly);
                    var currentRouteDictionary   = scanner.Scan().Item1;
                    var currentCommandDictionary = scanner.Scan().Item2;
                    ServiceRouteProvider.MergeRoutes(currentRouteDictionary);
                    ServiceRouteProvider.MergeCommands(currentCommandDictionary);

                    assembly.IsScanned = true;
                }
            }
        }
コード例 #9
0
        public void ScanAssemblies()
        {
            if ((ServiceAssemblies == null) || (ServiceAssemblies.Count == 0))
            {
                return;
            }

            foreach (var assembly in ServiceAssemblies)
            {
                RouteScanner scanner = new RouteScanner(assembly);
                Dictionary <string, Route> currentRouteDictionary = scanner.Scan();
                ServiceRouteProvider.MergeRoutes(currentRouteDictionary);
            }
        }
コード例 #10
0
        public void ScanTest()
        {
            // Note that the current assembly scan will include this file
            // And all other routes defined in other files in the assembly
            var scanner = new RouteScanner(Assembly.GetExecutingAssembly());

            Assert.NotNull(scanner);

            var result = scanner.Scan();

            Assert.NotNull(result);

            Assert.Equal(9, result.Count);
        }
コード例 #11
0
        /// <summary>
        /// The scan assemblies.
        /// </summary>
        public void ScanAssemblies()
        {
            if ((this.ServiceAssemblies == null) ||
                (this.ServiceAssemblies.Count == 0))
            {
                return;
            }

            foreach (var assembly in this.ServiceAssemblies)
            {
                var scanner = new RouteScanner(assembly);
                var currentRouteDictionary = scanner.Scan();
                ServiceRouteProvider.MergeRoutes(currentRouteDictionary);
            }
        }
コード例 #12
0
            public void ReturnsRoutesAndLogsWithInclusions()
            {
                var logger  = new InMemoryLogger();
                var scanner = new RouteScanner {
                    Logger = logger
                };

                scanner.Include(Assembly.GetExecutingAssembly());
                logger.Logs.ShouldBeEmpty();

                var routes = scanner.Scan();

                routes.ShouldNotBeNull();
                routes.Count.ShouldBe(2);
                logger.Logs.ShouldNotBeEmpty();
            }
コード例 #13
0
            public void ReturnsRoutesAndLogs()
            {
                var logger  = new InMemoryLogger();
                var scanner = new RouteScanner {
                    Logger = logger
                };

                logger.Logs.ShouldBeEmpty();

                var routes = scanner.Scan();

                routes.ShouldNotBeNull();
                routes.ShouldNotBeEmpty();
                routes.Count.ShouldBeGreaterThanOrEqualTo(2);
                logger.Logs.ShouldNotBeEmpty();
            }
コード例 #14
0
        public void AllAdminAuthorizationStatusHaveCorrectRoutes()
        {
            var routesToIgnore = new HashSet <string>
            {
                "/monitoring/snmp/oids",
                "/monitoring/snmp"
            };

            var routes = RouteScanner.Scan(attr =>
                                           routesToIgnore.Contains(attr.Path) == false &&
                                           !attr.Path.Contains("/admin/") &&
                                           (attr.RequiredAuthorization == AuthorizationStatus.ClusterAdmin ||
                                            attr.RequiredAuthorization == AuthorizationStatus.Operator ||
                                            attr.RequiredAuthorization == AuthorizationStatus.DatabaseAdmin));

            Assert.Empty(routes);
        }
コード例 #15
0
ファイル: HostBase.cs プロジェクト: jovian007/Chromely
        /// <summary>
        /// The scan assemblies.
        /// </summary>
        public void ScanAssemblies()
        {
            if ((this.HostConfig?.ServiceAssemblies == null) || (this.HostConfig?.ServiceAssemblies.Count == 0))
            {
                return;
            }

            foreach (var assembly in this.HostConfig?.ServiceAssemblies)
            {
                if (!assembly.IsScanned)
                {
                    RouteScanner scanner = new RouteScanner(assembly.Assembly);
                    Dictionary <string, Route> currentRouteDictionary = scanner.Scan();
                    ServiceRouteProvider.MergeRoutes(currentRouteDictionary);

                    assembly.IsScanned = true;
                }
            }
        }
コード例 #16
0
        public void ScanAssemblies()
        {
            if ((_config?.ControllerAssemblies == null) || (_config?.ControllerAssemblies.Count == 0))
            {
                return;
            }

            foreach (var assembly in _config?.ControllerAssemblies)
            {
                if (!assembly.IsScanned)
                {
                    var scanner       = new RouteScanner(assembly.Assembly, _container);
                    var scanResult    = scanner.Scan();
                    var actionRoutes  = scanResult?.Item1;
                    var commandRoutes = scanResult?.Item2;
                    ServiceRouteProvider.RegisterActionRoutes(_container, actionRoutes);
                    ServiceRouteProvider.RegisterCommnandRoutes(_container, commandRoutes);

                    assembly.IsScanned = true;
                }
            }
        }
コード例 #17
0
        //public Task<RouteScannerResults> Scan(CancellationToken ct)
        public RouteScannerResults Scan(CancellationToken ct)
        {
            State = ScanWorkerState.Working;
            try
            {
                ct.ThrowIfCancellationRequested();

                // Make the root node
                var rootNode = new DefNode();

                // Read def files
                var defReader = new DefReader();
                defReader.ProgressEvents.ProgressEvent += new EventHandler <ProgressEventArgs>((sender, args) => {
                    DoProgressEvent(sender, args);
                });
                foreach (var filepath in _defFiles)
                {
                    ct.ThrowIfCancellationRequested();
                    defReader.LoadDataFromFile(filepath, rootNode, ct);
                }


                // Build map
                var mapBuilder = new TradeMapBuilder();
                mapBuilder.ProgressEvents.ProgressEvent += new EventHandler <ProgressEventArgs>((sender, args) => {
                    DoProgressEvent(sender, args);
                });
                ct.ThrowIfCancellationRequested();
                var map = mapBuilder.Build(rootNode, ct);

                // Check that there are systems in the map
                if (map.Systems.Count == 0)
                {
                    DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Error, "No systems were found. Are the correct def files selected?"));
                    //return Task.FromResult(new RouteScannerResults() { Successful = false });
                    return(new RouteScannerResults()
                    {
                        Successful = false
                    });
                }

                // Scan for runs & routes
                var tradeScanner = new RouteScanner();
                tradeScanner.ProgressEvents.ProgressEvent += new EventHandler <ProgressEventArgs>((sender, args) => {
                    DoProgressEvent(sender, args);
                });
                ct.ThrowIfCancellationRequested();
                var results = tradeScanner.Scan(map, _options, ct);

                DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Complete, "Route scanning complete"));

                // Done
                //return Task.FromResult(results);
                return(results);
            }
            catch (OperationCanceledException)
            {
                // Operation was cancelled. Stop gracefully.

                DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Complete, "Cancelled"));
                //return Task.FromResult(new RouteScannerResults() { Successful = false });
                return(new RouteScannerResults()
                {
                    Successful = false
                });
            }
            catch (Exception ex)
            {
                DoProgressEvent(this, new ProgressEventArgs(ProgressEventStatus.Error, $"An error occurred: {ex.GetType().ToString()}\n{ex.Message}"));
                //return Task.FromResult(new RouteScannerResults() { Successful = false });
                return(new RouteScannerResults()
                {
                    Successful = false
                });
            }
            finally
            {
                State = ScanWorkerState.Idle;
            }
        }
コード例 #18
0
        public void Initialize()
        {
            var sp = Stopwatch.StartNew();

            try
            {
                ServerStore.Initialize();
            }
            catch (Exception e)
            {
                if (_logger.IsOperationsEnabled)
                {
                    _logger.Operations("Could not open the server store", e);
                }
                throw;
            }

            if (_logger.IsInfoEnabled)
            {
                _logger.Info(string.Format("Server store started took {0:#,#;;0} ms", sp.ElapsedMilliseconds));
            }

            sp.Restart();

            Router = new RequestRouter(RouteScanner.Scan(), this);

            try
            {
                _webHost = new WebHostBuilder()
                           .CaptureStartupErrors(captureStartupErrors: true)
                           .UseKestrel(options =>
                {
                    options.ShutdownTimeout = TimeSpan.FromSeconds(1);
                })
                           .UseUrls(Configuration.Core.ServerUrl)
                           .UseStartup <RavenServerStartup>()
                           .ConfigureServices(services =>
                {
                    services.AddSingleton(Router);
                    services.AddSingleton(this);
                    services.Configure <FormOptions>(options =>
                    {
                        options.MultipartBodyLengthLimit = long.MaxValue;
                    });
                })
                           // ReSharper disable once AccessToDisposedClosure
                           .Build();
                if (_logger.IsInfoEnabled)
                {
                    _logger.Info("Initialized Server...");
                }
            }
            catch (Exception e)
            {
                if (_logger.IsInfoEnabled)
                {
                    _logger.Info("Could not configure server", e);
                }
                throw;
            }

            if (_logger.IsInfoEnabled)
            {
                _logger.Info(string.Format("Configuring HTTP server took {0:#,#;;0} ms", sp.ElapsedMilliseconds));
            }

            try
            {
                _webHost.Start();
                _tcpListenerTask = StartTcpListener();
            }
            catch (Exception e)
            {
                if (_logger.IsOperationsEnabled)
                {
                    _logger.Operations("Could not start server", e);
                }
                throw;
            }

            try
            {
                _latestVersionCheck.Initialize();
            }
            catch (Exception e)
            {
                if (_logger.IsInfoEnabled)
                {
                    _logger.Info("Could not setup latest version check.", e);
                }
            }

            try
            {
                LicenseManager.Initialize();
            }
            catch (Exception e)
            {
                if (_logger.IsInfoEnabled)
                {
                    _logger.Info("Could not setup license check.", e);
                }

                ServerStore.Alerts.AddAlert(new Alert
                {
                    Type     = AlertType.LicenseManagerInitializationError,
                    Key      = nameof(AlertType.LicenseManagerInitializationError),
                    Severity = AlertSeverity.Info,
                    Content  = new LicenseManager.InitializationErrorAlertContent(e),
                    Message  = LicenseManager.InitializationErrorAlertContent.FormatMessage()
                });
            }
        }
コード例 #19
0
        public void Initialize()
        {
            var sp          = Stopwatch.StartNew();
            var clusterCert = InitializeClusterCertificate(out var httpsCert);

            try
            {
                ServerStore.Initialize();
            }
            catch (Exception e)
            {
                if (Logger.IsOperationsEnabled)
                {
                    Logger.Operations("Could not open the server store", e);
                }
                throw;
            }

            if (Logger.IsInfoEnabled)
            {
                Logger.Info(string.Format("Server store started took {0:#,#;;0} ms", sp.ElapsedMilliseconds));
            }

            sp.Restart();
            ListenToPipes().IgnoreUnobservedExceptions();
            Router = new RequestRouter(RouteScanner.Scan(), this);

            try
            {
                void ConfigureKestrel(KestrelServerOptions options)
                {
                    options.Limits.MaxRequestLineSize     = (int)Configuration.Http.MaxRequestLineSize.GetValue(SizeUnit.Bytes);
                    options.Limits.MaxRequestBodySize     = null;   // no limit!
                    options.Limits.MinResponseDataRate    = null;   // no limit!
                    options.Limits.MinRequestBodyDataRate = null;   // no limit!

                    if (Configuration.Http.MinDataRatePerSecond.HasValue && Configuration.Http.MinDataRateGracePeriod.HasValue)
                    {
                        options.Limits.MinResponseDataRate    = new MinDataRate(Configuration.Http.MinDataRatePerSecond.Value.GetValue(SizeUnit.Bytes), Configuration.Http.MinDataRateGracePeriod.Value.AsTimeSpan);
                        options.Limits.MinRequestBodyDataRate = new MinDataRate(Configuration.Http.MinDataRatePerSecond.Value.GetValue(SizeUnit.Bytes), Configuration.Http.MinDataRateGracePeriod.Value.AsTimeSpan);
                    }

                    if (Configuration.Http.MaxRequestBufferSize.HasValue)
                    {
                        options.Limits.MaxRequestBufferSize = Configuration.Http.MaxRequestBufferSize.Value.GetValue(SizeUnit.Bytes);
                    }

                    var actualCert = httpsCert ?? clusterCert;

                    if (actualCert != null)
                    {
                        var adapterOptions = new HttpsConnectionAdapterOptions
                        {
                            ServerCertificate          = actualCert.Certificate,
                            CheckCertificateRevocation = true,
                            ClientCertificateMode      = ClientCertificateMode.AllowCertificate,
                            SslProtocols = SslProtocols.Tls12,
                            ClientCertificateValidation = (cert, chain, errors) =>
                                                          // Here we are explicitly ignoring trust chain issues for client certificates
                                                          // this is because we don't actually require trust, we just use the certificate
                                                          // as a way to authenticate. The admin is going to tell us which specific certs
                                                          // we can trust anyway, so we can ignore such errors.
                                                          errors == SslPolicyErrors.RemoteCertificateChainErrors || errors == SslPolicyErrors.None
                        };

                        var uri         = new Uri(Configuration.Core.ServerUrl);
                        var host        = uri.DnsSafeHost;
                        var ipAddresses = GetListenIpAddresses(host);

                        var loggerFactory = options.ApplicationServices.GetRequiredService <ILoggerFactory>();
                        var adapter       = new AuthenticatingAdapter(this, new HttpsConnectionAdapter(adapterOptions, loggerFactory));

                        foreach (var address in ipAddresses)
                        {
                            options.Listen(address, uri.Port, listenOptions => { listenOptions.ConnectionAdapters.Add(adapter); });
                        }
                    }
                }

                _webHost = new WebHostBuilder()
                           .CaptureStartupErrors(captureStartupErrors: true)
                           .UseKestrel(ConfigureKestrel)
                           .UseUrls(Configuration.Core.ServerUrl)
                           .UseStartup <RavenServerStartup>()
                           .UseShutdownTimeout(TimeSpan.FromSeconds(1))
                           .ConfigureServices(services =>
                {
                    if (Configuration.Http.UseResponseCompression)
                    {
                        services.Configure <ResponseCompressionOptions>(options =>
                        {
                            options.EnableForHttps = Configuration.Http.AllowResponseCompressionOverHttps;
                            options.Providers.Add(typeof(GzipCompressionProvider));
                            options.Providers.Add(typeof(DeflateCompressionProvider));
                        });

                        services.Configure <GzipCompressionProviderOptions>(options =>
                        {
                            options.Level = Configuration.Http.GzipResponseCompressionLevel;
                        });

                        services.Configure <DeflateCompressionProviderOptions>(options =>
                        {
                            options.Level = Configuration.Http.DeflateResponseCompressionLevel;
                        });

                        services.AddResponseCompression();
                    }

                    services.AddSingleton(Router);
                    services.AddSingleton(this);
                    services.Configure <FormOptions>(options =>
                    {
                        options.MultipartBodyLengthLimit = long.MaxValue;
                    });
                })
                           // ReSharper disable once AccessToDisposedClosure
                           .Build();

                ClusterCertificateHolder = ClusterCertificateHolder ?? httpsCert ?? new CertificateHolder();
            }
            catch (Exception e)
            {
                if (Logger.IsInfoEnabled)
                {
                    Logger.Info("Could not configure server", e);
                }
                throw;
            }

            if (Logger.IsInfoEnabled)
            {
                Logger.Info(string.Format("Configuring HTTP server took {0:#,#;;0} ms", sp.ElapsedMilliseconds));
            }

            try
            {
                _webHost.Start();

                var serverAddressesFeature = _webHost.ServerFeatures.Get <IServerAddressesFeature>();
                WebUrl = GetWebUrl(serverAddressesFeature.Addresses.First()).TrimEnd('/');

                if (Logger.IsInfoEnabled)
                {
                    Logger.Info($"Initialized Server... {WebUrl}");
                }

                ServerStore.TriggerDatabases();

                _tcpListenerStatus = StartTcpListener();

                StartSnmp();
            }
            catch (Exception e)
            {
                if (Logger.IsOperationsEnabled)
                {
                    Logger.Operations("Could not start server", e);
                }
                throw;
            }
        }