public override void Initialize(GameServer server) { base.Initialize(server); _guardTask = GuardTask.Unknown; _server.Connected += new ConnectedEventHandler(this.Connected); _server.Disconnected += new DisconnectedEventHandler(this.Disconnected); _server.MessageReceived += new MessageReceivedEventHandler(this.MessageReceived); _server.Tick += new TickEventHandler(this.Tick); }
private void Connected(GameServer server) { KProtocolHead protocol = new KProtocolHead(); protocol.ProtocolId = (ushort)ProtocolDef.e2g_GetGuardDir_def; server.SendMessage(protocol); _guardTask = GuardTask.Idle; _GameProcessState = GameProcessState.Unknown; switch (server.ConfigState) { case GameServer.ConfigGuardState.Configuring: SwitchGuardMode(); //2008-3 huangbiao 只有在传输完配置文件后才更换状态 //server.ConfigState = GameServer.ConfigGuardState.WaitResponse; //SetServerTime(0, DateTime.Now, GetLinuxZoneInfoFile()); break; case GameServer.ConfigGuardState.None: SwitchGuardMode(); server.ConfigState = GameServer.ConfigGuardState.WaitResponse; //SetServerTime(0, DateTime.Now, GetLinuxZoneInfoFile()); break; case GameServer.ConfigGuardState.WaitResponse: SwitchGuardMode(); break; case GameServer.ConfigGuardState.Configured: //得到服务器时间 ////2008-3 huangbiao ////GetServerTime(1); 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)); }
/// <summary> /// 执行系统命令 /// </summary> bool ExecuteSystemCommand(int userId, string cmd, string input, GuardTask newTask, bool bNeedResult) { return(ExecuteSystemCommand(userId, cmd, input, newTask, null, false, bNeedResult)); }
private void Disconnected(GameServer server) { _guardTask = GuardTask.Unknown; _GameProcessState = GameProcessState.Unknown; }
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> 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; }
/// <summary> /// 执行系统命令 /// </summary> bool ExecuteSystemCommand(int userId, string cmd, string input, GuardTask newTask, bool bNeedResult) { return ExecuteSystemCommand(userId, cmd, input, newTask, null, 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; } }