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;