示例#1
0
        /// <summary>
        /// Sends a packet and retrieves the response
        /// </summary>
        /// <param name="packet"></param>
        public void SendPacket(RconPacket packet)
        {
            try
            {
                Logger.Log(LogLevel.Verbose, "Sending command: '{0}'", packet.Command);
                Send(packet.Command);
            }
            catch (Exception e)
            {
                Logger.Log(running ? LogLevel.Warning : LogLevel.Verbose, "SendPacket failed. ({0})", e.ToString());
                return;
            }

            lastMessage = null;
            DateTime start = DateTime.Now;

            while (lastMessage == null)
            {
                if ((DateTime.Now - start).TotalMilliseconds < PacketTimeout)
                {
                    Thread.Sleep(SLEEP);
                }
                else
                {
                    Logger.Log(running ? LogLevel.Warning : LogLevel.Verbose, "Rcon packet timeout. (running {0})", packet.Command);
                    return;
                }
            }

            packet.HandleResponse(lastMessage);
            lastMessage = null;
        }
示例#2
0
        /// <summary>
        /// Sends a command to the server and retrieves the response
        /// </summary>
        /// <param name="command"></param>
        /// <param name="p"></param>
        /// <returns></returns>
        public string SendCommand(string command, params string[] p)
        {
            RconPacket packet = new RconPacket(command + " " + string.Join(" ", p));

            SendPacket(packet);
            return(packet.Response);
        }
        public void TestThatFactoryMethodAndGetBytesFunctionCorrectly(int commandType, string command)
        {
            // Arrange
            int commandId = GetRandomInt();

            _mockCommand.Setup(s => s.CommandType).Returns(commandType);
            _mockCommand.Setup(s => s.Text).Returns(command);

            // Act
            var packet1 = RconPacket.From(commandId, _mockCommand.Object);

            using var writer = new BinaryWriter(stream);

            writer.Write(packet1.GetBytes());
            writer.Flush();

            stream.Seek(0, SeekOrigin.Begin);

            using var reader = new BinaryReader(stream);

            var packet2 = RconPacket.From(reader);

            // Assert
            Assert.That(packet1.Size == packet2.Size &&
                        packet1.CommandId == packet2.CommandId &&
                        packet1.PacketType == packet2.PacketType &&
                        packet1.Body == packet2.Body);
        }
示例#4
0
        public void BuildPacketWithoutType()
        {
            // Arrange
            var packet = new RconPacket(null, "password");

            // Act
            var buffer = packet.GetBytes();
        }
示例#5
0
 public FakeChannel()
 {
     responsesMap = new Dictionary <PacketType, byte[]>
     {
         { PacketType.ExecCommand, RconPacket.Create(PacketType.Response, "Command executed").ToBytes() },
         { PacketType.Auth, RconPacket.Create(PacketType.AuthResponse, "").ToBytes() }
     };
 }
示例#6
0
        /// <summary>
        /// Sends a packet and retrieves the response
        /// </summary>
        /// <param name="packet"></param>
        public void SendPacket(RconPacket packet)
        {
            string lastMessageTemp;

            lock (rxLock)
            {
                lastMessage = null;
            }

            try
            {
                Logger.Log(LogLevel.Verbose, "Sending command: '{0}'", packet.Command);
                Send(packet.Command);
            }
            catch (Exception e)
            {
                Logger.Log(running ? LogLevel.Warning : LogLevel.Verbose, "SendPacket failed. ({0})", e.ToString());
                return;
            }

            DateTime start = DateTime.Now;

            do
            {
                if ((DateTime.Now - start).TotalMilliseconds < PacketTimeout)
                {
                    Thread.Sleep(SLEEP);
                }
                else
                {
                    Logger.Log(LogLevel.Warning, "Rcon packet timeout. (running {0})", packet.Command);
                    return;
                }

                lock (rxLock)
                {
                    lastMessageTemp = lastMessage;
                }
            } while (lastMessageTemp == null);

            if (lastMessageTemp == STATUS_MESSAGE_SERVER_IS_BUSY)
            {
                Logger.Log(LogLevel.Verbose, "Server is busy - dropping rcon packet");
            }
            else
            {
                packet.HandleResponse(lastMessageTemp);
            }

            lock (rxLock)
            {
                lastMessage = null;
            }
        }
示例#7
0
        public void RconPacketTest()
        {
            RconPacket packet = new RconPacket(PacketType.ServerdataExeccommand, "Body");

            Assert.IsTrue(packet.Id >= 0);
            Assert.AreEqual(PacketType.ServerdataExeccommand, packet.Type);
            Assert.AreEqual("Body", packet.Body);
            Assert.AreEqual("Body".Length + 10, packet.Size);
            Assert.AreEqual(packet.Size + 4, ((byte[])packet).Length);

            //Assert.AreSame(new byte[] { 14, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 66, 111, 100, 121, 0, 0 }, (byte[])packet);
        }
        public void TestThatCommandTerminatorFactoryCreatesEmptyPacket()
        {
            // Arrange
            int commandId = GetRandomInt();

            // Act
            var terminator = RconPacket.CommandTerminator(commandId);

            // Assert
            Assert.That(terminator.Body == string.Empty);
            Assert.That(terminator.Size == 10);
        }
示例#9
0
        public async Task SendValidCommand()
        {
            // Arrange
            byte[] fakeResponse = new RconPacket(PacketType.ResponseValue, "command response").GetBytes();
            var    messenger    = SetupMessenger(fakeResponse, true);

            // Act
            var response = await messenger.ExecuteCommandAsync("command");

            // Assert
            Assert.AreEqual("command response", response);
        }
示例#10
0
        public void BuildPacketFromBytes()
        {
            // Arrange
            var originalPacket = new RconPacket(PacketType.Auth, "password");

            // Act
            var buffer       = originalPacket.GetBytes();
            var parsedPacket = RconPacket.FromBytes(buffer);

            // Assert
            Assert.IsTrue(parsedPacket.Body.Equals(originalPacket.Body));
            Assert.IsTrue(parsedPacket.Id.Equals(originalPacket.Id));
        }
示例#11
0
        public void BuildPacketWithEmptyContent()
        {
            // Arrange
            var packet = new RconPacket(PacketType.Auth, string.Empty);

            // Act
            var buffer = packet.GetBytes();

            // Asert
            Assert.IsNotNull(buffer);
            Assert.IsTrue(buffer.Length == 14);              // 14 fixed bytes
            Assert.IsTrue(buffer[buffer.Length - 1] == 0x00 && buffer[buffer.Length - 2] == 0x00);
        }
示例#12
0
        public void SendReceiveTest()
        {
            RconBase client = new RconBase();

            client.Connect(Host, Port);
            client.Authenticate(Password);
            RconPacket request  = new RconPacket(PacketType.ServerdataExeccommand, new Rcon.Commands.ListPlayers().ToString());
            RconPacket response = client.SendReceive(request);

            Assert.IsInstanceOfType(response, typeof(RconPacket));
            Assert.AreEqual(request.Id, response.Id);
            client.Disconnect();
        }
示例#13
0
        public void BuildPacket()
        {
            // Arrange
            var packet = new RconPacket(PacketType.Auth, "password");

            // Act
            var buffer = packet.GetBytes();

            // Asert
            Assert.IsNotNull(buffer);
            Assert.IsTrue(buffer.Length == 22);              // 14 fixed bytes + 8 bytes for "password" string encoding
            Assert.IsTrue(buffer[0] == 0x12);
            Assert.IsTrue(buffer[buffer.Length - 1] == 0x00 && buffer[buffer.Length - 2] == 0x00);
        }
示例#14
0
        public void TestThatRconPacketIsConstructedProperlyWithFactoryMethod(int commandType, string command)
        {
            // Arrange
            int commandId = GetRandomInt();

            _mockCommand.Setup(s => s.CommandType).Returns(commandType);
            _mockCommand.Setup(s => s.Text).Returns(command);

            // Act
            var packet = RconPacket.From(commandId, _mockCommand.Object);

            // Assert
            Assert.That(packet.Size == 10 + Encoding.UTF8.GetByteCount(command));
            Assert.That(packet.CommandId == commandId);
            Assert.That(packet.PacketType == commandType);
            Assert.That(packet.Body == command);
        }
示例#15
0
 private void HandleAuthentication(RconPacket rconPacket)
 {
     if (rconPacket.data["password"] == GameSettings.RconPassword)
     {
         authenticated = true;
         SendLogHistory();
     }
     else
     {
         Logging.Log("Rcon password was incorrect");
         SendPacket(RconPacketType.Error, new Dictionary <string, string>()
         {
             { "errorMessage", "Password incorrect :(" }
         });
         localSocket.Close();
     }
 }
示例#16
0
        public void ConvertRconPacketToBytesShouldReturnValidRCONBuffer()
        {
            // Arrange
            ProgressiveId.Seed(1);
            var content      = "test";
            var packetType   = PacketType.Auth;
            var bufferLength = 18;
            var packetLength = 14;
            var packet       = RconPacket.Create(packetType, content);

            // Act
            var buffer = packet.ToBytes();

            // Asert
            Assert.NotNull(buffer);
            Assert.Equal(bufferLength, buffer.Length);              // 12 headers bytes + 8 bytes for "password" string encoding + 1 ending
            Assert.Equal(packetLength, BitConverter.ToInt32(buffer[0..4]));
示例#17
0
        private void HandleHandshake(RconPacket rconPacket)
        {
            Logging.Log("Received handshake from client.");
            if (string.IsNullOrEmpty(GameSettings.RconPassword))
            {
                Logging.Log("Rcon authentication is disabled! Please enter a password in GameSettings if this is incorrect", Logging.Severity.Medium);

                if (localSocket.ConnectionInfo.ClientIpAddress == "127.0.0.1")
                {
                    authenticated = true;
                }
                else
                {
                    Logging.Log("Unauthorized rcon connection attempt from non-local machine was blocked; set a password", Logging.Severity.Medium);
                    return;
                }
            }
        }
示例#18
0
 public static void ShutdownServer(ArkServerInfo Server)
 {
     try
     {
         RconBase client = new RconBase();
         client.Connect(Server.IPAddress, Int32.Parse(Server.RCONPort));
         if (client.Connected)
         {
             client.Authenticate(Server.ServerPassword);
             RconPacket request  = new RconPacket(PacketType.ServerdataExeccommand, new Rcon.Commands.DoExit().ToString());
             RconPacket response = client.SendReceive(request);
             Console.WriteLine(response?.Body.Trim());
             Methods.Log(Server, response?.Body.Trim());
         }
         client.Disconnect();
     }
     catch (Exception ex)
     {
         //Console.WriteLine(DateTime.Now + ": Exception occured when trying to send a Ark Server Shutdown Command. Exception: " + ex.Message);
         Methods.Log(Server, DateTime.Now + ": Exception occured when trying to send a Ark Server Shutdown Command. Exception: " + ex.Message);
     }
 }
示例#19
0
        public static bool WorldSave(ArkServerInfo Server)
        {
            RconBase client = new RconBase();

            client.Connect(Server.IPAddress, Int32.Parse(Server.RCONPort));
            if (client.Connected)
            {
                client.Authenticate(Server.ServerPassword);
                RconPacket request        = new RconPacket(PacketType.ServerdataExeccommand, new Rcon.Commands.SaveWorld().ToString());
                RconPacket response       = client.SendReceive(request);
                string     stringResponse = response?.Body.Trim();
                if (stringResponse.Contains("World Saved"))
                {
                    Console.WriteLine(DateTime.Now + ": Server " + Server.Name + "- World Saved!");
                    Methods.Log(Server, DateTime.Now + ": Server " + Server.Name + "- World Saved!");
                    client.Disconnect();
                    return(true);
                }
            }
            client.Disconnect();
            return(false);
        }
示例#20
0
        public static void GlobalNotification(ArkServerInfo Server, string message)
        {
            try
            {
                RconBase client = new RconBase();
                client.Connect(Server.IPAddress, Int32.Parse(Server.RCONPort));
                if (client.Connected)
                {
                    client.Authenticate(Server.ServerPassword);
                    RconPacket request  = new RconPacket(PacketType.ServerdataExeccommand, new Rcon.Commands.Broadcast(message).ToString());
                    RconPacket response = client.SendReceive(request);
                    //Console.WriteLine(DateTime.Now + ": Broadcast sent to " + Server.Name + " Server Message: " + message);
                    Methods.Log(Server, DateTime.Now + ": Broadcast sent to " + Server.Name + " Server Message: " + message);
                }

                client.Disconnect();
            }
            catch (Exception ex)
            {
                //Console.WriteLine(DateTime.Now + ": Exception occured when trying to send an Ark Server Global Notification. Exception: " + ex.Message);
                Methods.Log(Server, DateTime.Now + ": Exception occured when trying to send an Ark Server Global Notification. Exception: " + ex.Message);
            }
        }
示例#21
0
        public Task SendAsync(ReadOnlyMemory <byte> payload)
        {
            var request = RconPacket.FromBytes(payload.ToArray());

            switch (request.Type)
            {
            case PacketType.Auth:
                pendingResponses.Add(RconPacket.Create(PacketType.Response, "").ToBytes());
                pendingResponses.Add(RconPacket.Create(request.Body.Equals("valid") ? request.Id : -1, PacketType.AuthResponse, "").ToBytes());
                break;

            case PacketType.ExecCommand:
                pendingResponses.Add(RconPacket.Create(PacketType.Response, "This will be a ve").ToBytes());
                pendingResponses.Add(RconPacket.Create(PacketType.Response, "ry long message").ToBytes());
                break;

            case PacketType.Response:
                pendingResponses.Add(RconPacket.Create(0, PacketType.Response, "").ToBytes());
                pendingResponses.Add(RconPacket.Create(0, PacketType.Response, "\u0001").ToBytes());
                break;
            }
            return(Task.CompletedTask);
        }
示例#22
0
文件: Rcon.cs 项目: astory/MCAdmin
        void RecvThread()
        {
            while (sock.Connected)
            {
                try
                {
                    RconPacket recvd = new RconPacket(this);
                    if (recvd.type == RconPacketType.SERVERDATA_AUTH)
                    {
                        if (recvd.string1 == rcon.password)
                        {
                            new RconPacket(this, RconPacketType.SERVERDATA_AUTH_RESPONSE, recvd.request_id, "", "").Send();
                            authed = true;
                        }
                        else
                        {
                            new RconPacket(this, RconPacketType.SERVERDATA_AUTH_RESPONSE, -1, "", "").Send();
                        }
                    }
                    else if (recvd.type == RconPacketType.SERVERDATA_EXECCOMMAND)
                    {
                        if (authed)
                        {
                            string response = "Unknown command or error!";
                            string cmd; string param;
                            string str = recvd.string1.Trim();
                            int splitter = str.IndexOf(' ');
                            if (splitter < 0)
                            {
                                cmd = str.ToLower();
                                param = "";
                            }
                            else
                            {
                                cmd = str.Remove(splitter).Trim().ToLower();
                                param = str.Substring(splitter + 1).Trim();
                            }
                            try
                            {
                                switch (cmd)
                                {
                                    case "help":
                                        response = "Commands: exec, stop, start, restart, kill, save, backup, status";
                                        break;
                                    case "exec":
                                        Program.SendServerCommand(param);
                                        response = "Ran command \"" + param + "\" on the server!";
                                        break;
                                    case "stop":
                                        Program.StopServer();
                                        response = "Server stopped!";
                                        break;
                                    case "start":
                                        Program.StartServer();
                                        response = "Server started!";
                                        break;
                                    case "restart":
                                        Program.StopServer();
                                        Program.StartServer();
                                        response = "Server restarted!";
                                        break;
                                    case "kill":
                                        Program.KillServer();
                                        response = "Server KILL'd!";
                                        break;
                                    case "save":
                                        Program.tmAutosave_Tick(null);
                                        response = "Save initiated!";
                                        break;
                                    case "status":
                                        //response = Program.serverStatus;
                                        break;
                                    case "say":
                                        Program.SendServerMessage("RCon: " + param, '2');
                                        Program.SendLogMsg("\"Console<9999><Console><RCon>\" say \"" + param + "\"");
                                        break;

                                    case "logaddress_add":
                                        IPEndPoint ipep = __TryGetIp(param);
                                        if (!Program.logToAddr.Contains(ipep)) Program.logToAddr.Add(ipep);
                                        response = "Added " + param + " to log broadcast!";

                                        Program.SendLogMsg("rcon from \"" + ip + "\": command \"logaddress_add \"" + param + "\"\"\n");
                                        break;
                                    case "logaddress_del":
                                        IPEndPoint ipep2 = __TryGetIp(param);
                                        if (Program.logToAddr.Contains(ipep2)) Program.logToAddr.Remove(ipep2);
                                        response = "Removed " + param + " from log broadcast!";

                                        Program.SendLogMsg("rcon from \"" + ip + "\": command \"logaddress_del \"" + param + "\"\"\n");
                                        break;
                                    case "logaddress_list":
                                        response = "Log broadcast list:\n";
                                        foreach (IPEndPoint ipep3 in Program.logToAddr)
                                        {
                                            response += ipep3.ToString() + "\n";
                                        }
                                        break;
                                    case "logaddress_delall":
                                        Program.logToAddr.Clear();
                                        response = "Removed ALL IPs from log broadcast!";
                                        break;
                                    case "log":
                                        response = "Usage:  log < on | off >\ncurrently logging to: file, console, udp";
                                        break;

                                    default:
                                        if (Program.commands.ContainsKey(cmd))
                                        {
                                            ply.request_id = recvd.request_id;
                                            Program.commands[cmd].Run(ply, str.Split(new char[] { ' ' }));
                                            response = "";
                                        }
                                        else
                                        {
                                            Program.SendServerCommand(str);
                                            response = "Sent command to server commandline!";
                                        }
                                        break;
                                }
                            }
                            catch (Exception e) { response = "Command error: " + e.ToString(); }

                            if (response != null && response.Length > 0)
                            {
                                Program.AddRTLine(Color.Orange, "RCon from " + ip + ": " + recvd.string1 + "\r\n", true);
                                Program.AddRTLine(Color.Orange, "RCon response: " + response + "\r\n", true);

                                new RconPacket(this, RconPacketType.SERVERDATA_RESPONSE_VALUE, recvd.request_id, response + "\n", "").Send();
                            }
                        }
                        else
                        {
                            new RconPacket(this, RconPacketType.SERVERDATA_AUTH_RESPONSE, -1, "", "").Send();
                        }
                    }
                }
                catch { this.Disconnect(); return; }
                Thread.Sleep(10);
            }
        }
示例#23
0
 private void HandleInput(RconPacket rconPacket)
 {
     Logging.Log($"Received input {rconPacket.data["input"]}");
 }
示例#24
0
 private void HandleInputInProgress(RconPacket rconPacket)
 {
     SendSuggestions(rconPacket.data["input"]);
 }
示例#25
0
 private void HandleRequestLogHistory(RconPacket rconPacket)
 {
     SendLogHistory();
 }
示例#26
0
 public Task SendAsync(ReadOnlyMemory <byte> payload)
 {
     incomingRequests.Add(RconPacket.FromBytes(payload.ToArray()));
     return(Task.CompletedTask);
 }