-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
mongos_manager.js
142 lines (129 loc) · 5.02 KB
/
mongos_manager.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
var debug = require('util').debug,
inspect = require('util').inspect,
path = require('path'),
fs = require('fs'),
exec = require('child_process').exec,
spawn = require('child_process').spawn,
Connection = require('../../lib/mongodb').Connection,
Db = require('../../lib/mongodb').Db,
Server = require('../../lib/mongodb').Server;
var MongosManager = exports.MongosManager = function(options) {
options = options == null ? {} : options;
// Basic unpack values
this.path = path.resolve("data");
this.port = options["start_port"] != null ? options["start_port"] : 50000;
this.db_path = getPath(this, "data-" + this.port);
this.log_path = getPath(this, "log-" + this.port);
this.pidfilepath = this.db_path;
this.configServer = options['configservers'] != null ? options['configservers'] : null;
this.purgedirectories = options['purgedirectories'] != null ? options['purgedirectories'] : true;
if(this.configServer == null) throw new Error("one or tree config servers needed in an array");
// Server status values
this.up = false;
this.pid = null;
}
// Start up the server instance
MongosManager.prototype.start = function(killall, callback) {
var self = this;
// Unpack callback and variables
var args = Array.prototype.slice.call(arguments, 0);
callback = args.pop();
killall = args.length ? args.shift() : true;
// Create start command
var startCmd = generateStartCmd(this, {pidfilepath:self.pidfilepath, configserver:self.configServer, log_path: self.log_path,
db_path: self.db_path, port: self.port, ssl:self.ssl});
// console.log("------------------------------------------------------------------------------")
// console.log(startCmd)
exec(killall ? 'killall -9 mongos' : '', function(err, stdout, stderr) {
if(self.purgedirectories) {
// Remove directory
exec("rm -rf " + self.db_path, function(err, stdout, stderr) {
if(err != null) return callback(err, null);
// Create directory
exec("mkdir -p " + self.db_path, function(err, stdout, stderr) {
if(err != null) return callback(err, null);
// Start up mongod process
var mongodb = exec(startCmd,
function (error, stdout, stderr) {
// console.log('stdout: ' + stdout);
// console.log('stderr: ' + stderr);
if (error != null) {
console.log('exec error: ' + error);
}
});
// Wait for a half a second then save the pids
setTimeout(function() {
// Mark server as running
self.up = true;
self.pid = fs.readFileSync(path.join(self.db_path, "mongos.lock"), 'ascii').trim();
// Callback
callback();
}, 500);
});
});
} else {
// Ensure we remove the lock file as we are not purging the directory
fs.unlinkSync(path.join(self.db_path, "mongos.lock"));
// Start up mongod process
var mongodb = exec(startCmd,
function (error, stdout, stderr) {
if (error != null) {
console.log('exec error: ' + error);
}
});
// Wait for a half a second then save the pids
setTimeout(function() {
// Mark server as running
self.up = true;
self.pid = fs.readFileSync(path.join(self.db_path, "mongos.lock"), 'ascii').trim();
// Callback
callback();
}, 5000);
}
});
}
MongosManager.prototype.stop = function(signal, callback) {
var self = this;
// Unpack callback and variables
var args = Array.prototype.slice.call(arguments, 0);
callback = args.pop();
signal = args.length ? args.shift() : 2;
// Stop the server
var command = "kill -" + signal + " " + self.pid;
// console.log(command)
// Kill process
exec(command,
function (error, stdout, stderr) {
// console.log('stdout: ' + stdout);
// console.log('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
self.up = false;
// Wait for a second
setTimeout(callback, 1000);
});
}
MongosManager.prototype.killAll = function(callback) {
exec('killall -9 mongos', function(err, stdout, stderr) {
callback(null, null);
});
}
// Get absolute path
var getPath = function(self, name) {
return path.join(self.path, name);
}
// Generate start command
var generateStartCmd = function(self, options) {
// Create boot command
var startCmd = "mongos --logpath '" + options['log_path'] + "' " +
" --port " + options['port'] + " --fork --pidfilepath " + options['pidfilepath'] + "/mongos.lock";
startCmd = options['configserver'] ? startCmd + " --configdb " + options['configserver'].join(",") : startCmd;
// If we have ssl defined set up with test certificate
if(options['ssl']) {
var path = getPath(self, '../test/certificates');
startCmd = startCmd + " --sslOnNormalPorts --sslPEMKeyFile=" + path + "/mycert.pem --sslPEMKeyPassword=10gen";
}
// Return start command
return startCmd;
}