summaryrefslogtreecommitdiff
path: root/src/mongo/db/server_options_helpers.cpp
diff options
context:
space:
mode:
authorHenrik Edin <henrik.edin@mongodb.com>2018-05-31 10:57:22 -0400
committerHenrik Edin <henrik.edin@mongodb.com>2018-06-07 12:06:59 -0400
commitc145be9589b0b25084cd674450a32289d511a166 (patch)
treea15dd07b0f823094bde27edf0d57a56b70bec4c5 /src/mongo/db/server_options_helpers.cpp
parentda63637defad5975040f8eac0e98c86c8d8e2533 (diff)
downloadmongo-c145be9589b0b25084cd674450a32289d511a166.tar.gz
SERVER-35297 Split server_options and server_status into two pieces.
Similarly to how commands are setup, so embedded can depend on a smaller library with fewer dependencies.
Diffstat (limited to 'src/mongo/db/server_options_helpers.cpp')
-rw-r--r--src/mongo/db/server_options_helpers.cpp558
1 files changed, 5 insertions, 553 deletions
diff --git a/src/mongo/db/server_options_helpers.cpp b/src/mongo/db/server_options_helpers.cpp
index 578bcd6855c..48c400d0b47 100644
--- a/src/mongo/db/server_options_helpers.cpp
+++ b/src/mongo/db/server_options_helpers.cpp
@@ -248,276 +248,7 @@ Status addBaseServerOptions(moe::OptionSection* options) {
return Status::OK();
}
-Status addGeneralServerOptions(moe::OptionSection* options) {
- auto baseResult = addBaseServerOptions(options);
- if (!baseResult.isOK()) {
- return baseResult;
- }
-
- StringBuilder maxConnInfoBuilder;
- std::stringstream unixSockPermsBuilder;
-
- maxConnInfoBuilder << "max number of simultaneous connections - " << DEFAULT_MAX_CONN
- << " by default";
- unixSockPermsBuilder << "permissions to set on UNIX domain socket file - "
- << "0" << std::oct << DEFAULT_UNIX_PERMS << " by default";
-
- options->addOptionChaining("help", "help,h", moe::Switch, "show this usage information")
- .setSources(moe::SourceAllLegacy);
-
- options->addOptionChaining("version", "version", moe::Switch, "show version information")
- .setSources(moe::SourceAllLegacy);
-
- options
- ->addOptionChaining(
- "config", "config,f", moe::String, "configuration file specifying additional options")
- .setSources(moe::SourceAllLegacy);
-
-
- options
- ->addOptionChaining(
- "net.bindIp",
- "bind_ip",
- moe::String,
- "comma separated list of ip addresses to listen on - localhost by default")
- .incompatibleWith("bind_ip_all");
-
- options
- ->addOptionChaining("net.bindIpAll", "bind_ip_all", moe::Switch, "bind to all ip addresses")
- .incompatibleWith("bind_ip");
-
- options->addOptionChaining(
- "net.ipv6", "ipv6", moe::Switch, "enable IPv6 support (disabled by default)");
-
- options
- ->addOptionChaining(
- "net.listenBacklog", "listenBacklog", moe::Int, "set socket listen backlog size")
- .setDefault(moe::Value(SOMAXCONN));
-
- options->addOptionChaining(
- "net.maxIncomingConnections", "maxConns", moe::Int, maxConnInfoBuilder.str().c_str());
-
- options
- ->addOptionChaining("net.transportLayer",
- "transportLayer",
- moe::String,
- "sets the ingress transport layer implementation")
- .hidden()
- .setDefault(moe::Value("asio"));
-
- options
- ->addOptionChaining("net.serviceExecutor",
- "serviceExecutor",
- moe::String,
- "sets the service executor implementation")
- .hidden()
- .setDefault(moe::Value("synchronous"));
-
-#if MONGO_ENTERPRISE_VERSION
- options->addOptionChaining("security.redactClientLogData",
- "redactClientLogData",
- moe::Switch,
- "Redact client data written to the diagnostics log");
-#endif
-
- options->addOptionChaining("processManagement.pidFilePath",
- "pidfilepath",
- moe::String,
- "full path to pidfile (if not set, no pidfile is created)");
-
- options->addOptionChaining("processManagement.timeZoneInfo",
- "timeZoneInfo",
- moe::String,
- "full path to time zone info directory, e.g. /usr/share/zoneinfo");
-
- options
- ->addOptionChaining(
- "security.keyFile", "keyFile", moe::String, "private key for cluster authentication")
- .incompatibleWith("noauth");
-
- options->addOptionChaining("noauth", "noauth", moe::Switch, "run without security")
- .setSources(moe::SourceAllLegacy)
- .incompatibleWith("auth")
- .incompatibleWith("keyFile")
- .incompatibleWith("transitionToAuth")
- .incompatibleWith("clusterAuthMode");
-
- options
- ->addOptionChaining(
- "security.transitionToAuth",
- "transitionToAuth",
- moe::Switch,
- "For rolling access control upgrade. Attempt to authenticate over outgoing "
- "connections and proceed regardless of success. Accept incoming connections "
- "with or without authentication.")
- .incompatibleWith("noauth");
-
- options
- ->addOptionChaining("security.clusterAuthMode",
- "clusterAuthMode",
- moe::String,
- "Authentication mode used for cluster authentication. Alternatives are "
- "(keyFile|sendKeyFile|sendX509|x509)")
- .format("(:?keyFile)|(:?sendKeyFile)|(:?sendX509)|(:?x509)",
- "(keyFile/sendKeyFile/sendX509/x509)");
-
-#ifndef _WIN32
- options
- ->addOptionChaining(
- "nounixsocket", "nounixsocket", moe::Switch, "disable listening on unix sockets")
- .setSources(moe::SourceAllLegacy);
-
- options
- ->addOptionChaining(
- "net.unixDomainSocket.enabled", "", moe::Bool, "disable listening on unix sockets")
- .setSources(moe::SourceYAMLConfig);
-
- options->addOptionChaining("net.unixDomainSocket.pathPrefix",
- "unixSocketPrefix",
- moe::String,
- "alternative directory for UNIX domain sockets (defaults to /tmp)");
-
- options->addOptionChaining("net.unixDomainSocket.filePermissions",
- "filePermissions",
- moe::Int,
- unixSockPermsBuilder.str());
-
- options->addOptionChaining(
- "processManagement.fork", "fork", moe::Switch, "fork server process");
-
-#endif
-
- options
- ->addOptionChaining("objcheck",
- "objcheck",
- moe::Switch,
- "inspect client data for validity on receipt (DEFAULT)")
- .hidden()
- .setSources(moe::SourceAllLegacy)
- .incompatibleWith("noobjcheck");
-
- options
- ->addOptionChaining("noobjcheck",
- "noobjcheck",
- moe::Switch,
- "do NOT inspect client data for validity on receipt")
- .hidden()
- .setSources(moe::SourceAllLegacy)
- .incompatibleWith("objcheck");
-
- options
- ->addOptionChaining("net.wireObjectCheck",
- "",
- moe::Bool,
- "inspect client data for validity on receipt (DEFAULT)")
- .hidden()
- .setSources(moe::SourceYAMLConfig);
-
- options
- ->addOptionChaining("enableExperimentalStorageDetailsCmd",
- "enableExperimentalStorageDetailsCmd",
- moe::Switch,
- "EXPERIMENTAL (UNSUPPORTED). "
- "Enable command computing aggregate statistics on storage.")
- .hidden()
- .setSources(moe::SourceAllLegacy);
-
- options
- ->addOptionChaining("operationProfiling.slowOpThresholdMs",
- "slowms",
- moe::Int,
- "value of slow for profile and console log")
- .setDefault(moe::Value(100));
-
- options
- ->addOptionChaining("operationProfiling.slowOpSampleRate",
- "slowOpSampleRate",
- moe::Double,
- "fraction of slow ops to include in the profile and console log")
- .setDefault(moe::Value(1.0));
-
- auto ret = addMessageCompressionOptions(options, false);
- if (!ret.isOK()) {
- return ret;
- }
-
- return Status::OK();
-}
-
-Status addWindowsServerOptions(moe::OptionSection* options) {
- options->addOptionChaining("install", "install", moe::Switch, "install Windows service")
- .setSources(moe::SourceAllLegacy);
-
- options->addOptionChaining("remove", "remove", moe::Switch, "remove Windows service")
- .setSources(moe::SourceAllLegacy);
-
- options
- ->addOptionChaining(
- "reinstall",
- "reinstall",
- moe::Switch,
- "reinstall Windows service (equivalent to --remove followed by --install)")
- .setSources(moe::SourceAllLegacy);
-
- options->addOptionChaining("processManagement.windowsService.serviceName",
- "serviceName",
- moe::String,
- "Windows service name");
-
- options->addOptionChaining("processManagement.windowsService.displayName",
- "serviceDisplayName",
- moe::String,
- "Windows service display name");
-
- options->addOptionChaining("processManagement.windowsService.description",
- "serviceDescription",
- moe::String,
- "Windows service description");
-
- options->addOptionChaining("processManagement.windowsService.serviceUser",
- "serviceUser",
- moe::String,
- "account for service execution");
-
- options->addOptionChaining("processManagement.windowsService.servicePassword",
- "servicePassword",
- moe::String,
- "password used to authenticate serviceUser");
-
- options->addOptionChaining("service", "service", moe::Switch, "start mongodb service")
- .hidden()
- .setSources(moe::SourceAllLegacy);
-
- return Status::OK();
-}
-
namespace {
-// Helpers for option storage
-Status setupBinaryName(const std::vector<std::string>& argv) {
- if (argv.empty()) {
- return Status(ErrorCodes::UnknownError, "Cannot get binary name: argv array is empty");
- }
-
- // setup binary name
- serverGlobalParams.binaryName = argv[0];
- size_t i = serverGlobalParams.binaryName.rfind('/');
- if (i != string::npos) {
- serverGlobalParams.binaryName = serverGlobalParams.binaryName.substr(i + 1);
- }
- return Status::OK();
-}
-
-Status setupCwd() {
- // setup cwd
- boost::system::error_code ec;
- boost::filesystem::path cwd = boost::filesystem::current_path(ec);
- if (ec) {
- return Status(ErrorCodes::UnknownError,
- "Cannot get current working directory: " + ec.message());
- }
- serverGlobalParams.cwd = cwd.string();
- return Status::OK();
-}
Status setArgvArray(const std::vector<std::string>& argv) {
BSONArrayBuilder b;
@@ -537,11 +268,7 @@ Status setParsedOpts(const moe::Environment& params) {
}
} // namespace
-void printCommandLineOpts() {
- log() << "options: " << serverGlobalParams.parsedOpts << endl;
-}
-
-Status validateServerOptions(const moe::Environment& params) {
+Status validateBaseOptions(const moe::Environment& params) {
if (params.count("verbose")) {
std::string verbosity = params["verbose"].as<std::string>();
@@ -558,55 +285,9 @@ Status validateServerOptions(const moe::Environment& params) {
}
}
-#ifdef _WIN32
- if (params.count("install") || params.count("reinstall")) {
- if (params.count("logpath") &&
- !boost::filesystem::path(params["logpath"].as<string>()).is_absolute()) {
- return Status(ErrorCodes::BadValue,
- "logpath requires an absolute file path with Windows services");
- }
-
- if (params.count("config") &&
- !boost::filesystem::path(params["config"].as<string>()).is_absolute()) {
- return Status(ErrorCodes::BadValue,
- "config requires an absolute file path with Windows services");
- }
-
- if (params.count("processManagement.pidFilePath") &&
- !boost::filesystem::path(params["processManagement.pidFilePath"].as<string>())
- .is_absolute()) {
- return Status(ErrorCodes::BadValue,
- "pidFilePath requires an absolute file path with Windows services");
- }
-
- if (params.count("security.keyFile") &&
- !boost::filesystem::path(params["security.keyFile"].as<string>()).is_absolute()) {
- return Status(ErrorCodes::BadValue,
- "keyFile requires an absolute file path with Windows services");
- }
- }
-#endif
-
-#ifdef MONGO_CONFIG_SSL
- Status ret = validateSSLServerOptions(params);
- if (!ret.isOK()) {
- return ret;
- }
-#endif
-
- bool haveAuthenticationMechanisms = true;
- bool hasAuthorizationEnabled = false;
- if (params.count("security.authenticationMechanisms") &&
- params["security.authenticationMechanisms"].as<std::vector<std::string>>().empty()) {
- haveAuthenticationMechanisms = false;
- }
if (params.count("setParameter")) {
std::map<std::string, std::string> parameters =
params["setParameter"].as<std::map<std::string, std::string>>();
- auto authMechParameter = parameters.find("authenticationMechanisms");
- if (authMechParameter != parameters.end() && authMechParameter->second.empty()) {
- haveAuthenticationMechanisms = false;
- }
// Only register failpoint server parameters if enableTestCommands=1.
auto enableTestCommandsParameter = parameters.find("enableTestCommands");
@@ -614,73 +295,12 @@ Status validateServerOptions(const moe::Environment& params) {
enableTestCommandsParameter->second.compare("1") == 0) {
getGlobalFailPointRegistry()->registerAllFailPointsAsServerParameters();
}
-
- if (parameters.find("internalValidateFeaturesAsMaster") != parameters.end()) {
- // Command line options that are disallowed when internalValidateFeaturesAsMaster is
- // specified.
- if (params.count("replication.replSet")) {
- return Status(ErrorCodes::BadValue,
- str::stream() << //
- "Cannot specify both internalValidateFeaturesAsMaster and "
- "replication.replSet");
- }
- }
- }
- if ((params.count("security.authorization") &&
- params["security.authorization"].as<std::string>() == "enabled") ||
- params.count("security.clusterAuthMode") || params.count("security.keyFile") ||
- params.count("auth")) {
- hasAuthorizationEnabled = true;
- }
- if (hasAuthorizationEnabled && !haveAuthenticationMechanisms) {
- return Status(ErrorCodes::BadValue,
- "Authorization is enabled but no authentication mechanisms are present.");
}
return Status::OK();
}
-Status canonicalizeServerOptions(moe::Environment* params) {
- // "net.wireObjectCheck" comes from the config file, so override it if either "objcheck" or
- // "noobjcheck" are set, since those come from the command line.
- if (params->count("objcheck")) {
- Status ret =
- params->set("net.wireObjectCheck", moe::Value((*params)["objcheck"].as<bool>()));
- if (!ret.isOK()) {
- return ret;
- }
- ret = params->remove("objcheck");
- if (!ret.isOK()) {
- return ret;
- }
- }
-
- if (params->count("noobjcheck")) {
- Status ret =
- params->set("net.wireObjectCheck", moe::Value(!(*params)["noobjcheck"].as<bool>()));
- if (!ret.isOK()) {
- return ret;
- }
- ret = params->remove("noobjcheck");
- if (!ret.isOK()) {
- return ret;
- }
- }
-
- // "net.unixDomainSocket.enabled" comes from the config file, so override it if
- // "nounixsocket" is set since that comes from the command line.
- if (params->count("nounixsocket")) {
- Status ret = params->set("net.unixDomainSocket.enabled",
- moe::Value(!(*params)["nounixsocket"].as<bool>()));
- if (!ret.isOK()) {
- return ret;
- }
- ret = params->remove("nounixsocket");
- if (!ret.isOK()) {
- return ret;
- }
- }
-
+Status canonicalizeBaseOptions(moe::Environment* params) {
// Handle both the "--verbose" string argument and the "-vvvv" arguments at the same time so
// that we ensure that we set the log level to the maximum of the options provided
int logLevel = -1;
@@ -753,34 +373,11 @@ Status canonicalizeServerOptions(moe::Environment* params) {
}
}
- if (params->count("noauth")) {
- Status ret =
- params->set("security.authorization",
- (*params)["noauth"].as<bool>() ? moe::Value(std::string("disabled"))
- : moe::Value(std::string("enabled")));
- if (!ret.isOK()) {
- return ret;
- }
- ret = params->remove("noauth");
- if (!ret.isOK()) {
- return ret;
- }
- }
return Status::OK();
}
-Status setupServerOptions(const std::vector<std::string>& args) {
- Status ret = setupBinaryName(args);
- if (!ret.isOK()) {
- return ret;
- }
-
- ret = setupCwd();
- if (!ret.isOK()) {
- return ret;
- }
-
- ret = setArgvArray(args);
+Status setupBaseOptions(const std::vector<std::string>& args) {
+ Status ret = setArgvArray(args);
if (!ret.isOK()) {
return ret;
}
@@ -788,7 +385,7 @@ Status setupServerOptions(const std::vector<std::string>& args) {
return Status::OK();
}
-Status storeServerOptions(const moe::Environment& params) {
+Status storeBaseOptions(const moe::Environment& params) {
Status ret = setParsedOpts(params);
if (!ret.isOK()) {
return ret;
@@ -828,62 +425,6 @@ Status storeServerOptions(const moe::Environment& params) {
params["enableExperimentalStorageDetailsCmd"].as<bool>();
}
- if (params.count("net.port")) {
- serverGlobalParams.port = params["net.port"].as<int>();
- }
-
- if (params.count("net.ipv6") && params["net.ipv6"].as<bool>() == true) {
- serverGlobalParams.enableIPv6 = true;
- enableIPv6();
- }
-
- if (params.count("net.listenBacklog")) {
- serverGlobalParams.listenBacklog = params["net.listenBacklog"].as<int>();
- }
-
- if (params.count("net.transportLayer")) {
- serverGlobalParams.transportLayer = params["net.transportLayer"].as<std::string>();
- if (serverGlobalParams.transportLayer != "asio") {
- return {ErrorCodes::BadValue, "Unsupported value for transportLayer. Must be \"asio\""};
- }
- }
-
- if (params.count("net.serviceExecutor")) {
- auto value = params["net.serviceExecutor"].as<std::string>();
- const auto valid = {"synchronous"_sd, "adaptive"_sd};
- if (std::find(valid.begin(), valid.end(), value) == valid.end()) {
- return {ErrorCodes::BadValue, "Unsupported value for serviceExecutor"};
- }
- serverGlobalParams.serviceExecutor = value;
- } else {
- serverGlobalParams.serviceExecutor = "synchronous";
- }
-
- if (params.count("security.transitionToAuth")) {
- serverGlobalParams.transitionToAuth = params["security.transitionToAuth"].as<bool>();
- }
-
- if (params.count("security.clusterAuthMode")) {
- std::string clusterAuthMode = params["security.clusterAuthMode"].as<std::string>();
-
- if (clusterAuthMode == "keyFile") {
- serverGlobalParams.clusterAuthMode.store(ServerGlobalParams::ClusterAuthMode_keyFile);
- } else if (clusterAuthMode == "sendKeyFile") {
- serverGlobalParams.clusterAuthMode.store(
- ServerGlobalParams::ClusterAuthMode_sendKeyFile);
- } else if (clusterAuthMode == "sendX509") {
- serverGlobalParams.clusterAuthMode.store(ServerGlobalParams::ClusterAuthMode_sendX509);
- } else if (clusterAuthMode == "x509") {
- serverGlobalParams.clusterAuthMode.store(ServerGlobalParams::ClusterAuthMode_x509);
- } else {
- return Status(ErrorCodes::BadValue,
- "unsupported value for clusterAuthMode " + clusterAuthMode);
- }
- serverGlobalParams.authState = ServerGlobalParams::AuthState::kEnabled;
- } else {
- serverGlobalParams.clusterAuthMode.store(ServerGlobalParams::ClusterAuthMode_undefined);
- }
-
if (params.count("systemLog.quiet")) {
serverGlobalParams.quiet.store(params["systemLog.quiet"].as<bool>());
}
@@ -892,52 +433,6 @@ Status storeServerOptions(const moe::Environment& params) {
DBException::traceExceptions.store(params["systemLog.traceAllExceptions"].as<bool>());
}
- if (params.count("net.maxIncomingConnections")) {
- serverGlobalParams.maxConns = params["net.maxIncomingConnections"].as<int>();
-
- if (serverGlobalParams.maxConns < 5) {
- return Status(ErrorCodes::BadValue, "maxConns has to be at least 5");
- }
- }
-
- if (params.count("net.wireObjectCheck")) {
- serverGlobalParams.objcheck = params["net.wireObjectCheck"].as<bool>();
- }
-
- if (params.count("net.bindIpAll") && params["net.bindIpAll"].as<bool>()) {
- // Bind to all IP addresses
- serverGlobalParams.bind_ip = "0.0.0.0";
- if (params.count("net.ipv6") && params["net.ipv6"].as<bool>()) {
- serverGlobalParams.bind_ip += ",::";
- }
- } else if (params.count("net.bindIp")) {
- // Bind to enumerated IP addresses
- serverGlobalParams.bind_ip = params["net.bindIp"].as<std::string>();
- } else {
- // Bind to localhost
- serverGlobalParams.bind_ip = "";
- }
-
-#ifndef _WIN32
- if (params.count("net.unixDomainSocket.pathPrefix")) {
- serverGlobalParams.socket = params["net.unixDomainSocket.pathPrefix"].as<string>();
- }
-
- if (params.count("net.unixDomainSocket.enabled")) {
- serverGlobalParams.noUnixSocket = !params["net.unixDomainSocket.enabled"].as<bool>();
- }
- if (params.count("net.unixDomainSocket.filePermissions")) {
- serverGlobalParams.unixSocketPermissions =
- params["net.unixDomainSocket.filePermissions"].as<int>();
- }
-
- if ((params.count("processManagement.fork") &&
- params["processManagement.fork"].as<bool>() == true) &&
- (!params.count("shutdown") || params["shutdown"].as<bool>() == false)) {
- serverGlobalParams.doFork = true;
- }
-#endif // _WIN32
-
if (params.count("systemLog.timeStampFormat")) {
using logger::MessageEventDetailsEncoder;
std::string formatterName = params["systemLog.timeStampFormat"].as<string>();
@@ -1032,26 +527,6 @@ Status storeServerOptions(const moe::Environment& params) {
return Status(ErrorCodes::BadValue, "Cant use both a logpath and syslog ");
}
- if (serverGlobalParams.doFork && serverGlobalParams.logpath.empty() &&
- !serverGlobalParams.logWithSyslog) {
- return Status(ErrorCodes::BadValue, "--fork has to be used with --logpath or --syslog");
- }
-
- if (params.count("security.keyFile")) {
- serverGlobalParams.keyFile =
- boost::filesystem::absolute(params["security.keyFile"].as<string>()).generic_string();
- serverGlobalParams.authState = ServerGlobalParams::AuthState::kEnabled;
- }
-
- if (serverGlobalParams.transitionToAuth ||
- (params.count("security.authorization") &&
- params["security.authorization"].as<std::string>() == "disabled")) {
- serverGlobalParams.authState = ServerGlobalParams::AuthState::kDisabled;
- } else if (params.count("security.authorization") &&
- params["security.authorization"].as<std::string>() == "enabled") {
- serverGlobalParams.authState = ServerGlobalParams::AuthState::kEnabled;
- }
-
if (params.count("processManagement.pidFilePath")) {
serverGlobalParams.pidFile = params["processManagement.pidFilePath"].as<string>();
}
@@ -1091,17 +566,6 @@ Status storeServerOptions(const moe::Environment& params) {
}
}
- if (!params.count("security.clusterAuthMode") && params.count("security.keyFile")) {
- serverGlobalParams.clusterAuthMode.store(ServerGlobalParams::ClusterAuthMode_keyFile);
- }
- int clusterAuthMode = serverGlobalParams.clusterAuthMode.load();
- if (serverGlobalParams.transitionToAuth &&
- (clusterAuthMode != ServerGlobalParams::ClusterAuthMode_keyFile &&
- clusterAuthMode != ServerGlobalParams::ClusterAuthMode_x509)) {
- return Status(ErrorCodes::BadValue,
- "--transitionToAuth must be used with keyFile or x509 authentication");
- }
-
if (params.count("operationProfiling.slowOpThresholdMs")) {
serverGlobalParams.slowMS = params["operationProfiling.slowOpThresholdMs"].as<int>();
}
@@ -1110,18 +574,6 @@ Status storeServerOptions(const moe::Environment& params) {
serverGlobalParams.sampleRate = params["operationProfiling.slowOpSampleRate"].as<double>();
}
-#ifdef MONGO_CONFIG_SSL
- ret = storeSSLServerOptions(params);
- if (!ret.isOK()) {
- return ret;
- }
-#endif
-
- ret = storeMessageCompressionOptions(params);
- if (!ret.isOK()) {
- return ret;
- }
-
return Status::OK();
}