def cleanup(overseer, manager): try: if hasattr(overseer, 'print_handle'): overseer.print_handle.cancel() if hasattr(overseer, 'worker30'): overseer.worker30.cancel() if hasattr(overseer, 'worker_raider'): overseer.worker_raider.cancel() overseer.running = False print('Exiting, please wait until all tasks finish') log = get_logger('cleanup') print('Finishing tasks...') LOOP.create_task(overseer.exit_progress()) pending = gather(*Task.all_tasks(loop=LOOP), return_exceptions=True) try: LOOP.run_until_complete(wait_for(pending, 40)) except TimeoutError as e: print('Coroutine completion timed out, moving on.') except Exception as e: log = get_logger('cleanup') log.exception('A wild {} appeared during exit!', e.__class__.__name__) db_proc.stop() overseer.refresh_dict() print('Dumping pickles...') dump_pickle('accounts', get_accounts()) dump_pickle('accounts30', get_accounts30()) FORT_CACHE.pickle() altitudes.pickle() if conf.CACHE_CELLS: dump_pickle('cells', Worker.cells) spawns.pickle() while not db_proc.queue.empty(): pending = db_proc.queue.qsize() # Spaces at the end are important, as they clear previously printed # output - \r doesn't clean whole line print('{} DB items pending '.format(pending), end='\r') sleep(.5) finally: print('Closing pipes, sessions, and event loop...') manager.shutdown() SessionManager.close() close_sessions() LOOP.close() print('Done.')
def main(): args = parse_args() log = get_logger() if args.status_bar: configure_logger(filename=join(conf.DIRECTORY, 'scan.log')) log.info('-' * 37) log.info('Starting up!') else: configure_logger(filename=None) log.setLevel(args.log_level) AccountManager.register('captcha_queue', callable=get_captchas) AccountManager.register('extra_queue', callable=get_extras) AccountManager.register('lv30_captcha_queue', callable=get_lv30_captchas) AccountManager.register('lv30_account_queue', callable=get_lv30_accounts) if conf.MAP_WORKERS: AccountManager.register('worker_dict', callable=get_workers, proxytype=DictProxy) AccountManager.register('lv30_worker_dict', callable=get_lv30_workers, proxytype=DictProxy) address = get_address() manager = AccountManager(address=address, authkey=conf.AUTHKEY) try: manager.start(mgr_init) except (OSError, EOFError) as e: if platform == 'win32' or not isinstance(address, str): raise OSError( 'Another instance is running with the same manager address. Stop that process or change your MANAGER_ADDRESS.' ) from e else: raise OSError( 'Another instance is running with the same socket. Stop that process or: rm {}' .format(address)) from e LOOP.set_exception_handler(exception_handler) overseer = Overseer(manager) overseer.start(args.status_bar) launcher = LOOP.create_task(overseer.launch(args.bootstrap, args.pickle)) if conf.GO_HASH: hashkey = conf.GO_HASH_KEY else: hashkey = conf.HASH_KEY activate_hash_server(hashkey, go_hash=conf.GO_HASH, hash_endpoint=conf.HASH_ENDPOINT, gohash_endpoint=conf.GOHASH_ENDPOINT) if platform != 'win32': LOOP.add_signal_handler(SIGINT, launcher.cancel) LOOP.add_signal_handler(SIGTERM, launcher.cancel) try: LOOP.run_until_complete(launcher) except (KeyboardInterrupt, SystemExit): launcher.cancel() finally: cleanup(overseer, manager)
def cleanup(overseer, manager): try: overseer.print_handle.cancel() overseer.running = False print('Exiting, please wait until all tasks finish') log = get_logger('cleanup') print('Finishing tasks...') LOOP.create_task(overseer.exit_progress()) pending = gather(*Task.all_tasks(loop=LOOP), return_exceptions=True) try: LOOP.run_until_complete(wait_for(pending, 40)) except TimeoutError as e: print('Coroutine completion timed out, moving on.') except Exception as e: log = get_logger('cleanup') log.exception('A wild {} appeared during exit!', e.__class__.__name__) db_proc.stop() overseer.refresh_dict() print('Dumping pickles...') dump_pickle('accounts', ACCOUNTS) FORT_CACHE.pickle() altitudes.pickle() if conf.CACHE_CELLS: dump_pickle('cells', Worker.cells) spawns.pickle() while not db_proc.queue.empty(): pending = db_proc.queue.qsize() # Spaces at the end are important, as they clear previously printed # output - \r doesn't clean whole line print('{} DB items pending '.format(pending), end='\r') sleep(.5) finally: print('Closing pipes, sessions, and event loop...') manager.shutdown() SessionManager.close() close_sessions() LOOP.close() print('Done.')
def main(): args = parse_args() log = get_logger() if args.status_bar: configure_logger(filename=join(conf.DIRECTORY, 'scan.log')) log.info('-' * 37) log.info('Starting up!') else: configure_logger(filename=None) log.setLevel(args.log_level) AccountManager.register('captcha_queue', callable=get_captchas) AccountManager.register('extra_queue', callable=get_extras) if conf.MAP_WORKERS: AccountManager.register('worker_dict', callable=get_workers, proxytype=DictProxy) address = get_address() manager = AccountManager(address=address, authkey=conf.AUTHKEY) try: manager.start(mgr_init) except (OSError, EOFError) as e: if platform == 'win32' or not isinstance(address, str): raise OSError('Another instance is running with the same manager address. Stop that process or change your MANAGER_ADDRESS.') from e else: raise OSError('Another instance is running with the same socket. Stop that process or: rm {}'.format(address)) from e LOOP.set_exception_handler(exception_handler) overseer = Overseer(manager) overseer.start(args.status_bar) launcher = LOOP.create_task(overseer.launch(args.bootstrap, args.pickle)) activate_hash_server(conf.HASH_KEY) if platform != 'win32': LOOP.add_signal_handler(SIGINT, launcher.cancel) LOOP.add_signal_handler(SIGTERM, launcher.cancel) try: LOOP.run_until_complete(launcher) except (KeyboardInterrupt, SystemExit): launcher.cancel() finally: cleanup(overseer, manager)