UNPKG

mecano

Version:

Common functions for system deployment.

240 lines (233 loc) 7.08 kB
// 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; };