diff --git a/index.jsx b/index.jsx index 0a40715..365d84e 100644 --- a/index.jsx +++ b/index.jsx @@ -13,7 +13,7 @@ function createLocalState(initState) { const initialState = { address: '', port: '', username: '', key: '', database: '', - databases: [], modules: '', serverlog: '', connected: false + databases: [], modules: '', serverlog: '', connected: false, stop: false }; const [isConnected, setIsConnected] = createSignal(false); @@ -183,7 +183,7 @@ const OdooDockerSshAdminActions = () => { const webStop = cmdFetch('webstop'); const webRestart = cmdFetch('webrestart'); const odooStart = cmdFetch('odoostart'); - const odooStop = cmdFetch('odoostop'); + const stop = cmdFetch('odoostop'); const odooRestart = cmdFetch('odoorestart'); const dbStart = cmdFetch('dbstart'); const dbStop = cmdFetch('dbstop'); @@ -198,7 +198,7 @@ const OdooDockerSshAdminActions = () => {
-
@@ -254,6 +254,34 @@ const OdooDockerSshAdminModules = () => { return names.length ? names.join(', ') : 'Aucune base sélectionnée'; }; + const odooCmd = (action) => { + return () => { + if (!isConnected()) { + humane.log('Non connecté : impossible de lancer une commande Odoo.'); + } else { + humane.log('Commande lancée, veuillez patienter.'); + fetch('/odooaction', { + method: 'POST', + body: JSON.stringify({ + stop: state.stop, + databases: state.databases.filter((db) => db.checked).map((db) => db.name), + modules: state.modules, + action: action + }), + headers: {'Content-Type': 'application/json'} + }) + .then(response => { + if (response.status != 200) { humane.log('Erreur : voyez le retour serveur'); } + return response.json(); + }) + .then(body => { + humane.log('Commande terminée.'); + setState('serverlog', state.serverlog + body); + }) + } + }; + }; + return

🗄 Modules

@@ -266,11 +294,16 @@ const OdooDockerSshAdminModules = () => {
- + setState('stop', e.target.checked)} />
- - + + }; diff --git a/server.js b/server.js index 1459f7d..0c5fefd 100644 --- a/server.js +++ b/server.js @@ -54,58 +54,84 @@ const disconnect = (req, res) => { }; const serverCommand = (req, res) => { - if (!req.params.cmd) { - res.end(sendJSON(res, 403, 'Pas de commande à exécuter')); - } else { - let execCmd = 'cd ~/docker/hosts/*/ && '; - switch (req.params.cmd) { - case 'webstart': - execCmd += 'docker-compose start nginx'; - break; - case 'webstop': - execCmd += 'docker-compose stop nginx'; - break; - case 'webrestart': - execCmd += 'docker-compose restart nginx'; - break; - case 'odoostart': - execCmd += 'docker-compose start golem'; - break; - case 'odoostop': - execCmd += 'docker-compose stop golem'; - break; - case 'odoorestart': - execCmd += 'docker-compose restart golem'; - break; - case 'dbstart': - execCmd += 'docker-compose start pggolem'; - break; - case 'dbstop': - execCmd += 'docker-compose stop pggolem'; - break; - case 'dbrestart': - execCmd += 'docker-compose restart pggolem'; - break; - default: - execCmd = '/bin/true'; - } - if (sshConn) { - sshConn.exec(execCmd, (err, stream) => { - if (err) throw err; - let std = ''; - stream.on('close', function(code, signal) { - console.log('Stream :: close :: code: ' + code + ', signal: ' + signal); - res.end(sendJSON(res, 200, std)); - }).on('data', function(data) { - console.log('STDOUT: ' + data); - std += data; - }).stderr.on('data', function(data) { - console.log('STDERR: ' + data); - std += data; - }); - }); - } + let execCmd = 'cd ~/docker/hosts/*/ && '; + switch (req.params.cmd) { + case 'webstart': + execCmd += 'docker-compose start nginx'; + break; + case 'webstop': + execCmd += 'docker-compose stop nginx'; + break; + case 'webrestart': + execCmd += 'docker-compose restart nginx'; + break; + case 'odoostart': + execCmd += 'docker-compose start golem'; + break; + case 'odoostop': + execCmd += 'docker-compose stop golem'; + break; + case 'odoorestart': + execCmd += 'docker-compose restart golem'; + break; + case 'dbstart': + execCmd += 'docker-compose start pggolem'; + break; + case 'dbstop': + execCmd += 'docker-compose stop pggolem'; + break; + case 'dbrestart': + execCmd += 'docker-compose restart pggolem'; + break; + default: + execCmd = '/bin/true'; } + if (sshConn) { + sshConn.exec(execCmd, (err, stream) => { + if (err) throw err; + let std = ''; + stream.on('close', function(code, signal) { + console.log('Stream :: close :: code: ' + code + ', signal: ' + signal); + res.end(sendJSON(res, 200, std)); + }).on('data', function(data) { + console.log('STDOUT: ' + data); + std += data; + }).stderr.on('data', function(data) { + console.log('STDERR: ' + data); + std += data; + }); + }); + } +}; + +const odooAction = (req, res) => { + console.log(req.body); + if (!req.body.databases.length) { + res.end(sendJSON(res, 500, 'Erreur : pas de base de données sélectionnée.\n')); + } + if (!req.body.modules.length) { + res.end(sendJSON(res, 500, 'Erreur : aucun module fourni.\n')); + } + let execCmd = 'cd ~/docker/hosts/*/ && '; + // Base command + let odooCmd = 'OCB/odoo-bin -c odoo.conf --no-xmlrpc --stop-after-init '; + // Install or update + odooCmd += (req.body.action == 'install') ? '-i ' : '-u '; + odooCmd += req.body.modules; + // TODO: multi databases + if (req.body.databases.length == 1) { + odooCmd += ' -d ' + req.body.databases[0]; + } + if (req.body.stop) { + execCmd += 'docker-compose stop golem && ' + execCmd += 'docker-compose run --rm golem bash -c \'bash genconf.sh && ' + odooCmd + '\' && '; + execCmd += 'docker-compose start golem' + } else { + execCmd += 'docker-compose exec golem bash -c \'' + odooCmd + '\''; + } + console.log(odooCmd); + console.log(execCmd); + res.end(sendJSON(res, 200, 'OK')); }; polka({ server }) @@ -113,6 +139,7 @@ polka({ server }) .post('/connect', connect) .get('/disconnect', disconnect) .get('/cmd/:cmd', serverCommand) + .post('/odooaction', odooAction) .listen(PORT, err => { if (err) throw err; console.log(`> Running on localhost:${PORT}`);