) if not args.debug: logging.getLogger("peewee").setLevel(logging.INFO) logging.getLogger("requests").setLevel(logging.WARNING) logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.INFO) logging.getLogger("pogom.pgoapi.rpc_api").setLevel(logging.WARNING) logging.getLogger("pogom.pgoapi.auth").setLevel(logging.WARNING) logging.getLogger("pogom.models").setLevel(logging.WARNING) logging.getLogger("werkzeug").setLevel(logging.WARNING) elif args.debug == "info": logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.INFO) logging.getLogger("pogom.models").setLevel(logging.INFO) logging.getLogger("werkzeug").setLevel(logging.INFO) elif args.debug == "debug": logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.DEBUG) logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.DEBUG) logging.getLogger("pogom.models").setLevel(logging.DEBUG) logging.getLogger("werkzeug").setLevel(logging.INFO) create_tables() scan_config = ScanConfig() read_config(scan_config) config["SIGNATURE_LIB_PATH"] = get_encryption_lib_path() scanner = Scanner(scan_config) scanner.start() app = Pogom(scan_config, __name__) config["ROOT_PATH"] = app.root_path app.run(threaded=True, debug=args.debug, host=args.host, port=args.port)
logging.getLogger("peewee").setLevel(logging.INFO) logging.getLogger("requests").setLevel(logging.WARNING) logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.INFO) logging.getLogger("pogom.pgoapi.rpc_api").setLevel(logging.WARNING) logging.getLogger("pogom.pgoapi.auth").setLevel(logging.WARNING) logging.getLogger("pogom.models").setLevel(logging.WARNING) logging.getLogger("werkzeug").setLevel(logging.WARNING) elif args.debug == "info": logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.INFO) logging.getLogger("pogom.models").setLevel(logging.INFO) logging.getLogger("werkzeug").setLevel(logging.INFO) elif args.debug == "debug": logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.DEBUG) logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.DEBUG) logging.getLogger("pogom.models").setLevel(logging.DEBUG) logging.getLogger("werkzeug").setLevel(logging.INFO) create_tables() scan_config = ScanConfig() read_config(scan_config) config['SIGNATURE_LIB_PATH'] = get_encryption_lib_path() scanner = Scanner(scan_config) scanner.start() app = Pogom(scan_config, __name__) config['ROOT_PATH'] = app.root_path port = int(os.environ.get("PORT", 5000)) app.run(threaded=True, host='0.0.0.0', port=port)
format='%(asctime)s [%(module)11s] [%(levelname)7s] %(message)s') if not args.debug: logging.getLogger("peewee").setLevel(logging.INFO) logging.getLogger("requests").setLevel(logging.WARNING) logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.INFO) logging.getLogger("pogom.pgoapi.rpc_api").setLevel(logging.WARNING) logging.getLogger("pogom.pgoapi.auth").setLevel(logging.WARNING) logging.getLogger("pogom.models").setLevel(logging.WARNING) logging.getLogger("werkzeug").setLevel(logging.WARNING) elif args.debug == "info": logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.INFO) logging.getLogger("pogom.models").setLevel(logging.INFO) logging.getLogger("werkzeug").setLevel(logging.INFO) elif args.debug == "debug": logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.DEBUG) logging.getLogger("pogom.pgoapi.pgoapi").setLevel(logging.DEBUG) logging.getLogger("pogom.models").setLevel(logging.DEBUG) logging.getLogger("werkzeug").setLevel(logging.INFO) create_tables() scan_config = ScanConfig() read_config(scan_config) config['SIGNATURE_LIB_PATH'] = get_encryption_lib_path() scanner = Scanner(scan_config) scanner.start() app = Pogom(scan_config, __name__) config['ROOT_PATH'] = app.root_path app.run(threaded=True, debug=args.debug, host='0.0.0.0', port=5000)
# Assert pgoapi is installed try: import pgoapi from pgoapi import utilities as util except ImportError: log.critical("It seems `pgoapi` is not installed. You must run pip install -r requirements.txt again") sys.exit(1) # Assert pgoapi >= pgoapi_version if not hasattr(pgoapi, "__version__") or StrictVersion(pgoapi.__version__) < StrictVersion(pgoapi_version): log.critical("It seems `pgoapi` is not up-to-date. You must run pip install -r requirements.txt again") sys.exit(1) if __name__ == '__main__': # Check if we have the proper encryption library file and get its path encryption_lib_path = get_encryption_lib_path() if encryption_lib_path is "": sys.exit(1) args = get_args() if args.debug: log.setLevel(logging.DEBUG) else: log.setLevel(logging.INFO) # Let's not forget to run Grunt / Only needed when running with webserver if not args.no_server: if not os.path.exists(os.path.join(os.path.dirname(__file__), 'static/dist')): log.critical('Missing front-end assets (static/dist) -- please run "npm install && npm run build" before starting the server') sys.exit()
def main(): # Patch threading to make exceptions catchable install_thread_excepthook() # Make sure exceptions get logged sys.excepthook = handle_exception args = get_args() # Check for depreciated argumented if args.debug: log.warning('--debug is depreciated. Please use --verbose instead. Enabling --verbose') args.verbose = 'nofile' # Add file logging if enabled if args.verbose and args.verbose != 'nofile': filelog = logging.FileHandler(args.verbose) filelog.setFormatter(logging.Formatter('%(asctime)s [%(threadName)16s][%(module)14s][%(levelname)8s] %(message)s')) logging.getLogger('').addHandler(filelog) if args.very_verbose and args.very_verbose != 'nofile': filelog = logging.FileHandler(args.very_verbose) filelog.setFormatter(logging.Formatter('%(asctime)s [%(threadName)16s][%(module)14s][%(levelname)8s] %(message)s')) logging.getLogger('').addHandler(filelog) # Check if we have the proper encryption library file and get its path encryption_lib_path = get_encryption_lib_path(args) if encryption_lib_path is "": sys.exit(1) if args.verbose or args.very_verbose: log.setLevel(logging.DEBUG) else: log.setLevel(logging.INFO) # Let's not forget to run Grunt / Only needed when running with webserver if not args.no_server: if not os.path.exists(os.path.join(os.path.dirname(__file__), 'static/dist')): log.critical('Missing front-end assets (static/dist) -- please run "npm install && npm run build" before starting the server') sys.exit() # These are very noisey, let's shush them up a bit logging.getLogger('peewee').setLevel(logging.INFO) logging.getLogger('requests').setLevel(logging.WARNING) logging.getLogger('pgoapi.pgoapi').setLevel(logging.WARNING) logging.getLogger('pgoapi.rpc_api').setLevel(logging.INFO) logging.getLogger('werkzeug').setLevel(logging.ERROR) config['parse_pokemon'] = not args.no_pokemon config['parse_pokestops'] = not args.no_pokestops config['parse_gyms'] = not args.no_gyms # Turn these back up if debugging if args.verbose or args.very_verbose: logging.getLogger('pgoapi').setLevel(logging.DEBUG) if args.very_verbose: logging.getLogger('peewee').setLevel(logging.DEBUG) logging.getLogger('requests').setLevel(logging.DEBUG) logging.getLogger('pgoapi.pgoapi').setLevel(logging.DEBUG) logging.getLogger('pgoapi.rpc_api').setLevel(logging.DEBUG) logging.getLogger('rpc_api').setLevel(logging.DEBUG) logging.getLogger('werkzeug').setLevel(logging.DEBUG) # use lat/lng directly if matches such a pattern prog = re.compile("^(\-?\d+\.\d+),?\s?(\-?\d+\.\d+)$") res = prog.match(args.location) if res: log.debug('Using coordinates from CLI directly') position = (float(res.group(1)), float(res.group(2)), 0) else: log.debug('Looking up coordinates in API') position = util.get_pos_by_name(args.location) # Use the latitude and longitude to get the local altitude from Google try: url = 'https://maps.googleapis.com/maps/api/elevation/json?locations={},{}'.format( str(position[0]), str(position[1])) altitude = requests.get(url).json()[u'results'][0][u'elevation'] log.debug('Local altitude is: %sm', altitude) position = (position[0], position[1], altitude) except (requests.exceptions.RequestException, IndexError, KeyError): log.error('Unable to retrieve altitude from Google APIs; setting to 0') if not any(position): log.error('Could not get a position by name, aborting') sys.exit() log.info('Parsed location is: %.4f/%.4f/%.4f (lat/lng/alt)', position[0], position[1], position[2]) if args.no_pokemon: log.info('Parsing of Pokemon disabled') if args.no_pokestops: log.info('Parsing of Pokestops disabled') if args.no_gyms: log.info('Parsing of Gyms disabled') config['LOCALE'] = args.locale config['CHINA'] = args.china app = Pogom(__name__) db = init_database(app) if args.clear_db: log.info('Clearing database') if args.db_type == 'mysql': drop_tables(db) elif os.path.isfile(args.db): os.remove(args.db) create_tables(db) app.set_current_location(position) # Control the search status (running or not) across threads pause_bit = Event() pause_bit.clear() # Setup the location tracking queue and push the first location on new_location_queue = Queue() new_location_queue.put(position) # DB Updates db_updates_queue = Queue() # Thread(s) to process database updates for i in range(args.db_threads): log.debug('Starting db-updater worker thread %d', i) t = Thread(target=db_updater, name='db-updater-{}'.format(i), args=(args, db_updates_queue)) t.daemon = True t.start() # db clearner; really only need one ever if not args.disable_clean: t = Thread(target=clean_db_loop, name='db-cleaner', args=(args,)) t.daemon = True t.start() # WH Updates wh_updates_queue = Queue() # Thread to process webhook updates for i in range(args.wh_threads): log.debug('Starting wh-updater worker thread %d', i) t = Thread(target=wh_updater, name='wh-updater-{}'.format(i), args=(args, wh_updates_queue)) t.daemon = True t.start() if not args.only_server: # Check all proxies before continue so we know they are good if args.proxy and not args.proxy_skip_check: # Overwrite old args.proxy with new working list args.proxy = check_proxies(args) # Gather the pokemons! # attempt to dump the spawn points (do this before starting threads of endure the woe) if args.spawnpoint_scanning and args.spawnpoint_scanning != 'nofile' and args.dump_spawnpoints: with open(args.spawnpoint_scanning, 'w+') as file: log.info('Saving spawn points to %s', args.spawnpoint_scanning) spawns = Pokemon.get_spawnpoints_in_hex(position, args.step_limit) file.write(json.dumps(spawns)) log.info('Finished exporting spawn points') argset = (args, new_location_queue, pause_bit, encryption_lib_path, db_updates_queue, wh_updates_queue) log.debug('Starting a %s search thread', args.scheduler) search_thread = Thread(target=search_overseer_thread, name='search-overseer', args=argset) search_thread.daemon = True search_thread.start() if args.cors: CORS(app) # No more stale JS init_cache_busting(app) app.set_search_control(pause_bit) app.set_location_queue(new_location_queue) config['ROOT_PATH'] = app.root_path config['GMAPS_KEY'] = args.gmaps_key if args.no_server: # This loop allows for ctrl-c interupts to work since flask won't be holding the program open while search_thread.is_alive(): time.sleep(60) else: ssl_context = None if args.ssl_certificate and args.ssl_privatekey \ and os.path.exists(args.ssl_certificate) and os.path.exists(args.ssl_privatekey): ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) ssl_context.load_cert_chain(args.ssl_certificate, args.ssl_privatekey) log.info('Web server in SSL mode.') if args.verbose or args.very_verbose: app.run(threaded=True, use_reloader=False, debug=True, host=args.host, port=args.port, ssl_context=ssl_context) else: app.run(threaded=True, use_reloader=False, debug=False, host=args.host, port=args.port, ssl_context=ssl_context)
def main(): args = get_args() # Check if we have the proper encryption library file and get its path encryption_lib_path = get_encryption_lib_path(args) if encryption_lib_path is "": sys.exit(1) if args.debug: log.setLevel(logging.DEBUG) else: log.setLevel(logging.INFO) # Let's not forget to run Grunt / Only needed when running with webserver if not args.no_server: if not os.path.exists(os.path.join(os.path.dirname(__file__), 'static/dist')): log.critical('Missing front-end assets (static/dist) -- please run "npm install && npm run build" before starting the server') sys.exit() # These are very noisey, let's shush them up a bit logging.getLogger('peewee').setLevel(logging.INFO) logging.getLogger('requests').setLevel(logging.WARNING) logging.getLogger('pgoapi.pgoapi').setLevel(logging.WARNING) logging.getLogger('pgoapi.rpc_api').setLevel(logging.INFO) logging.getLogger('werkzeug').setLevel(logging.ERROR) config['parse_pokemon'] = not args.no_pokemon config['parse_pokestops'] = not args.no_pokestops config['parse_gyms'] = not args.no_gyms # Turn these back up if debugging if args.debug: logging.getLogger('requests').setLevel(logging.DEBUG) logging.getLogger('pgoapi').setLevel(logging.DEBUG) logging.getLogger('rpc_api').setLevel(logging.DEBUG) # use lat/lng directly if matches such a pattern prog = re.compile("^(\-?\d+\.\d+),?\s?(\-?\d+\.\d+)$") res = prog.match(args.location) if res: log.debug('Using coordinates from CLI directly') position = (float(res.group(1)), float(res.group(2)), 0) else: log.debug('Looking up coordinates in API') position = util.get_pos_by_name(args.location) # Use the latitude and longitude to get the local altitude from Google try: url = 'https://maps.googleapis.com/maps/api/elevation/json?locations={},{}'.format( str(position[0]), str(position[1])) altitude = requests.get(url).json()[u'results'][0][u'elevation'] log.debug('Local altitude is: %sm', altitude) position = (position[0], position[1], altitude) except (requests.exceptions.RequestException, IndexError, KeyError): log.error('Unable to retrieve altitude from Google APIs; setting to 0') if not any(position): log.error('Could not get a position by name, aborting') sys.exit() log.info('Parsed location is: %.4f/%.4f/%.4f (lat/lng/alt)', position[0], position[1], position[2]) if args.no_pokemon: log.info('Parsing of Pokemon disabled') if args.no_pokestops: log.info('Parsing of Pokestops disabled') if args.no_gyms: log.info('Parsing of Gyms disabled') config['LOCALE'] = args.locale config['CHINA'] = args.china app = Pogom(__name__) db = init_database(app) if args.clear_db: log.info('Clearing database') if args.db_type == 'mysql': drop_tables(db) elif os.path.isfile(args.db): os.remove(args.db) create_tables(db) app.set_current_location(position) # Control the search status (running or not) across threads pause_bit = Event() pause_bit.clear() # Setup the location tracking queue and push the first location on new_location_queue = Queue() new_location_queue.put(position) # DB Updates db_updates_queue = Queue() # Thread(s) to process database updates for i in range(args.db_threads): log.debug('Starting db-updater worker thread %d', i) t = Thread(target=db_updater, name='db-updater-{}'.format(i), args=(args, db_updates_queue)) t.daemon = True t.start() # db clearner; really only need one ever t = Thread(target=clean_db_loop, name='db-cleaner', args=(args,)) t.daemon = True t.start() # WH Updates wh_updates_queue = Queue() # Thread to process webhook updates for i in range(args.wh_threads): log.debug('Starting wh-updater worker thread %d', i) t = Thread(target=wh_updater, name='wh-updater-{}'.format(i), args=(args, wh_updates_queue)) t.daemon = True t.start() if not args.only_server: # Gather the pokemons! # check the sort of scan if args.spawnpoint_scanning: mode = 'sps' else: mode = 'hex' # attempt to dump the spawn points (do this before starting threads of endure the woe) if args.spawnpoint_scanning and args.spawnpoint_scanning != 'nofile' and args.dump_spawnpoints: with open(args.spawnpoint_scanning, 'w+') as file: log.info('Sawing spawn points to %s', args.spawnpoint_scanning) spawns = Pokemon.get_spawnpoints_in_hex(position, args.step_limit) file.write(json.dumps(spawns)) log.info('Finished exporting spawn points') argset = (args, mode, new_location_queue, pause_bit, encryption_lib_path, db_updates_queue, wh_updates_queue) log.debug('Starting a %s search thread', mode) search_thread = Thread(target=search_overseer_thread, name='search-overseer', args=argset) search_thread.daemon = True search_thread.start() if args.cors: CORS(app) # No more stale JS init_cache_busting(app) app.set_search_control(pause_bit) app.set_location_queue(new_location_queue) config['ROOT_PATH'] = app.root_path config['GMAPS_KEY'] = args.gmaps_key if args.no_server: # This loop allows for ctrl-c interupts to work since flask won't be holding the program open while search_thread.is_alive(): time.sleep(60) else: ssl_context = None if args.ssl_certificate and args.ssl_privatekey \ and os.path.exists(args.ssl_certificate) and os.path.exists(args.ssl_privatekey): ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) ssl_context.load_cert_chain(args.ssl_certificate, args.ssl_privatekey) log.info('Web server in SSL mode.') app.run(threaded=True, use_reloader=False, debug=args.debug, host=args.host, port=args.port, ssl_context=ssl_context)
def main(): # Check if we have the proper encryption library file and get its path encryption_lib_path = get_encryption_lib_path() if encryption_lib_path is "": sys.exit(1) args = get_args() if args.debug: log.setLevel(logging.DEBUG) else: log.setLevel(logging.INFO) # These are very noisey, let's shush them up a bit logging.getLogger('peewee').setLevel(logging.INFO) logging.getLogger('requests').setLevel(logging.WARNING) logging.getLogger('pgoapi.pgoapi').setLevel(logging.WARNING) logging.getLogger('pgoapi.rpc_api').setLevel(logging.INFO) logging.getLogger('werkzeug').setLevel(logging.ERROR) config['parse_pokemon'] = not args.no_pokemon config['parse_pokestops'] = not args.no_pokestops config['parse_gyms'] = not args.no_gyms # Turn these back up if debugging if args.debug: logging.getLogger('requests').setLevel(logging.DEBUG) logging.getLogger('pgoapi').setLevel(logging.DEBUG) logging.getLogger('rpc_api').setLevel(logging.DEBUG) # use lat/lng directly if matches such a pattern prog = re.compile("^(\-?\d+\.\d+),?\s?(\-?\d+\.\d+)$") res = prog.match(args.location) if res: log.debug('Using coordinates from CLI directly') position = (float(res.group(1)), float(res.group(2)), 0) else: log.debug('Looking up coordinates in API') position = util.get_pos_by_name(args.location) if not any(position): log.error('Could not get a position by name, aborting') sys.exit() log.info('Parsed location is: %.4f/%.4f/%.4f (lat/lng/alt)', position[0], position[1], position[2]) if args.no_pokemon: log.info('Parsing of Pokemon disabled') if args.no_pokestops: log.info('Parsing of Pokestops disabled') if args.no_gyms: log.info('Parsing of Gyms disabled') config['LOCALE'] = args.locale config['CHINA'] = args.china app = Pogom(__name__) db = init_database(app) if args.clear_db: log.info('Clearing database') if args.db_type == 'mysql': drop_tables(db) elif os.path.isfile(args.db): os.remove(args.db) create_tables(db) app.set_current_location(position) # Control the search status (running or not) across threads pause_bit = Event() pause_bit.clear() # Setup the location tracking queue and push the first location on new_location_queue = Queue() new_location_queue.put(position) if not args.only_server: # Gather the pokemons! if not args.mock: # check the sort of scan if not args.spawnpoint_scanning: log.debug('Starting a real search thread') search_thread = Thread(target=search_overseer_thread, args=(args, new_location_queue, pause_bit, encryption_lib_path)) # using -ss else: if args.dump_spawnpoints: with open(args.spawnpoint_scanning, 'w+') as file: log.info('exporting spawns') spawns = Pokemon.get_spawnpoints_in_hex(position, args.step_limit) file.write(json.dumps(spawns)) file.close() log.info('Finished exporting spawns') # start the scan sceduler search_thread = Thread(target=search_overseer_thread_ss, args=(args, new_location_queue, pause_bit, encryption_lib_path)) else: log.debug('Starting a fake search thread') insert_mock_data(position) search_thread = Thread(target=fake_search_loop) search_thread.daemon = True search_thread.name = 'search_thread' search_thread.start() if args.cors: CORS(app) # No more stale JS init_cache_busting(app) app.set_search_control(pause_bit) app.set_location_queue(new_location_queue) config['ROOT_PATH'] = app.root_path config['GMAPS_KEY'] = args.gmaps_key if args.no_server: # This loop allows for ctrl-c interupts to work since flask won't be holding the program open while search_thread.is_alive(): time.sleep(60) else: ssl_context = None if args.ssl_certificate and args.ssl_privatekey \ and os.path.exists(args.ssl_certificate) and os.path.exists(args.ssl_privatekey): ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) ssl_context.load_cert_chain(args.ssl_certificate, args.ssl_privatekey) log.info('Web server in SSL mode.') app.run(threaded=True, use_reloader=False, debug=args.debug, host=args.host, port=args.port, ssl_context=ssl_context)