async def ping_observing_task(address): logger = logging.getLogger('moler.user.app-code') # Lowest layer of Moler's usage (you manually glue all elements): # 1. create observer net_down_detector = NetworkDownDetector('10.0.2.15') # 2. ThreadedMolerConnection is a proxy-glue between observer (speaks str) # and asyncio-connection (speaks bytes) moler_conn = ThreadedMolerConnection( decoder=lambda data: data.decode("utf-8")) # 3a. glue from proxy to observer moler_conn.subscribe(net_down_detector.data_received) logger.debug('waiting for data to observe') async for connection_data in tcp_connection(address): # 3b. glue to proxy from external-IO (asyncio tcp client connection) # (client code has to pass it's received data into Moler's connection) moler_conn.data_received(connection_data) # 4. Moler's client code must manually check status of observer ... if net_down_detector.done(): # 5. ... to know when it can ask for result net_down_time = net_down_detector.result() timestamp = time.strftime("%H:%M:%S", time.localtime(net_down_time)) logger.debug('Network is down from {}'.format(timestamp)) break
def ping_observing_task(address, ping_ip): logger = logging.getLogger('moler.user.app-code') net_addr = 'tcp://{}:{}'.format(*address) # Lowest layer of Moler's usage (you manually glue all elements): # 1. create observers net_down_detector = NetworkDownDetector(ping_ip) net_drop_found = False net_up_detector = NetworkUpDetector(ping_ip) moler_conn = ObservableConnection(decoder=lambda data: data.decode("utf-8")) # 2. virtually "start" observer by making it data-listener moler_conn.subscribe(net_down_detector.data_received) info = '{} on {} using {}'.format(ping_ip, net_addr, net_down_detector) logger.debug('observe ' + info) for _ in tcp_connection(address, moler_conn): # anytime new data comes it may change status of observer if not net_drop_found and net_down_detector.done(): net_drop_found = True net_down_time = net_down_detector.result() timestamp = time.strftime("%H:%M:%S", time.localtime(net_down_time)) logger.debug('Network {} is down from {}'.format(ping_ip, timestamp)) # 3. virtually "stop" that observer moler_conn.unsubscribe(net_down_detector.data_received) # 4. and start subsequent one (to know when net is back "up") info = '{} on {} using {}'.format(ping_ip, net_addr, net_up_detector) logger.debug('observe ' + info) moler_conn.subscribe(net_up_detector.data_received) if net_up_detector.done(): net_up_time = net_up_detector.result() timestamp = time.strftime("%H:%M:%S", time.localtime(net_up_time)) logger.debug('Network {} is back "up" from {}'.format(ping_ip, timestamp)) # 5. virtually "stop" that observer moler_conn.unsubscribe(net_up_detector.data_received) break
def ping_observing_task(ext_io_connection, ping_ip): """ Here external-IO connection is abstract - we don't know its type. What we know is just that it has .moler_connection attribute. """ logger = logging.getLogger('moler.user.app-code') conn_addr = str(ext_io_connection) # Layer 2 of Moler's usage (ext_io_connection): # 1. create observers net_down_detector = NetworkDownDetector(ping_ip) net_drop_found = False net_up_detector = NetworkUpDetector(ping_ip) moler_conn = ext_io_connection.moler_connection # 2. virtually "start" observer by making it data-listener moler_conn.subscribe(net_down_detector.data_received) info = '{} on {} using {}'.format(ping_ip, conn_addr, net_down_detector) logger.debug('observe ' + info) with ext_io_connection.open(): observing_timeout = 10 start_time = time.time() while time.time() < start_time + observing_timeout: # anytime new data comes it may change status of observer if not net_drop_found and net_down_detector.done(): net_drop_found = True net_down_time = net_down_detector.result() timestamp = time.strftime("%H:%M:%S", time.localtime(net_down_time)) logger.debug('Network {} is down from {}'.format( ping_ip, timestamp)) # 3. virtually "stop" that observer moler_conn.unsubscribe(net_down_detector.data_received) # 4. and start subsequent one (to know when net is back "up") info = '{} on {} using {}'.format(ping_ip, conn_addr, net_up_detector) logger.debug('observe ' + info) moler_conn.subscribe(net_up_detector.data_received) if net_up_detector.done(): net_up_time = net_up_detector.result() timestamp = time.strftime("%H:%M:%S", time.localtime(net_up_time)) logger.debug('Network {} is back "up" from {}'.format( ping_ip, timestamp)) # 5. virtually "stop" that observer moler_conn.unsubscribe(net_up_detector.data_received) break time.sleep(0.2)