You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

286 lines
9.1 KiB

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);
});