mirror of https://github.com/IoTcat/FDC.git
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.
105 lines
2.3 KiB
105 lines
2.3 KiB
'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;
|
|
|