Example #1
0
 def test_cvarlist(self, request, rcon_server):
     cvarlist = textwrap.dedent("""
     cvar list
     --------------
     foo                   : cmd      : , "a", "sv" : foo-description
     bar                   : 5        :             : bar-description
     --------------
     2345 total convars/concommands
     """)
     e_request = rcon_server.expect(0,
                                    valve.rcon.RCONMessage.Type.EXECCOMMAND,
                                    b"cvarlist")
     e_request.respond(0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE,
                       cvarlist)
     e_request.respond_terminate_multi_part(0)
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     convars = list(rcon.cvarlist())
     assert len(convars) == 2
     assert convars[0].name == "foo"
     assert convars[0].value == "cmd"
     assert convars[0].flags == frozenset({"a", "sv"})
     assert isinstance(convars[0].flags, frozenset)
     assert convars[0].description == "foo-description"
     assert convars[1].name == "bar"
     assert convars[1].value == "5"
     assert convars[1].flags == frozenset({})
     assert isinstance(convars[1].flags, frozenset)
     assert convars[1].description == "bar-description"
Example #2
0
 def test_execute_no_block(self, request, rcon_server):
     e1_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"echo hello")
     e1_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"hello")
     e1_request.respond_terminate_multi_part(0)
     rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"")
     e2_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"echo hello")
     e2_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"hello")
     e2_request.respond_terminate_multi_part(0)
     rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"")
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     response_1 = rcon.execute("echo hello", block=False)
     response_2 = rcon.execute("echo hello", block=True)
     assert response_1 is None
     assert response_2.id == 0
     assert response_2.type is response_2.Type.RESPONSE_VALUE
     assert response_2.body == b"hello"
     assert isinstance(response_2.body, six.binary_type)
Example #3
0
    async def handle_rcon_command(self, message):
        words = message.content.split(' ')
        if len(words) < 4:
            reply = "Error: invalid parameters\n"
            reply += "  Usage:\n    @{} rcon <server-name> <rcon-command>\n".format(
                self.user.name)
            reply += "  E.g:\n    @{} rcon ark-server-name listplayers\n".format(
                self.user.name)
            await message.channel.send(reply)
            return

        command = words[1]
        server_name = words[2]
        rcon_command = " ".join(words[3:])

        if not server_name in self.__servers__:
            reply = "Error: server name not found in list of servers"
            await message.channel.send(reply)
            return

        #print( "  RCON {} {}".format( server_name, rcon_command ) )

        ip = self.__servers__[server_name]["ip_address"]
        port = self.__servers__[server_name]["port"]
        password = self.__servers__[server_name]["password"]
        server_tuple = (ip, port)

        try:
            rcon = valve.rcon.RCON(server_tuple, password, multi_part=False)
            rcon.connect()
            rcon.authenticate()
            response = rcon.execute(rcon_command, timeout=10)

        except (valve.rcon.RCONError, ConnectionRefusedError) as e:
            await message.channel.send(
                "Failed to connect to server '{}'".format(server_name))
            rcon.close()
            return

        except valve.rcon.RCONAuthenticationError as e:
            await message.channel.send(
                "Failed to authenticate to server '{}'".format(server_name))
            rcon.close()
            return

        except valve.rcon.RCONTimeoutError as e:
            await message.channel.send(
                "Timeout waiting for response from server '{}'".format(
                    server_name))
            rcon.close()
            return

        except valve.rcon.RCONCommunicationError as e:
            await message.channel.send(
                "Error communicating with server '{}'".format(server_name))

        await message.channel.send("Server response:\n{}".format(response.text)
                                   )

        rcon.close()
Example #4
0
 def test_cvarlist(self, request, rcon_server):
     cvarlist = textwrap.dedent("""
     cvar list
     --------------
     foo                   : cmd      : , "a", "sv" : foo-description
     bar                   : 5        :             : bar-description
     --------------
     2345 total convars/concommands
     """)
     e_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"cvarlist")
     e_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, cvarlist)
     e_request.respond_terminate_multi_part(0)
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     convars = list(rcon.cvarlist())
     assert len(convars) == 2
     assert convars[0].name == "foo"
     assert convars[0].value == "cmd"
     assert convars[0].flags == frozenset({"a", "sv"})
     assert isinstance(convars[0].flags, frozenset)
     assert convars[0].description == "foo-description"
     assert convars[1].name == "bar"
     assert convars[1].value == "5"
     assert convars[1].flags == frozenset({})
     assert isinstance(convars[1].flags, frozenset)
     assert convars[1].description == "bar-description"
Example #5
0
 def test_execute_no_block(self, request, rcon_server):
     e1_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"echo hello")
     e1_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"hello")
     e1_request.respond_terminate_multi_part(0)
     rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"")
     e2_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"echo hello")
     e2_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"hello")
     e2_request.respond_terminate_multi_part(0)
     rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"")
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     response_1 = rcon.execute("echo hello", block=False)
     response_2 = rcon.execute("echo hello", block=True)
     assert response_1 is None
     assert response_2.id == 0
     assert response_2.type is response_2.Type.RESPONSE_VALUE
     assert response_2.body == b"hello"
     assert isinstance(response_2.body, six.binary_type)
Example #6
0
 def test_authenticate_timeout(self, request, rcon_server):
     rcon_server.expect(0, valve.rcon.RCONMessage.Type.AUTH, b"")
     rcon = valve.rcon.RCON(rcon_server.server_address, b"", 1.5)
     rcon.connect()
     request.addfinalizer(rcon.close)
     with pytest.raises(valve.rcon.RCONTimeoutError):
         rcon.authenticate()
Example #7
0
 def test_authenticate_timeout(self, request, rcon_server):
     rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.AUTH, b"")
     rcon = valve.rcon.RCON(rcon_server.server_address, b"", 1.5)
     rcon.connect()
     request.addfinalizer(rcon.close)
     with pytest.raises(valve.rcon.RCONTimeoutError):
         rcon.authenticate()
Example #8
0
 def test_execute_timeout(self, request, rcon_server):
     rcon_server.expect(0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"")
     rcon_server.expect(0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"")
     rcon = valve.rcon.RCON(rcon_server.server_address, b"", 1.5)
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     with pytest.raises(valve.rcon.RCONTimeoutError):
         rcon.execute("")
Example #9
0
 def test_cvarlist_malformed(self, request, rcon_server):
     e_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"cvarlist")
     e_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"asdf")
     e_request.respond_terminate_multi_part(0)
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     assert list(rcon.cvarlist()) == []
Example #10
0
 def test_execute_timeout(self, request, rcon_server):
     rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"")
     rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"")
     rcon = valve.rcon.RCON(rcon_server.server_address, b"", 1.5)
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     with pytest.raises(valve.rcon.RCONTimeoutError):
         rcon.execute("")
Example #11
0
 def test_cvarlist_malformed(self, request, rcon_server):
     e_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"cvarlist")
     e_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"asdf")
     e_request.respond_terminate_multi_part(0)
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     assert list(rcon.cvarlist()) == []
Example #12
0
 def test_call_text_bad(self, request, rcon_server):
     e_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"")
     e_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"\xFF")
     e_request.respond_terminate_multi_part(0)
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     with pytest.raises(valve.rcon.RCONMessageError):
         rcon("")
Example #13
0
 def test_call_text_bad(self, request, rcon_server):
     e_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"")
     e_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"\xFF")
     e_request.respond_terminate_multi_part(0)
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     with pytest.raises(valve.rcon.RCONMessageError):
         rcon("")
Example #14
0
 def test_call(self, request, rcon_server):
     e_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"echo hello")
     e_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"hello")
     e_request.respond_terminate_multi_part(0)
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     response = rcon("echo hello")
     assert response == "hello"
     assert isinstance(response, six.text_type)
Example #15
0
 def test_call_no_multi(self, request, rcon_server):
     e_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"echo hello")
     e_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"hello")
     rcon = valve.rcon.RCON(
         rcon_server.server_address, b"", multi_part=False)
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     response = rcon("echo hello")
     assert response == "hello"
     assert isinstance(response, six.text_type)
Example #16
0
 def test_call_no_multi_timeout(self, request, rcon_server):
     e_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.EXECCOMMAND, b"echo hello")
     e_request = rcon_server.expect(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"")
     e_request.respond(
         0, valve.rcon.RCONMessage.Type.RESPONSE_VALUE, b"hello")
     rcon = valve.rcon.RCON(
         rcon_server.server_address, b"", timeout=3)
     rcon.connect()
     rcon._authenticated = True
     request.addfinalizer(rcon.close)
     with pytest.raises(valve.rcon.RCONTimeoutError):
         rcon("echo hello")
Example #17
0
 async def cmd(self, ctx, *, cmd_):
     global servers
     #servers = await load_json('./json/servers.json')
     for server in servers:
         channel_id = servers[server]["discord_channel_id"]
         if ctx.channel.id == channel_id:
             addr = server.split(":")
             addr = (addr[0], int(addr[1]))
             rcon_password = servers[server]["rcon_password"]
             try:
                 """print("Here")
                 rcon = valve.rcon.RCON(addr, rcon_password, timeout=None)
                 print("Here2")
                 rcon.connect()
                 print("Her3")
                 rcon.authenticate()
                 print("Her4")
                 command = rcon.__call__(cmd_)
                 print("Her5")"""
                 rcon = valve.rcon.RCON(addr, rcon_password, timeout=None)
                 rcon.connect()
                 rcon.authenticate()
                 response = rcon.execute(cmd_)
                 response_text = response.body.decode("utf-8")
                 log1, log2 = "", ""
                 if cmd_ == 'status':
                     response_text = response_text.split("#")
                     for item in range(2, len(response_text)):
                         try:
                             if item < len(response_text) // 2:
                                 add = format_status_log(
                                     response_text[item])
                                 log1 = log1 + add + "\n"
                             else:
                                 add = format_status_log(
                                     response_text[item])
                                 log2 = log2 + add + "\n"
                         except:
                             await ctx.send(response_text[item])
                     log1 = log1 + f"{chr(701)}"
                     await ctx.send(log1)
                     await ctx.send(log2)
                 else:
                     await ctx.send(f"***__{response_text}__***")
             except Exception as e:
                 print(f"Command Error: {e}")
             break
Example #18
0
 def test_call_not_authenticated(self, request, rcon_server):
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     request.addfinalizer(rcon.close)
     with pytest.raises(valve.rcon.RCONError):
         rcon("foo")
Example #19
0
 def test_call_not_authenticated(self, request, rcon_server):
     rcon = valve.rcon.RCON(rcon_server.server_address, b"")
     rcon.connect()
     request.addfinalizer(rcon.close)
     with pytest.raises(valve.rcon.RCONError):
         rcon("foo")