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
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;
|
|
}
|
|
}
|