| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #! /usr/bin/env python
- # -*- coding: utf-8 -*-
- # Game Server Query
- # Author: Anonymous & Daniel Gibbs
- # # Website: http://gameservermanagers.com
- # Version: 030515
- import optparse
- import socket
- import sys
- class GameServer:
- def __init__( self, options, arguments ):
- self.option = options
- self.argument = arguments
- #
- self.server_response_timeout = 5
- self.default_buffer_length = 1024
- #
- if self.option.engine == 'source':
- self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0'
- if self.option.engine == 'goldsource':
- self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0'
- if self.option.engine == 'spark':
- self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0'
- if self.option.engine == 'realvirtuality':
- self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0'
- if self.option.engine == 'unity3d':
- self.query_prompt_string = '\xFF\xFF\xFF\xFFTSource Engine Query\0'
- elif self.option.engine == 'unreal':
- self.query_prompt_string = '\x5C\x69\x6E\x66\x6F\x5C'
- elif self.option.engine == 'unreal2':
- self.query_prompt_string = '\x79\x00\x00\x00\x00'
- elif self.option.engine == 'avalanche':
- self.query_prompt_string = '\xFE\xFD\x09\x10\x20\x30\x40'
- self.connected = False
- self.response = None
- self.sanity_checks()
- def fatal_error( self, error_message, error_code=1 ):
- sys.stderr.write( 'ERROR: ' + str(error_message) + '\n' )
- sys.exit( error_code )
- def exit_success( self, success_message='' ):
- sys.stdout.write( 'OK: ' + str(success_message) + '\n' )
- sys.exit( 0 )
- def responding( self ):
- # Connect.
- connection = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
- connection.settimeout( self.server_response_timeout )
- try:
- self.connected = connection.connect( ( self.option.address, int(self.option.port) ) )
- except socket.timeout:
- self.fatal_error( 'Request timed out', 1 )
- except:
- self.fatal_error( 'Unable to connect', 1 )
- # Send.
- connection.send( self.query_prompt_string )
- # Receive.
- try:
- self.response = connection.recv( self.default_buffer_length )
- except socket.error:
- self.fatal_error( 'Unable to receive', 2 )
- connection.close()
- # Response.
- if self.response == None:
- self.fatal_error( 'No response', 3 )
- if len( self.response ) < 10 :
- sys.exit( 'Short response.', 3 )
- else:
- self.exit_success( str( self.response ) )
- def sanity_checks( self ):
- if not self.option.address:
- self.fatal_error( 'No IPv4 address supplied.', 4 )
- if not self.option.port:
- self.fatal_error( 'No port supplied.', 4 )
- if __name__ == '__main__':
- parser = optparse.OptionParser(
- usage = 'usage: python %prog [options]',
- version = '%prog 0.0.1'
- )
- parser.add_option(
- '-a', '--address',
- action = 'store',
- dest = 'address',
- default = False,
- help = 'The IPv4 address of the server.'
- )
- parser.add_option(
- '-p', '--port',
- action = 'store',
- dest = 'port',
- default = False,
- help = 'The IPv4 port of the server.'
- )
- parser.add_option(
- '-e', '--engine',
- action = 'store',
- dest = 'engine',
- default = False,
- help = 'Engine type: avalanche, goldsource, realvirtuality, spark, source, unity3d, unreal, unreal2.'
- )
- parser.add_option(
- '-v', '--verbose',
- action = 'store_true',
- dest = 'verbose',
- default = False,
- help = 'Display verbose output.'
- )
- parser.add_option(
- '-d', '--debug',
- action = 'store_true',
- dest = 'debug',
- default = False,
- help = 'Display debugging output.'
- )
- options, arguments = parser.parse_args()
- #
- server = GameServer( options, arguments )
- server.responding()
|