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 simpleGit = require('simple-git'); // 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) } }); }); function create_project(swarmlabname,project){ var services_path = './instance/'+swarmlabname+'/'+project fs.mkdir(services_path, { recursive: true }, (err) => { var service_up = '/bin/bash ../install/usr/share/swarmlab.io/sec/swarmlab-sec create' create = spawn(service_up, { shell: true, cwd: services_path, //detached: true, detached: false, //stdio: [ 'ignore', logout, logerr ] stdio: 'pipe' }); create.stdout.on('data', function (data) { var n = {} n.data = data.toString() io.emit('message_out', n); }); create.stderr.on('data', function (data) { var n = {} n.data = data.toString() io.emit('message_err', n); }); create.on('close', function (code) { var n = {} n.data = code io.emit('message_close', n); }); }); } let child = []; var ppid = '' io.on('connection', function(socket) { console.log('new connection'); socket.on('start', (value) => { console.log('start') console.log('value '+JSON.stringify(value)) if(value.swarmlabname){ var service = value.swarmlabname var services_path = './instance/'+service+'/'+service var ENV_service_file_path = services_path+'/.env' var service_port = '' if(value.swarmlabname_size){ var service_size = value.swarmlabname_size }else{ var service_size = 3 } const apptest = require('express')(); const servertest = apptest.listen(0, () => { var newport = servertest.address().port servertest.close(); if(value.swarmlabname_port){ service_port = value.swarmlabname_port }else{ service_port = newport } var ENV_service_file = ` REGISTRY_ADDR=localhost REGISTRY_PORT=5000 IMAGE_NAME=${service} SSH_PORT=${service_port} TEST=${service} ` console.log('value1 '+JSON.stringify(ENV_service_file_path)) console.log('value2 '+JSON.stringify(ENV_service_file)) fs.writeFileSync(ENV_service_file_path, ENV_service_file ,{encoding:'utf8',flag:'w'}); var service_up = '/bin/bash ../install/usr/share/swarmlab.io/sec/swarmlab-sec up size='+service_size child[0] = spawn(service_up, { shell: true, cwd: services_path, //detached: true, detached: false, //stdio: [ 'ignore', logout, logerr ] stdio: 'pipe' }); 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); }); }); }else{ var n = {} n.data = 'NoSwarmlabname' io.emit('message_err', 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('install', (value) => { if(value.swarmlabname){ console.log('install') var service = value.swarmlabname var service_git = value.git var services_path = './instance/'+service var ENV_service_dir = services_path+'/'+service var ENV_service_file_path = services_path+'/'+service+'/'.env if (fs.existsSync(services_path)) { const git = simpleGit( { baseDir: services_path, maxConcurrentProcesses: 10 }); try { git.pull() .then((status) => { var n = {} n.data = 'Updated' io.emit('message_out', n); n.data = '...' io.emit('message_close', n); create_project(service,service) }).catch((err) => { var n = {} n.data = err.toString() io.emit('message_err', n); console.log('error ' + JSON.stringify(err)) }); } catch (e) { var n = {} n.data = e.toString() io.emit('message_err', n); } }else{ fs.mkdir(services_path, { recursive: true }, (err) => { if (err){ console.log('error ' + JSON.stringify(err)) }else{ var ENV_service_file = ` REGISTRY_ADDR=localhost REGISTRY_PORT=5000 IMAGE_NAME=${service} SSH_PORT= ` const git = simpleGit( { baseDir: '.', maxConcurrentProcesses: 10 }); try { git.clone(service_git, services_path) .then((status) => { var n = {} n.data = 'Installed' io.emit('message_out', n); n.data = '...' io.emit('message_out', n); fs.writeFileSync(ENV_service_file_path, ENV_service_file); create_project(service,service) }).catch((err) => { var n = {} n.data = err.toString() io.emit('message_err', n); console.log('error ' + JSON.stringify(err)) }); } catch (e) { var n = {} n.data = e.toString() io.emit('message_err', n); } } }); } }else{ var n = {} n.data = 'no services' io.emit('message_err', n); } }); socket.on('container-stop', (service, id) => { var services_path = './instance/'+service+'/'+service var containerrm = '/bin/sh ./container-stop.sh '+id const stop = spawn(containerrm, { 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); });