diff --git a/src/Auth.cpp b/src/Auth.cpp index 284e099..11baaae 100644 --- a/src/Auth.cpp +++ b/src/Auth.cpp @@ -10,8 +10,8 @@ #include "Request.h" -Auth::Auth(): - mMode(Command::Read|Command::Write|Command::Admin), +Auth::Auth(int mode): + mMode(mode), mReadKeyPrefix(nullptr), mWriteKeyPrefix(nullptr) { @@ -75,10 +75,11 @@ bool Auth::permission(Request* req, const String& key) const return true; } -Auth Authority::DefaultAuth; +Auth Authority::AuthAllowAll; +Auth Authority::AuthDenyAll(0); Authority::Authority(): - mDefault(&DefaultAuth) + mDefault(&AuthAllowAll) { } @@ -102,5 +103,7 @@ void Authority::add(const AuthConf& ac) mAuthMap[a->password()] = a; if (a->password().empty()) { mDefault = a; + } else if (mDefault == &AuthAllowAll) { + mDefault = &AuthDenyAll; } } diff --git a/src/Auth.h b/src/Auth.h index 1f1b3c5..b9b4f8e 100644 --- a/src/Auth.h +++ b/src/Auth.h @@ -15,7 +15,7 @@ class Auth { public: - Auth(); + Auth(int mode = Command::Read|Command::Write|Command::Admin); Auth(const AuthConf& conf); ~Auth(); const String& password() const @@ -53,7 +53,8 @@ public: private: std::map mAuthMap; Auth* mDefault; - static Auth DefaultAuth; + static Auth AuthAllowAll; + static Auth AuthDenyAll; }; #endif diff --git a/src/Handler.cpp b/src/Handler.cpp index a969a5f..425c4ff 100644 --- a/src/Handler.cpp +++ b/src/Handler.cpp @@ -889,98 +889,111 @@ void Handler::infoRequest(Request* req, const String& key) infoServerLatencyRequest(req); return; } + bool all = key.equal("All", true); + bool empty = key.empty(); ResponsePtr res = ResponseAlloc::create(); res->setType(Reply::String); Segment& body = res->body(); - BufferPtr buf = body.fset(nullptr, "# Proxy\n"); - buf = buf->fappend("Version:%s\n", _PREDIXY_VERSION_); - buf = buf->fappend("Name:%s\n", mProxy->conf()->name()); - buf = buf->fappend("Bind:%s\n", mProxy->conf()->bind()); - buf = buf->fappend("RedisMode:proxy\n"); + Buffer* buf = body.fset(nullptr, ""); + +#define Scope(all, empty, header) ((all || empty || key.equal(header, true)) ? \ + (buf = buf->fappend("# %s\n", header)) : nullptr) + + if (Scope(all, empty, "Proxy")) { + buf = buf->fappend("Version:%s\n", _PREDIXY_VERSION_); + buf = buf->fappend("Name:%s\n", mProxy->conf()->name()); + buf = buf->fappend("Bind:%s\n", mProxy->conf()->bind()); + buf = buf->fappend("RedisMode:proxy\n"); #ifdef _PREDIXY_SINGLE_THREAD_ - buf = buf->fappend("SingleThread:true\n"); + buf = buf->fappend("SingleThread:true\n"); #else - buf = buf->fappend("SingleThread:false\n"); + buf = buf->fappend("SingleThread:false\n"); #endif - buf = buf->fappend("WorkerThreads:%d\n", mProxy->conf()->workerThreads()); - SString<32> timeStr; - timeStr.strftime("%Y-%m-%d %H:%M:%S", mProxy->startTime()); - buf = buf->fappend("UptimeSince:%s\n", timeStr.data()); - buf = buf->fappend("\n"); - - buf = buf->fappend("# SystemResource\n"); - buf = buf->fappend("UsedMemory:%ld\n", AllocBase::getUsedMemory()); - buf = buf->fappend("MaxMemory:%ld\n", AllocBase::getMaxMemory()); - struct rusage ru; - int ret = getrusage(RUSAGE_SELF, &ru); - if (ret == 0) { - buf = buf->fappend("MaxRSS:%ld\n", ru.ru_maxrss<<10); - buf = buf->fappend("UsedCpuSys:%.3f\n", (double)ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1000000.); - buf = buf->fappend("UsedCpuUser:%.3f\n", (double)ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1000000.); - } else { - logError("h %d getrusage fail %s", id(), StrError()); - } - buf = buf->fappend("\n"); - - buf = buf->fappend("# Stats\n"); - HandlerStats st(mStats); - for (auto h : mProxy->handlers()) { - if (h == this) { - continue; - } - st += h->mStats; - } - buf = buf->fappend("Accept:%ld\n", st.accept); - buf = buf->fappend("ClientConnections:%ld\n", st.clientConnections); - buf = buf->fappend("TotalRequests:%ld\n", st.requests); - buf = buf->fappend("TotalResponses:%ld\n", st.responses); - buf = buf->fappend("TotalRecvClientBytes:%ld\n", st.recvClientBytes); - buf = buf->fappend("TotalSendServerBytes:%ld\n", st.sendServerBytes); - buf = buf->fappend("TotalRecvServerBytes:%ld\n", st.recvServerBytes); - buf = buf->fappend("TotalSendClientBytes:%ld\n", st.sendClientBytes); - buf = buf->fappend("\n"); - - buf = buf->fappend("# Servers\n"); - int servCursor = 0; - auto sp = mProxy->serverPool(); - while (Server* serv = sp->iter(servCursor)) { - ServerStats st; - for (auto h : mProxy->handlers()) { - if (auto cp = h->getConnectConnectionPool(serv->id())) { - st += cp->stats(); - } - } - buf->fappend("Server:%s\n", serv->addr().data()); - buf->fappend("Role:%s\n", serv->roleStr()); - auto g = serv->group(); - buf->fappend("Group:%s\n", g ? g->name().data() : ""); - buf->fappend("DC:%s\n", serv->dcName().data()); - buf->fappend("CurrentIsFail:%d\n", (int)serv->fail()); - buf->fappend("Connections:%d\n", st.connections); - buf->fappend("Connect:%ld\n", st.connect); - buf->fappend("Requests:%ld\n", st.requests); - buf->fappend("Responses:%ld\n", st.responses); - buf->fappend("SendBytes:%ld\n", st.sendBytes); - buf->fappend("RecvBytes:%ld\n", st.recvBytes); + buf = buf->fappend("WorkerThreads:%d\n", mProxy->conf()->workerThreads()); + buf = buf->fappend("Uptime:%ld\n", (long)mProxy->startTime()); + SString<32> timeStr; + timeStr.strftime("%Y-%m-%d %H:%M:%S", mProxy->startTime()); + buf = buf->fappend("UptimeSince:%s\n", timeStr.data()); buf = buf->fappend("\n"); } - buf = buf->fappend("\n"); - buf = buf->fappend("# LatencyMonitor\n"); - LatencyMonitor lm; - for (size_t i = 0; i < mLatencyMonitors.size(); ++i) { - lm = mLatencyMonitors[i]; + if (Scope(all, empty, "SystemResource")) { + buf = buf->fappend("UsedMemory:%ld\n", AllocBase::getUsedMemory()); + buf = buf->fappend("MaxMemory:%ld\n", AllocBase::getMaxMemory()); + struct rusage ru; + int ret = getrusage(RUSAGE_SELF, &ru); + if (ret == 0) { + buf = buf->fappend("MaxRSS:%ld\n", ru.ru_maxrss<<10); + buf = buf->fappend("UsedCpuSys:%.3f\n", (double)ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1000000.); + buf = buf->fappend("UsedCpuUser:%.3f\n", (double)ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1000000.); + } else { + logError("h %d getrusage fail %s", id(), StrError()); + } + buf = buf->fappend("\n"); + } + + if (Scope(all, empty, "Stats")) { + HandlerStats st(mStats); for (auto h : mProxy->handlers()) { if (h == this) { continue; } - lm += h->mLatencyMonitors[i]; + st += h->mStats; } - buf = buf->fappend("LatencyMonitorName:%s\n", lm.name().data()); - buf = lm.output(buf); + buf = buf->fappend("Accept:%ld\n", st.accept); + buf = buf->fappend("ClientConnections:%ld\n", st.clientConnections); + buf = buf->fappend("TotalRequests:%ld\n", st.requests); + buf = buf->fappend("TotalResponses:%ld\n", st.responses); + buf = buf->fappend("TotalRecvClientBytes:%ld\n", st.recvClientBytes); + buf = buf->fappend("TotalSendServerBytes:%ld\n", st.sendServerBytes); + buf = buf->fappend("TotalRecvServerBytes:%ld\n", st.recvServerBytes); + buf = buf->fappend("TotalSendClientBytes:%ld\n", st.sendClientBytes); buf = buf->fappend("\n"); } + if (Scope(all, empty, "Servers")) { + int servCursor = 0; + auto sp = mProxy->serverPool(); + while (Server* serv = sp->iter(servCursor)) { + ServerStats st; + for (auto h : mProxy->handlers()) { + if (auto cp = h->getConnectConnectionPool(serv->id())) { + st += cp->stats(); + } + } + buf->fappend("Server:%s\n", serv->addr().data()); + buf->fappend("Role:%s\n", serv->roleStr()); + auto g = serv->group(); + buf->fappend("Group:%s\n", g ? g->name().data() : ""); + buf->fappend("DC:%s\n", serv->dcName().data()); + buf->fappend("CurrentIsFail:%d\n", (int)serv->fail()); + buf->fappend("Connections:%d\n", st.connections); + buf->fappend("Connect:%ld\n", st.connect); + buf->fappend("Requests:%ld\n", st.requests); + buf->fappend("Responses:%ld\n", st.responses); + buf->fappend("SendBytes:%ld\n", st.sendBytes); + buf->fappend("RecvBytes:%ld\n", st.recvBytes); + buf = buf->fappend("\n"); + } + buf = buf->fappend("\n"); + } + + if (Scope(all, empty, "LatencyMonitor")) { + LatencyMonitor lm; + for (size_t i = 0; i < mLatencyMonitors.size(); ++i) { + lm = mLatencyMonitors[i]; + for (auto h : mProxy->handlers()) { + if (h == this) { + continue; + } + lm += h->mLatencyMonitors[i]; + } + buf = buf->fappend("LatencyMonitorName:%s\n", lm.name().data()); + buf = lm.output(buf); + buf = buf->fappend("\n"); + } + } + buf = buf->fappend("\r\n"); body.end().buf = buf; body.end().pos = buf->length(); diff --git a/test/basic.py b/test/basic.py index 20da613..e5bf04c 100755 --- a/test/basic.py +++ b/test/basic.py @@ -133,6 +133,7 @@ Cases = [ [('del', 'list', 'u1', 'u2', 'u3', 'u4', 'u5', 'u6'), 7], ]), ('touch', [ + [('del', 'k1', 'k2', 'k3', 'k4'), ], [('mset', 'k1', 'v1', 'k2', 'v2', 'k3', 'v3'), 'OK'], [('touch', 'k1'), 1], [('touch', 'k1', 'k2', 'k3', 'k4'), 3],