parser.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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) {
  36. return CronExpression.parse(expression, options);
  37. };
  38. /**
  39. * Wrapper for CronExpression.fieldsToExpression method
  40. *
  41. * @public
  42. * @param {Object} fields Input fields
  43. * @param {Object} [options] Parsing options
  44. * @return {Object}
  45. */
  46. CronParser.fieldsToExpression = function fieldsToExpression (fields, options) {
  47. return CronExpression.fieldsToExpression(fields, options);
  48. };
  49. /**
  50. * Parse content string
  51. *
  52. * @public
  53. * @param {String} data Crontab content
  54. * @return {Object}
  55. */
  56. CronParser.parseString = function parseString (data) {
  57. var blocks = data.split('\n');
  58. var response = {
  59. variables: {},
  60. expressions: [],
  61. errors: {}
  62. };
  63. for (var i = 0, c = blocks.length; i < c; i++) {
  64. var block = blocks[i];
  65. var matches = null;
  66. var entry = block.trim(); // Remove surrounding spaces
  67. if (entry.length > 0) {
  68. if (entry.match(/^#/)) { // Comment
  69. continue;
  70. } else if ((matches = entry.match(/^(.*)=(.*)$/))) { // Variable
  71. response.variables[matches[1]] = matches[2];
  72. } else { // Expression?
  73. var result = null;
  74. try {
  75. result = CronParser._parseEntry('0 ' + entry);
  76. response.expressions.push(result.interval);
  77. } catch (err) {
  78. response.errors[entry] = err;
  79. }
  80. }
  81. }
  82. }
  83. return response;
  84. };
  85. /**
  86. * Parse crontab file
  87. *
  88. * @public
  89. * @param {String} filePath Path to file
  90. * @param {Function} callback
  91. */
  92. CronParser.parseFile = function parseFile (filePath, callback) {
  93. require('fs').readFile(filePath, function(err, data) {
  94. if (err) {
  95. callback(err);
  96. return;
  97. }
  98. return callback(null, CronParser.parseString(data.toString()));
  99. });
  100. };
  101. module.exports = CronParser;