async def plaintext_tcpclient(output_cfg, queue, start_shutdown): host, port = output_cfg["remote-address"], output_cfg["remote-port"] clogger.debug("Output handler: connection to %s:%s" % (host, port)) reader, tcp_writer = await asyncio.open_connection(host, port) clogger.debug("Output handler: connected") # consume queue while not start_shutdown.is_set(): # read item from queue tapmsg = await queue.get() # convert dnstap message msg = transform.convert_dnstap(fmt=output_cfg["format"], tapmsg=tapmsg) # write & add delimiter tcp_writer.write(msg + output_cfg["delimiter"].encode()) # connection lost ? exit and try to reconnect if tcp_writer.transport._conn_lost: break # done continue to next item queue.task_done() # something if not start_shutdown.is_set(): clogger.error("Output handler: connection lost")
async def handle(output_cfg, queue, metrics, start_shutdown): """handle output""" server_address = (output_cfg["remote-address"], output_cfg["remote-port"]) loop = asyncio.get_event_loop() # syslog tcp if output_cfg["transport"] == "tcp": clogger.debug("Output handler: syslog TCP enabled") while not start_shutdown.is_set(): try: await syslog_tcpclient(output_cfg, queue, start_shutdown) except ConnectionRefusedError: clogger.error( 'Output handler: connection to syslog server failed!') except asyncio.TimeoutError: clogger.error( 'Output handler: connection to syslog server timed out!') else: clogger.error( 'Output handler: connection to server is closed.') clogger.debug("'Output handler: retry to connect every %ss" % output_cfg["retry"]) if not start_shutdown.is_set(): await asyncio.sleep(output_cfg["retry"]) # syslog udp else: clogger.debug("Output handler: syslog UDP enabled with %s" % str(server_address)) transport, _ = await loop.create_datagram_endpoint( asyncio.DatagramProtocol, remote_addr=server_address) # consume the queue while not start_shutdown.is_set(): # read item from queue tapmsg = await queue.get() # convert dnstap message msg = transform.convert_dnstap(fmt=output_cfg["format"], tapmsg=tapmsg) # send msg transport.sendto(msg) # all done queue.task_done()
async def handle(output_cfg, queue, metrics): """stdout output handler""" # init output logger setup_logger(output_cfg) while True: # read item from queue tapmsg = await queue.get() # convert dnstap message msg = transform.convert_dnstap(fmt=output_cfg["format"], tapmsg=tapmsg) # print to stdout file_logger.info(msg.decode()) # all done queue.task_done()
async def handle(output_cfg, queue, metrics, start_shutdown): start_shutdown_producer = asyncio.Event() producer = Producer(output_cfg['rdkafka-config'], output_cfg['topic'], start_shutdown_producer) clogger.info("Output handler: kafka: Enabled") while not start_shutdown.is_set(): try: tapmsg = await asyncio.wait_for(queue.get(), timeout=0.5) except asyncio.TimeoutError: continue msg = transform.convert_dnstap(fmt=output_cfg["format"], tapmsg=tapmsg) producer.produce(msg) queue.task_done() # tell producer to shut down clogger.info("Output handler: kafka: Triggering producer shutdown") start_shutdown_producer.set()
async def handle(output_cfg, queue, metrics, start_shutdown): """stdout output handler""" # init logger setup_logger() while not start_shutdown.is_set(): # read item from queue try: tapmsg = await asyncio.wait_for(queue.get(), timeout=0.5) except asyncio.TimeoutError: continue # convert dnstap message msg = transform.convert_dnstap(fmt=output_cfg["format"], tapmsg=tapmsg) # print to stdout tap_logger.info(msg.decode()) # all done queue.task_done()