Merge pull request #377 from shamoon/unified-infowidget-settings

Feature: Unified info widget settings
pull/395/head v0.4.18
Ben Phelps 2 years ago committed by GitHub
commit 4ea279856f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -10,7 +10,7 @@ export default function Widget({ options }) {
// eslint-disable-next-line no-param-reassign // eslint-disable-next-line no-param-reassign
options.type = "unifi_console"; options.type = "unifi_console";
const { data: statsData, error: statsError } = useWidgetAPI(options, "stat/sites"); const { data: statsData, error: statsError } = useWidgetAPI(options, "stat/sites", { index: options.index });
if (statsError || statsData?.error) { if (statsError || statsData?.error) {
return ( return (

@ -1,29 +1,17 @@
import { httpProxy } from "utils/proxy/http"; import { httpProxy } from "utils/proxy/http";
import createLogger from "utils/logger"; import createLogger from "utils/logger";
import { getSettings } from "utils/config/config"; import { getPrivateWidgetOptions } from "utils/config/widget-helpers";
const logger = createLogger("glances"); const logger = createLogger("glances");
export default async function handler(req, res) { export default async function handler(req, res) {
const { id } = req.query; const { index } = req.query;
let errorMessage; const privateWidgetOptions = await getPrivateWidgetOptions("glances", index);
let instanceID = "glances"; const url = privateWidgetOptions?.url;
if (id) { // multiple instances
instanceID = id;
}
const settings = getSettings();
const instanceSettings = settings[instanceID];
if (!instanceSettings) {
errorMessage = id ? `There is no glances section with id '${id}' in settings.yaml` : "There is no glances section in settings.yaml";
logger.error(errorMessage);
return res.status(400).json({ error: errorMessage });
}
const url = instanceSettings?.url;
if (!url) { if (!url) {
errorMessage = "Missing Glances URL"; const errorMessage = "Missing Glances URL";
logger.error(errorMessage); logger.error(errorMessage);
return res.status(400).json({ error: errorMessage }); return res.status(400).json({ error: errorMessage });
} }
@ -32,8 +20,8 @@ export default async function handler(req, res) {
const headers = { const headers = {
"Accept-Encoding": "application/json" "Accept-Encoding": "application/json"
}; };
if (instanceSettings.username && instanceSettings.password) { if (privateWidgetOptions.username && privateWidgetOptions.password) {
headers.Authorization = `Basic ${Buffer.from(`${instanceSettings.username}:${instanceSettings.password}`).toString("base64")}` headers.Authorization = `Basic ${Buffer.from(`${privateWidgetOptions.username}:${privateWidgetOptions.password}`).toString("base64")}`
} }
const params = { method: "GET", headers }; const params = { method: "GET", headers };

@ -6,6 +6,7 @@ import yaml from "js-yaml";
import checkAndCopyConfig from "utils/config/config"; import checkAndCopyConfig from "utils/config/config";
import { servicesFromConfig, servicesFromDocker, cleanServiceGroups } from "utils/config/service-helpers"; import { servicesFromConfig, servicesFromDocker, cleanServiceGroups } from "utils/config/service-helpers";
import { cleanWidgetGroups, widgetsFromConfig } from "utils/config/widget-helpers";
export async function bookmarksResponse() { export async function bookmarksResponse() {
checkAndCopyConfig("bookmarks.yaml"); checkAndCopyConfig("bookmarks.yaml");
@ -29,21 +30,17 @@ export async function bookmarksResponse() {
} }
export async function widgetsResponse() { export async function widgetsResponse() {
checkAndCopyConfig("widgets.yaml"); let configuredWidgets;
const widgetsYaml = path.join(process.cwd(), "config", "widgets.yaml"); try {
const fileContents = await fs.readFile(widgetsYaml, "utf8"); configuredWidgets = cleanWidgetGroups(await widgetsFromConfig());
const widgets = yaml.load(fileContents); } catch (e) {
console.error("Failed to load widgets, please check widgets.yaml for errors or remove example entries.");
if (!widgets) return []; if (e) console.error(e);
configuredWidgets = [];
// map easy to write YAML objects into easy to consume JS arrays }
const widgetsArray = widgets.map((group) => ({
type: Object.keys(group)[0],
options: { ...group[Object.keys(group)[0]] },
}));
return widgetsArray; return configuredWidgets;
} }
export async function servicesResponse() { export async function servicesResponse() {

@ -0,0 +1,73 @@
import { promises as fs } from "fs";
import path from "path";
import yaml from "js-yaml";
import checkAndCopyConfig from "utils/config/config";
export async function widgetsFromConfig() {
checkAndCopyConfig("widgets.yaml");
const widgetsYaml = path.join(process.cwd(), "config", "widgets.yaml");
const fileContents = await fs.readFile(widgetsYaml, "utf8");
const widgets = yaml.load(fileContents);
if (!widgets) return [];
// map easy to write YAML objects into easy to consume JS arrays
const widgetsArray = widgets.map((group, index) => ({
type: Object.keys(group)[0],
options: {
index,
...group[Object.keys(group)[0]]
},
}));
return widgetsArray;
}
export async function cleanWidgetGroups(widgets) {
return widgets.map((widget, index) => {
const sanitizedOptions = widget.options;
const optionKeys = Object.keys(sanitizedOptions);
["url", "username", "password", "key"].forEach((pO) => {
if (optionKeys.includes(pO)) {
delete sanitizedOptions[pO];
}
});
return {
type: widget.type,
options: {
index,
...sanitizedOptions
},
}
});
}
export async function getPrivateWidgetOptions(type, widgetIndex) {
const widgets = await widgetsFromConfig();
const privateOptions = widgets.map((widget) => {
const {
index,
url,
username,
password,
key
} = widget.options;
return {
type: widget.type,
options: {
index,
url,
username,
password,
key
},
}
});
return (type !== undefined && widgetIndex !== undefined) ? privateOptions.find(o => o.type === type && o.options.index === parseInt(widgetIndex, 10))?.options : privateOptions;
}

@ -3,8 +3,8 @@ import cache from "memory-cache";
import { formatApiCall } from "utils/proxy/api-helpers"; import { formatApiCall } from "utils/proxy/api-helpers";
import { httpProxy } from "utils/proxy/http"; import { httpProxy } from "utils/proxy/http";
import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar"; import { addCookieToJar, setCookieHeader } from "utils/proxy/cookie-jar";
import { getSettings } from "utils/config/config";
import getServiceWidget from "utils/config/service-helpers"; import getServiceWidget from "utils/config/service-helpers";
import { getPrivateWidgetOptions } from "utils/config/widget-helpers";
import createLogger from "utils/logger"; import createLogger from "utils/logger";
import widgets from "widgets/widgets"; import widgets from "widgets/widgets";
@ -17,11 +17,11 @@ async function getWidget(req) {
const { group, service, type } = req.query; const { group, service, type } = req.query;
let widget = null; let widget = null;
if (type === "unifi_console") { if (type === "unifi_console") { // info widget
const settings = getSettings(); const index = req.query?.query ? JSON.parse(req.query.query).index : undefined;
widget = settings.unifi_console; widget = await getPrivateWidgetOptions(type, index);
if (!widget) { if (!widget) {
logger.debug("There is no unifi_console section in settings.yaml"); logger.debug("Error retrieving settings for this Unifi widget");
return null; return null;
} }
widget.type = "unifi"; widget.type = "unifi";

Loading…
Cancel
Save