'use strict'; const childProcess = require('child_process'); module.exports = class Util { static isValidIPv4(str) { const blocks = str.split('.'); if (blocks.length !== 4) return false; for (let value of blocks) { value = parseInt(value, 10); if (Number.isNaN(value)) return false; if (value < 0 || value > 255) return false; } return true; } static promisify(fn) { // eslint-disable-next-line func-names return function(req, res) { Promise.resolve().then(async () => fn(req, res)) .then(result => { if (res.headersSent) return; if (typeof result === 'undefined') { return res .status(204) .end(); } return res .status(200) .json(result); }) .catch(error => { if (typeof error === 'string') { error = new Error(error); } // eslint-disable-next-line no-console console.error(error); return res .status(error.statusCode || 500) .json({ error: error.message || error.toString(), stack: error.stack, }); }); }; } static async exec(cmd) { // eslint-disable-next-line no-console console.log(`$ ${cmd}`); if (process.platform !== 'linux') { return ''; } return new Promise((resolve, reject) => { childProcess.exec(cmd, { shell: 'bash', }, (err, stdout) => { if (err) return reject(err); return resolve(String(stdout).trim()); }); }); } };