462 lines
14 KiB
JavaScript
462 lines
14 KiB
JavaScript
|
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;
|