var fs = require('fs'); var express = require('express'); var https = require('https'); var app = express(); const cors = require('cors') const helmet = require('helmet'); var allowedOrigins = [ 'https://localhost:55543', 'http://localhost:8080' ]; app.use(cors({ origin: function(origin, callback){ // allow requests with no origin // (like mobile apps or curl requests) if(!origin) return callback(null, true); if(allowedOrigins.indexOf(origin) === -1){ var msg = 'The CORS policy for this site does not '; return callback(new Error(msg), false); } return callback(null, true); } })); //app.use(cors) app.use(helmet()); app.use(express.json()); var options = { key: fs.readFileSync('./llo/swarmlab.key'), cert: fs.readFileSync('./llo/swarmlab.crt') }; var serverPort = 3000; var server = https.createServer(options, app); var io = require('socket.io')(server); const { spawn, exec } = require('child_process') // const { exec } = require('child_process'); //const chokidar = require('chokidar'); //const logout = fs.openSync('./logs/out.log', 'a'); //const logerr = fs.openSync('./logs/out.log', 'a'); //const watcher = chokidar.watch('./logs/out.log', { persistent: true }); //const Tail = require('nodejs-tail'); //const tail = new Tail('./logs/out.log'); //tail.watch(); // tail.on('line', (line) => { // var n = {} // n.data = line // io.emit('message_out', n); // }) /* watcher .on('add', path => { var n = {} n.data = path.toString() }) .on('change', async path => { //var updateContent = await readLastLines.read(path, 1); tail.on('line', (line) => { var n = {} n.data = line io.emit('message_out', n); }) }) .on('unlink', path => { var n = {} n.data = path.toString() io.emit('message_out', n); }); */ // *************************************************** // rest get // *************************************************** app.get('/dockerservices', (req, res, next) => { //var showexec = `docker ps --format `docker ps --format '{"ID":"{{ .ID }}", "Image": "{{ .Image }}", "Names":"{{ .Names }}", "Command": "{{ .Command }}", "CreatedAt": "{{ .CreatedAt }}", "Networks": "{{ .Networks }}"}' | jq . -s ` //var showexec = `docker ps --format '{"ID":"{{ .ID }}", "Image": "{{ .Image }}", "Names":"{{ .Names }}"}' | jq . -s ` //docker ps --format '{"ID":"{{ .ID }}", "Image": "{{ .Image }}", "Names":"{{ .Names }}", "Command": "{{ .Command }}", "CreatedAt": "{{ .CreatedAt}}", "Networks":"{{ .Networks}}", "Ports": "{{ .Ports}}", "RunningFor": "{{ .RunningFor}}", "Status": "{{ .Status}}" }' //var showexec = `docker ps --format '{"ID":"{{ .ID }}", "Image": "{{ .Image }}", "Names":"{{ .Names }}", "Ports":"{{.Ports}}", "Networks":"{{.Networks}}", "Status":"{{.Status}}","Command":"{{,Command}}","RunningFor":"{{.RunningFor}}","CreatedAt":"{{.CreatedAt}}"}' | jq . -s ` var showexec = `docker ps --format '{"ID":"{{ .ID }}", "Image": "{{ .Image }}", "Names":"{{ .Names }}", "Ports":"{{.Ports}}", "Networks":"{{.Networks}}", "Status":"{{.Status}}","RunningFor":"{{.RunningFor}}","CreatedAt":"{{.CreatedAt}}"}' | jq . -s ` exec(showexec, (err, stdout, stderr) => { if (err) { console.error(`exec error: ${err}`); return; } var nn = [] var string = stdout.toString() var datajson = JSON.parse(string); console.log('Number of files ' + stdout); console.log('Number string ' + string); console.log('stringify ' + JSON.stringify(datajson)); var total = datajson.length var perpage = 5 var page = 1 var lastpage = total/5 var from = 1 var to = 5 var myplaybooks = new Object(); var links = ` { "pagination": { "total": ${total}, "per_page": ${perpage}, "current_page": ${page}, "last_page": ${lastpage}, "next_page_url": "?page=$next", "prev_page_url": "?page=$prev", "from": ${from}, "to": ${to}, "frommongo": "frommongo", "tomongo": "tomongo" } } ` //myplaybooks.links = links myplaybooks.links = JSON.parse(links); myplaybooks.data = datajson; var RES = new Object(); RES.code = req.query["action"] RES.token = req.query["token"] RES.error = false RES.error_msg = "ok" RES.data = myplaybooks; res.json(RES.data) }); }); app.get('/getservicesinfo', (req, res, next) => { var RES = new Object(); RES.instance = req.query["instance"] var services_path = './instance/'+RES.instance console.log(services_path) if (fs.existsSync(services_path)) { var found = 'yes' RES.error = false RES.error_msg = "ok" RES.data = found; res.json(RES) }else{ var found = 'no' RES.error = false RES.error_msg = "ok" RES.data = found; res.json(RES) } }); app.get('/getservicesstatus', (req, res, next) => { var RES = new Object(); RES.instance = req.query["instance"] var showexec = `docker ps --format '{"Names":"{{ .Names }}", "Status":"{{.Status}}"}' | jq . -s ` exec(showexec, (err, stdout, stderr) => { if (err) { console.error(`exec error: ${err}`); return; } if (stdout) { var string = stdout.toString() var datajson = JSON.parse(string); console.log(JSON.stringify(datajson.length)) console.log(JSON.stringify(datajson)) var extenderror = new RegExp(RES.instance); var found = 'no'; for(var i = 0; i < datajson.length; i++) { var servicename = datajson[i].Names console.log(JSON.stringify(servicename)) if(extenderror.test(servicename)){ found = 'yes'; } } RES.error = false RES.error_msg = "ok" RES.test = datajson; RES.data = found; res.json(RES) }else{ var found = 'no' RES.error = false RES.error_msg = "ok" RES.data = found; res.json(RES) } }); }); let child = []; var ppid = '' io.on('connection', function(socket) { console.log('new connection'); socket.on('start', (service) => { var services_path = './instance/'+service+'/'+service //const childstart = spawn('/bin/sh ./swarmlab-sec/hybrid//start.sh'); //child[0] = spawn('/bin/sh ./start.sh', { child[0] = spawn('/bin/bash ../install/usr/share/swarmlab.io/sec/swarmlab-sec up size=3', { shell: true, //shell: false, cwd: services_path, //detached: true, detached: false, //stdio: [ 'ignore', logout, logerr ] stdio: 'pipe' }); //child[0].unref(); ppid = child[0].pid; console.log(ppid) child[0].stdout.on('data', function (data) { var n = {} n.data = data.toString() io.emit('message_out', n); }); child[0].stderr.on('data', function (data) { var n = {} n.data = data.toString() io.emit('message_err', n); }); child[0].on('close', function (code) { var n = {} n.data = code io.emit('message_close', n); }); }); socket.on('stop', (service) => { var services_path = './instance/'+service+'/'+service const stop = spawn('/bin/sh ./stop.sh', { stdio: 'pipe', shell: true, cwd: services_path }); stop.stdout.on('data', function (data) { var n = {} n.data = data.toString() io.emit('message_out', n); }); stop.stderr.on('data', function (data) { var n = {} n.data = data.toString() io.emit('message_err', n); }); stop.on('close', function (code) { var n = {} n.data = code io.emit('message_close', n); }); }); socket.on('kill', () => { console.log(ppid) //process.kill(ppid, 'SIGHUP'); child[0].kill('SIGHUP'); //child[0].kill('SIGINT'); //child[0].kill(); }); }); server.listen(serverPort, function() { console.log('server up and running at %s port', serverPort); });