def parse_default_services(self): # defaults from the CORE GUI self.default_services = { 'router': ['zebra', 'OSPFv2', 'OSPFv3', 'IPForward'], 'host': ['DefaultRoute', 'SSH'], 'PC': [ 'DefaultRoute', ], 'mdr': ['zebra', 'OSPFv3MDR', 'IPForward'], } default_services = xmlutils.get_first_child_by_tag_name( self.scenario, 'CORE:defaultservices') if not default_services: return for device in xmlutils.iter_children_with_name(default_services, 'device'): device_type = device.getAttribute('type') if not device_type: logger.warn( 'parse_default_services: no type attribute found for device' ) continue services = [] for service in xmlutils.iter_children_with_name(device, 'service'): name = service.getAttribute('name') if name: services.append(str(name)) self.default_services[device_type] = services # store default services for the session for t, s in self.default_services.iteritems(): self.session.services.defaultservices[t] = s logger.info('default services for node type \'%s\' set to: %s' % (t, s))
def parse_default_services(self): # defaults from the CORE GUI self.default_services = { 'router': ['zebra', 'OSPFv2', 'OSPFv3', 'IPForward'], 'host': ['DefaultRoute', 'SSH'], 'PC': ['DefaultRoute', ], 'mdr': ['zebra', 'OSPFv3MDR', 'IPForward'], } default_services = xmlutils.get_first_child_by_tag_name(self.scenario, 'CORE:defaultservices') if not default_services: return for device in xmlutils.iter_children_with_name(default_services, 'device'): device_type = device.getAttribute('type') if not device_type: logger.warn('parse_default_services: no type attribute found for device') continue services = [] for service in xmlutils.iter_children_with_name(device, 'service'): name = service.getAttribute('name') if name: services.append(str(name)) self.default_services[device_type] = services # store default services for the session for t, s in self.default_services.iteritems(): self.session.services.default_services[t] = s logger.info('default services for node type \'%s\' set to: %s' % (t, s))
def parse_addresses(self, interface): mac = [] ipv4 = [] ipv6 = [] hostname = [] for address in xmlutils.iter_children_with_name(interface, 'address'): addr_type = address.getAttribute('type') if not addr_type: msg = 'no type attribute found for address ' \ 'in interface: \'%s\'' % interface.toxml('utf-8') logger.warn(msg) assert False # XXX for testing addr_text = xmlutils.get_child_text_trim(address) if not addr_text: msg = 'no text found for address ' \ 'in interface: \'%s\'' % interface.toxml('utf-8') logger.warn(msg) assert False # XXX for testing if addr_type == 'mac': mac.append(addr_text) elif addr_type == 'IPv4': ipv4.append(addr_text) elif addr_type == 'IPv6': ipv6.append(addr_text) elif addr_type == 'hostname': hostname.append(addr_text) else: msg = 'skipping unknown address type \'%s\' in ' \ 'interface: \'%s\'' % (addr_type, interface.toxml('utf-8')) logger.warn(msg) assert False # XXX for testing return mac, ipv4, ipv6, hostname
def parse_device_services(self, services, node): """ Use session.services manager to store service customizations before they are added to a node. """ service_names = [] for service in xmlutils.iter_children_with_name(services, 'service'): name = self.parse_device_service(service, node) if name: service_names.append(name) return '|'.join(service_names)
def parse_session_hooks(self, session_config): """ Parse hook scripts. """ hooks = xmlutils.get_first_child_by_tag_name(session_config, 'hooks') if not hooks: return for hook in xmlutils.iter_children_with_name(hooks, 'hook'): filename = hook.getAttribute('name') state = hook.getAttribute('state') data = xmlutils.get_child_text_trim(hook) if data is None: data = '' # allow for empty file hook_type = "hook:%s" % state self.session.set_hook(hook_type, file_name=str(filename), source_name=None, data=str(data))
def parse_parameter_children(cls, parent): params = {} for parameter in xmlutils.iter_children_with_name(parent, 'parameter'): param_name = parameter.getAttribute('name') assert param_name # XXX for testing if not param_name: continue # TODO: consider supporting unicode; for now convert # to an ascii string param_name = str(param_name) param_val = cls.parse_xml_value(xmlutils.get_child_text_trim(parameter)) # TODO: check if the name already exists? if param_name and param_val: params[param_name] = param_val return params
def parse_layer3_device(self, device): objid, device_name = self.get_common_attributes(device) logger.info('parsing layer-3 device: name=%s id=%s', device_name, objid) try: return self.session.get_object(objid) except KeyError: logger.exception("error getting session object: %s", objid) device_cls = self.nodecls core_node_type = self.core_node_type(device) n = self.create_core_object(device_cls, objid, device_name, device, core_node_type) n.type = core_node_type self.add_device_services(n, device, core_node_type) for interface in xmlutils.iter_children_with_name(device, 'interface'): self.parse_interface(n, device.getAttribute('id'), interface) return n
def set_object_presentation(self, obj, element, node_type): # defaults from the CORE GUI default_icons = { 'router': 'router.gif', 'host': 'host.gif', 'PC': 'pc.gif', 'mdr': 'mdr.gif', } icon_set = False for child in xmlutils.iter_children_with_name(element, 'CORE:presentation'): canvas = child.getAttribute('canvas') if canvas: obj.canvas = int(canvas) icon = child.getAttribute('icon') if icon: icon = str(icon).replace("$CORE_DATA_DIR", constants.CORE_DATA_DIR) obj.icon = icon icon_set = True if not icon_set and node_type in default_icons: obj.icon = default_icons[node_type]
def parse_network(self, network): """ Each network element should have an 'id' and 'name' attribute and include the following child elements: type (one) member (zero or more with type="interface" or type="channel") channel (zero or more) """ layer2_members = set() layer3_members = 0 for dev, if_name in self.iter_network_member_devices(network): if not dev: continue devtype = self.device_type(dev) if devtype in self.layer2_device_types: layer2_members.add(dev) elif devtype in self.layer3_device_types: layer3_members += 1 else: raise NotImplementedError if len(layer2_members) == 0: net_type = xmlutils.get_first_child_text_trim_by_tag_name( network, 'type') if not net_type: logger.warn('no network type found for network: \'%s\'', network.toxml('utf-8')) assert False # XXX for testing net_cls = self.network_class(network, net_type) objid, net_name = self.get_common_attributes(network) logger.info('parsing network: name=%s id=%s' % (net_name, objid)) if objid in self.session.objects: return n = self.create_core_object(net_cls, objid, net_name, network, None) # handle channel parameters for channel in xmlutils.iter_children_with_name(network, 'channel'): self.parse_network_channel(channel)
def parse_network(self, network): """ Each network element should have an 'id' and 'name' attribute and include the following child elements: type (one) member (zero or more with type="interface" or type="channel") channel (zero or more) """ layer2_members = set() layer3_members = 0 for dev, if_name in self.iter_network_member_devices(network): if not dev: continue devtype = self.device_type(dev) if devtype in self.layer2_device_types: layer2_members.add(dev) elif devtype in self.layer3_device_types: layer3_members += 1 else: raise NotImplementedError if len(layer2_members) == 0: net_type = xmlutils.get_first_child_text_trim_by_tag_name(network, 'type') if not net_type: logger.warn('no network type found for network: \'%s\'', network.toxml('utf-8')) assert False # XXX for testing net_cls = self.network_class(network, net_type) objid, net_name = self.get_common_attributes(network) logger.info('parsing network: name=%s id=%s' % (net_name, objid)) if objid in self.session.objects: return n = self.create_core_object(net_cls, objid, net_name, network, None) # handle channel parameters for channel in xmlutils.iter_children_with_name(network, 'channel'): self.parse_network_channel(channel)
def parse_device_service(self, service, node): name = service.getAttribute('name') session_service = ServiceManager.get(name) if not session_service: assert False # XXX for testing values = [] startup_idx = service.getAttribute('startup_idx') if startup_idx: values.append('startidx=%s' % startup_idx) startup_time = service.getAttribute('start_time') if startup_time: values.append('starttime=%s' % startup_time) dirs = [] for directory in xmlutils.iter_children_with_name(service, 'directory'): dirname = directory.getAttribute('name') dirs.append(str(dirname)) if dirs: values.append("dirs=%s" % dirs) startup = [] shutdown = [] validate = [] for command in xmlutils.iter_children_with_name(service, 'command'): command_type = command.getAttribute('type') command_text = xmlutils.get_child_text_trim(command) if not command_text: continue if command_type == 'start': startup.append(str(command_text)) elif command_type == 'stop': shutdown.append(str(command_text)) elif command_type == 'validate': validate.append(str(command_text)) if startup: values.append('cmdup=%s' % startup) if shutdown: values.append('cmddown=%s' % shutdown) if validate: values.append('cmdval=%s' % validate) filenames = [] files = [] for f in xmlutils.iter_children_with_name(service, 'file'): filename = f.getAttribute('name') if not filename: continue filenames.append(filename) data = xmlutils.get_child_text_trim(f) if data: data = str(data) else: data = None typestr = 'service:%s:%s' % (name, filename) files.append((typestr, filename, data)) if filenames: values.append('files=%s' % filenames) custom = service.getAttribute('custom') if custom and custom.lower() == 'true': self.session.services.set_service(node.objid, session_service.name) values = ConfigShim.str_to_dict("|".join(values)) for key, value in values.iteritems(): ServiceShim.setvalue(session_service, key, value) # NOTE: if a custom service is used, setservicefile() must be # called after the custom service exists for typestr, filename, data in files: svcname = typestr.split(":")[1] self.session.services.set_service_file( node_id=node.objid, service_name=svcname, file_name=filename, data=data ) return str(name)
def parse_device_service(self, service, node): name = service.getAttribute('name') session_service = ServiceManager.get(name) if not session_service: assert False # XXX for testing values = [] startup_idx = service.getAttribute('startup_idx') if startup_idx: values.append('startidx=%s' % startup_idx) startup_time = service.getAttribute('start_time') if startup_time: values.append('starttime=%s' % startup_time) dirs = [] for directory in xmlutils.iter_children_with_name( service, 'directory'): dirname = directory.getAttribute('name') dirs.append(str(dirname)) if dirs: values.append("dirs=%s" % dirs) startup = [] shutdown = [] validate = [] for command in xmlutils.iter_children_with_name(service, 'command'): command_type = command.getAttribute('type') command_text = xmlutils.get_child_text_trim(command) if not command_text: continue if command_type == 'start': startup.append(str(command_text)) elif command_type == 'stop': shutdown.append(str(command_text)) elif command_type == 'validate': validate.append(str(command_text)) if startup: values.append('cmdup=%s' % startup) if shutdown: values.append('cmddown=%s' % shutdown) if validate: values.append('cmdval=%s' % validate) filenames = [] files = [] for f in xmlutils.iter_children_with_name(service, 'file'): filename = f.getAttribute('name') if not filename: continue filenames.append(filename) data = xmlutils.get_child_text_trim(f) if data: data = str(data) else: data = None typestr = 'service:%s:%s' % (name, filename) files.append((typestr, filename, data)) if filenames: values.append('files=%s' % filenames) custom = service.getAttribute('custom') if custom and custom.lower() == 'true': self.session.services.setcustomservice(node.objid, session_service, values) # NOTE: if a custom service is used, setservicefile() must be # called after the custom service exists for typestr, filename, data in files: self.session.services.setservicefile(nodenum=node.objid, type=typestr, filename=filename, srcname=None, data=data) return str(name)