public JsonConfigStore(IOptions <HaccOptions> haccOptions)
        {
            Options = haccOptions.Value;
            var isHassio = !string.IsNullOrWhiteSpace(SupervisorEnvironment.GetSupervisorToken());

            ConfigDirectory = isHassio ? HASSIO_CONFIG_LOC : Environment.ExpandEnvironmentVariables(Options.ConfigLocation);
        }
Beispiel #2
0
        private async Task AttemptBaseUrlDiscovery()
        {
            // Temporary while we fetch some stuff...
            ClientFactory.Initialize(SupervisorEnvironment.GetBaseUrl(), SupervisorEnvironment.GetSupervisorToken());

            var discovery = ClientFactory.GetClient <DiscoveryClient>();
            var discInfo  = await discovery.GetDiscoveryInfo();

            if (string.IsNullOrWhiteSpace(discInfo?.BaseUrl))
            {
                Log.LogError("Unable to read discovery info from Home Assistant. Do you have the HTTP component configured in Home Assistant with a \"base_url\" set?");
                ClientFactory.Reset();
            }
            else
            {
                await ConfigStore.ManipulateConfig(c =>
                {
                    c.Settings = new SystemSettings
                    {
                        BaseUri = discInfo.BaseUrl
                    };
                });
            }
        }
        public async Task InvokeAsync(HttpContext context)
        {
            var config = await ConfigStore.GetConfigAsync();

            if (!string.IsNullOrWhiteSpace(config?.Settings?.BaseUri) && (!string.IsNullOrWhiteSpace(config?.Settings?.AccessToken) || !string.IsNullOrWhiteSpace(SupervisorEnvironment.GetSupervisorToken())))
            {
                if (!ClientFactory.IsInitialized)
                {
                    if (config.Settings.IsHassIo)
                    {
                        Log.LogInformation($"Auto-initializing HACC via Hass.io addon.");
                        ClientFactory.Initialize(config.Settings.BaseUri, SupervisorEnvironment.GetSupervisorToken());

                        var discovery = ClientFactory.GetClient <DiscoveryClient>();
                        var discInfo  = await discovery.GetDiscoveryInfo();

                        await ConfigStore.ManipulateConfig(c => c.Settings.ExternalBaseUri = discInfo.BaseUrl);
                    }
                    else
                    {
                        Log.LogInformation($"Initializing HACC API with URL {config?.Settings?.BaseUri ?? "[NULL]"} and access token [{new string(config?.Settings?.AccessToken.Take(6).ToArray())}•••••••••••{new string(config?.Settings?.AccessToken.TakeLast(6).ToArray())}].");
                        ClientFactory.Initialize(config.Settings.BaseUri, config.Settings.AccessToken);
                    }
                }
            }
            else
            {
                ClientFactory.Reset();
            }

            if (!ClientFactory.IsInitialized)
            {
                // If we're in Hass.io mode, set the base URI and redirect to the admin homepage.
                if (!string.IsNullOrWhiteSpace(SupervisorEnvironment.GetSupervisorToken()))
                {
                    await ConfigStore.ManipulateConfig(c =>
                    {
                        c.Settings = new SystemSettings
                        {
                            BaseUri     = "http://hassio/homeassistant",
                            AccessToken = null,
                            IsHassIo    = true
                        };

                        context.Response.StatusCode = 303;
                        context.Response.Redirect("/admin");
                    });
                }

                // Otherwise, if we aren't on one of the approved pages, redirect to the settings page and prompt for setup.
                if (context.Request.Path.ToString().ToLower() != "/admin/settings" && context.Request.Path.ToString().ToLower() != "/admin")
                {
                    Log.LogInformation($"Client factory is not initialized, redirecting user to settings area...");

                    context.Response.Redirect("/admin/settings?setup=1");
                    return;
                }
            }

            // Pages Migration

#pragma warning disable CS0612
            if ((config.TileLayout?.Count > 0 || config.Tiles?.Count > 0) && (config.Pages?.Count ?? 0) == 0)
            {
                await ConfigStore.ManipulateConfig(config =>
                {
                    config.Pages ??= new List <Page>();
                    config.Pages.Add(new Page
                    {
                        Name           = "default",
                        Description    = "[Automatically generated from previous configuration.]",
                        IsDefaultPage  = true,
                        Tiles          = config.Tiles,
                        TileLayout     = config.TileLayout,
                        LayoutSettings = config.LayoutSettings
                    });
                    config.TileLayout     = null;
                    config.Tiles          = null;
                    config.LayoutSettings = null;
                });

                context.Response.Redirect("/admin/pageMigration");
            }
            else if (config.Pages.Count == 0)
            {
                await ConfigStore.ManipulateConfig(config =>
                {
                    config.Pages = new List <Page>
                    {
                        new Page
                        {
                            Name           = "default",
                            Description    = "Default Page",
                            IsDefaultPage  = true,
                            Tiles          = new List <BaseTile>(),
                            TileLayout     = new List <TileLayout>(),
                            LayoutSettings = new LayoutSettings
                            {
                                DeviceHeightPx = 1280,
                                DeviceWidthPx  = 720,
                                BaseTileSizePx = 92,
                                TileSpacingPx  = 6,
                            }
                        }
                    };
                });
            }
#pragma warning restore CS0612

            await Next(context);
        }