diff --git a/src/routes/system.js b/src/routes/system.js index 82bfcccf0..aad997394 100644 --- a/src/routes/system.js +++ b/src/routes/system.js @@ -11,7 +11,8 @@ exports = module.exports = { getLogStream, getSystemGraphs, getBlockDevices, - getCpus + getCpus, + getDmi }; const assert = require('assert'), @@ -151,3 +152,10 @@ async function getCpus(req, res, next) { next(new HttpSuccess(200, { cpus })); } + +async function getDmi(req, res, next) { + const [error, dmi] = await safe(system.getDmi()); + if (error) return next(BoxError.toHttpError(error)); + + next(new HttpSuccess(200, { dmi })); +} diff --git a/src/routes/test/system-test.js b/src/routes/test/system-test.js index 861330f53..d8885b654 100644 --- a/src/routes/test/system-test.js +++ b/src/routes/test/system-test.js @@ -33,6 +33,19 @@ describe('System', function () { }); }); + describe('dmi', function () { + it('succeeds', async function () { + const response = await superagent.get(`${serverUrl}/api/v1/system/dmi`) + .query({ access_token: owner.token }); + + expect(response.statusCode).to.equal(200); + expect(response.body.dmi).to.be.ok(); + + expect(response.body.dmi.sysVendor).to.be.a('string'); + expect(response.body.dmi.productName).to.be.a('string'); + }); + }); + describe('logs', function () { before(function () { console.log(paths.BOX_LOG_FILE); diff --git a/src/server.js b/src/server.js index 95fb916bb..d4ffc4b58 100644 --- a/src/server.js +++ b/src/server.js @@ -115,6 +115,7 @@ async function initializeExpressSync() { router.get ('/api/v1/system/graphs', token, authorizeAdmin, routes.system.getSystemGraphs); router.get ('/api/v1/system/disks', token, authorizeAdmin, routes.system.getDisks); router.get ('/api/v1/system/cpus', token, authorizeAdmin, routes.system.getCpus); + router.get ('/api/v1/system/dmi', token, authorizeAdmin, routes.system.getDmi); router.get ('/api/v1/system/disk_usage', token, authorizeAdmin, routes.system.getDiskUsage); router.post('/api/v1/system/disk_usage', token, authorizeAdmin, routes.system.updateDiskUsage); router.get ('/api/v1/system/block_devices', token, authorizeAdmin, routes.system.getBlockDevices); diff --git a/src/system.js b/src/system.js index 5ba29962c..407de2f15 100644 --- a/src/system.js +++ b/src/system.js @@ -16,7 +16,8 @@ exports = module.exports = { getBlockDevices, runSystemChecks, getProvider, - getCpus + getCpus, + getDmi }; const apps = require('./apps.js'), @@ -369,3 +370,13 @@ function getProvider() { async function getCpus() { return os.cpus(); } + +async function getDmi() { + const sysVendor = safe.fs.readFileSync('/sys/devices/virtual/dmi/id/sys_vendor', 'utf8'); + const productName = safe.fs.readFileSync('/sys/devices/virtual/dmi/id/product_name', 'utf8'); + + return { + sysVendor, + productName + }; +} diff --git a/src/test/system-test.js b/src/test/system-test.js index e1067cd8f..b50655446 100644 --- a/src/test/system-test.js +++ b/src/test/system-test.js @@ -52,7 +52,14 @@ describe('System', function () { expect(cpus).to.be.an(Array); expect(cpus[0].model).to.be.a('string'); }); - + + it('can get DMI', async function () { + const dmi = await system.getDmi(); + + expect(dmi.sysVendor).to.be.a('string'); + expect(dmi.productName).to.be.a('string'); + }); + it('can get diskUsage', async function () { const usage = await system.getDiskUsage(); expect(usage).to.be(null); // nothing cached