Ejemplo n.º 1
0
        void RegisterCommonModule(
            ContainerBuilder builder,
            bool optimizeForPerformance,
            StoreAndForward storeAndForward,
            MetricsConfig metricsConfig,
            bool nestedEdgeEnabled)
        {
            bool            cacheTokens        = this.configuration.GetValue("CacheTokens", false);
            Option <string> workloadUri        = this.GetConfigurationValueIfExists <string>(Constants.ConfigKey.WorkloadUri);
            Option <string> workloadApiVersion = this.GetConfigurationValueIfExists <string>(Constants.ConfigKey.WorkloadAPiVersion);
            Option <string> moduleGenerationId = this.GetConfigurationValueIfExists <string>(Constants.ConfigKey.ModuleGenerationId);
            bool            hasParentEdge      = this.GetConfigurationValueIfExists <string>(Constants.ConfigKey.GatewayHostname).HasValue;

            if (!Enum.TryParse(this.configuration.GetValue("AuthenticationMode", string.Empty), true, out AuthenticationMode authenticationMode))
            {
                authenticationMode = AuthenticationMode.Scope;
            }

            int      scopeCacheRefreshRateSecs = this.configuration.GetValue("DeviceScopeCacheRefreshRateSecs", 3600);
            TimeSpan scopeCacheRefreshRate     = TimeSpan.FromSeconds(scopeCacheRefreshRateSecs);

            int      scopeCacheRefreshDelaySecs = this.configuration.GetValue("DeviceScopeCacheRefreshDelaySecs", 120);
            TimeSpan scopeCacheRefreshDelay     = TimeSpan.FromSeconds(scopeCacheRefreshDelaySecs);

            string proxy       = this.configuration.GetValue("https_proxy", string.Empty);
            string productInfo = GetProductInfo();

            // Register modules
            builder.RegisterModule(
                new CommonModule(
                    productInfo,
                    this.iotHubHostname,
                    this.gatewayHostname,
                    this.edgeDeviceId,
                    this.edgeModuleId,
                    this.edgeDeviceHostName,
                    moduleGenerationId,
                    authenticationMode,
                    this.connectionString,
                    optimizeForPerformance,
                    storeAndForward.UsePersistentStorage,
                    storeAndForward.StoragePath,
                    workloadUri,
                    workloadApiVersion,
                    scopeCacheRefreshRate,
                    scopeCacheRefreshDelay,
                    cacheTokens,
                    this.trustBundle,
                    proxy,
                    metricsConfig,
                    storeAndForward.UseBackupAndRestore,
                    storeAndForward.StorageBackupPath,
                    storeAndForward.StorageMaxTotalWalSize,
                    storeAndForward.StorageMaxOpenFiles,
                    storeAndForward.StorageLogLevel,
                    nestedEdgeEnabled));
        }
Ejemplo n.º 2
0
        public void Register(ContainerBuilder builder)
        {
            builder.RegisterModule(new LoggingModule());
            builder.RegisterBuildCallback(
                c =>
            {
                // set up loggers for Dotnetty
                var loggerFactory = c.Resolve <ILoggerFactory>();
                InternalLoggerFactory.DefaultFactory = loggerFactory;

                var eventListener = new LoggerEventListener(loggerFactory.CreateLogger("EdgeHub"));
                eventListener.EnableEvents(CommonEventSource.Log, EventLevel.Informational);
            });

            bool            optimizeForPerformance = this.configuration.GetValue("OptimizeForPerformance", true);
            StoreAndForward storeAndForward        = this.GetStoreAndForwardConfiguration();

            IConfiguration       experimentalFeaturesConfig = this.configuration.GetSection(Constants.ConfigKey.ExperimentalFeatures);
            ExperimentalFeatures experimentalFeatures       = ExperimentalFeatures.Create(experimentalFeaturesConfig, Logger.Factory.CreateLogger("EdgeHub"));

            MetricsConfig metricsConfig = new MetricsConfig(this.configuration.GetSection("metrics:listener"));

            bool nestedEdgeEnabled = this.configuration.GetValue <bool>(Constants.ConfigKey.NestedEdgeEnabled, true);

            if (!Enum.TryParse(this.configuration.GetValue("AuthenticationMode", string.Empty), true, out AuthenticationMode authenticationMode))
            {
                authenticationMode = AuthenticationMode.Scope;
            }

            bool trackDeviceState = authenticationMode == AuthenticationMode.Scope &&
                                    this.configuration.GetValue("TrackDeviceState", true);

            string proxyModuleId = this.configuration.GetValue("ApiProxyModuleId", Core.Constants.DefaultApiProxyId);

            this.RegisterCommonModule(builder, optimizeForPerformance, storeAndForward, metricsConfig, nestedEdgeEnabled, authenticationMode);
            this.RegisterRoutingModule(builder, storeAndForward, experimentalFeatures, nestedEdgeEnabled, authenticationMode == AuthenticationMode.Scope, trackDeviceState);
            this.RegisterMqttModule(builder, storeAndForward, optimizeForPerformance, experimentalFeatures);
            this.RegisterAmqpModule(builder);
            builder.RegisterModule(new HttpModule(this.iotHubHostname, this.edgeDeviceId, proxyModuleId));

            if (experimentalFeatures.EnableMqttBroker)
            {
                var authConfig = this.configuration.GetSection("authAgentSettings");
                builder.RegisterModule(new AuthModule(authConfig));

                var mqttBrokerConfig = this.configuration.GetSection("mqttBrokerSettings");
                builder.RegisterModule(new MqttBrokerModule(mqttBrokerConfig));
            }
        }
Ejemplo n.º 3
0
        void RegisterMqttModule(
            ContainerBuilder builder,
            StoreAndForward storeAndForward,
            ExperimentalFeatures experimentalFeatures)
        {
            var topics = new MessageAddressConversionConfiguration(
                this.configuration.GetSection(Constants.TopicNameConversionSectionName + ":InboundTemplates").Get <List <string> >(),
                this.configuration.GetSection(Constants.TopicNameConversionSectionName + ":OutboundTemplates").Get <Dictionary <string, string> >());

            bool clientCertAuthEnabled = this.configuration.GetValue(Constants.ConfigKey.EdgeHubClientCertAuthEnabled, false);

            IConfiguration mqttSettingsConfiguration = this.configuration.GetSection("mqttSettings");

            // MQTT broker overrides the legacy MQTT protocol head
            if (mqttSettingsConfiguration.GetValue("enabled", true) && !experimentalFeatures.EnableMqttBroker)
            {
                builder.RegisterModule(new MqttModule(mqttSettingsConfiguration, topics, this.serverCertificate, storeAndForward.IsEnabled, clientCertAuthEnabled, this.sslProtocols));
            }
        }
Ejemplo n.º 4
0
        public void Register(ContainerBuilder builder)
        {
            builder.RegisterModule(new LoggingModule());
            builder.RegisterBuildCallback(
                c =>
            {
                // set up loggers for Dotnetty
                var loggerFactory = c.Resolve <ILoggerFactory>();
                InternalLoggerFactory.DefaultFactory = loggerFactory;

                var eventListener = new LoggerEventListener(loggerFactory.CreateLogger("EdgeHub"));
                eventListener.EnableEvents(CommonEventSource.Log, EventLevel.Informational);
            });

            bool            optimizeForPerformance = this.configuration.GetValue("OptimizeForPerformance", true);
            StoreAndForward storeAndForward        = this.GetStoreAndForwardConfiguration();

            IConfiguration       experimentalFeaturesConfig = this.configuration.GetSection(Constants.ConfigKey.ExperimentalFeatures);
            ExperimentalFeatures experimentalFeatures       = ExperimentalFeatures.Create(experimentalFeaturesConfig, Logger.Factory.CreateLogger("EdgeHub"));

            MetricsConfig metricsConfig = new MetricsConfig(this.configuration.GetSection("metrics:listener"));

            this.RegisterCommonModule(builder, optimizeForPerformance, storeAndForward, metricsConfig, experimentalFeatures);
            this.RegisterRoutingModule(builder, storeAndForward, experimentalFeatures);
            this.RegisterMqttModule(builder, storeAndForward, optimizeForPerformance, experimentalFeatures);
            this.RegisterAmqpModule(builder);
            builder.RegisterModule(new HttpModule(this.iotHubHostname));

            if (experimentalFeatures.EnableMqttBroker)
            {
                var authConfig = this.configuration.GetSection("authAgentSettings");
                builder.RegisterModule(new AuthModule(authConfig));

                var mqttBrokerConfig = this.configuration.GetSection("mqttBrokerSettings");
                builder.RegisterModule(new MqttBrokerModule(mqttBrokerConfig));
            }
        }
Ejemplo n.º 5
0
        void RegisterRoutingModule(
            ContainerBuilder builder,
            StoreAndForward storeAndForward,
            ExperimentalFeatures experimentalFeatures,
            bool nestedEdgeEnabled,
            bool scopeAuthenticationOnly,
            bool trackDeviceState)
        {
            var    routes             = this.configuration.GetSection("routes").Get <Dictionary <string, string> >();
            int    connectionPoolSize = this.configuration.GetValue <int>("IotHubConnectionPoolSize");
            string configSource       = this.configuration.GetValue <string>("configSource");
            bool   useTwinConfig      = !string.IsNullOrWhiteSpace(configSource) && configSource.Equals("twin", StringComparison.OrdinalIgnoreCase);
            Option <UpstreamProtocol> upstreamProtocolOption = GetUpstreamProtocol(this.configuration);
            int      connectivityCheckFrequencySecs          = this.configuration.GetValue("ConnectivityCheckFrequencySecs", 300);
            TimeSpan connectivityCheckFrequency = connectivityCheckFrequencySecs < 0 ? TimeSpan.MaxValue : TimeSpan.FromSeconds(connectivityCheckFrequencySecs);
            // n Clients + 1 Edgehub
            int               maxConnectedClients               = this.configuration.GetValue("MaxConnectedClients", 100) + 1;
            int               messageAckTimeoutSecs             = this.configuration.GetValue("MessageAckTimeoutSecs", 30);
            TimeSpan          messageAckTimeout                 = TimeSpan.FromSeconds(messageAckTimeoutSecs);
            int               cloudConnectionIdleTimeoutSecs    = this.configuration.GetValue("CloudConnectionIdleTimeoutSecs", 3600);
            TimeSpan          cloudConnectionIdleTimeout        = TimeSpan.FromSeconds(cloudConnectionIdleTimeoutSecs);
            bool              closeCloudConnectionOnIdleTimeout = this.configuration.GetValue("CloseCloudConnectionOnIdleTimeout", true);
            int               cloudOperationTimeoutSecs         = this.configuration.GetValue("CloudOperationTimeoutSecs", 20);
            bool              useServerHeartbeat                = this.configuration.GetValue("UseServerHeartbeat", true);
            TimeSpan          cloudOperationTimeout             = TimeSpan.FromSeconds(cloudOperationTimeoutSecs);
            Option <TimeSpan> minTwinSyncPeriod                 = this.GetConfigurationValueIfExists("MinTwinSyncPeriodSecs")
                                                                  .Map(s => TimeSpan.FromSeconds(s));
            Option <TimeSpan> reportedPropertiesSyncFrequency = this.GetConfigurationValueIfExists("ReportedPropertiesSyncFrequencySecs")
                                                                .Map(s => TimeSpan.FromSeconds(s));
            bool useV1TwinManager = this.GetConfigurationValueIfExists <string>("TwinManagerVersion")
                                    .Map(v => v.Equals("v1", StringComparison.OrdinalIgnoreCase))
                                    .GetOrElse(false);
            int      maxUpstreamBatchSize                   = this.configuration.GetValue("MaxUpstreamBatchSize", 10);
            int      upstreamFanOutFactor                   = this.configuration.GetValue("UpstreamFanOutFactor", 10);
            bool     encryptTwinStore                       = this.configuration.GetValue("EncryptTwinStore", true);
            int      configUpdateFrequencySecs              = this.configuration.GetValue("ConfigRefreshFrequencySecs", 3600);
            TimeSpan configUpdateFrequency                  = TimeSpan.FromSeconds(configUpdateFrequencySecs);
            bool     checkEntireQueueOnCleanup              = this.configuration.GetValue("CheckEntireQueueOnCleanup", false);
            int      messageCleanupIntervalSecs             = this.configuration.GetValue("MessageCleanupIntervalSecs", 1800);
            bool     closeCloudConnectionOnDeviceDisconnect = this.configuration.GetValue("CloseCloudConnectionOnDeviceDisconnect", true);
            bool     isLegacyUpstream                       = ExperimentalFeatures.IsViaBrokerUpstream(
                experimentalFeatures,
                nestedEdgeEnabled,
                this.GetConfigurationValueIfExists <string>(Constants.ConfigKey.GatewayHostname).HasValue);

            builder.RegisterModule(
                new RoutingModule(
                    this.iotHubHostname,
                    this.gatewayHostname,
                    this.edgeDeviceId,
                    this.edgeModuleId,
                    this.connectionString,
                    routes,
                    storeAndForward.IsEnabled,
                    storeAndForward.Config,
                    connectionPoolSize,
                    useTwinConfig,
                    this.versionInfo,
                    upstreamProtocolOption,
                    connectivityCheckFrequency,
                    maxConnectedClients,
                    messageAckTimeout,
                    cloudConnectionIdleTimeout,
                    closeCloudConnectionOnIdleTimeout,
                    cloudOperationTimeout,
                    useServerHeartbeat,
                    minTwinSyncPeriod,
                    reportedPropertiesSyncFrequency,
                    useV1TwinManager,
                    maxUpstreamBatchSize,
                    upstreamFanOutFactor,
                    encryptTwinStore,
                    configUpdateFrequency,
                    checkEntireQueueOnCleanup,
                    messageCleanupIntervalSecs,
                    experimentalFeatures,
                    closeCloudConnectionOnDeviceDisconnect,
                    nestedEdgeEnabled,
                    isLegacyUpstream,
                    scopeAuthenticationOnly: scopeAuthenticationOnly,
                    trackDeviceState: trackDeviceState));
        }
Ejemplo n.º 6
0
        void RegisterCommonModule(
            ContainerBuilder builder,
            bool optimizeForPerformance,
            StoreAndForward storeAndForward,
            MetricsConfig metricsConfig,
            ExperimentalFeatures experimentalFeatures)
        {
            bool            cacheTokens        = this.configuration.GetValue("CacheTokens", false);
            Option <string> workloadUri        = this.GetConfigurationValueIfExists <string>(Constants.ConfigKey.WorkloadUri);
            Option <string> workloadApiVersion = this.GetConfigurationValueIfExists <string>(Constants.ConfigKey.WorkloadAPiVersion);
            Option <string> moduleGenerationId = this.GetConfigurationValueIfExists <string>(Constants.ConfigKey.ModuleGenerationId);
            bool            hasParentEdge      = this.GetConfigurationValueIfExists <string>(Constants.ConfigKey.GatewayHostname).HasValue;

            if (!Enum.TryParse(this.configuration.GetValue("AuthenticationMode", string.Empty), true, out AuthenticationMode authenticationMode))
            {
                if (!hasParentEdge)
                {
                    // Default setting should be local auth with fallback to cloud auth
                    authenticationMode = AuthenticationMode.CloudAndScope;
                }
                else
                {
                    // If the Edge is nested and connects to a parent Edge, then we
                    // should only allow local authentication as we don't expect to
                    // have internet connectivity.
                    authenticationMode = AuthenticationMode.Scope;
                }
            }

            int      scopeCacheRefreshRateSecs = this.configuration.GetValue("DeviceScopeCacheRefreshRateSecs", 3600);
            TimeSpan scopeCacheRefreshRate     = TimeSpan.FromSeconds(scopeCacheRefreshRateSecs);

            int      scopeCacheRefreshDelaySecs = this.configuration.GetValue("DeviceScopeCacheRefreshDelaySecs", 120);
            TimeSpan scopeCacheRefreshDelay     = TimeSpan.FromSeconds(scopeCacheRefreshDelaySecs);

            string proxy       = this.configuration.GetValue("https_proxy", string.Empty);
            string productInfo = GetProductInfo();

            // Register modules
            builder.RegisterModule(
                new CommonModule(
                    productInfo,
                    this.iotHubHostname,
                    this.gatewayHostname,
                    this.edgeDeviceId,
                    this.edgeModuleId,
                    this.edgeDeviceHostName,
                    moduleGenerationId,
                    authenticationMode,
                    this.connectionString,
                    optimizeForPerformance,
                    storeAndForward.UsePersistentStorage,
                    storeAndForward.StoragePath,
                    workloadUri,
                    workloadApiVersion,
                    scopeCacheRefreshRate,
                    scopeCacheRefreshDelay,
                    cacheTokens,
                    this.trustBundle,
                    proxy,
                    metricsConfig,
                    storeAndForward.UseBackupAndRestore,
                    storeAndForward.StorageBackupPath,
                    storeAndForward.StorageMaxTotalWalSize,
                    storeAndForward.StorageMaxOpenFiles,
                    storeAndForward.StorageLogLevel,
                    experimentalFeatures.EnableNestedEdge));
        }