def __init__(self, *ryu_args, **ryu_kwargs): args = self.get_args() if not args['debug']: LOG.setLevel(logging.INFO) LOG.debug('Args: %s', args) super(_OF13Hook, self).__init__(tcp_ports=args['tcp_ports'], udp_ports=args['udp_ports'], zmq_addr=args['zmq_addr'], *ryu_args, **ryu_kwargs)
def main(): parser = argparse.ArgumentParser( description='HookSwitch for Linux netfilter queue') help_str = 'ZeroMQ connect address (e.g. ipc:///tmp/hookswitch-socket)' parser.add_argument('ZMQ_ADDR', type=str, help=help_str) parser.add_argument('-n', '--nfq-number', required=True, type=int, help='netfilter queue number') parser.add_argument('--debug', action='store_true', help='print debug info') args = parser.parse_args() if not args.debug: LOG.setLevel(logging.INFO) hook = NFQHook(nfq_number=args.nfq_number, zmq_addr=args.ZMQ_ADDR) print('Starting for %s (NFQ %d)' % (args.ZMQ_ADDR, args.nfq_number)) hook.start()
from abc import ABCMeta, abstractmethod import eventlet from eventlet.green import zmq import six import json from hookswitch.internal import LOG as _LOG LOG = _LOG.getChild(__name__) @six.add_metaclass(ABCMeta) class ZMQClientBase(object): def __init__(self, zmq_addr): self.zmq_addr = zmq_addr self.zmq_ctx = zmq.Context() self.zs = self.zmq_ctx.socket(zmq.PAIR) self.pendings = {} # key: id(int), value: Ethernet Frame def start(self): LOG.debug('Connecting to ZMQ: %s', self.zmq_addr) self.zs.connect(self.zmq_addr) worker_handle = eventlet.spawn(self._zmq_worker) return worker_handle def _zmq_worker(self): while True: # eth_ignored will be used when 'op' == 'modify' is implemented metadata_str, eth_ignored = self.zs.recv_multipart() metadata = json.loads(metadata_str)