mecano
Version:
Common functions for system deployment.
107 lines (103 loc) • 3.16 kB
JavaScript
// Generated by CoffeeScript 1.11.1
var misc, string;
module.exports = function(options, callback) {
var do_diff, do_end, do_get_indexes, do_getdn, do_save, modified;
modified = false;
do_getdn = (function(_this) {
return function() {
if (options.hdb_dn) {
return do_get_indexes();
}
options.log({
message: "Get DN of the HDB to modify",
level: 'DEBUG',
module: 'mecano/ldap/index'
});
return _this.execute({
cmd: "ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config \"(olcSuffix= " + options.suffix + ")\" dn 2>/dev/null | egrep '^dn' | sed -e 's/^dn:\\s*olcDatabase=\\(.*\\)$/\\1/g'"
}, function(err, _, hdb_dn) {
if (err) {
return callback(err);
}
options.hdb_dn = hdb_dn.trim();
return do_get_indexes();
});
};
})(this);
do_get_indexes = (function(_this) {
return function() {
options.log({
message: "List all indexes of the directory",
level: 'DEBUG',
module: 'mecano/ldap/index'
});
return _this.execute({
cmd: "ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b olcDatabase=" + options.hdb_dn + " \"(olcDbIndex=*)\" olcDbIndex"
}, function(err, _, stdout) {
var attrlist, i, indexes, indices, len, line, match, ref;
if (err) {
return callback(err);
}
indexes = {};
ref = string.lines(stdout);
for (i = 0, len = ref.length; i < len; i++) {
line = ref[i];
if (!(match = /^olcDbIndex:\s+(.*)\s+(.*)/.exec(line))) {
continue;
}
_ = match[0], attrlist = match[1], indices = match[2];
indexes[attrlist] = indices;
}
return do_diff(indexes);
});
};
})(this);
do_diff = function(orgp) {
var add, k, modify, ref, v;
add = {};
modify = {};
ref = options.indexes;
for (k in ref) {
v = ref[k];
if (orgp[k] == null) {
add[k] = v;
} else if (v !== orgp[k]) {
modify[k] = [v, orgp[k]];
}
}
if (Object.keys(add).length || Object.keys(modify).length) {
return do_save(add, modify);
} else {
return do_end();
}
};
do_save = (function(_this) {
return function(add, modify) {
var cmd, k, v;
cmd = [];
for (k in add) {
v = add[k];
cmd.push("add: olcDbIndex\nolcDbIndex: " + k + " " + v);
}
for (k in modify) {
v = modify[k];
cmd.push("delete: olcDbIndex\nolcDbIndex: " + k + " " + v[1] + "\n-\nadd: olcDbIndex\nolcDbIndex: " + k + " " + v[0]);
}
return _this.execute({
cmd: "ldapmodify -Y EXTERNAL -H ldapi:/// <<-EOF\ndn: olcDatabase=" + options.hdb_dn + "\nchangetype: modify\n" + (cmd.join('\n-\n')) + "\nEOF"
}, function(err, _, stdout) {
if (err) {
return callback(err);
}
modified = true;
return do_end();
});
};
})(this);
do_end = function(err) {
return callback(err, modified);
};
return do_getdn();
};
misc = require('../misc');
string = require('../misc/string');