using System.Collections.Generic; using Sog; namespace SMCenter { public static class CmdProcFactory { private static readonly int StartSeq = 1629962662; private static int m_lastSeqNum; public static Dictionary helpCmdInfo; public static void Init() { m_lastSeqNum = (int)AppTime.ServerAppTime.GetTimeSecond() - StartSeq; helpCmdInfo = new Dictionary(); BaseCmdProc proc = new DontTransAgentCmdProc(); proc.m_explainCmd = string.Format("help [cmd]: 获取指令帮助信息(可查看具体的命令帮助) \n"); proc.m_needCheckValidServerId = false; helpCmdInfo.Add("help", proc); proc = new CommCmdProc(); proc.m_explainCmd = string.Format("start [worldId].[apptype].[instId]: 开启指定游戏服务器进程,*为通配符 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("start", proc); proc = new CommCmdProc(); proc.m_explainCmd = string.Format("stop [worldId].[apptype].[instId]: 停止指定的游戏服务器进程 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("stop", proc); proc = new CommCmdProc(); proc.m_explainCmd = string.Format("kill [worldId].[apptype].[instId]: 停止指定的游戏服务器进程 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("kill", proc); proc = new CommCmdProc(); proc.m_explainCmd = string.Format("check [worldId].[apptype].[instId]: 检查指定的游戏服务器进程运行状态 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("check", proc); proc = new CommCmdProc(); proc.m_explainCmd = string.Format("hotfix [worldId].[apptype].[instId]: 重新加载指定的游戏服务器进程 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("hotfix", proc); proc = new CommCmdProc(); proc.m_explainCmd = string.Format("reloadconfig [worldId].[apptype].[instId]: 重新加载指定的游戏服务器配置文件 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("reloadconfig", proc); proc = new CommCmdProc(); proc.m_explainCmd = string.Format("reloadcluster [worldId].[apptype].[instId]: 重新加载游戏服务cluster管道文件 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("reloadcluster", proc); proc = new CommCmdProc(); proc.m_explainCmd = string.Format("gmcmd [worldId].[apptype].[instId] [attribute] [addnum] -t [uid]: GM管理指令 attribute操作的指令或属性, addnum 增加的数值, uid 玩家ID\n"); proc.m_explainCmd += string.Format("gmcmd [worldId].[apptype].[instId] [attribute] -b [base64编码]: GM管理指令 将[addnum] -t [uid]编码后获得 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("gmcmd", proc); proc = new CommCmdProc(); proc.m_explainCmd = string.Format("list [hostname]: 列出指定主机上的服务器进程,* 通配符列出所有 \n"); proc.m_needCheckValidServerId = false; helpCmdInfo.Add("list", proc); proc = new DontTransAgentCmdProc(); proc.m_explainCmd = string.Format("listhost : 查看所有的主机 \n"); proc.m_needCheckValidServerId = false; helpCmdInfo.Add("listhost", proc); proc = new DontTransAgentCmdProc(); proc.m_explainCmd = string.Format("disable [worldId].[apptype].[instId]: 屏蔽指定的服务器,后期指令对屏蔽的服务器无效 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("disable", proc); proc = new DontTransAgentCmdProc(); proc.m_explainCmd = string.Format("enable [worldId].[apptype].[instId]: 取消屏蔽指定的服务器 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("enable", proc); proc = new DontTransAgentCmdProc(); proc.m_explainCmd = string.Format("enter_agent_shell [HostName]: 进入指定Agent的Shell,* 为所有Agent \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("enter_agent_shell", proc); proc = new FileTransCmdProc(); proc.m_explainCmd = string.Format("push [worldId].[apptype].[instId] -r [src] [dst]: 向指定的服务器传输文件 -r表示递归,支持绝对路径,相对路径以运行时目录为当前目录 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("push", proc); proc = new FileTransCmdProc(); proc.m_explainCmd = string.Format("pushcfg [worldId].[apptype].[instId]: 向指定服务器推送配置指定目录文件 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("pushcfg", proc); proc = new FileTransCmdProc(); proc.m_explainCmd = string.Format("pushbin [worldId].[apptype].[instId]: 向指定服务器推送dll,pdb文件 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("pushbin", proc); proc = new FileTransCmdProc(); proc.m_explainCmd = string.Format("pushagent [worldId].[apptype].[instId]: 向指定服务器推送SMAgent \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("pushagent", proc); proc = new FileTransCmdProc(); proc.m_explainCmd = string.Format("pushsh [worldId].[apptype].[instId]: 向指定服务器推送sh文件 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("pushsh", proc); proc = new FileTransCmdProc(); proc.m_explainCmd = string.Format("cancelpush : 取消所有的文件推送(有文件传输时才有效) \n"); proc.m_needCheckValidServerId = false; helpCmdInfo.Add("cancelpush", proc); proc = new FilePullCmdProc(); proc.m_explainCmd = string.Format("pull [worldId].[apptype].[instId] -r [src] [dst]: 向指定的服务器请求文件 -r表示递归,支持绝对路径,相对路径以运行时目录为当前目录 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("pull", proc); proc = new FilePullCmdProc(); proc.m_explainCmd = string.Format("pullagentlog [worldId].[apptype].[instId]: 获取指定Agent的log \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("pullagentlog", proc); proc = new FilePullCmdProc(); proc.m_explainCmd = string.Format("cancelpull : 取消所有的文件获取(有文件传输时才有效) \n"); proc.m_needCheckValidServerId = false; helpCmdInfo.Add("cancelpull", proc); proc = new UpdateAgentCmdProc(); proc.m_explainCmd = string.Format("updateagent : 更新所有的已经注册的Agent \n"); proc.m_needCheckValidServerId = false; helpCmdInfo.Add("updateagent", proc); proc = new CheckAgentCmdProc(); proc.m_explainCmd = string.Format("checkagent [HostName]: 检测指定的agent dll pdb文件是否一致(*为通配符,检测所有) \n"); proc.m_needCheckValidServerId = false; helpCmdInfo.Add("checkagent", proc); proc = new CheckAgentCmdProc(); proc.m_explainCmd = string.Format("checkpushfile [worldId].[apptype].[instId] : 检测指定的agent push文件是否一致 \n"); proc.m_needCheckValidServerId = false; helpCmdInfo.Add("checkpushfile", proc); proc = new CheckAgentCmdProc(); proc.m_explainCmd = string.Format("checkagentmem [HostName] : 检测指定的agent 的内存情况(尤其时传输文件后) \n"); proc.m_needCheckValidServerId = false; helpCmdInfo.Add("checkagentmem", proc); proc = new ShellCmdProc(); proc.m_explainCmd = string.Format("shell [worldId].[apptype].[instId] [Win or unix CMD]:在指定的服务器上执行shell指令 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("shell", proc); proc = new ShellCmdProc(); proc.m_explainCmd = string.Format("cancelshell [worldId].[apptype].[instId]: 取消指定的服务器上正在执行的shell指令 \n"); proc.m_needCheckValidServerId = true; helpCmdInfo.Add("cancelshell", proc); } public static CmdInfo GetCmdInfo(string command) { string[] split = command.Split(' '); if (split == null || split.Length < 1) { TraceLog.Error("CmdProcFactory.GetCmdInfo invalid CMD {0}", command); return null; } string cmd = split[0].Trim().ToLower(); if (string.IsNullOrEmpty(cmd)) { TraceLog.Error("CmdProcFactory.GetCmdInfo CMD is null"); return null; } var newCmd = new CmdInfo { SeqNum = ++m_lastSeqNum, ConsoleInput = command, CMD = cmd, CreateTime = SMCenterUtils.GetTimeSecond(), }; for (int i = 1; i < split.Length; i++) { newCmd.CmdParams.Add(split[i]); } //防止异常 if (split.Length == 1) { newCmd.CmdParams.Add(""); } return newCmd; } public static BaseCmdProc GetCmdProc(CmdInfo cmdInfo) { if (cmdInfo == null) { return null; } string lowerCmd = cmdInfo.CMD; if(helpCmdInfo.ContainsKey(lowerCmd)) { //以防万一,还是加上个清理数据的 helpCmdInfo[lowerCmd].ClearData(); helpCmdInfo[lowerCmd].InitCmd(cmdInfo); return helpCmdInfo[lowerCmd]; } return null; } } }