Initial DTrace prototype
This commit is contained in:
parent
695f2e4367
commit
7f43ade50b
|
@ -16,11 +16,35 @@ var SERVER_PROVIDER;
|
||||||
*/
|
*/
|
||||||
var SERVER_PROBES = {
|
var SERVER_PROBES = {
|
||||||
|
|
||||||
add: ['char "*', 'char *', 'char *'],
|
// 3: attributes.length
|
||||||
bind: ['char "*', 'char *', 'char *'],
|
add: ['char *', 'char *', 'char *', 'int'],
|
||||||
unbind: ['char "*', 'char *', 'char *'],
|
|
||||||
connection: ['char *']
|
|
||||||
|
|
||||||
|
bind: ['char *', 'char *', 'char *'],
|
||||||
|
|
||||||
|
// 3: attribute, 4: value
|
||||||
|
compare: ['char *', 'char *', 'char *', 'char *', 'char *'],
|
||||||
|
|
||||||
|
'delete': ['char *', 'char *', 'char *'],
|
||||||
|
|
||||||
|
// 3: requestName, 4: requestValue
|
||||||
|
exop: ['char *', 'char *', 'char *', 'char *', 'char *'],
|
||||||
|
|
||||||
|
// 3: changes.length
|
||||||
|
modify: ['char *', 'char *', 'char *', 'int'],
|
||||||
|
|
||||||
|
// 3: newRdn, 4: deleteOldRdn, 5: newSuperior
|
||||||
|
modifyDN: ['char *', 'char *', 'char *', 'char *', 'int', 'char *'],
|
||||||
|
|
||||||
|
// 3: filter, 4: scope, 5: attributes.length
|
||||||
|
search: ['char *', 'char *', 'char *', 'char *', 'char *', 'int'],
|
||||||
|
|
||||||
|
unbind: ['char *', 'char *', 'char *'],
|
||||||
|
|
||||||
|
// remote IP
|
||||||
|
connection: ['char *'],
|
||||||
|
|
||||||
|
// statusCode, matchedDN, error message, remoteAddress, bindDN, req.dn
|
||||||
|
result: ['int', 'char *', 'char *', 'char *', 'char *', 'char *']
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,7 +62,7 @@ module.exports = {
|
||||||
Object.keys(SERVER_PROBES).forEach(function(p) {
|
Object.keys(SERVER_PROBES).forEach(function(p) {
|
||||||
var args = SERVER_PROBES[p].splice(0);
|
var args = SERVER_PROBES[p].splice(0);
|
||||||
args.unshift(p);
|
args.unshift(p);
|
||||||
console.log('%j', args);
|
|
||||||
dtrace.DTraceProvider.prototype.addProbe.apply(SERVER_PROVIDER, args);
|
dtrace.DTraceProvider.prototype.addProbe.apply(SERVER_PROVIDER, args);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ var asn1 = require('asn1');
|
||||||
var LDAPMessage = require('./message');
|
var LDAPMessage = require('./message');
|
||||||
|
|
||||||
var Protocol = require('../protocol');
|
var Protocol = require('../protocol');
|
||||||
|
var dtrace = require('../dtrace').serverProvider();
|
||||||
|
|
||||||
|
|
||||||
///--- Globals
|
///--- Globals
|
||||||
|
@ -17,6 +17,7 @@ var Ber = asn1.Ber;
|
||||||
var BerWriter = asn1.BerWriter;
|
var BerWriter = asn1.BerWriter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///--- API
|
///--- API
|
||||||
|
|
||||||
function LDAPResult(options) {
|
function LDAPResult(options) {
|
||||||
|
@ -66,11 +67,21 @@ LDAPResult.prototype.end = function(status) {
|
||||||
this.log.debug('%s: sending: %j', this.connection.ldap.id, this.json);
|
this.log.debug('%s: sending: %j', this.connection.ldap.id, this.json);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
var self = this;
|
||||||
this.connection.write(ber);
|
this.connection.write(ber);
|
||||||
|
dtrace.fire('result', function() {
|
||||||
|
return [self.status,
|
||||||
|
(self.matchedDN || ''),
|
||||||
|
(self.errorMessage || ''),
|
||||||
|
(self.connection ? self.connection.remoteAddress : ''),
|
||||||
|
(self.connection ? self.connection.ldap.bindDN.toString() : ''),
|
||||||
|
(self.requestDN ? self.requestDN.toString() : '')];
|
||||||
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.log.warn('%s failure to write message %j: %s',
|
this.log.warn('%s failure to write message %j: %s',
|
||||||
this.connection.ldap.id, this.json, e.toString());
|
this.connection.ldap.id, this.json, e.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
123
lib/server.js
123
lib/server.js
|
@ -228,9 +228,12 @@ function Server(options) {
|
||||||
c.remotePort = c.fd;
|
c.remotePort = c.fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var rdn = new dn.RDN();
|
||||||
|
rdn.cn = 'anonymous'
|
||||||
c.ldap = {
|
c.ldap = {
|
||||||
id: c.remoteAddress + ':' + c.remotePort,
|
id: c.remoteAddress + ':' + c.remotePort,
|
||||||
config: options
|
config: options,
|
||||||
|
_bindDN: new DN([rdn])
|
||||||
};
|
};
|
||||||
c.addListener('timeout', function() {
|
c.addListener('timeout', function() {
|
||||||
log.trace('%s timed out', c.ldap.id);
|
log.trace('%s timed out', c.ldap.id);
|
||||||
|
@ -249,7 +252,7 @@ function Server(options) {
|
||||||
});
|
});
|
||||||
|
|
||||||
c.ldap.__defineGetter__('bindDN', function() {
|
c.ldap.__defineGetter__('bindDN', function() {
|
||||||
return c.ldap._bindDN || new DN([{cn: 'anonymous'}]);
|
return c.ldap._bindDN;
|
||||||
});
|
});
|
||||||
c.ldap.__defineSetter__('bindDN', function(val) {
|
c.ldap.__defineSetter__('bindDN', function(val) {
|
||||||
if (!(val instanceof DN))
|
if (!(val instanceof DN))
|
||||||
|
@ -284,6 +287,9 @@ function Server(options) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
res.connection = c;
|
||||||
|
res.requestDN = req.dn;
|
||||||
|
|
||||||
var chain = self._getHandlerChain(req);
|
var chain = self._getHandlerChain(req);
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
|
@ -395,7 +401,9 @@ Server.prototype.add = function(name) {
|
||||||
var args = Array.prototype.slice.call(arguments, 1);
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
args.unshift(function(req, res, next) {
|
args.unshift(function(req, res, next) {
|
||||||
self.dtrace.fire('add', function() {
|
self.dtrace.fire('add', function() {
|
||||||
return [c.remoteAddress, c.ldap.bindDN.toString(), c.dn.toString()];
|
var c = req.connection;
|
||||||
|
return [c.remoteAddress, c.ldap.bindDN.toString(), req.dn.toString(),
|
||||||
|
req.attributes.length];
|
||||||
});
|
});
|
||||||
return next();
|
return next();
|
||||||
});
|
});
|
||||||
|
@ -420,13 +428,13 @@ Server.prototype.bind = function(name) {
|
||||||
var args = Array.prototype.slice.call(arguments, 1);
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
args.unshift(function(req, res, next) {
|
args.unshift(function(req, res, next) {
|
||||||
self.dtrace.fire('bind', function() {
|
self.dtrace.fire('bind', function() {
|
||||||
return [c.remoteAddress, c.ldap.bindDN.toString(), c.dn.toString()];
|
var c = req.connection;
|
||||||
|
return [c.remoteAddress, c.ldap.bindDN.toString(), req.dn.toString()];
|
||||||
});
|
});
|
||||||
return next();
|
return next();
|
||||||
});
|
});
|
||||||
|
|
||||||
return this._mount(Protocol.LDAP_REQ_BIND, name, args);
|
return this._mount(Protocol.LDAP_REQ_BIND, name, args);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -441,9 +449,19 @@ Server.prototype.bind = function(name) {
|
||||||
* @throws {TypeError} on bad input
|
* @throws {TypeError} on bad input
|
||||||
*/
|
*/
|
||||||
Server.prototype.compare = function(name) {
|
Server.prototype.compare = function(name) {
|
||||||
return this._mount(Protocol.LDAP_REQ_COMPARE,
|
var self = this;
|
||||||
name,
|
|
||||||
Array.prototype.slice.call(arguments, 1));
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
args.unshift(function(req, res, next) {
|
||||||
|
self.dtrace.fire('compare', function() {
|
||||||
|
var c = req.connection;
|
||||||
|
return [c.remoteAddress, c.ldap.bindDN.toString(), req.dn.toString(),
|
||||||
|
req.attribute, req.value];
|
||||||
|
});
|
||||||
|
return next();
|
||||||
|
});
|
||||||
|
|
||||||
|
return this._mount(Protocol.LDAP_REQ_COMPARE, name, args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -458,9 +476,18 @@ Server.prototype.compare = function(name) {
|
||||||
* @throws {TypeError} on bad input
|
* @throws {TypeError} on bad input
|
||||||
*/
|
*/
|
||||||
Server.prototype.del = function(name) {
|
Server.prototype.del = function(name) {
|
||||||
return this._mount(Protocol.LDAP_REQ_DELETE,
|
var self = this;
|
||||||
name,
|
|
||||||
Array.prototype.slice.call(arguments, 1));
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
args.unshift(function(req, res, next) {
|
||||||
|
self.dtrace.fire('delete', function() {
|
||||||
|
var c = req.connection;
|
||||||
|
return [c.remoteAddress, c.ldap.bindDN.toString(), req.dn.toString()];
|
||||||
|
});
|
||||||
|
return next();
|
||||||
|
});
|
||||||
|
|
||||||
|
return this._mount(Protocol.LDAP_REQ_DELETE, name, args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -475,10 +502,19 @@ Server.prototype.del = function(name) {
|
||||||
* @throws {TypeError} on bad input.
|
* @throws {TypeError} on bad input.
|
||||||
*/
|
*/
|
||||||
Server.prototype.exop = function(name) {
|
Server.prototype.exop = function(name) {
|
||||||
return this._mount(Protocol.LDAP_REQ_EXTENSION,
|
var self = this;
|
||||||
name,
|
|
||||||
Array.prototype.slice.call(arguments, 1),
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
true);
|
args.unshift(function(req, res, next) {
|
||||||
|
self.dtrace.fire('exop', function() {
|
||||||
|
var c = req.connection;
|
||||||
|
return [c.remoteAddress, c.ldap.bindDN.toString(), req.name,
|
||||||
|
req.name, req.value];
|
||||||
|
});
|
||||||
|
return next();
|
||||||
|
});
|
||||||
|
|
||||||
|
return this._mount(Protocol.LDAP_REQ_EXTENSION, name, args, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -493,9 +529,19 @@ Server.prototype.exop = function(name) {
|
||||||
* @throws {TypeError} on bad input
|
* @throws {TypeError} on bad input
|
||||||
*/
|
*/
|
||||||
Server.prototype.modify = function(name) {
|
Server.prototype.modify = function(name) {
|
||||||
return this._mount(Protocol.LDAP_REQ_MODIFY,
|
var self = this;
|
||||||
name,
|
|
||||||
Array.prototype.slice.call(arguments, 1));
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
args.unshift(function(req, res, next) {
|
||||||
|
self.dtrace.fire('modify', function() {
|
||||||
|
var c = req.connection;
|
||||||
|
return [c.remoteAddress, c.ldap.bindDN.toString(), req.dn.toString(),
|
||||||
|
req.changes.length];
|
||||||
|
});
|
||||||
|
return next();
|
||||||
|
});
|
||||||
|
|
||||||
|
return this._mount(Protocol.LDAP_REQ_MODIFY, name, args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -510,9 +556,20 @@ Server.prototype.modify = function(name) {
|
||||||
* @throws {TypeError} on bad input
|
* @throws {TypeError} on bad input
|
||||||
*/
|
*/
|
||||||
Server.prototype.modifyDN = function(name) {
|
Server.prototype.modifyDN = function(name) {
|
||||||
return this._mount(Protocol.LDAP_REQ_MODRDN,
|
var self = this;
|
||||||
name,
|
|
||||||
Array.prototype.slice.call(arguments, 1));
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
args.unshift(function(req, res, next) {
|
||||||
|
self.dtrace.fire('modifyDN', function() {
|
||||||
|
var c = req.connection;
|
||||||
|
return [c.remoteAddress, c.ldap.bindDN.toString(), req.dn.toString(),
|
||||||
|
req.newRdn.toString(), (req.deleteOldRdn ? 1 : 0),
|
||||||
|
(req.newSuperior ? req.newSuperior.toString() : '')];
|
||||||
|
});
|
||||||
|
return next();
|
||||||
|
});
|
||||||
|
|
||||||
|
return this._mount(Protocol.LDAP_REQ_MODRDN, name, args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -527,9 +584,20 @@ Server.prototype.modifyDN = function(name) {
|
||||||
* @throws {TypeError} on bad input
|
* @throws {TypeError} on bad input
|
||||||
*/
|
*/
|
||||||
Server.prototype.search = function(name) {
|
Server.prototype.search = function(name) {
|
||||||
return this._mount(Protocol.LDAP_REQ_SEARCH,
|
var self = this;
|
||||||
name,
|
|
||||||
Array.prototype.slice.call(arguments, 1));
|
var args = Array.prototype.slice.call(arguments, 1);
|
||||||
|
args.unshift(function(req, res, next) {
|
||||||
|
self.dtrace.fire('search', function() {
|
||||||
|
var c = req.connection;
|
||||||
|
return [c.remoteAddress, c.ldap.bindDN.toString(), req.dn.toString(),
|
||||||
|
req.filter.toString(), req.scope, req.attributes.length];
|
||||||
|
});
|
||||||
|
return next();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
return this._mount(Protocol.LDAP_REQ_SEARCH, name, args);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -545,7 +613,7 @@ Server.prototype.search = function(name) {
|
||||||
Server.prototype.unbind = function() {
|
Server.prototype.unbind = function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var args = Array.prototype.slice.call(arguments, 1);
|
var args = Array.prototype.slice.call(arguments, 0);
|
||||||
args.unshift(function(req, res, next) {
|
args.unshift(function(req, res, next) {
|
||||||
self.dtrace.fire('unbind', function() {
|
self.dtrace.fire('unbind', function() {
|
||||||
return [c.remoteAddress, c.ldap.bindDN.toString(), c.dn.toString()];
|
return [c.remoteAddress, c.ldap.bindDN.toString(), c.dn.toString()];
|
||||||
|
@ -553,10 +621,7 @@ Server.prototype.unbind = function() {
|
||||||
return next();
|
return next();
|
||||||
});
|
});
|
||||||
|
|
||||||
return this._mount(Protocol.LDAP_REQ_UNBIND,
|
return this._mount(Protocol.LDAP_REQ_UNBIND, 'unbind', args, true);
|
||||||
'unbind',
|
|
||||||
Array.prototype.slice.call(arguments, 0),
|
|
||||||
true);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue