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.
471 lines
15 KiB
471 lines
15 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 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);
|
|
});
|
|
|