parser.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. 'use strict';
  2. var CronExpression = require('./expression');
  3. function CronParser() {}
  4. /**
  5. * Parse crontab entry
  6. *
  7. * @private
  8. * @param {String} entry Crontab file entry/line
  9. */
  10. CronParser._parseEntry = function _parseEntry (entry) {
  11. var atoms = entry.split(' ');
  12. if (atoms.length === 6) {
  13. return {
  14. interval: CronExpression.parse(entry)
  15. };
  16. } else if (atoms.length > 6) {
  17. return {
  18. interval: CronExpression.parse(entry),
  19. command: atoms.slice(6, atoms.length)
  20. };
  21. } else {
  22. throw new Error('Invalid entry: ' + entry);
  23. }
  24. };
  25. /**
  26. * Wrapper for CronExpression.parser method
  27. *
  28. * @public
  29. * @param {String} expression Input expression
  30. * @param {Object} [options] Parsing options
  31. * @return {Object}
  32. */
  33. CronParser.parseExpression = function parseExpression (expression, options, callback) {
  34. return CronExpression.parse(expression, options, callback);
  35. };
  36. /**
  37. * Parse content string
  38. *
  39. * @public
  40. * @param {String} data Crontab content
  41. * @return {Object}
  42. */
  43. CronParser.parseString = function parseString (data) {
  44. var self = this;
  45. var blocks = data.split('\n');
  46. var response = {
  47. variables: {},
  48. expressions: [],
  49. errors: {}
  50. };
  51. for (var i = 0, c = blocks.length; i < c; i++) {
  52. var block = blocks[i];
  53. var matches = null;
  54. var entry = block.replace(/^\s+|\s+$/g, ''); // Remove surrounding spaces
  55. if (entry.length > 0) {
  56. if (entry.match(/^#/)) { // Comment
  57. continue;
  58. } else if ((matches = entry.match(/^(.*)=(.*)$/))) { // Variable
  59. response.variables[matches[1]] = matches[2];
  60. } else { // Expression?
  61. var result = null;
  62. try {
  63. result = self._parseEntry('0 ' + entry);
  64. response.expressions.push(result.interval);
  65. } catch (err) {
  66. response.errors[entry] = err;
  67. }
  68. }
  69. }
  70. }
  71. return response;
  72. };
  73. /**
  74. * Parse crontab file
  75. *
  76. * @public
  77. * @param {String} filePath Path to file
  78. * @param {Function} callback
  79. */
  80. CronParser.parseFile = function parseFile (filePath, callback) {
  81. require('fs').readFile(filePath, function(err, data) {
  82. if (err) {
  83. callback(err);
  84. return;
  85. }
  86. return callback(null, CronParser.parseString(data.toString()));
  87. });
  88. };
  89. module.exports = CronParser;