node-ldapjs/bin/ldapjs-modify

181 lines
3.3 KiB
Plaintext
Raw Normal View History

2011-10-18 20:44:31 +00:00
#!/usr/bin/env node
// -*- mode: js -*-
// Copyright 2011 Mark Cavage. All rights reserved.
var fs = require('fs');
var path = require('path');
var url = require('url');
var nopt = require('nopt');
var ldap = require('../lib/index');
var Logger = require('bunyan');
2011-10-18 20:44:31 +00:00
///--- Globals
nopt.typeDefs.DN = {
type: ldap.DN,
validate: function(data, k, val) {
data[k] = ldap.parseDN(val);
}
};
var opts = {
'attribute': String,
'debug': Number,
'binddn': ldap.DN,
'file': String,
'insecure': Boolean,
2011-10-18 20:44:31 +00:00
'password': String,
'type': String,
'url': url,
'value': Array,
};
var shortOpts = {
'a': ['--attribute'],
'd': ['--debug'],
'D': ['--binddn'],
'f': ['--file'],
'i': ['--insecure'],
2011-10-18 20:44:31 +00:00
'w': ['--password'],
't': ['--type'],
'u': ['--url'],
'v': ['--value']
};
///--- Helpers
function usage(code, message) {
var _opts = '';
Object.keys(shortOpts).forEach(function(k) {
if (!Array.isArray(shortOpts[k]))
return;
var longOpt = shortOpts[k][0].replace('--', '');
var type = opts[longOpt].name || 'string';
if (type && type === 'boolean') type = '';
type = type.toLowerCase();
_opts += ' [--' + longOpt + ' ' + type + ']';
});
_opts += ' DN';
var msg = (message ? message + '\n' : '') +
'usage: ' + path.basename(process.argv[1]) + _opts;
process.stderr.write(msg + '\n');
process.exit(code);
}
function perror(err) {
if (parsed.debug) {
process.stderr.write(err.stack + '\n');
} else {
process.stderr.write(err.message + '\n');
}
process.exit(1);
}
///--- Mainline
var logLevel = 'info';
2011-10-18 20:44:31 +00:00
var parsed;
try {
parsed = nopt(opts, shortOpts, process.argv, 2);
} catch (e) {
usage(1, e.toString());
}
if (parsed.insecure === undefined &&
process.env.LDAPJS_TLS_INSECURE !== undefined) {
if (process.env.LDAPJS_TLS_INSECURE === '0') {
parsed.insecure = false;
} else {
parsed.insecure = true;
}
}
2011-10-18 20:44:31 +00:00
if (parsed.help)
usage(0);
if (parsed.argv.remain.length < 1)
usage(1, 'DN required');
try {
parsed.argv.remain.forEach(function(dn) {
ldap.parseDN(dn);
});
} catch (e) {
usage(1, e.toString());
}
if (!parsed.type)
parsed.type = 'replace';
if (!parsed.attribute || !Array.isArray(parsed.value))
usage(1, 'attribute and value required');
if (parsed.debug)
logLevel = (parsed.debug > 1 ? 'trace' : 'debug');
2011-10-18 20:44:31 +00:00
if (!parsed.url)
parsed.url = 'ldap://127.0.0.1:389';
if (!parsed.binddn)
parsed.binddn = '';
if (!parsed.password)
parsed.password = '';
var log = new Logger({
name: 'ldapjs',
component: 'client',
stream: process.stderr,
level: logLevel
});
2011-10-18 20:44:31 +00:00
var client = ldap.createClient({
url: parsed.url,
log: log,
tlsOptions: {
rejectUnauthorized: !parsed.insecure
}
2011-10-18 20:44:31 +00:00
});
client.on('error', function(err) {
perror(err);
});
client.bind(parsed.binddn, parsed.password, function(err, res) {
if (err)
perror(err);
var finished = 0;
var mod = {};
mod[parsed.attribute] = [];
parsed.value.forEach(function(v) {
mod[parsed.attribute].push(v);
});
var change = new ldap.Change({
type: parsed.type,
modification: mod
});
2011-10-18 20:49:48 +00:00
function callback(err) {
2011-10-18 20:44:31 +00:00
if (err)
perror(err);
if (++finished === parsed.argv.remain.length) {
client.unbind(function() {
return;
});
}
}
parsed.argv.remain.forEach(function(dn) {
client.modify(dn, change, callback);
});
});