From ad179438c6fab16b28f91f6e34853c0319a68d33 Mon Sep 17 00:00:00 2001 From: "Blake J. Harnden" Date: Thu, 13 Jul 2017 09:36:09 -0700 Subject: [PATCH] fixed issue where config messages were not being broadcasted out --- daemon/core/corehandlers.py | 42 ++++++++++++++++++----------------- daemon/core/session.py | 10 +++++++-- daemon/core/xml/xmlparser1.py | 16 ++++++++----- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/daemon/core/corehandlers.py b/daemon/core/corehandlers.py index 83ecfbd1..8f6a4b03 100644 --- a/daemon/core/corehandlers.py +++ b/daemon/core/corehandlers.py @@ -129,11 +129,7 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler): logger.info("connection closed: %s", self.client_address) if self.session: - self.session.event_handlers.remove(self.handle_broadcast_event) - self.session.exception_handlers.remove(self.handle_broadcast_exception) - self.session.node_handlers.remove(self.handle_broadcast_node) - self.session.link_handlers.remove(self.handle_broadcast_link) - self.session.file_handlers.remove(self.handle_broadcast_file) + self.remove_session_handlers() # remove client from session broker and shutdown if there are no clients self.session.broker.session_clients.remove(self) @@ -517,11 +513,7 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler): # add handlers for various data logger.info("adding session broadcast handlers") - self.session.event_handlers.append(self.handle_broadcast_event) - self.session.exception_handlers.append(self.handle_broadcast_exception) - self.session.node_handlers.append(self.handle_broadcast_node) - self.session.link_handlers.append(self.handle_broadcast_link) - self.session.file_handlers.append(self.handle_broadcast_file) + self.add_session_handlers() # set initial session state self.session.set_state(state=EventTypes.DEFINITION_STATE.value) @@ -551,6 +543,24 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler): logger.info("BROADCAST TO OTHER CLIENT: %s", client) client.sendall(message.raw_message) + def add_session_handlers(self): + logger.info("adding session broadcast handlers") + self.session.event_handlers.append(self.handle_broadcast_event) + self.session.exception_handlers.append(self.handle_broadcast_exception) + self.session.node_handlers.append(self.handle_broadcast_node) + self.session.link_handlers.append(self.handle_broadcast_link) + self.session.file_handlers.append(self.handle_broadcast_file) + self.session.config_handlers.append(self.handle_broadcast_config) + + def remove_session_handlers(self): + logger.info("removing session broadcast handlers") + self.session.event_handlers.remove(self.handle_broadcast_event) + self.session.exception_handlers.remove(self.handle_broadcast_exception) + self.session.node_handlers.remove(self.handle_broadcast_node) + self.session.link_handlers.remove(self.handle_broadcast_link) + self.session.file_handlers.remove(self.handle_broadcast_file) + self.session.config_handlers.remove(self.handle_broadcast_config) + def handle_node_message(self, message): """ Node Message handler @@ -1506,11 +1516,7 @@ class CoreRequestHandler(SocketServer.BaseRequestHandler): # add broadcast handlers logger.info("adding session broadcast handlers") - self.session.event_handlers.append(self.handle_broadcast_event) - self.session.exception_handlers.append(self.handle_broadcast_exception) - self.session.node_handlers.append(self.handle_broadcast_node) - self.session.link_handlers.append(self.handle_broadcast_link) - self.session.file_handlers.append(self.handle_broadcast_file) + self.add_session_handlers() if user is not None: self.session.set_user(user) @@ -1751,11 +1757,7 @@ class BaseAuxRequestHandler(CoreRequestHandler): :return: nothing """ if self.session: - self.session.event_handlers.remove(self.handle_broadcast_event) - self.session.exception_handlers.remove(self.handle_broadcast_exception) - self.session.node_handlers.remove(self.handle_broadcast_node) - self.session.link_handlers.remove(self.handle_broadcast_link) - self.session.file_handlers.remove(self.handle_broadcast_file) + self.remove_session_handlers() self.session.shutdown() return SocketServer.BaseRequestHandler.finish(self) diff --git a/daemon/core/session.py b/daemon/core/session.py index 22883865..8922ccfd 100644 --- a/daemon/core/session.py +++ b/daemon/core/session.py @@ -5,6 +5,7 @@ that manages a CORE session. import atexit import os +import pprint import random import shlex import shutil @@ -1270,24 +1271,29 @@ class Session(object): links_data.append(link_data) # send all nodes first, so that they will exist for any links - logger.info("nodes: %s", nodes_data) - logger.info("links: %s", links_data) + logger.info("sending nodes:") for node_data in nodes_data: + logger.info(pprint.pformat(dict(node_data._asdict()))) self.broadcast_node(node_data) + logger.info("sending links:") for link_data in links_data: + logger.info(pprint.pformat(dict(link_data._asdict()))) self.broadcast_link(link_data) # send model info configs = self.mobility.getallconfigs() configs += self.emane.getallconfigs() + logger.info("sending model configs:") for node_number, cls, values in configs: + logger.info("config: node(%s) class(%s) values(%s)", node_number, cls, values) config_data = cls.config_data( flags=0, node_id=node_number, type_flags=ConfigFlags.UPDATE.value, values=values ) + logger.info(pprint.pformat(dict(config_data._asdict()))) self.broadcast_config(config_data) # service customizations diff --git a/daemon/core/xml/xmlparser1.py b/daemon/core/xml/xmlparser1.py index c1861526..3e2ec376 100644 --- a/daemon/core/xml/xmlparser1.py +++ b/daemon/core/xml/xmlparser1.py @@ -24,12 +24,14 @@ class CoreDocumentParser1(object): def __init__(self, session, filename, options): """ + Creates an CoreDocumentParser1 object. :param core.session.Session session: - :param filename: - :param options: + :param str filename: file name to open and parse + :param dict options: parsing options :return: """ + logger.info("creating xml parser: file (%s) options(%s)", filename, options) self.session = session self.filename = filename if 'dom' in options: @@ -56,11 +58,10 @@ class CoreDocumentParser1(object): def get_scenario(dom): scenario = xmlutils.get_first_child_by_tag_name(dom, 'scenario') if not scenario: - raise ValueError, 'no scenario element found' + raise ValueError('no scenario element found') version = scenario.getAttribute('version') if version and version != '1.0': - raise ValueError, \ - 'unsupported scenario version found: \'%s\'' % version + raise ValueError('unsupported scenario version found: \'%s\'' % version) return scenario def parse_scenario(self): @@ -210,6 +211,8 @@ class CoreDocumentParser1(object): else: # TODO: any other config managers? raise NotImplementedError + logger.info("setting wireless link params: node(%s) model(%s) mobility_model(%s)", + nodenum, model_name, mobility_model_name) mgr.setconfig_keyvalues(nodenum, model_name, link_params.items()) if mobility_model_name and mobility_params: mgr.setconfig_keyvalues(nodenum, mobility_model_name, mobility_params.items()) @@ -274,6 +277,7 @@ class CoreDocumentParser1(object): else: mobility_model_name = None mobility_params = None + if channel_type == 'wireless': self.set_wireless_link_parameters(channel, link_params, mobility_model_name, mobility_params) elif channel_type == 'ethernet': @@ -282,10 +286,12 @@ class CoreDocumentParser1(object): self.set_ethernet_link_parameters(channel, link_params, mobility_model_name, mobility_params) else: raise NotImplementedError + layer2_device = [] for dev, if_name in self.iter_network_member_devices(channel): if self.device_type(dev) in self.layer2_device_types: layer2_device.append((dev, if_name)) + assert len(layer2_device) <= 2 if len(layer2_device) == 2: self.link_layer2_devices(layer2_device[0][0], layer2_device[0][1],