aboutsummaryrefslogtreecommitdiff
path: root/src/zenserver/admin/admin.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2023-09-26 09:54:00 +0200
committerStefan Boberg <[email protected]>2023-09-26 09:54:00 +0200
commit6b23bf09acd11f50ec224297ee69bef15cad39ee (patch)
tree8b2bcfe89eb5ffd71cae323dc62c4881024aa876 /src/zenserver/admin/admin.cpp
parentsort commands for cleaner merges (diff)
parent0.2.24 (diff)
downloadzen-6b23bf09acd11f50ec224297ee69bef15cad39ee.tar.xz
zen-6b23bf09acd11f50ec224297ee69bef15cad39ee.zip
Merge branch 'main' of https://github.com/EpicGames/zen
Diffstat (limited to 'src/zenserver/admin/admin.cpp')
-rw-r--r--src/zenserver/admin/admin.cpp150
1 files changed, 149 insertions, 1 deletions
diff --git a/src/zenserver/admin/admin.cpp b/src/zenserver/admin/admin.cpp
index cef2ba403..083086f50 100644
--- a/src/zenserver/admin/admin.cpp
+++ b/src/zenserver/admin/admin.cpp
@@ -5,15 +5,29 @@
#include <zencore/compactbinarybuilder.h>
#include <zencore/jobqueue.h>
#include <zencore/string.h>
+#if ZEN_WITH_TRACE
+# include <zencore/trace.h>
+#endif // ZEN_WITH_TRACE
+
#include <zenstore/gc.h>
+#include "cache/structuredcachestore.h"
#include <chrono>
+ZEN_THIRD_PARTY_INCLUDES_START
+#include <spdlog/spdlog.h>
+ZEN_THIRD_PARTY_INCLUDES_END
+
namespace zen {
-HttpAdminService::HttpAdminService(GcScheduler& Scheduler, JobQueue& BackgroundJobQueue)
+HttpAdminService::HttpAdminService(GcScheduler& Scheduler,
+ JobQueue& BackgroundJobQueue,
+ ZenCacheStore& CacheStore,
+ const LogPaths& LogPaths)
: m_GcScheduler(Scheduler)
, m_BackgroundJobQueue(BackgroundJobQueue)
+, m_CacheStore(CacheStore)
+, m_LogPaths(LogPaths)
{
using namespace std::literals;
@@ -248,6 +262,140 @@ HttpAdminService::HttpAdminService(GcScheduler& Scheduler, JobQueue& BackgroundJ
Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Obj.Save());
},
HttpVerb::kPost);
+#if ZEN_WITH_TRACE
+ m_Router.RegisterRoute(
+ "trace",
+ [this](HttpRouterRequest& Req) {
+ bool Enabled = IsTracing();
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Enabled ? "enabled" : "disabled");
+ },
+ HttpVerb::kGet);
+
+ m_Router.RegisterRoute(
+ "trace/start",
+ [this](HttpRouterRequest& Req) {
+ HttpServerRequest& HttpReq = Req.ServerRequest();
+ const HttpServerRequest::QueryParams Params = HttpReq.GetQueryParams();
+ TraceType Type = TraceType::None;
+ std::string HostOrPath;
+ if (auto Param = Params.GetValue("file"); Param.empty() == false)
+ {
+ Type = TraceType::File;
+ HostOrPath = Param;
+ }
+ if (auto Param = Params.GetValue("host"); Param.empty() == false)
+ {
+ Type = TraceType::Network;
+ HostOrPath = Param;
+ }
+ if (Type == TraceType::None)
+ {
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest,
+ HttpContentType::kText,
+ "Invalid trace type, use `file` or `host`"sv);
+ }
+ if (IsTracing())
+ {
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest,
+ HttpContentType::kText,
+ "Tracing is already enabled"sv);
+ }
+ TraceStart(HostOrPath.c_str(), Type);
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::OK, HttpContentType::kText, "Tracing started");
+ },
+ HttpVerb::kPost);
+
+ m_Router.RegisterRoute(
+ "trace/stop",
+ [this](HttpRouterRequest& Req) {
+ if (!IsTracing())
+ {
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest, HttpContentType::kText, "Tracing is not enabled"sv);
+ }
+ if (TraceStop())
+ {
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::OK, HttpContentType::kText, "Tracing stopped");
+ }
+ else
+ {
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::InternalServerError,
+ HttpContentType::kText,
+ "Failed stopping trace");
+ }
+ },
+ HttpVerb::kPost);
+#endif // ZEN_WITH_TRACE
+
+ m_Router.RegisterRoute(
+ "logs",
+ [this](HttpRouterRequest& Req) {
+ CbObjectWriter Obj;
+ spdlog::string_view_t LogLevel = spdlog::level::to_string_view(spdlog::get_level());
+ Obj.AddString("loglevel", std::string_view(LogLevel.data(), LogLevel.size()));
+ Obj.AddString("Logfile", PathToUtf8(m_LogPaths.AbsLogPath));
+ Obj.BeginObject("cache");
+ {
+ const ZenCacheStore::Configuration& CacheConfig = m_CacheStore.GetConfiguration();
+ Obj.AddString("Logfile", PathToUtf8(m_LogPaths.CacheLogPath));
+ Obj.AddBool("Write", CacheConfig.Logging.EnableWriteLog);
+ Obj.AddBool("Access", CacheConfig.Logging.EnableAccessLog);
+ }
+ Obj.EndObject();
+ Obj.BeginObject("http");
+ {
+ Obj.AddString("Logfile", PathToUtf8(m_LogPaths.HttpLogPath));
+ }
+ Obj.EndObject();
+ Req.ServerRequest().WriteResponse(HttpResponseCode::OK, Obj.Save());
+ },
+ HttpVerb::kGet);
+
+ m_Router.RegisterRoute(
+ "logs",
+ [this](HttpRouterRequest& Req) {
+ HttpServerRequest& HttpReq = Req.ServerRequest();
+ const HttpServerRequest::QueryParams Params = HttpReq.GetQueryParams();
+ bool SetCacheLogConfig = false;
+ ExtendableStringBuilder<256> StringBuilder;
+ ZenCacheStore::Configuration::LogConfig LoggingConfig = m_CacheStore.GetConfiguration().Logging;
+ if (std::string Param(Params.GetValue("cacheenablewritelog")); Param.empty() == false)
+ {
+ LoggingConfig.EnableWriteLog = StrCaseCompare(Param.c_str(), "true") == 0;
+ SetCacheLogConfig = true;
+ }
+ if (std::string Param(Params.GetValue("cacheenableaccesslog")); Param.empty() == false)
+ {
+ LoggingConfig.EnableAccessLog = StrCaseCompare(Param.c_str(), "true") == 0;
+ SetCacheLogConfig = true;
+ }
+ if (SetCacheLogConfig)
+ {
+ m_CacheStore.SetLoggingConfig(LoggingConfig);
+ StringBuilder.Append(fmt::format("cache write log: {}, cache access log: {}",
+ LoggingConfig.EnableWriteLog ? "true" : "false",
+ LoggingConfig.EnableAccessLog ? "true" : "false"));
+ }
+ if (std::string Param(Params.GetValue("loglevel")); Param.empty() == false)
+ {
+ spdlog::level::level_enum NewLevel = spdlog::level::from_str(Param);
+ spdlog::string_view_t LogLevel = spdlog::level::to_string_view(NewLevel);
+ if (LogLevel != Param)
+ {
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::BadRequest,
+ HttpContentType::kText,
+ fmt::format("Invalid log level '{}'", Param));
+ }
+ spdlog::set_level(NewLevel);
+ if (StringBuilder.Size() > 0)
+ {
+ StringBuilder.Append(", ");
+ }
+ StringBuilder.Append("loglevel: ");
+ StringBuilder.Append(Param);
+ }
+ return Req.ServerRequest().WriteResponse(HttpResponseCode::OK, HttpContentType::kText, StringBuilder.ToView());
+ },
+ HttpVerb::kPost);
}
HttpAdminService::~HttpAdminService()