1
0
mirror of https://github.com/xuthus83/pigallery2.git synced 2024-11-03 21:04:03 +08:00
pigallery2/backend/model/diagnostics/ConfigDiagnostics.ts

264 lines
9.7 KiB
TypeScript
Raw Normal View History

2018-11-19 03:26:29 +08:00
import {Config} from '../../../common/config/private/Config';
2017-07-14 05:39:09 +08:00
import {
DataBaseConfig,
DatabaseType,
2017-07-15 20:27:12 +08:00
IPrivateConfig,
2017-07-14 05:39:09 +08:00
ThumbnailConfig,
ThumbnailProcessingLib
2018-11-19 03:26:29 +08:00
} from '../../../common/config/private/IPrivateConfig';
import {Logger} from '../../Logger';
import {NotificationManager} from '../NotifocationManager';
import {ProjectPath} from '../../ProjectPath';
import {SQLConnection} from '../sql/SQLConnection';
2018-03-31 03:30:30 +08:00
import * as fs from 'fs';
2018-11-19 03:26:29 +08:00
import {ClientConfig} from '../../../common/config/public/ConfigClass';
import VideoConfig = ClientConfig.VideoConfig;
import {FFmpegFactory} from '../FFmpegFactory';
2018-03-31 03:30:30 +08:00
const LOG_TAG = '[ConfigDiagnostics]';
2017-07-14 05:39:09 +08:00
export class ConfigDiagnostics {
static async testDatabase(databaseConfig: DataBaseConfig) {
if (databaseConfig.type !== DatabaseType.memory) {
await SQLConnection.tryConnection(databaseConfig);
2017-07-14 05:39:09 +08:00
}
}
2018-11-19 03:26:29 +08:00
static testVideoConfig(videoConfig: VideoConfig) {
return new Promise((resolve, reject) => {
try {
if (videoConfig.enabled === true) {
const ffmpeg = FFmpegFactory.get();
ffmpeg().getAvailableCodecs((err) => {
if (err) {
return reject(new Error('Error accessing ffmpeg, cant find executable: ' + err.toString()));
}
ffmpeg(__dirname + '/blank.jpg').ffprobe((err2) => {
if (err2) {
return reject(new Error('Error accessing ffmpeg-probe, cant find executable: ' + err2.toString()));
}
return resolve();
});
});
} else {
return resolve();
}
} catch (e) {
return reject(new Error('unkown video error: ' + e.toString()));
}
});
}
2017-07-14 05:39:09 +08:00
static async testThumbnailLib(processingLibrary: ThumbnailProcessingLib) {
switch (processingLibrary) {
case ThumbnailProcessingLib.sharp:
2018-03-31 03:30:30 +08:00
const sharp = require('sharp');
2017-07-14 05:39:09 +08:00
sharp();
break;
case ThumbnailProcessingLib.gm:
2018-03-31 03:30:30 +08:00
const gm = require('gm');
2017-07-14 05:39:09 +08:00
await new Promise((resolve, reject) => {
2018-03-31 03:30:30 +08:00
gm(ProjectPath.FrontendFolder + '/assets/icon.png').size((err, value) => {
2017-07-15 18:47:11 +08:00
if (err) {
return reject(err.toString());
2017-07-14 05:39:09 +08:00
}
2017-07-15 18:47:11 +08:00
return resolve();
2017-07-14 05:39:09 +08:00
});
});
break;
}
}
2018-11-19 03:26:29 +08:00
static testThumbnailFolder(folder: string) {
return new Promise((resolve, reject) => {
2017-07-14 15:28:52 +08:00
fs.access(folder, fs.constants.W_OK, (err) => {
2017-07-14 05:39:09 +08:00
if (err) {
2018-03-31 03:30:30 +08:00
reject({message: 'Error during getting write access to temp folder', error: err.toString()});
2017-07-14 05:39:09 +08:00
}
});
resolve();
});
}
2018-11-19 03:26:29 +08:00
static testImageFolder(folder: string) {
return new Promise((resolve, reject) => {
2017-07-14 05:39:09 +08:00
if (!fs.existsSync(folder)) {
2018-03-31 03:30:30 +08:00
reject('Images folder not exists: \'' + folder + '\'');
2017-07-14 05:39:09 +08:00
}
2017-07-14 15:28:52 +08:00
fs.access(folder, fs.constants.R_OK, (err) => {
2017-07-14 05:39:09 +08:00
if (err) {
2018-03-31 03:30:30 +08:00
reject({message: 'Error during getting read access to images folder', error: err.toString()});
2017-07-14 05:39:09 +08:00
}
});
resolve();
});
}
2017-07-15 18:47:11 +08:00
static async testServerThumbnailConfig(thumbnailConfig: ThumbnailConfig) {
2017-07-14 05:39:09 +08:00
await ConfigDiagnostics.testThumbnailLib(thumbnailConfig.processingLibrary);
await ConfigDiagnostics.testThumbnailFolder(thumbnailConfig.folder);
}
2017-07-15 18:47:11 +08:00
static async testClientThumbnailConfig(thumbnailConfig: ClientConfig.ThumbnailConfig) {
if (isNaN(thumbnailConfig.iconSize) || thumbnailConfig.iconSize <= 0) {
throw new Error('IconSize has to be >= 0 integer, got: ' + thumbnailConfig.iconSize);
2017-07-15 18:47:11 +08:00
}
if (!thumbnailConfig.thumbnailSizes.length) {
throw new Error('At least one thumbnail size is needed');
2017-07-15 18:47:11 +08:00
}
for (let i = 0; i < thumbnailConfig.thumbnailSizes.length; i++) {
if (isNaN(thumbnailConfig.thumbnailSizes[i]) || thumbnailConfig.thumbnailSizes[i] <= 0) {
throw new Error('Thumbnail size has to be >= 0 integer, got: ' + thumbnailConfig.thumbnailSizes[i]);
2017-07-15 18:47:11 +08:00
}
}
}
2017-07-14 05:39:09 +08:00
2017-07-15 20:27:12 +08:00
static async testSearchConfig(search: ClientConfig.SearchConfig, config: IPrivateConfig) {
if (search.enabled === true &&
config.Server.database.type === DatabaseType.memory) {
throw new Error('Memory Database do not support searching');
2017-07-14 05:39:09 +08:00
}
}
2017-07-15 20:27:12 +08:00
static async testSharingConfig(sharing: ClientConfig.SharingConfig, config: IPrivateConfig) {
if (sharing.enabled === true &&
config.Server.database.type === DatabaseType.memory) {
throw new Error('Memory Database do not support sharing');
2017-07-14 05:39:09 +08:00
}
2018-05-25 09:29:05 +08:00
if (sharing.enabled === true &&
config.Client.authenticationRequired === false) {
throw new Error('In case of no authentication, sharing is not supported');
}
2017-07-14 05:39:09 +08:00
}
static async testRandomPhotoConfig(sharing: ClientConfig.RandomPhotoConfig, config: IPrivateConfig) {
if (sharing.enabled === true &&
config.Server.database.type === DatabaseType.memory) {
throw new Error('Memory Database do not support sharing');
}
}
2017-07-15 18:47:11 +08:00
static async testMapConfig(map: ClientConfig.MapConfig) {
if (map.enabled === true && (!map.googleApiKey || map.googleApiKey.length === 0)) {
throw new Error('Maps need a valid google api key');
2017-07-14 05:39:09 +08:00
}
}
static async runDiagnostics() {
if (Config.Server.database.type !== DatabaseType.memory) {
2017-07-14 05:39:09 +08:00
try {
await ConfigDiagnostics.testDatabase(Config.Server.database);
2018-05-25 09:29:05 +08:00
} catch (ex) {
const err: Error = ex;
Logger.warn(LOG_TAG, '[SQL error]', err.toString());
2018-03-31 03:30:30 +08:00
Logger.warn(LOG_TAG, 'Error during initializing SQL falling back temporally to memory DB');
2018-05-25 09:29:05 +08:00
NotificationManager.warning('Error during initializing SQL falling back temporally to memory DB', err.toString());
2017-07-14 05:39:09 +08:00
Config.setDatabaseType(DatabaseType.memory);
}
}
if (Config.Server.thumbnail.processingLibrary !== ThumbnailProcessingLib.Jimp) {
2017-07-14 05:39:09 +08:00
try {
await ConfigDiagnostics.testThumbnailLib(Config.Server.thumbnail.processingLibrary);
2018-05-25 09:29:05 +08:00
} catch (ex) {
const err: Error = ex;
2018-03-31 03:30:30 +08:00
NotificationManager.warning('Thumbnail hardware acceleration is not possible.' +
' \'' + ThumbnailProcessingLib[Config.Server.thumbnail.processingLibrary] + '\' node module is not found.' +
2018-05-25 09:29:05 +08:00
' Falling back temporally to JS based thumbnail generation', err.toString());
Logger.warn(LOG_TAG, '[Thumbnail hardware acceleration] module error: ', err.toString());
2018-03-31 03:30:30 +08:00
Logger.warn(LOG_TAG, 'Thumbnail hardware acceleration is not possible.' +
' \'' + ThumbnailProcessingLib[Config.Server.thumbnail.processingLibrary] + '\' node module is not found.' +
' Falling back temporally to JS based thumbnail generation');
2017-07-14 05:39:09 +08:00
Config.Server.thumbnail.processingLibrary = ThumbnailProcessingLib.Jimp;
}
}
try {
2018-03-31 03:30:30 +08:00
await ConfigDiagnostics.testThumbnailFolder(Config.Server.thumbnail.folder);
2018-05-25 09:29:05 +08:00
} catch (ex) {
const err: Error = ex;
NotificationManager.error('Thumbnail folder error', err.toString());
Logger.error(LOG_TAG, 'Thumbnail folder error', err.toString());
2017-07-14 05:39:09 +08:00
}
2018-11-19 03:26:29 +08:00
try {
await ConfigDiagnostics.testVideoConfig(Config.Client.Video);
} catch (ex) {
const err: Error = ex;
NotificationManager.warning('Video support error, switching off..', err.toString());
Logger.warn(LOG_TAG, 'Video support error, switching off..', err.toString());
Config.Client.Video.enabled = false;
}
2017-07-14 05:39:09 +08:00
try {
2018-03-31 03:30:30 +08:00
await ConfigDiagnostics.testImageFolder(Config.Server.imagesFolder);
2018-05-25 09:29:05 +08:00
} catch (ex) {
const err: Error = ex;
NotificationManager.error('Images folder error', err.toString());
Logger.error(LOG_TAG, 'Images folder error', err.toString());
2017-07-14 05:39:09 +08:00
}
2017-07-15 18:47:11 +08:00
try {
2018-03-31 03:30:30 +08:00
await ConfigDiagnostics.testClientThumbnailConfig(Config.Client.Thumbnail);
2018-05-25 09:29:05 +08:00
} catch (ex) {
const err: Error = ex;
NotificationManager.error('Thumbnail settings error', err.toString());
Logger.error(LOG_TAG, 'Thumbnail settings error', err.toString());
2017-07-15 18:47:11 +08:00
}
2017-07-14 05:39:09 +08:00
try {
2017-07-15 20:27:12 +08:00
await ConfigDiagnostics.testSearchConfig(Config.Client.Search, Config);
2018-05-25 09:29:05 +08:00
} catch (ex) {
const err: Error = ex;
NotificationManager.warning('Search is not supported with these settings. Disabling temporally. ' +
2018-05-25 09:29:05 +08:00
'Please adjust the config properly.', err.toString());
Logger.warn(LOG_TAG, 'Search is not supported with these settings, switching off..', err.toString());
2017-07-14 05:39:09 +08:00
Config.Client.Search.enabled = false;
}
try {
2017-07-15 20:27:12 +08:00
await ConfigDiagnostics.testSharingConfig(Config.Client.Sharing, Config);
2018-05-25 09:29:05 +08:00
} catch (ex) {
const err: Error = ex;
NotificationManager.warning('Sharing is not supported with these settings. Disabling temporally. ' +
2018-05-25 09:29:05 +08:00
'Please adjust the config properly.', err.toString());
Logger.warn(LOG_TAG, 'Sharing is not supported with these settings, switching off..', err.toString());
2017-07-14 05:39:09 +08:00
Config.Client.Sharing.enabled = false;
}
try {
await ConfigDiagnostics.testRandomPhotoConfig(Config.Client.Sharing, Config);
} catch (ex) {
const err: Error = ex;
2018-11-05 02:28:32 +08:00
NotificationManager.warning('Random Media is not supported with these settings. Disabling temporally. ' +
'Please adjust the config properly.', err.toString());
2018-11-05 02:28:32 +08:00
Logger.warn(LOG_TAG, 'Random Media is not supported with these settings, switching off..', err.toString());
Config.Client.Sharing.enabled = false;
}
2017-07-14 05:39:09 +08:00
try {
await ConfigDiagnostics.testMapConfig(Config.Client.Map);
2018-05-25 09:29:05 +08:00
} catch (ex) {
const err: Error = ex;
NotificationManager.warning('Maps is not supported with these settings. Disabling temporally. ' +
2018-05-25 09:29:05 +08:00
'Please adjust the config properly.', err.toString());
Logger.warn(LOG_TAG, 'Maps is not supported with these settings. Disabling temporally. ' +
2018-05-25 09:29:05 +08:00
'Please adjust the config properly.', err.toString());
2017-07-14 05:39:09 +08:00
Config.Client.Map.enabled = false;
}
}
}