import json from contracting.client import ContractingClient from contracting.db.encoder import decode import uvloop import gc from lamden.logger.base import get_logger import decimal from pathlib import Path import uuid import shutil import os import pathlib from lamden.nodes.events import Event, EventWriter asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) BLOCK_SERVICE = 'catchup' NEW_BLOCK_SERVICE = 'new_blocks' NEW_BLOCK_EVENT = 'new_block' WORK_SERVICE = 'work' CONTENDER_SERVICE = 'contenders' GET_BLOCK = 'get_block' GET_HEIGHT = 'get_height' STORAGE_HOME = pathlib.Path().home().joinpath('.lamden') class FileQueue: EXTENSION = '.tx'
def __init__(self, back_plane_ip_address=None, subscriber_port='43125', publisher_port='43124', process_name='None', numpy=False, external_message_processor=None, receive_loop_idle_addition=None, connect_time=0.3, subscriber_list=None, event_loop=None): """ The __init__ method sets up all the ZeroMQ "plumbing" :param back_plane_ip_address: banyan_base back_planeIP Address - if not specified, it will be set to the local computer. :param subscriber_port: banyan_base back plane subscriber port. This must match that of the banyan_base backplane :param publisher_port: banyan_base back plane publisher port. This must match that of the banyan_base backplane. :param process_name: Component identifier in banner at component startup. :param numpy: Set true if you wish to include numpy matrices in your messages. :param external_message_processor: external method to process messages :param receive_loop_idle_addition: an external method called in the idle section of the receive loop :param connect_time: a short delay to allow the component to connect to the Backplane """ # call to super allows this class to be used in multiple inheritance scenarios when needed super(BanyanBaseAIO, self).__init__() self.backplane_exists = False self.back_plane_ip_address = None self.numpy = numpy self.external_message_processor = external_message_processor self.receive_loop_idle_addition = receive_loop_idle_addition self.connect_time = connect_time self.subscriber_list = subscriber_list self.my_context = None self.subscriber = None self.publisher = None self.the_task = None if event_loop: self.event_loop = event_loop else: # fix for "not implemented" bugs in Python 3.8 if sys.platform == 'win32': asyncio.set_event_loop_policy( asyncio.WindowsSelectorEventLoopPolicy()) self.event_loop = asyncio.get_event_loop() # if using numpy apply the msgpack_numpy monkey patch if numpy: m.patch() # If no back plane address was specified, determine the IP address of the local machine if back_plane_ip_address: self.back_plane_ip_address = back_plane_ip_address else: # check for a running backplane for pid in psutil.pids(): p = psutil.Process(pid) try: p_command = p.cmdline() # ignore these psutil exceptions except (psutil.AccessDenied, psutil.ZombieProcess): continue try: if any('backplane' in s for s in p_command): self.backplane_exists = True else: continue except UnicodeDecodeError: continue if not self.backplane_exists: raise RuntimeError( 'Backplane is not running - please start it.') # determine this computer's IP address s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # use the google dns try: s.connect(('8.8.8.8', 1)) self.back_plane_ip_address = s.getsockname()[0] except: self.back_plane_ip_address = '127.0.0.1' finally: s.close() self.subscriber_port = subscriber_port self.publisher_port = publisher_port print('\n************************************************************') print(process_name + ' using Back Plane IP address: ' + self.back_plane_ip_address) print('Subscriber Port = ' + self.subscriber_port) print('Publisher Port = ' + self.publisher_port) print('************************************************************')