summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSara Golemon <sara.golemon@mongodb.com>2019-10-24 03:35:42 +0000
committerevergreen <evergreen@mongodb.com>2019-10-24 03:35:42 +0000
commit24b21c0c9307b510cd05d88235e0fada876d5652 (patch)
treed3480388400e97ad0c8b37af9548ed42c8cc8f0f
parent4bcb6a10d72604930935b5c280f89d5c9ba29a42 (diff)
downloadmongo-24b21c0c9307b510cd05d88235e0fada876d5652.tar.gz
SERVER-43922 Backport shell util runNonMongoProgram
(cherry picked from commit 8084a0ce51f6af543385e9292d11b6943d6b7cd4)
-rw-r--r--src/mongo/shell/shell_utils_launcher.cpp49
-rw-r--r--src/mongo/shell/shell_utils_launcher.h6
2 files changed, 37 insertions, 18 deletions
diff --git a/src/mongo/shell/shell_utils_launcher.cpp b/src/mongo/shell/shell_utils_launcher.cpp
index b7364ebac48..80c3b270b5e 100644
--- a/src/mongo/shell/shell_utils_launcher.cpp
+++ b/src/mongo/shell/shell_utils_launcher.cpp
@@ -261,7 +261,7 @@ void ProgramOutputMultiplexer::clear() {
_buffer.str("");
}
-ProgramRunner::ProgramRunner(const BSONObj& args, const BSONObj& env) {
+ProgramRunner::ProgramRunner(const BSONObj& args, const BSONObj& env, bool isMongo) {
uassert(ErrorCodes::FailedToParse,
"cannot pass an empty argument to ProgramRunner",
!args.isEmpty());
@@ -273,14 +273,17 @@ ProgramRunner::ProgramRunner(const BSONObj& args, const BSONObj& env) {
boost::filesystem::path programPath = findProgram(program);
boost::filesystem::path programName = programPath.stem();
+
string prefix("mongod-");
- bool isMongodProgram = string("mongod") == programName ||
- programName.string().compare(0, prefix.size(), prefix) == 0;
+ bool isMongodProgram = isMongo && (string("mongod") == programName ||
+ programName.string().compare(0, prefix.size(), prefix) == 0);
prefix = "mongos-";
- bool isMongosProgram = string("mongos") == programName ||
- programName.string().compare(0, prefix.size(), prefix) == 0;
+ bool isMongosProgram = isMongo && (string("mongos") == programName ||
+ programName.string().compare(0, prefix.size(), prefix) == 0);
- if (isMongodProgram) {
+ if (!isMongo) {
+ _name = "sh";
+ } else if (isMongodProgram) {
_name = "d";
} else if (isMongosProgram) {
_name = "s";
@@ -297,6 +300,7 @@ ProgramRunner::ProgramRunner(const BSONObj& args, const BSONObj& env) {
// Parse individual arguments into _argv
BSONObjIterator j(args);
j.next(); // skip program name (handled above)
+
while (j.more()) {
BSONElement e = j.next();
string str;
@@ -308,12 +312,14 @@ ProgramRunner::ProgramRunner(const BSONObj& args, const BSONObj& env) {
verify(e.type() == mongo::String);
str = e.valuestr();
}
- if (str == "--port") {
- _port = -2;
- } else if (_port == -2) {
- _port = strtol(str.c_str(), 0, 10);
- } else if (isMongodProgram && str == "--configsvr") {
- _name = "c";
+ if (isMongo) {
+ if (str == "--port") {
+ _port = -2;
+ } else if (_port == -2) {
+ _port = strtol(str.c_str(), 0, 10);
+ } else if (isMongodProgram && str == "--configsvr") {
+ _name = "c";
+ }
}
_argv.push_back(str);
}
@@ -363,10 +369,12 @@ ProgramRunner::ProgramRunner(const BSONObj& args, const BSONObj& env) {
++environEntry;
}
#endif
- bool needsPort = isMongodProgram || isMongosProgram || (programName == "mongobridge");
+ bool needsPort =
+ isMongo && (isMongodProgram || isMongosProgram || (programName == "mongobridge"));
if (!needsPort) {
_port = -1;
}
+
uassert(ErrorCodes::FailedToParse,
str::stream() << "a port number is expected when running " << program
<< " from the shell",
@@ -788,7 +796,7 @@ BSONObj StartMongoProgram(const BSONObj& a, void* data) {
}
}
- ProgramRunner r(args, env);
+ ProgramRunner r(args, env, true);
r.start();
invariant(registry.isPidRegistered(r.pid()));
stdx::thread t(r);
@@ -796,9 +804,9 @@ BSONObj StartMongoProgram(const BSONObj& a, void* data) {
return BSON(string("") << r.pid().asLongLong());
}
-BSONObj RunMongoProgram(const BSONObj& a, void* data) {
+BSONObj RunProgram(const BSONObj& a, void* data, bool isMongo) {
BSONObj env{};
- ProgramRunner r(a, env);
+ ProgramRunner r(a, env, isMongo);
r.start();
invariant(registry.isPidRegistered(r.pid()));
stdx::thread t(r);
@@ -808,6 +816,14 @@ BSONObj RunMongoProgram(const BSONObj& a, void* data) {
return BSON(string("") << exit_code);
}
+BSONObj RunMongoProgram(const BSONObj& a, void* data) {
+ return RunProgram(a, data, true);
+}
+
+BSONObj RunNonMongoProgram(const BSONObj& a, void* data) {
+ return RunProgram(a, data, false);
+}
+
BSONObj ResetDbpath(const BSONObj& a, void* data) {
verify(a.nFields() == 1);
string path = a.firstElement().valuestrsafe();
@@ -1068,6 +1084,7 @@ void installShellUtilsLauncher(Scope& scope) {
scope.injectNative("runProgram", RunMongoProgram);
scope.injectNative("run", RunMongoProgram);
scope.injectNative("_runMongoProgram", RunMongoProgram);
+ scope.injectNative("runNonMongoProgram", RunNonMongoProgram);
scope.injectNative("_stopMongoProgram", StopMongoProgram);
scope.injectNative("stopMongoProgramByPid", StopMongoProgramByPid);
scope.injectNative("rawMongoProgramOutput", RawMongoProgramOutput);
diff --git a/src/mongo/shell/shell_utils_launcher.h b/src/mongo/shell/shell_utils_launcher.h
index 8224cb1b46f..0ab14b7227c 100644
--- a/src/mongo/shell/shell_utils_launcher.h
+++ b/src/mongo/shell/shell_utils_launcher.h
@@ -123,8 +123,10 @@ class ProgramRunner {
public:
/** @param args The program's arguments, including the program name.
* @param env Environment to run the program with, which will override any set by the local
- * environment */
- ProgramRunner(const BSONObj& args, const BSONObj& env);
+ * environment
+ * @param isMongo Indicator variable, true if runs as a mongo process.
+ */
+ ProgramRunner(const BSONObj& args, const BSONObj& env, bool isMongo);
/** Launch the program. */
void start();
/** Continuously read the program's output, generally from a special purpose thread. */