This avoids making the callback parse off the command portion on their own.
It also lets them assert that the command portion is in the set of
registered commands.
Signed-off-by: Sage Weil <sage@inktank.com>
if (match.size() == 0) {
lderr(m_cct) << "AdminSocket: request '" << c << "' not defined" << dendl;
} else {
- bool success = p->second->call(c, out);
+ string args;
+ if (match != c)
+ args = c.substr(match.length() + 1);
+ bool success = p->second->call(match, args, out);
if (!success) {
- ldout(m_cct, 0) << "AdminSocket: request '" << c << "' (" << match
- << ") to " << p->second << " failed" << dendl;
+ ldout(m_cct, 0) << "AdminSocket: request '" << match << "' args '" << args
+ << "' to " << p->second << " failed" << dendl;
out.append("failed");
} else {
- ldout(m_cct, 20) << "AdminSocket: request '" << c << "' (" << match
- << ") to " << p->second
+ ldout(m_cct, 20) << "AdminSocket: request '" << match << "' '" << args
+ << "' to " << p->second
<< " returned " << out.length() << " bytes" << dendl;
}
uint32_t len = htonl(out.length());
class VersionHook : public AdminSocketHook {
public:
- virtual bool call(std::string command, bufferlist& out) {
+ virtual bool call(std::string command, std::string args, bufferlist& out) {
if (command == "version")
out.append(ceph_version_to_str());
else if (command == "git_version")
AdminSocket *m_as;
public:
HelpHook(AdminSocket *as) : m_as(as) {}
- bool call(string command, bufferlist& out) {
+ bool call(string command, string args, bufferlist& out) {
unsigned max = 0;
for (map<string,string>::iterator p = m_as->m_help.begin();
p != m_as->m_help.end();
class AdminSocketHook {
public:
- virtual bool call(std::string command, bufferlist& out) = 0;
+ virtual bool call(std::string command, std::string args, bufferlist& out) = 0;
virtual ~AdminSocketHook() {};
};
public:
CephContextHook(CephContext *cct) : m_cct(cct) {}
- bool call(std::string command, bufferlist& out) {
- m_cct->do_command(command, &out);
+ bool call(std::string command, std::string args, bufferlist& out) {
+ m_cct->do_command(command, args, &out);
return true;
}
};
-void CephContext::do_command(std::string command, bufferlist *out)
+void CephContext::do_command(std::string command, std::string args, bufferlist *out)
{
- lgeneric_dout(this, 1) << "do_command '" << command << "'" << dendl;
+ lgeneric_dout(this, 1) << "do_command '" << command << "' '" << args << "'" << dendl;
if (command == "perfcounters_dump" || command == "1" ||
command == "perf dump") {
std::vector<char> v;
_conf->show_config(ss);
out->append(ss.str());
}
- else if (command.find("config set ") == 0) {
- std::string var = command.substr(11);
+ else if (command == "config set ") {
+ std::string var = args;
size_t pos = var.find(' ');
if (pos == string::npos) {
out->append("set_config syntax is 'set_config <var> <value>'");
else {
assert(0 == "registered under wrong command?");
}
- lgeneric_dout(this, 1) << "do_command '" << command << "' result is " << out->length() << " bytes" << dendl;
+ lgeneric_dout(this, 1) << "do_command '" << command << "' '" << args << "' result is " << out->length() << " bytes" << dendl;
};
/**
* process an admin socket command
*/
- void do_command(std::string command, bufferlist *out);
+ void do_command(std::string command, std::string args, bufferlist *out);
private:
CephContext(const CephContext &rhs);
Monitor *mon;
public:
AdminHook(Monitor *m) : mon(m) {}
- bool call(std::string command, bufferlist& out) {
+ bool call(std::string command, std::string args, bufferlist& out) {
stringstream ss;
- mon->do_admin_command(command, ss);
+ mon->do_admin_command(command, args, ss);
out.append(ss);
return true;
}
};
-void Monitor::do_admin_command(string command, ostream& ss)
+void Monitor::do_admin_command(string command, string args, ostream& ss)
{
Mutex::Locker l(lock);
if (command == "mon_status")
else if (command == "quorum_status")
_quorum_status(ss);
else if (command.find("add_bootstrap_peer_hint") == 0)
- _add_bootstrap_peer_hint(command, ss);
+ _add_bootstrap_peer_hint(command, args, ss);
else
assert(0 == "bad AdminSocket command binding");
}
}
}
-void Monitor::_add_bootstrap_peer_hint(string cmd, ostream& ss)
+void Monitor::_add_bootstrap_peer_hint(string cmd, string args, ostream& ss)
{
- dout(10) << "_add_bootstrap_peer_hint '" << cmd << "'" << dendl;
+ dout(10) << "_add_bootstrap_peer_hint '" << cmd << "' '" << args << "'" << dendl;
if (is_leader() || is_peon()) {
ss << "mon already active; ignoring bootstrap hint";
return;
}
- size_t off = cmd.find(" ");
- if (off == std::string::npos) {
+ if (args.length() == 0) {
ss << "syntax is 'add_bootstrap_peer_hint ip[:port]'";
return;
}
entity_addr_t addr;
const char *end = 0;
- if (!addr.parse(cmd.c_str() + off + 1, &end)) {
- ss << "failed to parse addr '" << (cmd.c_str() + off + 1) << "'";
+ if (!addr.parse(args.c_str(), &end)) {
+ ss << "failed to parse addr '" << args << "'";
return;
}
bool _allowed_command(MonSession *s, const vector<std::string>& cmd);
void _mon_status(ostream& ss);
void _quorum_status(ostream& ss);
- void _add_bootstrap_peer_hint(string cmd, ostream& ss);
+ void _add_bootstrap_peer_hint(string cmd, string args, ostream& ss);
void handle_command(class MMonCommand *m);
void handle_route(MRoute *m);
int mkfs(bufferlist& osdmapbl);
- void do_admin_command(std::string command, ostream& ss);
+ void do_admin_command(std::string command, std::string args, ostream& ss);
private:
// don't allow copying
OSD *osd;
public:
OpsFlightSocketHook(OSD *o) : osd(o) {}
- bool call(std::string command, bufferlist& out) {
+ bool call(std::string command, std::string args, bufferlist& out) {
stringstream ss;
osd->dump_ops_in_flight(ss);
out.append(ss);
{
}
-bool Objecter::RequestStateHook::call(std::string command, bufferlist& out)
+bool Objecter::RequestStateHook::call(std::string command, std::string args, bufferlist& out)
{
stringstream ss;
JSONFormatter formatter(true);
Objecter *m_objecter;
public:
RequestStateHook(Objecter *objecter);
- bool call(std::string command, bufferlist& out);
+ bool call(std::string command, std::string args, bufferlist& out);
};
RequestStateHook *m_request_state_hook;