You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					117 lines
				
				2.5 KiB
			
		
		
			
		
	
	
					117 lines
				
				2.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var CronExpression = require('./expression');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function CronParser() {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Parse crontab entry
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @private
							 | 
						||
| 
								 | 
							
								 * @param {String} entry Crontab file entry/line
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								CronParser._parseEntry = function _parseEntry (entry) {
							 | 
						||
| 
								 | 
							
								  var atoms = entry.split(' ');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (atoms.length === 6) {
							 | 
						||
| 
								 | 
							
								    return {
							 | 
						||
| 
								 | 
							
								      interval: CronExpression.parse(entry)
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  } else if (atoms.length > 6) {
							 | 
						||
| 
								 | 
							
								    return {
							 | 
						||
| 
								 | 
							
								      interval: CronExpression.parse(
							 | 
						||
| 
								 | 
							
								        atoms.slice(0, 6).join(' ')
							 | 
						||
| 
								 | 
							
								      ),
							 | 
						||
| 
								 | 
							
								      command: atoms.slice(6, atoms.length)
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    throw new Error('Invalid entry: ' + entry);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Wrapper for CronExpression.parser method
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @public
							 | 
						||
| 
								 | 
							
								 * @param {String} expression Input expression
							 | 
						||
| 
								 | 
							
								 * @param {Object} [options] Parsing options
							 | 
						||
| 
								 | 
							
								 * @return {Object}
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								CronParser.parseExpression = function parseExpression (expression, options) {
							 | 
						||
| 
								 | 
							
								  return CronExpression.parse(expression, options);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Wrapper for CronExpression.fieldsToExpression method
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @public
							 | 
						||
| 
								 | 
							
								 * @param {Object} fields Input fields
							 | 
						||
| 
								 | 
							
								 * @param {Object} [options] Parsing options
							 | 
						||
| 
								 | 
							
								 * @return {Object}
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								CronParser.fieldsToExpression = function fieldsToExpression (fields, options) {
							 | 
						||
| 
								 | 
							
								  return CronExpression.fieldsToExpression(fields, options);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Parse content string
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @public
							 | 
						||
| 
								 | 
							
								 * @param {String} data Crontab content
							 | 
						||
| 
								 | 
							
								 * @return {Object}
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								CronParser.parseString = function parseString (data) {
							 | 
						||
| 
								 | 
							
								  var blocks = data.split('\n');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var response = {
							 | 
						||
| 
								 | 
							
								    variables: {},
							 | 
						||
| 
								 | 
							
								    expressions: [],
							 | 
						||
| 
								 | 
							
								    errors: {}
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (var i = 0, c = blocks.length; i < c; i++) {
							 | 
						||
| 
								 | 
							
								    var block = blocks[i];
							 | 
						||
| 
								 | 
							
								    var matches = null;
							 | 
						||
| 
								 | 
							
								    var entry = block.trim(); // Remove surrounding spaces
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (entry.length > 0) {
							 | 
						||
| 
								 | 
							
								      if (entry.match(/^#/)) { // Comment
							 | 
						||
| 
								 | 
							
								        continue;
							 | 
						||
| 
								 | 
							
								      } else if ((matches = entry.match(/^(.*)=(.*)$/))) { // Variable
							 | 
						||
| 
								 | 
							
								        response.variables[matches[1]] = matches[2];
							 | 
						||
| 
								 | 
							
								      } else { // Expression?
							 | 
						||
| 
								 | 
							
								        var result = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								          result = CronParser._parseEntry('0 ' + entry);
							 | 
						||
| 
								 | 
							
								          response.expressions.push(result.interval);
							 | 
						||
| 
								 | 
							
								        } catch (err) {
							 | 
						||
| 
								 | 
							
								          response.errors[entry] = err;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return response;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Parse crontab file
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @public
							 | 
						||
| 
								 | 
							
								 * @param {String} filePath Path to file
							 | 
						||
| 
								 | 
							
								 * @param {Function} callback
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								CronParser.parseFile = function parseFile (filePath, callback) {
							 | 
						||
| 
								 | 
							
								  require('fs').readFile(filePath, function(err, data) {
							 | 
						||
| 
								 | 
							
								    if (err) {
							 | 
						||
| 
								 | 
							
								      callback(err);
							 | 
						||
| 
								 | 
							
								      return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return callback(null, CronParser.parseString(data.toString()));
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = CronParser;
							 |