You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

330 lines
11 KiB

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<SSOperationMonitorRes>();
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<string> 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<string, string> 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<GateInfo>(content);
GetInfoList[info.fileName] = info.context;
TraceLog.Trace("ServerMonitor.OnHttpGateInfoPush fileName= {0} cont= {1}", info.fileName, GetInfoList.Count);
return 0;
}
}