using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using LitJson; using ProtoCSStruct; using SimpleHttpServer; using Sog; namespace Operation; [MenuMapping(MenuName.SERVER_MANAGER, MenuIcon.SERVER, permission: PermissionCode.SERVER_SERVER_MANAGER, order: 6)] public static class ServerMonitor { public static string cmd = ""; [RequestMapping("服务器数据查询", PermissionCode.SERVER_DATA_SELECT, isMenu: true, toLog: true)] public static int OnHttpServerMonitorReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { TraceLog.Trace("ServerMonitor.OnHttpServerMonitorReq Url{0},param count {1}, httpContextId {2}", request.Url, query.Count, httpContextId); string reamId = query.GetValue("realmlist"); string type = query.GetValue("dbName"); string args = query.GetValue("args"); long objectId = 0; if (type == "GmUid") { if (long.TryParse(args, out long obID)) { objectId = obID; ref var gmUid = ref OperationServerUtils.GetOperationServerData().m_operationWebsite.GmUid; if (gmUid.Contains(obID)) { gmUid.Remove(ref obID); } else { gmUid.Add(obID); } } PlayerPresetOp.UpdateVersion(); return 0; } rsp.IsWaitFor = true; SSOperationMonitorReq req = new SSOperationMonitorReq(); req.Id = httpContextId; req.Type.SetString(type); req.Args.Add(args); req.Args.Add(reamId); if (!String.IsNullOrEmpty(reamId)) { reamId += ",#"; } OperationServerUtils.SendToWorld((int)SSGameMsgID.OperationMonitorReq, ref req, objectId, 0, reamId); return 0; } [RequestMapping("GM指令列表", PermissionCode.GM_COMMAND, isMenu: true)] public static int OnHttpGMCommandReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { return OnHttpServerMonitorReq(httpApiCmd, jsonData, rsp, request, query, httpContextId); } public static void OnServerMonitorMsg(uint id, JsonData payload, HttpResponse rsp, HttpRequest request, HttpQueryParams query, ref SSOperationMonitorRes res) { rsp.IsWaitFor = false; string modelName = query.GetValue("dbName").ToString(); payload["type"] = 0; // 0标准json 显示。1:类Json显示,3:表格显示 payload["code"] = 0; switch (res.Type.ToString()) { case "Activity": case "MatePveData": var jsonStr = res.Result.Get(0).ToString(); jsonStr = JsonUtils.FormatJson(jsonStr); payload["data"] = jsonStr; break; case "Command": var json = res.Result.Get(0).ToString(); payload["data"] = json; jsonStr = JsonUtils.FormatJson(json); break; case "OnlineData": jsonStr = JsonUtils.FormatJson(res.Result.Get(0).ToString()); payload["data"] = jsonStr; break; case "ServerData": jsonStr = JsonUtils.FormatJson(res.Result.Get(0).ToString()); payload["data"] = jsonStr; break; case "GmUid": jsonStr = JsonUtils.FormatJson(res.Result.Get(0).ToString()); payload["data"] = jsonStr; var gmUid = OperationServerUtils.GetOperationServerData().m_operationWebsite.GmUid; var gmUserList = ""; for (int i = 0; i < gmUid.Count; i++) { gmUserList = "," + gmUid[i]; } payload["list"] = string.Join(",", gmUserList); break; } } public static void OnServerMonitorMsg(uint serverId, StructPacket packet) { HttpRequestInfo m_request = null; try { ref var res = ref packet.GetMessage(); var id = res.Id; TraceLog.Debug("ServerMonitor.OnServerMonitorMsg uid {0} ", id); m_request = OperationServer.m_httpService.m_requestList.Find(f => f.Http.id == id); LitJson.JsonData builder = new LitJson.JsonData(); HttpQueryParams queryParams = new HttpQueryParams(m_request.Http.httpRequest.Url); OnServerMonitorMsg(id, builder, m_request.Http.httpResponse, m_request.Http.httpRequest, queryParams, ref res); m_request.Http.httpResponse.ContentAsUTF8 = builder.ToJson(); } catch (Exception ex) { TraceLog.Error("ServerMonitor.OnServerMonitorMsg Error Msg {0}", ex.Message); } finally { if (m_request != null) { m_request.ProcessEnd = true; } } } [RequestMapping("网关数据查询", PermissionCode.GATE_MONITOR, isMenu: true)] public static int OnHttpGateMonitorReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { var name = query.GetValue("gateName").ToString(); JsonData data = new JsonData(); try { foreach (var info in GetInfoList) { var baseName = info.Key; if (!name.Equals("All")) { if (!baseName.Contains(name)) { continue; } } else { if (!baseName.Contains("gate")) { continue; } } JsonData json = new JsonData(); json["name"] = baseName; string tail = ""; var values = info.Value; var lines = values.Split("\n"); for (var i = 0; i < lines.Length; i++) { var value = lines[i]; if (value.Contains("onlinePlayer")) { var onlinePlayer = value.Split("onlinePlayer")[1]; json["onlinePlayer"] = onlinePlayer; continue; } if (value.Contains("SocketSessionMapCount")) { var SocketSessionMapCount = value.Split("SocketSessionMapCount")[1]; json["SocketSessionMapCount"] = SocketSessionMapCount; continue; } tail += "\r\n" + value; } json["tail"] = tail; data[baseName] = json; } jsonData["type"] = 1; jsonData["code"] = 0; jsonData["data"] = data.ToJson(); } catch (Exception ex) { TraceLog.Error("ServerMonitor.OnServerMonitorMsg Error Msg {0}", ex.Message); } return 0; } private static readonly List Exclude = new() { "data", "data_bak", "clihotpatch", "clihotpatch_debug", "sog", "version_md5_cache", }; [RequestMapping("服务器配置查询", PermissionCode.SERVER_CONFIG, isMenu: true)] public static int OnHttpGetServerCfgReq(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { var clusterJson = "cluster.json"; var path = query.GetValue("path"); var subPath = query.GetValue("subPatch"); var fileName = query.GetValue("fileName"); var cfg = "../cfg/"; var subdirectories = Directory.GetDirectories(cfg); var list = new JsonData(); foreach (var subdirectory in subdirectories) { var tar = subdirectory.Replace(cfg, ""); if (Exclude.Contains(tar)) { continue; } list.Add(tar); if (string.IsNullOrEmpty(path)) { path = tar; } } //1级路径 jsonData["paths"] = list; //某个cfg下面得所有路径 if (!string.IsNullOrEmpty(path)) { var fullPath = cfg + path; var subdirectories1 = Directory.GetDirectories(fullPath); var list1 = new JsonData(); foreach (var subdirectory in subdirectories1) { var tar = subdirectory.Replace(fullPath, ""); tar = tar.Replace("\\", ""); tar = tar.Replace("/", ""); list1.Add(tar); if (string.IsNullOrEmpty(subPath)) { subPath = tar; } } list1.Add(clusterJson); jsonData["subPatch"] = list1; if (!string.IsNullOrEmpty(subPath)) { var fullSubPath = fullPath + "/" + subPath; if (subPath.Equals(clusterJson)) { var context = File.ReadAllText(fullSubPath); jsonData["context"] = context; } else { var fileNames = Directory.GetFiles(fullSubPath); var fileList = new JsonData(); foreach (var name in fileNames) { var tar = name.Replace(fullSubPath, ""); tar = tar.Replace("\\", ""); tar = tar.Replace("/", ""); fileList.Add(tar); if (string.IsNullOrEmpty(fileName)) { fileName = tar; } } jsonData["fileList"] = fileList; if (!string.IsNullOrEmpty(fileName)) { var fileFullPath = fullSubPath + "/" + fileName; var context = File.ReadAllText(fileFullPath); jsonData["context"] = context; } } } } return 0; } class GateInfo { public string fileName; public string context; } static Dictionary GetInfoList = new(); [RequestMapping("统计数据查询", PermissionCode.GATE_MONITOR, isMenu: false, toLog = false, Ignored = true)] public static int OnHttpGateInfoPush(string httpApiCmd, JsonData jsonData, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId) { var content = request.Content; var info = JsonConfig.parseLitJson(content); GetInfoList[info.fileName] = info.context; TraceLog.Trace("ServerMonitor.OnHttpGateInfoPush fileName= {0} cont= {1}", info.fileName, GetInfoList.Count); return 0; } }