From d3dac3d2807b5d5ad47f316a8c1da472b1840432 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 4 Dec 2017 16:52:00 -0600 Subject: [PATCH] mgr/DaemonServer: 'config show ' Signed-off-by: Sage Weil --- src/mgr/DaemonServer.cc | 71 +++++++++++++++++++++++++++++++++++++++++ src/mgr/MgrCommands.h | 5 +++ 2 files changed, 76 insertions(+) diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index 165e4e86ad5..f57933deb04 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -1342,7 +1342,78 @@ bool DaemonServer::handle_command(MCommand *m) ss << std::endl; cmdctx->reply(r, ss); return true; + } else if (prefix == "config show") { + string who; + cmd_getval(g_ceph_context, cmdctx->cmdmap, "who", who); + int r = 0; + auto dot = who.find('.'); + DaemonKey key; + key.first = who.substr(0, dot); + key.second = who.substr(dot + 1); + DaemonStatePtr daemon = daemon_state.get(key); + if (daemon) { + Mutex::Locker l(daemon->lock); + if (f) { + f->open_array_section("config"); + for (auto& i : daemon->config) { + dout(20) << " " << i.first << " -> " << i.second << dendl; + if (i.second.empty()) { + continue; + } + f->open_object_section("value"); + f->dump_string("name", i.first); + f->dump_string("value", i.second.rbegin()->second); + f->dump_string("source", ceph_conf_level_name( + i.second.rbegin()->first)); + if (i.second.size() > 1) { + f->open_array_section("overrides"); + auto j = i.second.rend(); + for (--j; j != i.second.rbegin(); --j) { + f->open_object_section("value"); + f->dump_string("source", ceph_conf_level_name(j->first)); + f->dump_string("value", j->second); + f->close_section(); + } + f->close_section(); + } + f->close_section(); + } + f->close_section(); + f->flush(cmdctx->odata); + } else { + TextTable tbl; + tbl.define_column("NAME", TextTable::LEFT, TextTable::LEFT); + tbl.define_column("VALUE", TextTable::LEFT, TextTable::LEFT); + tbl.define_column("SOURCE", TextTable::LEFT, TextTable::LEFT); + tbl.define_column("OVERRIDES", TextTable::LEFT, TextTable::LEFT); + for (auto& i : daemon->config) { + if (i.second.empty()) { + continue; + } + dout(20) << " " << i.first << " -> " << i.second << dendl; + tbl << i.first; + tbl << i.second.rbegin()->second; + tbl << ceph_conf_level_name(i.second.rbegin()->first); + if (i.second.size() > 1) { + list ov; + auto j = i.second.rend(); + for (--j; j != i.second.rbegin(); --j) { + ov.push_front(ceph_conf_level_name(j->first)); + } + tbl << ov; + } + tbl << TextTable::endrow; + } + cmdctx->odata.append(stringify(tbl)); + } + } else { + ss << "no state for daemon " << who; + r = -ENOENT; + } + cmdctx->reply(r, ss); + return true; } else { + // fall back to feeding command to PGMap r = cluster_state.with_pgmap([&](const PGMap& pg_map) { return cluster_state.with_osdmap([&](const OSDMap& osdmap) { return process_pg_map_command(prefix, cmdctx->cmdmap, pg_map, osdmap, diff --git a/src/mgr/MgrCommands.h b/src/mgr/MgrCommands.h index 79766fafed9..29f0197b221 100644 --- a/src/mgr/MgrCommands.h +++ b/src/mgr/MgrCommands.h @@ -136,3 +136,8 @@ COMMAND("config set " \ "name=key,type=CephString name=value,type=CephString", "Set a configuration option at runtime (not persistent)", "mgr", "rw", "cli,rest") + +COMMAND("config show " \ + "name=who,type=CephString", + "Show running configuration", + "mgr", "r", "cli,rest") -- 2.39.5