/// <summary> /// 执行系统命令(不记录日志) /// </summary> /// <param name="cmd">命令</param> /// <param name="input">输入</param> /// <param name="newTask">任务</param> bool ExecuteSystemCommand(int userId, string cmd, string input, GuardTask newTask, ExeSysCmdComplete exeSysCmdComplete, bool bNeedResult) { return(ExecuteSystemCommand(userId, cmd, input, newTask, exeSysCmdComplete, false, bNeedResult)); }
/// <summary> /// 执行系统命令 /// </summary> /// <param name="cmd">命令</param> /// <param name="input">输入</param> /// <param name="newTask">任务</param> /// <param name="needLog">是否需要记录日志</param> /// <param name="bNeedResult">是否需要反馈结果</param> bool ExecuteSystemCommand(int userId, string cmd, string input, GuardTask newTask, ExeSysCmdComplete exeSysCmdComplete, bool needLog, bool bNeedResult) { if (cmd == null) { throw new ArgumentNullException("cmd"); } if (input == null) { input = string.Empty; } bool result = false; //TODO: if (_server.IsConnected && _guardTask == GuardTask.Idle) if (_server.IsConnected) { IProtocol realProtocol = null; if (cmd.Length >= 1024) { e2g_exesyscmd_large protocol = new e2g_exesyscmd_large(); protocol.Command = cmd; protocol.InputBuff = input; protocol.bNeedOutput = Convert.ToUInt16(bNeedResult); realProtocol = protocol; } else { e2g_exesyscmd protocol = new e2g_exesyscmd(); protocol.Command = cmd; protocol.InputBuff = input; protocol.bNeedOutput = Convert.ToUInt16(bNeedResult); realProtocol = protocol; } if (_server.SendMessage(realProtocol)) { _lastSystemCommand = cmd; _lastSystemCommandInput = input; _sysCmdOutput.Length = 0; _exeSysCmdComplete = exeSysCmdComplete; _guardTask = newTask; result = true; } } if (needLog) { User user = AdminServer.TheInstance.SecurityManager.GetUser(userId); Security.LogSystem.TheInstance.WriteLog( userId, Security.OpType.EXECUTE, _server.Id, string.Format(StringDef.LogMessageExecuteSystemCommand, user == null ? userId.ToString() : user.UserName, _server.Name, cmd, result ? StringDef.Success : StringDef.Fail) ); } return(result); }
public override bool DoAction(int userId, string actionKey, ref object outArg, params object[] args) { switch (actionKey) { case ActionKeyExeSysCmd: //if (args.Length >= 4) _exeSysCmdAutomation = args[3] as ExeSysCmdAutomation; ExeSysCmdComplete exeSysCmdComplete = null; if (args.Length == 4) { exeSysCmdComplete = args[3] as ExeSysCmdComplete; } return(ExecuteSystemCommand(userId, args[0] as string, args[1] as string, (GuardTask)args[2], exeSysCmdComplete, true)); case ActionKeyStartGame: return(StartGame(userId)); case ActionKeyStopGame: return(StopGame(userId)); case ActionKeyUpdateGame: return(UpdateGame(userId, args[0] as string)); case ActionKeyCheckGame: return(CheckGame(userId)); case ActionKeyGetStackTrace: return(GetStackStrace(userId)); case ActionKeyRefreshUploadDir: return(RefreshUploadDir(userId, args[0] as string)); case ActionKeyDeleteUploadDirFile: return(DeleteUploadDirFile(userId, args[0] as string)); case ActionKeyRenemeUploadDirFile: return(RenemeUploadDirFile(userId, args[0] as string, args[1] as string)); case ActionKeyUpdateGuard: return(UpdateGuard(userId)); case ActionKeyBackupDb: return(BackupDb(userId, (int)args[0])); case ActionKeyRollbackDb: return(RollbackDb(userId, (string)args[0])); case ActionKeyRestartDb: return(RestartDb(userId)); case ActionKeyRestartServer: return(RestartServer(userId)); case ActionKeyReconfigureGuard: return(ReconfigreGuard(userId)); case ActionKeySetServerTime: return(SetServerTime(userId, (DateTime)args[0], (string)args[1])); ////2008-3 huangbiao ////case ActionKeyGetServerTime: //// return GetServerTime(userId); } throw new Exception(string.Format("ActionKey {0} does not exist.", actionKey)); }
private void MessageReceived(GameServer server, IProtocol message) { switch ((ProtocolDef)message.ProtocolId) { case ProtocolDef.g2e_exesyscmd_def: { g2e_exesyscmd protocol = message as g2e_exesyscmd; FSEyeResult returnCode = (FSEyeResult)protocol.ReturnCode; switch (_guardTask) { case GuardTask.Unknown: case GuardTask.Idle: //设置时间服务器断连后的回包处理 //if (returnCode == FSEyeResult.g2e_ExeSysCmd_done) break; //throw new Exception("State Exception"); case GuardTask.StartGameServer: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: AppendSysCmdOutput(protocol.OutputBuff); break; } break; case GuardTask.DoNormalSysCmd: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: AppendSysCmdOutput(protocol.OutputBuff); break; } break; case GuardTask.UpdateGameServer: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: { _guardTask = GuardTask.Idle; if (_updateGameResult.ToString().Contains("fail")) { server.AppendMessage(string.Format("UpdateGameFail\nFailureMessage:\"{0}\"", _updateGameResult.ToString()), GameServer.MessageInfo.Type.Failure); //触发UpdateGameFail事件 AutomationContext context = new AutomationContext(); context.Message = string.Format("{0} UpdateGameFail\nFailureMessage:\"{1}\"", server.ToString(), _updateGameResult.ToString());; context.Server = server; AdminServer.TheInstance.StrategyManager.OnEvent(FSEyeEvent.UpdateGameFail, context); } else { server.AppendMessage("UpdateGameSucceed", GameServer.MessageInfo.Type.Success); //触发UpdateGameSucceed事件 AutomationContext context = new AutomationContext(); context.Message = string.Format("{0} UpdateGameSucceed", server.ToString()); context.Server = server; AdminServer.TheInstance.StrategyManager.OnEvent(FSEyeEvent.UpdateGameSucceed, context); } } break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: _updateGameResult.Append(protocol.OutputBuff); break; } break; case GuardTask.RefreshUploadDirFileInfo: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: _uploadDirInfo += protocol.OutputBuff; break; } break; case GuardTask.CheckGame: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; _GameProcessState = (protocol.OutputBuff.Length > 0) ? GameProcessState.Exist : GameProcessState.NotExist; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: break; } break; case GuardTask.GetStatckStrace: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; _getStackTraceState = GetStackTraceState.Done; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: _stackTrace.Append(protocol.OutputBuff); break; } break; ////2008-03 huangbiao 去掉getTime任务 case GuardTask.GetServerTime: //// switch (returnCode) //// { //// case FSEyeResult.g2e_ExeSysCmd_done: //// _guardTask = GuardTask.Idle; //// break; //// case FSEyeResult.g2e_ExeSysCmd_busy: //// GetServerTime(1); //// break; //// case FSEyeResult.g2e_ExeSysCmd_result: //// try //// { //// string dateText = protocol.OutputBuff.TrimEnd('\n').Replace('_', ' '); //// _serverTimeSpan = DateTime.Now.Subtract(DateTime.Parse(dateText)); //// } //// catch (Exception ex) //// { //// throw (ex); //// } //// break; //// } break; default: throw new Exception("State Exception"); } switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: if (_exeSysCmdComplete != null) { _exeSysCmdComplete(_server, true, _sysCmdOutput.ToString()); _exeSysCmdComplete = null; } break; case FSEyeResult.g2e_ExeSysCmd_busy: if (_exeSysCmdComplete != null) { _exeSysCmdComplete(_server, false, "busy"); _exeSysCmdComplete = null; } break; case FSEyeResult.g2e_ExeSysCmd_result: break; } } break; case ProtocolDef.g2e_GetGuardDir_def: { g2e_GetGuardDir protocol = message as g2e_GetGuardDir; server.GuardDir = protocol.GuardDir; } break; case ProtocolDef.g2e_switchmode_def: { server.AppendMessage(StringDef.StopConfigGuard, GameServer.MessageInfo.Type.Normal); AdminServer.TheInstance.GameServerManager.SendServerConfigFile(server); foreach (GameServer svr in AdminServer.TheInstance.GameServerManager._gameServerList) { if (svr.IpAddress == server.IpAddress) { svr.ConfigState = GameServer.ConfigGuardState.Configured; AdminServer.TheInstance.GameServerManager.ModifyGameServer(svr, svr.Name, svr.Comment, svr.IpAddress, svr.GameDir, svr.Group, svr.LordConfig, svr.ConfigState, svr.ConfigContent, svr.Type, svr.FtpServer); } } } break; case ProtocolDef.g2e_config_def: { //TODO 提示重新配置Guard成功 UpdateGuard(0); } break; default: break; } }
/// <summary> /// 执行系统命令 /// </summary> /// <param name="cmd">命令</param> /// <param name="input">输入</param> /// <param name="newTask">任务</param> /// <param name="needLog">是否需要记录日志</param> /// <param name="bNeedResult">是否需要反馈结果</param> bool ExecuteSystemCommand(int userId,string cmd, string input, GuardTask newTask, ExeSysCmdComplete exeSysCmdComplete, bool needLog, bool bNeedResult) { if (cmd == null) throw new ArgumentNullException("cmd"); if (input == null) input = string.Empty; bool result = false; //TODO: if (_server.IsConnected && _guardTask == GuardTask.Idle) if (_server.IsConnected) { IProtocol realProtocol = null; if (cmd.Length >= 1024) { e2g_exesyscmd_large protocol = new e2g_exesyscmd_large(); protocol.Command = cmd; protocol.InputBuff = input; protocol.bNeedOutput = Convert.ToUInt16(bNeedResult); realProtocol = protocol; } else { e2g_exesyscmd protocol = new e2g_exesyscmd(); protocol.Command = cmd; protocol.InputBuff = input; protocol.bNeedOutput = Convert.ToUInt16(bNeedResult); realProtocol = protocol; } if (_server.SendMessage(realProtocol)) { _lastSystemCommand = cmd; _lastSystemCommandInput = input; _sysCmdOutput.Length = 0; _exeSysCmdComplete = exeSysCmdComplete; _guardTask = newTask; result = true; } } if (needLog) { User user = AdminServer.TheInstance.SecurityManager.GetUser(userId); Security.LogSystem.TheInstance.WriteLog( userId, Security.OpType.EXECUTE, _server.Id, string.Format(StringDef.LogMessageExecuteSystemCommand, user == null ? userId.ToString() : user.UserName, _server.Name, cmd, result ? StringDef.Success : StringDef.Fail) ); } return result; }
/// <summary> /// 执行系统命令(不记录日志) /// </summary> /// <param name="cmd">命令</param> /// <param name="input">输入</param> /// <param name="newTask">任务</param> bool ExecuteSystemCommand(int userId, string cmd, string input, GuardTask newTask, ExeSysCmdComplete exeSysCmdComplete, bool bNeedResult) { return ExecuteSystemCommand(userId, cmd, input, newTask, exeSysCmdComplete, false, bNeedResult); }
private void MessageReceived(GameServer server, IProtocol message) { switch ((ProtocolDef)message.ProtocolId) { case ProtocolDef.g2e_exesyscmd_def: { g2e_exesyscmd protocol = message as g2e_exesyscmd; FSEyeResult returnCode = (FSEyeResult)protocol.ReturnCode; switch (_guardTask) { case GuardTask.Unknown: case GuardTask.Idle: //设置时间服务器断连后的回包处理 //if (returnCode == FSEyeResult.g2e_ExeSysCmd_done) break; //throw new Exception("State Exception"); case GuardTask.StartGameServer: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: AppendSysCmdOutput(protocol.OutputBuff); break; } break; case GuardTask.DoNormalSysCmd: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: AppendSysCmdOutput(protocol.OutputBuff); break; } break; case GuardTask.UpdateGameServer: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: { _guardTask = GuardTask.Idle; if (_updateGameResult.ToString().Contains("fail")) { server.AppendMessage(string.Format("UpdateGameFail\nFailureMessage:\"{0}\"", _updateGameResult.ToString()), GameServer.MessageInfo.Type.Failure); //触发UpdateGameFail事件 AutomationContext context = new AutomationContext(); context.Message = string.Format("{0} UpdateGameFail\nFailureMessage:\"{1}\"", server.ToString(), _updateGameResult.ToString()); ; context.Server = server; AdminServer.TheInstance.StrategyManager.OnEvent(FSEyeEvent.UpdateGameFail, context); } else { server.AppendMessage("UpdateGameSucceed", GameServer.MessageInfo.Type.Success); //触发UpdateGameSucceed事件 AutomationContext context = new AutomationContext(); context.Message = string.Format("{0} UpdateGameSucceed", server.ToString()); context.Server = server; AdminServer.TheInstance.StrategyManager.OnEvent(FSEyeEvent.UpdateGameSucceed, context); } } break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: _updateGameResult.Append(protocol.OutputBuff); break; } break; case GuardTask.RefreshUploadDirFileInfo: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: _uploadDirInfo += protocol.OutputBuff; break; } break; case GuardTask.CheckGame: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; _GameProcessState = (protocol.OutputBuff.Length > 0) ? GameProcessState.Exist : GameProcessState.NotExist; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: break; } break; case GuardTask.GetStatckStrace: switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: _guardTask = GuardTask.Idle; _getStackTraceState = GetStackTraceState.Done; break; case FSEyeResult.g2e_ExeSysCmd_busy: break; case FSEyeResult.g2e_ExeSysCmd_result: _stackTrace.Append(protocol.OutputBuff); break; } break; ////2008-03 huangbiao 去掉getTime任务 case GuardTask.GetServerTime: //// switch (returnCode) //// { //// case FSEyeResult.g2e_ExeSysCmd_done: //// _guardTask = GuardTask.Idle; //// break; //// case FSEyeResult.g2e_ExeSysCmd_busy: //// GetServerTime(1); //// break; //// case FSEyeResult.g2e_ExeSysCmd_result: //// try //// { //// string dateText = protocol.OutputBuff.TrimEnd('\n').Replace('_', ' '); //// _serverTimeSpan = DateTime.Now.Subtract(DateTime.Parse(dateText)); //// } //// catch (Exception ex) //// { //// throw (ex); //// } //// break; //// } break; default: throw new Exception("State Exception"); } switch (returnCode) { case FSEyeResult.g2e_ExeSysCmd_done: if (_exeSysCmdComplete != null) { _exeSysCmdComplete(_server, true, _sysCmdOutput.ToString()); _exeSysCmdComplete = null; } break; case FSEyeResult.g2e_ExeSysCmd_busy: if (_exeSysCmdComplete != null) { _exeSysCmdComplete(_server, false, "busy"); _exeSysCmdComplete = null; } break; case FSEyeResult.g2e_ExeSysCmd_result: break; } } break; case ProtocolDef.g2e_GetGuardDir_def: { g2e_GetGuardDir protocol = message as g2e_GetGuardDir; server.GuardDir = protocol.GuardDir; } break; case ProtocolDef.g2e_switchmode_def: { server.AppendMessage(StringDef.StopConfigGuard, GameServer.MessageInfo.Type.Normal); AdminServer.TheInstance.GameServerManager.SendServerConfigFile(server); foreach (GameServer svr in AdminServer.TheInstance.GameServerManager._gameServerList) { if (svr.IpAddress == server.IpAddress) { svr.ConfigState = GameServer.ConfigGuardState.Configured; AdminServer.TheInstance.GameServerManager.ModifyGameServer(svr, svr.Name, svr.Comment, svr.IpAddress, svr.GameDir, svr.Group, svr.LordConfig, svr.ConfigState, svr.ConfigContent, svr.Type, svr.FtpServer); } } } break; case ProtocolDef.g2e_config_def: { //TODO 提示重新配置Guard成功 UpdateGuard(0); } break; default: break; } }