mecano
Version:
Common functions for system deployment.
83 lines (78 loc) • 2.45 kB
JavaScript
// Generated by CoffeeScript 1.9.1
var escape, execute, wrap;
escape = function(str) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
};
module.exports = function(options, callback) {
return wrap(this, arguments, function(options, callback) {
var crontab, do_list, do_write, modified, ref;
if (!(((ref = options.cmd) != null ? ref.length : void 0) > 0)) {
return callback(new Error('valid cmd is required'));
}
if (options.user != null) {
if (typeof options.log === "function") {
options.log("Using user " + options.user + " [INFO]");
}
crontab = "crontab -u " + options.user;
} else {
if (typeof options.log === "function") {
options.log('Using default user [INFO]');
}
crontab = "crontab";
}
modified = false;
do_list = function() {
return execute({
cmd: crontab + " -l",
ssh: options.ssh,
log: options.log,
stdout: options.stdout,
stderr: options.stderr
}, function(err, _, stdout, stderr) {
var i, j, job, jobs, len, myjob, regex;
if (err && !/^no crontab for/.test(stderr)) {
return callback(err);
}
if (err) {
return next(err);
}
myjob = options.when ? escape(options.when) : '.*';
myjob += escape(" " + options.cmd);
regex = new RegExp(myjob);
jobs = stdout.split('\n');
jobs.pop();
for (i = j = 0, len = jobs.length; j < len; i = ++j) {
job = jobs[i];
if (regex.test(job)) {
if (typeof options.log === "function") {
options.log("Job '" + job + "' matches. Removing from list [WARN]");
}
modified = true;
jobs.splice(i, 1);
}
}
return do_write(jobs);
});
};
do_write = function(jobs) {
if (!modified) {
if (typeof options.log === "function") {
options.log('No Job matches. Skipping [INFO]');
}
if (!modified) {
return callback(null, false);
}
}
return execute({
cmd: "echo -e '" + (jobs.join('\\n')) + "' | " + crontab + " -",
ssh: options.ssh,
log: options.log,
stdout: options.stdout,
stderr: options.stderr
}, callback);
};
return do_list();
});
};
wrap = require('./misc/wrap');
execute = require('./execute');