gsquery.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Source Game Server Query
  4. # Author: Anonymous & Daniel Gibbs
  5. # # Website: http://danielgibbs.co.uk
  6. # Version: 251213
  7. import optparse
  8. import socket
  9. import sys
  10. class GameServer:
  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. if self.option.engine == 'source':
  19. self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0'
  20. if self.option.engine == 'goldsource':
  21. self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0'
  22. if self.option.engine == 'spark':
  23. self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0'
  24. elif self.option.engine == 'unreal':
  25. self.query_prompt_string = '\x5C\x69\x6E\x66\x6F\x5C'
  26. elif self.option.engine == 'unreal2':
  27. self.query_prompt_string = '\x79\x00\x00\x00\x00'
  28. self.connected = False
  29. self.response = None
  30. self.sanity_checks()
  31. def fatal_error( self, error_message, error_code=1 ):
  32. sys.stderr.write( 'ERROR: ' + str(error_message) + '\n' )
  33. sys.exit( error_code )
  34. def exit_success( self, success_message='' ):
  35. sys.stdout.write( 'OK: ' + str(success_message) + '\n' )
  36. sys.exit( 0 )
  37. def responding( self ):
  38. # Connect.
  39. connection = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
  40. connection.settimeout( self.server_response_timeout )
  41. try:
  42. self.connected = connection.connect( ( self.option.address, int(self.option.port) ) )
  43. except socket.timeout:
  44. self.fatal_error( 'Request timed out', 1 )
  45. except:
  46. self.fatal_error( 'Unable to connect', 1 )
  47. # Send.
  48. connection.send( self.query_prompt_string )
  49. # Receive.
  50. try:
  51. self.response = connection.recv( self.default_buffer_length )
  52. except socket.error:
  53. self.fatal_error( 'Unable to receive', 2 )
  54. connection.close()
  55. # Response.
  56. if self.response == None:
  57. self.fatal_error( 'No response', 3 )
  58. if len( self.response ) < 10 :
  59. sys.exit( 'Short response.', 3 )
  60. else:
  61. self.exit_success( str( self.response ) )
  62. def sanity_checks( self ):
  63. if not self.option.address:
  64. self.fatal_error( 'No IPv4 address supplied.', 4 )
  65. if not self.option.port:
  66. self.fatal_error( 'No port supplied.', 4 )
  67. if __name__ == '__main__':
  68. parser = optparse.OptionParser(
  69. usage = 'usage: python %prog [options]',
  70. version = '%prog 0.0.1'
  71. )
  72. parser.add_option(
  73. '-a', '--address',
  74. action = 'store',
  75. dest = 'address',
  76. default = False,
  77. help = 'The IPv4 address of the server.'
  78. )
  79. parser.add_option(
  80. '-p', '--port',
  81. action = 'store',
  82. dest = 'port',
  83. default = False,
  84. help = 'The IPv4 port of the server.'
  85. )
  86. parser.add_option(
  87. '-e', '--engine',
  88. action = 'store',
  89. dest = 'engine',
  90. default = False,
  91. help = 'Engine type. source, goldsource, unreal, unreal2, spark'
  92. )
  93. parser.add_option(
  94. '-v', '--verbose',
  95. action = 'store_true',
  96. dest = 'verbose',
  97. default = False,
  98. help = 'Display verbose output.'
  99. )
  100. parser.add_option(
  101. '-d', '--debug',
  102. action = 'store_true',
  103. dest = 'debug',
  104. default = False,
  105. help = 'Display debugging output.'
  106. )
  107. options, arguments = parser.parse_args()
  108. #
  109. server = GameServer( options, arguments )
  110. server.responding()