#!/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'); ///--- 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, 'password': String, 'type': String, 'url': url, 'value': Array, }; var shortOpts = { 'a': ['--attribute'], 'd': ['--debug'], 'D': ['--binddn'], 'f': ['--file'], 'i': ['--insecure'], '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'; 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; } } 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'); 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 }); var client = ldap.createClient({ url: parsed.url, log: log, tlsOptions: { rejectUnauthorized: !parsed.insecure } }); 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 }); function callback(err) { 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); }); });