Add formatting option to ldapjs-search
- Update dashdash version to 1.7.0 - Support line delimited JSON and JSON arrays as alternative output formats in ldapjs-search. Fix mcavage/node-ldapjs#224
This commit is contained in:
parent
92362e01f3
commit
58f58883cd
|
@ -42,6 +42,19 @@ dashdash.addOptionType({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
dashdash.addOptionType({
|
||||||
|
name: 'ldap.outputFormat',
|
||||||
|
takesArg: true,
|
||||||
|
helpArg: 'FORMAT',
|
||||||
|
parseArg: function (option, optstr, arg) {
|
||||||
|
var formats = ['json', 'jsonl', 'jsona'];
|
||||||
|
if (formats.indexOf(arg) === -1) {
|
||||||
|
throw new TypeError('Must be valid format type');
|
||||||
|
}
|
||||||
|
return arg;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
var opts = [
|
var opts = [
|
||||||
{
|
{
|
||||||
|
@ -94,6 +107,17 @@ var opts = [
|
||||||
help: 'Set debug level <0-2>',
|
help: 'Set debug level <0-2>',
|
||||||
helpArg: 'LEVEL'
|
helpArg: 'LEVEL'
|
||||||
},
|
},
|
||||||
|
{ group: 'Output Options' },
|
||||||
|
{
|
||||||
|
names: ['format', 'o'],
|
||||||
|
type: 'ldap.outputFormat',
|
||||||
|
helpWrap: false,
|
||||||
|
help: ('Specify and output format. One of:\n' +
|
||||||
|
' json: JSON objects (default)\n' +
|
||||||
|
' jsonl: Line-delimited JSON\n' +
|
||||||
|
' jsona: Array of JSON objects\n'),
|
||||||
|
default: 'json'
|
||||||
|
},
|
||||||
{ group: 'Connection Options' },
|
{ group: 'Connection Options' },
|
||||||
{
|
{
|
||||||
names: ['url', 'u'],
|
names: ['url', 'u'],
|
||||||
|
@ -150,6 +174,46 @@ function perror(err) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function EntryFormatter(fp, format) {
|
||||||
|
this.format = format;
|
||||||
|
this.started = false;
|
||||||
|
this.ended = false;
|
||||||
|
this.fp = fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntryFormatter.prototype.write = function write(entry) {
|
||||||
|
switch (this.format) {
|
||||||
|
case 'json':
|
||||||
|
this.fp.write(JSON.stringify(entry.object, null, 2) + '\n');
|
||||||
|
break;
|
||||||
|
case 'jsonl':
|
||||||
|
this.fp.write(JSON.stringify(entry.object) + '\n');
|
||||||
|
break;
|
||||||
|
case 'jsona':
|
||||||
|
this.fp.write((this.started) ? ',\n' : '[\n');
|
||||||
|
this.started = true;
|
||||||
|
// pretty-print with indent
|
||||||
|
this.fp.write(
|
||||||
|
JSON.stringify(entry.object, null, 2)
|
||||||
|
.split('\n')
|
||||||
|
.map(function (line) { return ' ' + line; })
|
||||||
|
.join('\n'));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error('invalid output format');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
EntryFormatter.prototype.end = function end() {
|
||||||
|
if (this.ended) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.ended = true;
|
||||||
|
if (this.format === 'jsona') {
|
||||||
|
this.fp.write('\n]\n');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
///--- Mainline
|
///--- Mainline
|
||||||
|
|
||||||
|
@ -177,11 +241,13 @@ var logLevel = 'info';
|
||||||
if (parsed.debug)
|
if (parsed.debug)
|
||||||
logLevel = (parsed.debug > 1 ? 'trace' : 'debug');
|
logLevel = (parsed.debug > 1 ? 'trace' : 'debug');
|
||||||
|
|
||||||
|
var formatter = new EntryFormatter(process.stdout, parsed.format);
|
||||||
|
|
||||||
var log = new Logger({
|
var log = new Logger({
|
||||||
name: 'ldapjs',
|
name: 'ldapjs',
|
||||||
component: 'client',
|
component: 'client',
|
||||||
stream: process.stderr,
|
stream: process.stderr,
|
||||||
level: logLevel
|
level: logLevel
|
||||||
});
|
});
|
||||||
|
|
||||||
var client = ldap.createClient({
|
var client = ldap.createClient({
|
||||||
|
@ -239,14 +305,17 @@ client.bind(parsed.binddn, parsed.password, function (err, res) {
|
||||||
perror(err);
|
perror(err);
|
||||||
|
|
||||||
res.on('searchEntry', function (entry) {
|
res.on('searchEntry', function (entry) {
|
||||||
process.stdout.write(JSON.stringify(entry.object, null, 2) + '\n');
|
formatter.write(entry);
|
||||||
});
|
});
|
||||||
res.on('error', function (err) {
|
res.on('error', function (err) {
|
||||||
|
formatter.end();
|
||||||
perror(err);
|
perror(err);
|
||||||
});
|
});
|
||||||
res.on('end', function (res) {
|
res.on('end', function (res) {
|
||||||
if (res.status !== 0)
|
formatter.end();
|
||||||
|
if (res.status !== 0) {
|
||||||
process.stderr.write(ldap.getMessage(res.status) + '\n');
|
process.stderr.write(ldap.getMessage(res.status) + '\n');
|
||||||
|
}
|
||||||
client.unbind(function () {
|
client.unbind(function () {
|
||||||
return;
|
return;
|
||||||
});
|
});
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
"asn1": "0.2.1",
|
"asn1": "0.2.1",
|
||||||
"assert-plus": "0.1.5",
|
"assert-plus": "0.1.5",
|
||||||
"bunyan": "0.23.1",
|
"bunyan": "0.23.1",
|
||||||
"dashdash": "1.6.0",
|
"dashdash": "1.7.0",
|
||||||
"backoff": "2.4.0",
|
"backoff": "2.4.0",
|
||||||
"once": "1.3.0",
|
"once": "1.3.0",
|
||||||
"vasync": "1.5.0",
|
"vasync": "1.5.0",
|
||||||
|
|
Loading…
Reference in New Issue