diff --git a/index.jsx b/index.jsx index 34876f7..0a40715 100644 --- a/index.jsx +++ b/index.jsx @@ -15,10 +15,10 @@ const initialState = { address: '', port: '', username: '', key: '', database: '', databases: [], modules: '', serverlog: '', connected: false }; +const [isConnected, setIsConnected] = createSignal(false); const OdooDockerSshAdminConfig = () => { const [state, setState] = createLocalState(initialState); - const [isConnected, setIsConnected] = createSignal(false); const [passphrase, setPassphrase] = createSignal(''); const valueSet = ({target}) => setState(target.name, target.value); @@ -163,39 +163,83 @@ const OdooDockerSshAdminDatabases = () => { const OdooDockerSshAdminActions = () => { const [state, setState] = createLocalState(initialState); + const cmdFetch = (cmd) => { + return () => { + if (!isConnected()) { + humane.log('Non connecté : impossible de lancer une commande.'); + } else { + humane.log('Commande lancée, veuillez patienter.'); + fetch('/cmd/' + cmd) + .then(response => response.json()) + .then(body => { + humane.log('Commande terminée.'); + setState('serverlog', state.serverlog + body); + }) + } + }; + }; + + const webStart = cmdFetch('webstart'); + const webStop = cmdFetch('webstop'); + const webRestart = cmdFetch('webrestart'); + const odooStart = cmdFetch('odoostart'); + const odooStop = cmdFetch('odoostop'); + const odooRestart = cmdFetch('odoorestart'); + const dbStart = cmdFetch('dbstart'); + const dbStop = cmdFetch('dbstop'); + const dbRestart = cmdFetch('dbrestart'); + return

🚩 Actions

- +
- +
- +
- +
- +
- +
- +
- +
- +
diff --git a/server.js b/server.js index d9ad753..1459f7d 100644 --- a/server.js +++ b/server.js @@ -21,7 +21,6 @@ const sendJSON = (res, httpCode, message) => { }; const connect = (req, res) => { - console.log(req.body); if (!req.body.address.length || !req.body.username.length || !req.body.port.length || !req.body.key.length) { res.end(sendJSON(res, 500, 'Erreur : un champ requis manque.')); @@ -30,7 +29,7 @@ const connect = (req, res) => { try { sshConn.on('ready', () => { console.log('Client :: ready'); - res.end(sendJSON(res, 200, 'OK, connected!')); + res.end(sendJSON(res, 200, 'OK, connecté !')); }).connect({ host: req.body.address, port: req.body.port, @@ -50,14 +49,70 @@ const connect = (req, res) => { }; const disconnect = (req, res) => { - sshConn.end(); - res.end(sendJSON(res, 200, 'OK, disconnected!')); + if (sshConn) sshConn.end(); + res.end(sendJSON(res, 200, 'OK, déconnecté !')); +}; + +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; + }); + }); + } + } }; polka({ server }) .use(json(), files) .post('/connect', connect) .get('/disconnect', disconnect) + .get('/cmd/:cmd', serverCommand) .listen(PORT, err => { if (err) throw err; console.log(`> Running on localhost:${PORT}`);