utils.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. const _ = require('lodash');
  2. const exec = require('node:child_process').exec;
  3. const execFile = require('node:child_process').execFile;
  4. const { Liquid } = require('liquidjs');
  5. const logger = require('../logger').global;
  6. const error = require('./error');
  7. module.exports = {
  8. exec: async (cmd, options = {}) => {
  9. logger.debug('CMD:', cmd);
  10. const { stdout, stderr } = await new Promise((resolve, reject) => {
  11. const child = exec(cmd, options, (isError, stdout, stderr) => {
  12. if (isError) {
  13. reject(new error.CommandError(stderr, isError));
  14. } else {
  15. resolve({ stdout, stderr });
  16. }
  17. });
  18. child.on('error', (e) => {
  19. reject(new error.CommandError(stderr, 1, e));
  20. });
  21. });
  22. return stdout;
  23. },
  24. /**
  25. * @param {String} cmd
  26. * @param {Array} args
  27. * @returns {Promise}
  28. */
  29. execFile: (cmd, args) => {
  30. // logger.debug('CMD: ' + cmd + ' ' + (args ? args.join(' ') : ''));
  31. return new Promise((resolve, reject) => {
  32. execFile(cmd, args, (err, stdout, /*stderr*/) => {
  33. if (err && typeof err === 'object') {
  34. reject(err);
  35. } else {
  36. resolve(stdout.trim());
  37. }
  38. });
  39. });
  40. },
  41. /**
  42. * Used in objection query builder
  43. *
  44. * @param {Array} omissions
  45. * @returns {Function}
  46. */
  47. omitRow: (omissions) => {
  48. /**
  49. * @param {Object} row
  50. * @returns {Object}
  51. */
  52. return (row) => {
  53. return _.omit(row, omissions);
  54. };
  55. },
  56. /**
  57. * Used in objection query builder
  58. *
  59. * @param {Array} omissions
  60. * @returns {Function}
  61. */
  62. omitRows: (omissions) => {
  63. /**
  64. * @param {Array} rows
  65. * @returns {Object}
  66. */
  67. return (rows) => {
  68. rows.forEach((row, idx) => {
  69. rows[idx] = _.omit(row, omissions);
  70. });
  71. return rows;
  72. };
  73. },
  74. /**
  75. * @returns {Object} Liquid render engine
  76. */
  77. getRenderEngine: () => {
  78. const renderEngine = new Liquid({
  79. root: `${__dirname}/../templates/`
  80. });
  81. /**
  82. * nginxAccessRule expects the object given to have 2 properties:
  83. *
  84. * directive string
  85. * address string
  86. */
  87. renderEngine.registerFilter('nginxAccessRule', (v) => {
  88. if (typeof v.directive !== 'undefined' && typeof v.address !== 'undefined' && v.directive && v.address) {
  89. return `${v.directive} ${v.address};`;
  90. }
  91. return '';
  92. });
  93. return renderEngine;
  94. }
  95. };