106 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| '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, callback) {
 | |
|   return CronExpression.parse(expression, options, callback);
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Parse content string
 | |
|  *
 | |
|  * @public
 | |
|  * @param {String} data Crontab content
 | |
|  * @return {Object}
 | |
|  */
 | |
| CronParser.parseString = function parseString (data) {
 | |
|   var self = this;
 | |
|   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.replace(/^\s+|\s+$/g, ''); // 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 = self._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;
 | 
