parser.js 2.3 KB

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