This commit is contained in:
@@ -2,20 +2,20 @@ const express = require('express');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const router = express.Router();
|
||||
const fileUpload = require('express-fileupload');
|
||||
const authMiddleware = require('../../../Middlewares/authMiddleware');
|
||||
const bodyParser = require('body-parser');
|
||||
const crypto = require('crypto');
|
||||
const os = require('os');
|
||||
const osUtils = require('os-utils');
|
||||
const Convert = require('ansi-to-html');
|
||||
const convert = new Convert();
|
||||
const { getUserData, getSetupData } = require('../../../Middlewares/watcherMiddleware');
|
||||
const { logger } = require('../../../config/logs');
|
||||
|
||||
// Utilitaires pour la gestion des services
|
||||
const services = {
|
||||
fileCleanup: require('../../../services/fileCleanupService'),
|
||||
reportManager: require('../../../services/reportService')
|
||||
};
|
||||
|
||||
router.use(bodyParser.json());
|
||||
|
||||
// Fonction de nettoyage des objets
|
||||
function clean(obj) {
|
||||
for (var propName in obj) {
|
||||
for (let propName in obj) {
|
||||
if (obj[propName] === null || obj[propName] === undefined || obj[propName] === '') {
|
||||
delete obj[propName];
|
||||
} else if (typeof obj[propName] === 'object') {
|
||||
@@ -27,6 +27,7 @@ function clean(obj) {
|
||||
}
|
||||
}
|
||||
|
||||
// Validation des IPs
|
||||
function validateIP(ip) {
|
||||
if (!ip) return false;
|
||||
|
||||
@@ -46,9 +47,9 @@ function validateIP(ip) {
|
||||
}
|
||||
|
||||
function isIPv4(ip) {
|
||||
const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
|
||||
const ipv4Regex = /^\d{1,3}(\.\d{1,3}){3}$/;
|
||||
if (!ipv4Regex.test(ip)) return false;
|
||||
|
||||
|
||||
const parts = ip.split('.');
|
||||
return parts.every(part => {
|
||||
const num = parseInt(part);
|
||||
@@ -61,42 +62,111 @@ function isIPv6(ip) {
|
||||
return ipv6Regex.test(ip);
|
||||
}
|
||||
|
||||
router.get('/', (req, res) => {
|
||||
res.status(400).json({ error: 'Bad Request. The request cannot be fulfilled due to bad syntax or missing parameters.' });
|
||||
});
|
||||
// Fonction pour activer ou désactiver un service
|
||||
async function handleServices(newConfig, oldConfig) {
|
||||
if (!newConfig.services) return;
|
||||
|
||||
router.post('/', authMiddleware, async (req, res) => {
|
||||
try {
|
||||
let setup = JSON.parse(fs.readFileSync(path.join(__dirname, '../../../data', 'setup.json'), 'utf-8'));
|
||||
|
||||
if (req.body.allowedIps) {
|
||||
const ipsArray = Array.isArray(req.body.allowedIps) ? req.body.allowedIps : [req.body.allowedIps];
|
||||
|
||||
req.body.allowedIps = ipsArray
|
||||
.filter(ip => ip && ip.trim())
|
||||
.filter(ip => validateIP(ip.trim()))
|
||||
.map(ip => ip.trim());
|
||||
|
||||
console.log('IPs validées:', req.body.allowedIps);
|
||||
for (const [serviceName, serviceConfig] of Object.entries(newConfig.services)) {
|
||||
const service = services[serviceName];
|
||||
if (!service) {
|
||||
logger.warn(`Service ${serviceName} not found`);
|
||||
continue;
|
||||
}
|
||||
|
||||
clean(req.body);
|
||||
setup[0] = {
|
||||
...setup[0],
|
||||
...req.body
|
||||
};
|
||||
const oldServiceConfig = oldConfig?.services?.[serviceName] || {};
|
||||
const wasEnabled = oldServiceConfig.enabled === 'on'; // ancien état
|
||||
const isEnabled = serviceConfig.enabled === 'on'; // nouvel état
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(__dirname, '../../../data', 'setup.json'),
|
||||
JSON.stringify(setup, null, 2),
|
||||
'utf-8'
|
||||
);
|
||||
try {
|
||||
logger.info(`Processing service ${serviceName}: wasEnabled=${wasEnabled}, isEnabled=${isEnabled}`);
|
||||
|
||||
res.redirect('/dpanel/dashboard/admin/settingsetup');
|
||||
} catch (err) {
|
||||
console.error('Erreur lors de la mise à jour de la configuration:', err);
|
||||
res.status(500).send('Server Error');
|
||||
if (isEnabled && !wasEnabled) {
|
||||
await service.updateConfig(serviceConfig);
|
||||
await service.start();
|
||||
} else if (!isEnabled && wasEnabled) {
|
||||
await service.stop();
|
||||
} else if (isEnabled && wasEnabled &&
|
||||
JSON.stringify(serviceConfig) !== JSON.stringify(oldServiceConfig)) {
|
||||
await service.stop();
|
||||
await service.updateConfig(serviceConfig);
|
||||
await service.start();
|
||||
}
|
||||
} catch (error) {
|
||||
logger.error(`Error handling service ${serviceName}:`, error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Mise à jour de la configuration et gestion des services
|
||||
async function handleServicesUpdate(newConfig, oldConfig) {
|
||||
if (!newConfig.services) return;
|
||||
|
||||
for (const [serviceName, serviceConfig] of Object.entries(newConfig.services)) {
|
||||
const oldServiceConfig = oldConfig?.services?.[serviceName] || {};
|
||||
await handleServices(serviceName, serviceConfig, oldServiceConfig);
|
||||
}
|
||||
}
|
||||
|
||||
// Route principale pour mettre à jour la configuration
|
||||
router.post('/', async (req, res) => {
|
||||
try {
|
||||
const setupPath = path.join(__dirname, '../../../data', 'setup.json');
|
||||
const oldConfig = JSON.parse(fs.readFileSync(setupPath, 'utf-8'))[0];
|
||||
|
||||
// Validation et traitement des IPs autorisées
|
||||
if (req.body.allowedIps) {
|
||||
let ipsToProcess = Array.isArray(req.body.allowedIps) ? req.body.allowedIps : req.body.allowedIps[""] || [];
|
||||
req.body.allowedIps = ipsToProcess.filter(ip => validateIP(ip.trim())).map(ip => ip.trim());
|
||||
}
|
||||
|
||||
['ldap', 'discord'].forEach(service => {
|
||||
if (req.body[service] && !req.body[service].enabled) {
|
||||
req.body[service] = { enabled: 'off' };
|
||||
}
|
||||
});
|
||||
|
||||
// Traitement des services
|
||||
if (req.body.services) {
|
||||
for (const [key, value] of Object.entries(req.body.services)) {
|
||||
if (typeof value === 'string') {
|
||||
req.body.services[key] = { enabled: 'off', schedule: value }; // Par défaut 'off' et ajouter un schedule si nécessaire
|
||||
}
|
||||
|
||||
// Si l'état n'est pas 'on' ou 'off', on le met à 'off'
|
||||
if (value.enabled !== 'on' && value.enabled !== 'off') {
|
||||
req.body.services[key].enabled = 'off';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Traitement des logs
|
||||
if (req.body.logs) {
|
||||
req.body.logs = {
|
||||
enabled: req.body.logs.enabled || "on",
|
||||
excludePaths: Array.isArray(req.body.logs.excludePaths) ? req.body.logs.excludePaths : [],
|
||||
includeOnly: Array.isArray(req.body.logs.includeOnly) ? req.body.logs.includeOnly : [],
|
||||
levels: Array.isArray(req.body.logs.levels) ? req.body.logs.levels : []
|
||||
};
|
||||
}
|
||||
|
||||
// Fusion des anciennes et nouvelles configurations
|
||||
const newConfig = { ...oldConfig, ...req.body };
|
||||
clean(newConfig);
|
||||
|
||||
// Mise à jour des services
|
||||
await handleServicesUpdate(newConfig, oldConfig);
|
||||
|
||||
// Sauvegarde de la nouvelle configuration
|
||||
fs.writeFileSync(setupPath, JSON.stringify([newConfig], null, 2));
|
||||
|
||||
res.status(200).json({ message: 'Configuration mise à jour avec succès.' });
|
||||
} catch (error) {
|
||||
logger.error('Erreur lors de la mise à jour de la configuration:', error);
|
||||
res.status(500).json({ error: 'Erreur interne du serveur.' });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user