mecano
Version:
Common functions for system deployment.
116 lines (112 loc) • 3.18 kB
JavaScript
// Generated by CoffeeScript 1.11.1
var fs, path;
module.exports = function(options, callback) {
var do_dispatch, do_end, do_mkdir, exec_create, exec_exists, linked, sym_create, sym_exists;
options.log({
message: "Entering link",
level: 'DEBUG',
module: 'mecano/lib/link'
});
linked = 0;
sym_exists = function(options, callback) {
return fs.readlink(options.ssh, options.target, function(err, resolvedPath) {
if (err) {
return callback(null, false);
}
if (resolvedPath === options.source) {
return callback(null, true);
}
return fs.unlink(options.ssh, options.target, function(err) {
if (err) {
return callback(err);
}
return callback(null, false);
});
});
};
sym_create = function(options, callback) {
return fs.symlink(options.ssh, options.source, options.target, function(err) {
if (err) {
return callback(err);
}
linked++;
return callback();
});
};
exec_exists = function(options, callback) {
return fs.exists(options.ssh, options.target, function(err, exists) {
if (!exists) {
return callback(null, false);
}
return fs.readFile(options.ssh, options.target, 'utf8', function(err, content) {
var exec_cmd;
if (err) {
return callback(err);
}
exec_cmd = /exec (.*) \$@/.exec(content)[1];
return callback(null, exec_cmd && exec_cmd === options.source);
});
});
};
exec_create = function(options, callback) {
var content;
content = "#!/bin/bash\nexec " + options.source + " $@";
return fs.writeFile(options.ssh, options.target, content, function(err) {
if (err) {
return callback(err);
}
return fs.chmod(options.ssh, options.target, options.mode, function(err) {
if (err) {
return callback(err);
}
linked++;
return callback();
});
});
};
if (!options.source) {
return callback(new Error("Missing source, got " + (JSON.stringify(options.source))));
}
if (!options.target) {
return callback(new Error("Missing target, got " + (JSON.stringify(options.target))));
}
if (options.mode == null) {
options.mode = 0x1ed;
}
do_mkdir = (function(_this) {
return function() {
return _this.mkdir({
ssh: options.ssh,
target: path.dirname(options.target)
}, function(err, created) {
if (err && err.code !== 'EEXIST') {
return callback(err);
}
return do_dispatch();
});
};
})(this);
do_dispatch = function() {
if (options.exec) {
return exec_exists(options, function(err, exists) {
if (exists) {
return do_end();
}
return exec_create(options, do_end);
});
} else {
return sym_exists(options, function(err, exists) {
if (exists) {
return do_end();
}
return sym_create(options, do_end);
});
}
};
do_end = function() {
return callback(null, linked);
};
return do_mkdir();
};
fs = require('ssh2-fs');
path = require('path');