gsquery.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # PythonGSQ
  4. # Author: Anonymous & Daniel Gibbs
  5. # Website: https://linuxgsm.com
  6. # Description: Allows querying of various game servers.
  7. import optparse
  8. import socket
  9. import sys
  10. class PythonGSQ:
  11. def __init__(self, options, arguments):
  12. self.option = options
  13. self.argument = arguments
  14. #
  15. self.server_response_timeout = 5
  16. self.default_buffer_length = 1024
  17. #
  18. sourcequery=[ 'avalanche3.0','madness','quakelive','realvirtuality','refractor','source','goldsource','spark','starbound','unity3d', 'unreal4' ]
  19. idtech3query=['idtech3','quake','iw3.0']
  20. idtech2query=['idtech2','iw2.0']
  21. if self.option.engine in sourcequery:
  22. self.query_prompt_string = b'\xFF\xFF\xFF\xFFTSource Engine Query\0'
  23. elif self.option.engine in idtech2query:
  24. self.query_prompt_string = b'\xff\xff\xff\xffstatus\x00'
  25. elif self.option.engine in idtech3query:
  26. self.query_prompt_string = b'\xff\xff\xff\xffgetstatus'
  27. elif self.option.engine == 'avalanche2.0':
  28. self.query_prompt_string = b'\xFE\xFD\x09\x10\x20\x30\x40'
  29. elif self.option.engine == 'unreal':
  30. self.query_prompt_string = b'\x5C\x69\x6E\x66\x6F\x5C'
  31. elif self.option.engine == 'unreal2':
  32. self.query_prompt_string = b'\x79\x00\x00\x00\x00'
  33. self.connected = False
  34. self.response = None
  35. self.sanity_checks()
  36. def fatal_error(self, error_message, error_code=1):
  37. sys.stderr.write('ERROR: ' + str(error_message) + '\n')
  38. sys.exit(error_code)
  39. def exit_success(self, success_message=''):
  40. sys.stdout.write('OK: ' + str(success_message) + '\n')
  41. sys.exit(0)
  42. def responding(self):
  43. # Connect.
  44. connection = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  45. connection.settimeout(self.server_response_timeout)
  46. try:
  47. self.connected = connection.connect((self.option.address, int(self.option.port)))
  48. except socket.timeout:
  49. self.fatal_error('Request timed out', 1)
  50. except:
  51. self.fatal_error('Unable to connect', 1)
  52. # Send.
  53. connection.send(self.query_prompt_string)
  54. # Receive.
  55. try:
  56. self.response = connection.recv(self.default_buffer_length)
  57. except socket.error:
  58. self.fatal_error('Unable to receive', 2)
  59. connection.close()
  60. # Response.
  61. if self.response is None:
  62. self.fatal_error('No response', 3)
  63. if len(self.response) < 10:
  64. sys.exit('Short response.', 3)
  65. else:
  66. self.exit_success(str(self.response))
  67. def sanity_checks(self):
  68. if not self.option.address:
  69. self.fatal_error('No IPv4 address supplied.', 4)
  70. if not self.option.port:
  71. self.fatal_error('No port supplied.', 4)
  72. if __name__ == '__main__':
  73. parser = optparse.OptionParser(
  74. usage='usage: python %prog [options]',
  75. version='%prog 0.0.1'
  76. )
  77. parser.add_option(
  78. '-a', '--address',
  79. action='store',
  80. dest='address',
  81. default=False,
  82. help='The IPv4 address of the server.'
  83. )
  84. parser.add_option(
  85. '-p', '--port',
  86. action='store',
  87. dest='port',
  88. default=False,
  89. help='The IPv4 port of the server.'
  90. )
  91. parser.add_option(
  92. '-e', '--engine',
  93. action='store',
  94. dest='engine',
  95. default=False,
  96. help='Engine type: avalanche2.0, avalanche3.0, goldsource, idtech2, idtech3, iw2.0, iw3.0, realvirtuality, quake, quakelive, refractor, spark, source, unity3d, unreal, unreal2.'
  97. )
  98. parser.add_option(
  99. '-v', '--verbose',
  100. action='store_true',
  101. dest='verbose',
  102. default=False,
  103. help='Display verbose output.'
  104. )
  105. parser.add_option(
  106. '-d', '--debug',
  107. action='store_true',
  108. dest='debug',
  109. default=False,
  110. help='Display debugging output.'
  111. )
  112. options, arguments = parser.parse_args()
  113. #
  114. server = PythonGSQ(options, arguments)
  115. server.responding()