123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576 |
- "use strict";
- var toError = require('./utils').toError,
- Define = require('./metadata'),
- shallowClone = require('./utils').shallowClone;
- var Admin = function(db, topology, promiseLibrary) {
- if(!(this instanceof Admin)) return new Admin(db, topology);
-
- this.s = {
- db: db
- , topology: topology
- , promiseLibrary: promiseLibrary
- }
- }
- var define = Admin.define = new Define('Admin', Admin, false);
- Admin.prototype.command = function(command, options, callback) {
- var self = this;
- var args = Array.prototype.slice.call(arguments, 1);
- callback = args.pop();
- if(typeof callback != 'function') args.push(callback);
- options = args.length ? args.shift() : {};
-
- if(typeof callback == 'function') return this.s.db.executeDbAdminCommand(command, options, function(err, doc) {
- return callback != null ? callback(err, doc) : null;
- });
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- self.s.db.executeDbAdminCommand(command, options, function(err, doc) {
- if(err) return reject(err);
- resolve(doc);
- });
- });
- }
- define.classMethod('command', {callback: true, promise:true});
- Admin.prototype.buildInfo = function(callback) {
- var self = this;
-
- if(typeof callback == 'function') return this.serverInfo(callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- self.serverInfo(function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- }
- define.classMethod('buildInfo', {callback: true, promise:true});
- Admin.prototype.serverInfo = function(callback) {
- var self = this;
-
- if(typeof callback == 'function') return this.s.db.executeDbAdminCommand({buildinfo:1}, function(err, doc) {
- if(err != null) return callback(err, null);
- callback(null, doc);
- });
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- self.s.db.executeDbAdminCommand({buildinfo:1}, function(err, doc) {
- if(err) return reject(err);
- resolve(doc);
- });
- });
- }
- define.classMethod('serverInfo', {callback: true, promise:true});
- Admin.prototype.serverStatus = function(callback) {
- var self = this;
-
- if(typeof callback == 'function') return serverStatus(self, callback)
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- serverStatus(self, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- };
- var serverStatus = function(self, callback) {
- self.s.db.executeDbAdminCommand({serverStatus: 1}, function(err, doc) {
- if(err == null && doc.ok === 1) {
- callback(null, doc);
- } else {
- if(err) return callback(err, false);
- return callback(toError(doc), false);
- }
- });
- }
- define.classMethod('serverStatus', {callback: true, promise:true});
- Admin.prototype.profilingLevel = function(callback) {
- var self = this;
-
- if(typeof callback == 'function') return profilingLevel(self, callback)
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- profilingLevel(self, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- };
- var profilingLevel = function(self, callback) {
- self.s.db.executeDbAdminCommand({profile:-1}, function(err, doc) {
- if(err == null && doc.ok === 1) {
- var was = doc.was;
- if(was == 0) return callback(null, "off");
- if(was == 1) return callback(null, "slow_only");
- if(was == 2) return callback(null, "all");
- return callback(new Error("Error: illegal profiling level value " + was), null);
- } else {
- err != null ? callback(err, null) : callback(new Error("Error with profile command"), null);
- }
- });
- }
- define.classMethod('profilingLevel', {callback: true, promise:true});
- Admin.prototype.ping = function(options, callback) {
- var self = this;
- var args = Array.prototype.slice.call(arguments, 0);
- callback = args.pop();
- if(typeof callback != 'function') args.push(callback);
-
- if(typeof callback == 'function') return this.s.db.executeDbAdminCommand({ping: 1}, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- self.s.db.executeDbAdminCommand({ping: 1}, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- }
- define.classMethod('ping', {callback: true, promise:true});
- Admin.prototype.authenticate = function(username, password, options, callback) {
- var self = this;
- if(typeof options == 'function') callback = options, options = {};
- options = shallowClone(options);
- options.authdb = 'admin';
-
- if(typeof callback == 'function') return this.s.db.authenticate(username, password, options, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- self.s.db.authenticate(username, password, options, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- }
- define.classMethod('authenticate', {callback: true, promise:true});
- Admin.prototype.logout = function(callback) {
- var self = this;
-
- if(typeof callback == 'function') return this.s.db.logout({dbName: 'admin'}, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- self.s.db.logout({dbName: 'admin'}, function(err) {
- if(err) return reject(err);
- resolve(true);
- });
- });
- }
- define.classMethod('logout', {callback: true, promise:true});
- var writeConcern = function(options, db) {
- options = shallowClone(options);
-
- if(options.w || options.wtimeout || options.j || options.fsync) {
- return options;
- }
-
- if(db.writeConcern) {
- if(options.w) options.w = db.writeConcern.w;
- if(options.wtimeout) options.wtimeout = db.writeConcern.wtimeout;
- if(options.j) options.j = db.writeConcern.j;
- if(options.fsync) options.fsync = db.writeConcern.fsync;
- }
-
- return options;
- }
- Admin.prototype.addUser = function(username, password, options, callback) {
- var self = this;
- var args = Array.prototype.slice.call(arguments, 2);
- callback = args.pop();
- if(typeof callback != 'function') args.push(callback);
- options = args.length ? args.shift() : {};
- options = options || {};
-
- options = writeConcern(options, self.s.db)
-
- options.dbName = 'admin';
-
- if(typeof callback == 'function')
- return self.s.db.addUser(username, password, options, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- self.s.db.addUser(username, password, options, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- }
- define.classMethod('addUser', {callback: true, promise:true});
- Admin.prototype.removeUser = function(username, options, callback) {
- var self = this;
- var args = Array.prototype.slice.call(arguments, 1);
- callback = args.pop();
- if(typeof callback != 'function') args.push(callback);
- options = args.length ? args.shift() : {};
- options = options || {};
-
- options = writeConcern(options, self.s.db)
-
- options.dbName = 'admin';
-
- if(typeof callback == 'function')
- return self.s.db.removeUser(username, options, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- self.s.db.removeUser(username, options, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- }
- define.classMethod('removeUser', {callback: true, promise:true});
- Admin.prototype.setProfilingLevel = function(level, callback) {
- var self = this;
-
- if(typeof callback == 'function') return setProfilingLevel(self, level, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- setProfilingLevel(self, level, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- };
- var setProfilingLevel = function(self, level, callback) {
- var command = {};
- var profile = 0;
- if(level == "off") {
- profile = 0;
- } else if(level == "slow_only") {
- profile = 1;
- } else if(level == "all") {
- profile = 2;
- } else {
- return callback(new Error("Error: illegal profiling level value " + level));
- }
-
- command['profile'] = profile;
- self.s.db.executeDbAdminCommand(command, function(err, doc) {
- if(err == null && doc.ok === 1)
- return callback(null, level);
- return err != null ? callback(err, null) : callback(new Error("Error with profile command"), null);
- });
- }
- define.classMethod('setProfilingLevel', {callback: true, promise:true});
- Admin.prototype.profilingInfo = function(callback) {
- var self = this;
-
- if(typeof callback == 'function') return profilingInfo(self, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- profilingInfo(self, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- };
- var profilingInfo = function(self, callback) {
- try {
- self.s.topology.cursor("admin.system.profile", { find: 'system.profile', query: {}}, {}).toArray(callback);
- } catch (err) {
- return callback(err, null);
- }
- }
- define.classMethod('profilingLevel', {callback: true, promise:true});
- Admin.prototype.validateCollection = function(collectionName, options, callback) {
- var self = this;
- var args = Array.prototype.slice.call(arguments, 1);
- callback = args.pop();
- if(typeof callback != 'function') args.push(callback);
- options = args.length ? args.shift() : {};
- options = options || {};
-
- if(typeof callback == 'function')
- return validateCollection(self, collectionName, options, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- validateCollection(self, collectionName, options, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- };
- var validateCollection = function(self, collectionName, options, callback) {
- var command = {validate: collectionName};
- var keys = Object.keys(options);
-
- for(var i = 0; i < keys.length; i++) {
- if(options.hasOwnProperty(keys[i])) {
- command[keys[i]] = options[keys[i]];
- }
- }
- self.s.db.command(command, function(err, doc) {
- if(err != null) return callback(err, null);
- if(doc.ok === 0)
- return callback(new Error("Error with validate command"), null);
- if(doc.result != null && doc.result.constructor != String)
- return callback(new Error("Error with validation data"), null);
- if(doc.result != null && doc.result.match(/exception|corrupt/) != null)
- return callback(new Error("Error: invalid collection " + collectionName), null);
- if(doc.valid != null && !doc.valid)
- return callback(new Error("Error: invalid collection " + collectionName), null);
- return callback(null, doc);
- });
- }
- define.classMethod('validateCollection', {callback: true, promise:true});
- Admin.prototype.listDatabases = function(callback) {
- var self = this;
-
- if(typeof callback == 'function') return self.s.db.executeDbAdminCommand({listDatabases:1}, {}, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- self.s.db.executeDbAdminCommand({listDatabases:1}, {}, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- }
- define.classMethod('listDatabases', {callback: true, promise:true});
- Admin.prototype.replSetGetStatus = function(callback) {
- var self = this;
-
- if(typeof callback == 'function') return replSetGetStatus(self, callback);
-
- return new this.s.promiseLibrary(function(resolve, reject) {
- replSetGetStatus(self, function(err, r) {
- if(err) return reject(err);
- resolve(r);
- });
- });
- };
- var replSetGetStatus = function(self, callback) {
- self.s.db.executeDbAdminCommand({replSetGetStatus:1}, function(err, doc) {
- if(err == null && doc.ok === 1)
- return callback(null, doc);
- if(err) return callback(err, false);
- callback(toError(doc), false);
- });
- }
- define.classMethod('replSetGetStatus', {callback: true, promise:true});
- module.exports = Admin;
|