mecano
Version:
Common functions for system deployment.
240 lines (233 loc) • 7.08 kB
JavaScript
// Generated by CoffeeScript 1.7.1
var child, conditions, each, execute, misc;
each = require('each');
misc = require('./misc');
conditions = require('./misc/conditions');
child = require('./misc/child');
execute = require('./execute');
module.exports = function(goptions, options, callback) {
var finish, result, _ref;
_ref = misc.args(arguments, {
parallel: true
}), goptions = _ref[0], options = _ref[1], callback = _ref[2];
result = child();
finish = function(err, gmodified) {
if (callback) {
callback(err, gmodified);
}
return result.end(err, gmodified);
};
misc.options(options, function(err, options) {
var gmodified;
if (err) {
return finish(err);
}
gmodified = 0;
return each(options).parallel(goptions.parallel).on('item', function(options, next) {
var do_compare, do_create, do_info, do_modify, do_password, groups_info, modified, user_info;
if (!options.name) {
return next(new Error("Option 'name' is required"));
}
if (options.shell === false) {
options.shell = "/sbin/nologin";
}
if (options.shell === true) {
options.shell = "/bin/bash";
}
if (options.system == null) {
options.system = false;
}
if (options.gid == null) {
options.gid = null;
}
if (typeof options.groups === 'string') {
options.groups = options.groups.split(',');
}
if (typeof options.shell === "function" ? options.shell(typeof options.shell !== 'string') : void 0) {
return next(new Error("Invalid option 'shell': " + (JSON.strinfigy(options.shell))));
}
modified = false;
user_info = groups_info = null;
do_info = function() {
var _ref1;
if (typeof options.log === "function") {
options.log("Get user information for " + options.name);
}
if ((_ref1 = options.ssh) != null) {
_ref1.passwd = null;
}
return misc.ssh.passwd(options.ssh, function(err, users) {
var _ref2;
if (err) {
return next(err);
}
if (typeof options.log === "function") {
options.log("Got " + (JSON.stringify(users[options.name])));
}
user_info = users[options.name];
if (!user_info) {
return do_create();
}
if (!options.groups) {
return do_compare();
}
if ((_ref2 = options.ssh) != null) {
_ref2.cache_group = null;
}
return misc.ssh.group(options.ssh, function(err, groups) {
if (err) {
return next(err);
}
groups_info = groups;
return do_compare();
});
});
};
do_create = function() {
var cmd;
cmd = 'useradd';
if (options.system) {
cmd += " -r";
}
if (!options.home) {
cmd += " -M";
}
if (options.home) {
cmd += " -d " + options.home;
}
if (options.shell) {
cmd += " -s " + options.shell;
}
if (options.comment) {
cmd += " -c " + (misc.string.escapeshellarg(options.comment));
}
if (options.uid) {
cmd += " -u " + options.uid;
}
if (options.gid) {
cmd += " -g " + options.gid;
}
if (options.expiredate) {
cmd += " -e " + options.expiredate;
}
if (options.inactive) {
cmd += " -f " + options.inactive;
}
if (options.groups) {
cmd += " -G " + (options.groups.join(','));
}
if (options.skel) {
cmd += " -k " + options.skel;
}
cmd += " " + options.name;
return execute({
ssh: options.ssh,
cmd: cmd,
log: options.log,
stdout: options.stdout,
stderr: options.stderr,
code_skipped: 9
}, function(err, created) {
if (err) {
return next(err);
}
if (created) {
modified = true;
return do_password();
} else {
if (typeof options.log === "function") {
options.log("User defined elsewhere than '/etc/passwd', exit code is 9");
}
return next();
}
});
};
do_compare = function() {
var group, k, _i, _j, _len, _len1, _ref1, _ref2;
_ref1 = ['uid', 'home', 'shell', 'comment', 'gid'];
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
k = _ref1[_i];
if ((options[k] != null) && user_info[k] !== options[k]) {
modified = true;
}
}
if (options.groups) {
_ref2 = options.groups;
for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
group = _ref2[_j];
if (!groups_info[group]) {
return next(err("Group does not exist: " + group));
}
if (groups_info[group].user_list.indexOf(options.name) === -1) {
modified = true;
}
}
}
if (typeof options.log === "function") {
options.log("Did user information changed: " + modified);
}
if (modified) {
return do_modify();
} else {
return do_password();
}
};
do_modify = function() {
var cmd;
cmd = 'usermod';
if (options.home) {
cmd += " -d " + options.home;
}
if (options.shell) {
cmd += " -s " + options.shell;
}
if (options.comment != null) {
cmd += " -c " + (misc.string.escapeshellarg(options.comment));
}
if (options.gid) {
cmd += " -g " + options.gid;
}
if (options.groups) {
cmd += " -G " + (options.groups.join(','));
}
if (options.uid) {
cmd += " -u " + options.uid;
}
cmd += " " + options.name;
return execute({
ssh: options.ssh,
cmd: cmd,
log: options.log,
stdout: options.stdout,
stderr: options.stderr
}, function(err, _, __, stderr) {
if ((err != null ? err.code : void 0) === 8) {
return next(new Error("User " + options.name + " is logged in"));
}
if (err) {
return next(err);
}
return do_password();
});
};
do_password = function() {
if (!options.password) {
return next();
}
return execute({
ssh: options.ssh,
cmd: "echo " + user.password + " | passwd --stdin " + user.username,
log: options.log,
stdout: options.stdout,
stderr: options.stderr
}, function(err) {
return next(err);
});
};
return do_info();
}).on('both', function(err) {
return finish(err, gmodified);
});
});
return result;
};