diff options
author | Sara Golemon <sara.golemon@mongodb.com> | 2019-10-24 03:35:42 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-10-24 03:35:42 +0000 |
commit | 24b21c0c9307b510cd05d88235e0fada876d5652 (patch) | |
tree | d3480388400e97ad0c8b37af9548ed42c8cc8f0f | |
parent | 4bcb6a10d72604930935b5c280f89d5c9ba29a42 (diff) | |
download | mongo-24b21c0c9307b510cd05d88235e0fada876d5652.tar.gz |
SERVER-43922 Backport shell util runNonMongoProgram
(cherry picked from commit 8084a0ce51f6af543385e9292d11b6943d6b7cd4)
-rw-r--r-- | src/mongo/shell/shell_utils_launcher.cpp | 49 | ||||
-rw-r--r-- | src/mongo/shell/shell_utils_launcher.h | 6 |
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. */ |