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; |