zoneadmin/routes/api.js

462 lines
14 KiB
JavaScript
Raw Normal View History

2017-09-20 23:16:30 +02:00
var express = require('express');
var router = express.Router();
var exec = require('child_process').execFile;
var os = require('os');
var sudo = require('sudo');
var sudoOptions = {
cachePassword: true,
prompt: '?',
spawnOptions: {},
};
/* GET home page. */
router.get('/show-phys', function(req, res, next) {
exec('dladm', ['show-phys'], function(err, data) {
console.log(err);
// console.log(data);
data = data.split(os.EOL);
//data = data[0].split(' ');
response = [];
for(var i = 0; i < data.length; i++) {
if(data[i]) {
response.push({"link": data[i].substring(0, data[0].indexOf('MEDIA')).trim(),
"media": data[i].substring(data[0].indexOf('MEDIA'), data[0].indexOf('STATE')).trim(),
"state": data[i].substring(data[0].indexOf('STATE'), data[0].indexOf('SPEED')).trim(),
"speed": data[i].substring(data[0].indexOf('SPEED'), data[0].indexOf('DUPLEX')).trim(),
"duplex": data[i].substring(data[0].indexOf('DUPLEX'), data[0].indexOf('DEVICE')).trim(),
"device": data[i].substring(data[0].indexOf('DEVICE'), data[i].length).trim()});
}
}
response.splice(0,1);
res.send(response);
})
});
router.get('/show-vnic', function(req, res, next) {
exec('dladm', ['show-vnic'], function(err, data) {
console.log(err);
// console.log(data);
data = data.split(os.EOL);
response = [];
for(var i = 0; i < data.length; i++) {
if(data[i]) {
response.push({'link': data[i].substring(0, data[0].indexOf('OVER')).trim(),
'over': data[i].substring(data[0].indexOf('OVER'), data[0].indexOf('SPEED')).trim(),
'speed': data[i].substring(data[0].indexOf('SPEED'), data[0].indexOf('MACADDRESS')).trim(),
'macaddress': data[i].substring(data[0].indexOf('MACADDRESS'), data[0].indexOf('MACADDRTYPE')).trim(),
'macaddrtype': data[i].substring(data[0].indexOf('MACADDRTYPE'), data[0].indexOf('VID')).trim(),
'vid': data[i].substring(data[0].indexOf('VID'), data[i].length).trim()});
}
}
response.splice(0,1);
res.send(response);
});
});
router.get('/list-zones', function(req, res, next) {
exec('zoneadm', ['list', '-cv'], function(err, data) {
console.log(err);
// console.log(data);
data = data.split(os.EOL);
response = [];
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].trim().split(/[ ]+/);
console.log(data_w);
if(data_w.length == 6) {
response.push({'id': data_w[0].trim(),
'name': data_w[1].trim(),
'status': data_w[2].trim(),
'zone_path': data_w[3].trim(),
'brand': data_w[4].trim(),
'ip': data_w[5].trim()})
}
}
}
response.splice(0,1);
res.send(response);
});
});
router.get('/list-zfs', function(req, res, next) {
exec('zfs', ['list'], function(err, data) {
console.log(err);
// console.log(data);
data = data.split(os.EOL);
data_w = data[0].split(/[ ]+/);
console.log(data_w);
response = [];
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].split(/[ ]+/);
if(data_w.length == 5) {
response.push({'name': data_w[0].trim(),
'used': data_w[1].trim(),
'avail': data_w[2].trim(),
'refer': data_w[3].trim(),
'mountpoint': data_w[4].trim()});
}
}
}
response.splice(0,1);
res.send(response);
});
});
router.get('/list-svc', function(req, res, next) {
exec('svcs', ['-a'], function(err, data) {
console.log(err);
// console.log(data);
data = data.split(os.EOL);
data_w = data[0].split(/[ ]+/);
console.log(data_w);
response = [];
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].split(/[ ]+/);
if(data_w.length == 3) {
response.push({'state': data_w[0].trim(),
'stime': data_w[1].trim(),
'fmri': data_w[2].trim()});
}
}
}
response.splice(0,1);
res.send(response);
});
});
router.get('/list-zpool', function(req, res, next) {
exec('zpool', ['list'], function(err, data) {
console.log(err);
// console.log(data);
data = data.split(os.EOL);
data_w = data[0].split(/[ ]+/);
console.log(data_w);
response = [];
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].split(/[ ]+/);
if(data_w.length == 10) {
response.push({'name': data_w[0].trim(),
'size': data_w[1].trim(),
'alloc': data_w[2].trim(),
'free': data_w[3].trim(),
'expandsz': data_w[4].trim(),
'frag': data_w[5].trim(),
'cap': data_w[6].trim(),
'dedup': data_w[7].trim(),
'health': data_w[8].trim(),
'altroot': data_w[9].trim()});
}
}
}
response.splice(0,1);
res.send(response);
});
});
router.get('/prstat', function(req, res, next) {
exec('prstat', ['-Z', '0', '1'], function(err, data) {
console.log(err);
// console.log(data);
data = data.substring(data.indexOf('ZONEID'), data.indexOf('Total'));
data = data.split(os.EOL);
data_w = data[0].trim().split(/[ ]+/);
console.log(data_w);
response = [];
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].trim().split(/[ ]+/);
if(data_w.length == 8) {
response.push({'zoneid': data_w[0].trim(),
'nproc': data_w[1].trim(),
'swap': data_w[2].trim(),
'rss': data_w[3].trim(),
'memory': data_w[4].trim(),
'time': data_w[5].trim(),
'cpu': data_w[6].trim(),
'zone': data_w[7].trim()});
}
}
}
response.splice(0,1);
res.send(response);
});
});
router.get('/statsCPU', function(req, res, next) {
exec('prstat', ['-Z', '0', '1'], function(err, data) {
console.log(err);
// console.log(data);
data = data.substring(data.indexOf('ZONEID'), data.indexOf('Total'));
data = data.split(os.EOL);
data_w = data[1].trim().split(/[ ]+/);
data.splice(0,1);
// console.log(data_w);
response = {
labels: [],
datasets: [
{
data: [],
backgroundColor: [
'#FFAC0D',
'#E8840C',
'#FF6600',
'#E8440C',
'#FF270D',
],
}
]
};
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].trim().split(/[ ]+/);
if(data_w.length == 8) {
response.labels.push(data_w[7].trim());
response.datasets[0].data.push(parseFloat(data_w[6].trim().toString().replace(',', '.')));
}
}
}
var part = 0;
for(var i = 0; i < response.datasets[0].data.length; i++) {
part += response.datasets[0].data[i];
}
response.labels.push('free');
response.datasets[0].data.push(100-part);
res.send(response);
});
});
router.get('/statsMEM', function(req, res, next) {
exec('prstat', ['-Z', '0', '1'], function(err, data) {
console.log(err);
// console.log(data);
data = data.substring(data.indexOf('ZONEID'), data.indexOf('Total'));
data = data.split(os.EOL);
data_w = data[1].trim().split(/[ ]+/);
data.splice(0,1);
// console.log(data_w);
response = {
labels: [],
datasets: [
{
data: [],
backgroundColor: [
'#FFAC0D',
'#E8840C',
'#FF6600',
'#E8440C',
'#FF270D',
],
}
]
};
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].trim().split(/[ ]+/);
if(data_w.length == 8) {
response.labels.push(data_w[7].trim());
response.datasets[0].data.push(parseFloat(data_w[4].trim().toString().replace(',', '.')));
}
}
}
var part = 0;
for(var i = 0; i < response.datasets[0].data.length; i++) {
part += response.datasets[0].data[i];
}
response.labels.push('free');
response.datasets[0].data.push(100-part);
res.send(response);
});
});
router.get('/cpu-load', function(req, res, next) {
res.send(os.loadavg());
});
router.get('/poweroff/:zoneName', function(req, res, next) {
exec('pfexec', ['zoneadm', '-z', req.params.zoneName, 'shutdown'], function(err, data) {
console.log('Shutdown initiated for ' + req.params.zoneName);
console.log(err);
console.log(data);
});
res.send('OK');
});
router.get('/boot/:zoneName', function(req, res, next) {
exec('pfexec', ['zoneadm', '-z', req.params.zoneName, 'boot'], function(err, data) {
console.log('Boot initiated for ' + req.params.zoneName);
console.log(err);
console.log(data);
});
});
router.get('/stats', function(req, res, next) {
result = {};
result.cpuLoad = os.loadavg();
resultCount = 0;
exec('zoneadm', ['list', '-cv'], function(err, data) {
console.log(err);
// console.log(data);
data = data.split(os.EOL);
response = [];
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].trim().split(/[ ]+/);
// console.log(data_w);
if(data_w.length == 6) {
response.push({'id': data_w[0].trim(),
'name': data_w[1].trim(),
'status': data_w[2].trim(),
'zone_path': data_w[3].trim(),
'brand': data_w[4].trim(),
'ip': data_w[5].trim()})
}
}
}
response.splice(0,1);
result.listZones = response;
resultCount++;
if(resultCount == 3) {
res.send(result);
}
});
exec('prstat', ['-Z', '0', '1'], function(err, data) {
console.log(err);
// console.log(data);
data = data.substring(data.indexOf('ZONEID'), data.indexOf('Total'));
data = data.split(os.EOL);
data_w = data[1].trim().split(/[ ]+/);
data.splice(0,1);
// console.log(data_w);
response = {
labels: [],
datasets: [
{
data: [],
backgroundColor: [
'#FFAC0D',
'#E8840C',
'#FF6600',
'#E8440C',
'#FF270D',
],
}
]
};
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].trim().split(/[ ]+/);
if(data_w.length == 8) {
response.labels.push(data_w[7].trim());
response.datasets[0].data.push(parseFloat(data_w[6].trim().toString().replace(',', '.')));
}
}
}
var part = 0;
for(var i = 0; i < response.datasets[0].data.length; i++) {
part += response.datasets[0].data[i];
}
response.labels.push('free');
response.datasets[0].data.push(100-part);
result.statsCPU = response;
resultCount++;
if(resultCount == 3) {
res.send(result);
}
});
exec('prstat', ['-Z', '0', '1'], function(err, data) {
console.log(err);
// console.log(data);
data = data.substring(data.indexOf('ZONEID'), data.indexOf('Total'));
data = data.split(os.EOL);
data_w = data[1].trim().split(/[ ]+/);
data.splice(0,1);
// console.log(data_w);
response = {
labels: [],
datasets: [
{
data: [],
backgroundColor: [
'#FFAC0D',
'#E8840C',
'#FF6600',
'#E8440C',
'#FF270D',
],
}
]
};
for(var i = 0; i < data.length; i++) {
if(data[i]) {
data_w = data[i].trim().split(/[ ]+/);
if(data_w.length == 8) {
response.labels.push(data_w[7].trim());
response.datasets[0].data.push(parseFloat(data_w[4].trim().toString().replace(',', '.')));
}
}
}
var part = 0;
for(var i = 0; i < response.datasets[0].data.length; i++) {
part += response.datasets[0].data[i];
}
response.labels.push('free');
response.datasets[0].data.push(100-part);
result.statsMEM = response;
resultCount++;
if(resultCount == 3) {
res.send(result);
}
});
});
router.get('/createvnic/:vnicName/:overName', function(req, res, next) {
exec('pfexec', ['dladm', 'create-vnic', '-l', req.params.overName, req.params.vnicName], function(err, data) {
console.log('Vnic created: ' + req.params.vnicName + ' over ' + req.params.overName);
console.log(err);
console.log(data);
res.send('OK');
});
});
router.get('/deletevnic/:vnicName', function(req, res, next) {
exec('pfexec', ['dladm', 'delete-vnic', req.params.vnicName], function(err, data) {
console.log('Vnic deleted: ' + req.params.vnicName);
console.log(err);
console.log(data);
res.send('OK');
});
});
router.get('/createvm/:vmName/:vnicName', function(req, res, next) {
var child = sudo(['pfexec', __dirname + '/scripts/create-vm', req.params.vmName, req.params.vnicName], sudoOptions);
child.stdout.on('data', function(data) {
console.log('VM created: ' + req.params.vmName);
//console.log(err);
console.log(data.toString());
});
res.send('OK');
});
router.get('/deletevm/:vmName', function(req, res, next) {
var child = sudo([__dirname + '/scripts/delete-vm', req.params.vmName], sudoOptions);
child.stdout.on('data', function(data) {
console.log('VM deleted: ' + req.params.vmName);
console.log(data.toString());
});
res.send('OK');
})
module.exports = router;