key.first = who.substr(0, dot);
key.second = who.substr(dot + 1);
DaemonStatePtr daemon = daemon_state.get(key);
- if (daemon &&
- daemon->config_defaults_bl.length() > 0) {
+ string name;
+ if (!daemon) {
+ ss << "no config state for daemon " << who;
+ r = -ENOENT;
+ } else if (cmd_getval(g_ceph_context, cmdctx->cmdmap, "key", name)) {
+ auto p = daemon->config.find(name);
+ if (p != daemon->config.end() &&
+ !p->second.empty()) {
+ cmdctx->odata.append(p->second.rbegin()->second + "\n");
+ } else {
+ auto& defaults = daemon->get_config_defaults();
+ auto q = defaults.find(name);
+ if (q != defaults.end()) {
+ cmdctx->odata.append(q->second + "\n");
+ } else {
+ r = -ENOENT;
+ }
+ }
+ } else if (daemon->config_defaults_bl.length() > 0) {
Mutex::Locker l(daemon->lock);
TextTable tbl;
if (f) {
}
} else {
// show-with-defaults
- if (daemon->config_defaults.empty()) {
- auto p = daemon->config_defaults_bl.begin();
- try {
- ::decode(daemon->config_defaults, p);
- } catch (buffer::error e) {
- }
- }
- for (auto& i : daemon->config_defaults) {
+ auto& defaults = daemon->get_config_defaults();
+ for (auto& i : defaults) {
if (f) {
f->open_object_section("value");
f->dump_string("name", i.first);
} else {
cmdctx->odata.append(stringify(tbl));
}
- } else {
- ss << "no config state for daemon " << who;
- r = -ENOENT;
}
cmdctx->reply(r, ss);
return true;
: perf_counters(types_)
{
}
+
+ const std::map<std::string,std::string>& get_config_defaults() {
+ if (config_defaults.empty() &&
+ config_defaults_bl.length()) {
+ auto p = config_defaults_bl.begin();
+ try {
+ ::decode(config_defaults, p);
+ } catch (buffer::error e) {
+ }
+ }
+ return config_defaults;
+ }
};
typedef std::shared_ptr<DaemonState> DaemonStatePtr;
"dump service state", "service", "r", "cli,rest")
COMMAND("config show " \
- "name=who,type=CephString",
+ "name=who,type=CephString name=key,type=CephString,req=False",
"Show running configuration",
"mgr", "r", "cli,rest")
COMMAND("config show-with-defaults " \