homebridge-config-ui-x
Version:
A web based management, configuration and control platform for Homebridge
145 lines • 6.97 kB
JavaScript
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
const common_1 = require("@nestjs/common");
const os = require("os");
const path = require("path");
const fs = require("fs-extra");
const crypto = require("crypto");
const semver = require("semver");
let ConfigService = class ConfigService {
constructor() {
this.name = 'homebridge-config-ui-x';
this.configPath = process.env.UIX_CONFIG_PATH || path.resolve(os.homedir(), '.homebridge/config.json');
this.storagePath = process.env.UIX_STORAGE_PATH || path.resolve(os.homedir(), '.homebridge');
this.customPluginPath = process.env.UIX_CUSTOM_PLUGIN_PATH;
this.secretPath = path.resolve(this.storagePath, '.uix-secrets');
this.authPath = path.resolve(this.storagePath, 'auth.json');
this.accessoryLayoutPath = path.resolve(this.storagePath, 'accessories', 'uiAccessoriesLayout.json');
this.homebridgeInsecureMode = Boolean(process.env.UIX_INSECURE_MODE === '1');
this.homebridgeNoTimestamps = Boolean(process.env.UIX_LOG_NO_TIMESTAMPS === '1');
this.minimumNodeVersion = '8.15.1';
this.serviceMode = (process.env.UIX_SERVICE_MODE === '1');
this.runningInDocker = Boolean(process.env.HOMEBRIDGE_CONFIG_UI === '1');
this.runningInLinux = (!this.runningInDocker && os.platform() === 'linux');
this.ableToConfigureSelf = (!this.runningInDocker || semver.satisfies(process.env.CONFIG_UI_VERSION, '>=3.5.5'), { includePrerelease: true });
this.enableTerminalAccess = this.runningInDocker || Boolean(process.env.HOMEBRIDGE_CONFIG_UI_TERMINAL === '1');
this.branding = process.env.CONFIG_UI_BRANDING || false;
this.startupScript = path.resolve(this.storagePath, 'startup.sh');
this.dockerEnvFile = path.resolve(this.storagePath, '.docker.env');
this.dockerOfflineUpdate = this.runningInDocker && semver.satisfies(process.env.CONFIG_UI_VERSION, '>=4.6.2', { includePrerelease: true });
this.package = fs.readJsonSync(path.resolve(process.env.UIX_BASE_PATH, 'package.json'));
this.homebridgeConfig = fs.readJSONSync(this.configPath);
this.ui = Array.isArray(this.homebridgeConfig.platforms) ? this.homebridgeConfig.platforms.find(x => x.platform === 'config') : undefined;
if (!this.ui) {
this.ui = {
name: 'Config',
};
}
process.env.UIX_PLUGIN_NAME = this.ui.name || 'homebridge-config-ui-x';
if (this.runningInDocker) {
this.setConfigForDocker();
}
if (this.serviceMode) {
this.setConfigForServiceMode();
}
if (!this.ui.port) {
this.ui.port = 8080;
}
if (!this.ui.sessionTimeout) {
this.ui.sessionTimeout = 28800;
}
this.secrets = this.getSecrets();
this.instanceId = this.getInstanceId();
}
uiSettings() {
return {
env: {
ableToConfigureSelf: this.ableToConfigureSelf,
enableAccessories: this.homebridgeInsecureMode,
enableTerminalAccess: this.enableTerminalAccess,
homebridgeInstanceName: this.homebridgeConfig.bridge.name,
nodeVersion: process.version,
packageName: this.package.name,
packageVersion: this.package.version,
runningInDocker: this.runningInDocker,
runningInLinux: this.runningInLinux,
dockerOfflineUpdate: this.dockerOfflineUpdate,
temperatureUnits: this.ui.tempUnits || 'c',
websocketCompatibilityMode: this.ui.websocketCompatibilityMode || false,
branding: this.branding,
instanceId: this.instanceId,
},
formAuth: Boolean(this.ui.auth !== 'none'),
theme: this.ui.theme || 'auto',
serverTimestamp: new Date().toISOString(),
};
}
setConfigForDocker() {
this.ui.restart = 'killall -9 homebridge && killall -9 homebridge-config-ui-x';
this.homebridgeInsecureMode = Boolean(process.env.HOMEBRIDGE_INSECURE === '1');
this.ui.sudo = false;
this.ui.log = {
method: 'file',
path: '/homebridge/logs/homebridge.log',
};
if (!this.ui.port && process.env.HOMEBRIDGE_CONFIG_UI_PORT) {
this.ui.port = parseInt(process.env.HOMEBRIDGE_CONFIG_UI_PORT, 10);
}
this.ui.theme = this.ui.theme || process.env.HOMEBRIDGE_CONFIG_UI_THEME || 'teal';
this.ui.auth = this.ui.auth || process.env.HOMEBRIDGE_CONFIG_UI_AUTH || 'form';
this.ui.temp = this.ui.temp || process.env.HOMEBRIDGE_CONFIG_UI_TEMP || undefined;
this.ui.loginWallpaper = this.ui.loginWallpaper || process.env.HOMEBRIDGE_CONFIG_UI_LOGIN_WALLPAPER || undefined;
}
setConfigForServiceMode() {
this.ui.restart = undefined;
this.homebridgeInsecureMode = true;
this.ui.log = {
method: 'file',
path: path.resolve(this.storagePath, 'homebridge.log'),
};
}
getSecrets() {
if (fs.pathExistsSync(this.secretPath)) {
try {
const secrets = fs.readJsonSync(this.secretPath);
if (!secrets.secretKey) {
return this.generateSecretToken();
}
else {
return secrets;
}
}
catch (e) {
return this.generateSecretToken();
}
}
else {
return this.generateSecretToken();
}
}
generateSecretToken() {
const secrets = {
secretKey: crypto.randomBytes(32).toString('hex'),
};
fs.writeJsonSync(this.secretPath, secrets);
return secrets;
}
getInstanceId() {
return crypto.createHash('sha256').update(this.secrets.secretKey).digest('hex');
}
};
ConfigService = __decorate([
common_1.Injectable(),
__metadata("design:paramtypes", [])
], ConfigService);
exports.ConfigService = ConfigService;
//# sourceMappingURL=config.service.js.map