void runCommands(OperationContext* txn, const rpc::RequestInterface& request, rpc::ReplyBuilderInterface* replyBuilder) { try { dassert(replyBuilder->getState() == rpc::ReplyBuilderInterface::State::kMetadata); Command* c = nullptr; // In the absence of a Command object, no redaction is possible. Therefore // to avoid displaying potentially sensitive information in the logs, // we restrict the log message to the name of the unrecognized command. // However, the complete command object will still be echoed to the client. if (!(c = Command::findCommand(request.getCommandName()))) { Command::unknownCommands.increment(); std::string msg = str::stream() << "no such command: '" << request.getCommandName() << "'"; LOG(2) << msg; uasserted(ErrorCodes::CommandNotFound, str::stream() << msg << ", bad cmd: '" << request.getCommandArgs() << "'"); } LOG(2) << "run command " << request.getDatabase() << ".$cmd" << ' ' << c->getRedactedCopyForLogging(request.getCommandArgs()); Command::execCommand(txn, c, request, replyBuilder); } catch (const DBException& ex) { Command::generateErrorResponse(txn, replyBuilder, ex, request); } }
// called into by the web server. For now we just translate the parameters // to their old style equivalents. void Command::execCommand(OperationContext* txn, Command* command, const rpc::RequestInterface& request, rpc::ReplyBuilderInterface* replyBuilder) { int queryFlags = 0; BSONObj cmdObj; std::tie(cmdObj, queryFlags) = uassertStatusOK( rpc::downconvertRequestMetadata(request.getCommandArgs(), request.getMetadata()) ); std::string db = request.getDatabase().rawData(); BSONObjBuilder result; execCommandClientBasic(txn, command, *txn->getClient(), queryFlags, request.getDatabase().rawData(), cmdObj, result); replyBuilder ->setMetadata(rpc::makeEmptyMetadata()) .setCommandReply(result.done()); }
void Command::generateErrorResponse(OperationContext* txn, rpc::ReplyBuilderInterface* replyBuilder, const DBException& exception, const rpc::RequestInterface& request) { LOG(1) << "assertion while executing command '" << request.getCommandName() << "' " << "on database '" << request.getDatabase() << "': " << exception.toString(); _generateErrorResponse(txn, replyBuilder, exception, rpc::makeEmptyMetadata()); }
void Command::generateErrorResponse(OperationContext* txn, rpc::ReplyBuilderInterface* replyBuilder, const DBException& exception, const rpc::RequestInterface& request, Command* command, const BSONObj& metadata) { LOG(1) << "assertion while executing command '" << request.getCommandName() << "' " << "on database '" << request.getDatabase() << "' " << "with arguments '" << command->getRedactedCopyForLogging(request.getCommandArgs()) << "' " << "and metadata '" << request.getMetadata() << "': " << exception.toString(); _generateErrorResponse(txn, replyBuilder, exception, metadata); }
bool Command::isHelpRequest(const rpc::RequestInterface& request) { return request.getCommandArgs()["help"].trueValue(); }