diff --git a/src/api/admin.js b/src/api/admin.js index 800c00b..dd62d55 100644 --- a/src/api/admin.js +++ b/src/api/admin.js @@ -669,4 +669,29 @@ exports.setup = (mstream) => { res.status(500).json({ error: typeof err === 'string' ? err : 'Unknown Error' }); } }); + + let enableFederationDebouncer = false; + mstream.post('/api/v1/admin/federation/enable', async (req, res) => { + try { + const schema = Joi.object({ enable: Joi.boolean().required() }); + await schema.validateAsync(req.body); + }catch (err) { + return res.status(500).json({ error: 'Validation Error' }); + } + + try { + if (enableFederationDebouncer === true) { throw 'Debouncer Enabled'; } + await admin.enableFederation(req.body.enable); + res.json({}); + } catch(err) { + winston.error('admin error', {stack: err}); + res.status(500).json({ error: typeof err === 'string' ? err : 'Unknown Error' }); + } + + enableFederationDebouncer = true; + setTimeout(() => { + enableFederationDebouncer = false; + }, 5000); + }); + } \ No newline at end of file diff --git a/src/state/syncthing.js b/src/state/syncthing.js index 78e7aff..75a96de 100644 --- a/src/state/syncthing.js +++ b/src/state/syncthing.js @@ -48,7 +48,7 @@ exports.getPathId = (path) => { // TODO: change this for server reboot exports.setup = async () => { - if (config.program.federation.enabled === false) { return; } + if (config.program.federation.enabled === false) { return this.kill(); } try { await initSyncthingConfig(); @@ -61,6 +61,18 @@ exports.setup = async () => { } } +let preventRebootFlag = false; +exports.kill = async () => { + if(spawnedProcess) { + preventRebootFlag = true; + spawnedProcess.stdin.pause(); + spawnedProcess.kill(); + delete spawnedProcess; + delete myId; + delete xmlObj; + } +} + function initSyncthingConfig() { return new Promise((resolve, reject) => { const newProcess = spawn(path.join(__dirname, `../../bin/syncthing/${osMap[platform]}`), [`--generate=${config.program.storage.syncConfigDirectory}`], {}); @@ -349,7 +361,7 @@ function bootProgram() { } try { - spawnedProcess = spawn(path.join(__dirname, `../../bin/syncthing/${osMap[platform]}`), ['--home', config.program.storage.syncConfigDirectory], {}); + spawnedProcess = spawn(path.join(__dirname, `../../bin/syncthing/${osMap[platform]}`), ['--home', config.program.storage.syncConfigDirectory, '--no-browser'], {}); spawnedProcess.stdout.on('data', (data) => { winston.info(`sync: ${data}`); @@ -360,12 +372,17 @@ function bootProgram() { }); spawnedProcess.on('close', (code) => { - winston.info('Sync: SyncThing failed. Attempting to reboot'); - setTimeout(() => { - winston.info('Sync: Rebooting SyncThing'); - delete spawnedProcess; - bootProgram(); - }, 4000); + if (preventRebootFlag === false) { + winston.info('Syncthing failed. Attempting to reboot'); + setTimeout(() => { + winston.info('Sync: Rebooting SyncThing'); + delete spawnedProcess; + bootProgram(); + }, 4000); + } else { + winston.info('Syncthing Turned Off'); + preventRebootFlag = false; + } }); winston.info('Sync: SyncThing Booted'); diff --git a/src/util/admin.js b/src/util/admin.js index 392569d..df13a36 100644 --- a/src/util/admin.js +++ b/src/util/admin.js @@ -6,6 +6,7 @@ const mStreamServer = require('../server'); const dbQueue = require('../db/task-queue'); const logger = require('../logger'); const db = require('../db/manager'); +const syncthing = require('../state/syncthing'); exports.loadFile = async (file) => { return JSON.parse(await fs.readFile(file, 'utf-8')); @@ -317,3 +318,13 @@ exports.lockAdminApi = async (val) => { config.program.lockAdmin = val; } + +exports.enableFederation = async (val) => { + const loadConfig = await this.loadFile(config.configFile); + loadConfig.federation.enabled = val; + await this.saveFile(loadConfig, config.configFile); + + config.program.federation.enabled = val; + + syncthing.setup(); +} diff --git a/webapp/admin/index.html b/webapp/admin/index.html index cf5ae46..8c2cf81 100644 --- a/webapp/admin/index.html +++ b/webapp/admin/index.html @@ -106,10 +106,10 @@ Transcoding - +