def add(self, lines, parents=None): """Adds one or lines of configuration """ ancestors = list() offset = 0 obj = None ## global config command if not parents: for line in to_list(lines): item = ConfigLine(line) item.raw = line if item not in self.items: self.items.append(item) else: for index, p in enumerate(parents): try: i = index + 1 obj = self.get_section_objects(parents[:i])[0] ancestors.append(obj) except ValueError: # add parent to config offset = index * self.indent obj = ConfigLine(p) obj.raw = p.rjust(len(p) + offset) if ancestors: obj.parents = list(ancestors) ancestors[-1].children.append(obj) self.items.append(obj) ancestors.append(obj) # add child objects for line in to_list(lines): # check if child already exists for child in ancestors[-1].children: if child.text == line: break else: offset = len(parents) * self.indent item = ConfigLine(line) item.raw = line.rjust(len(line) + offset) item.parents = ancestors ancestors[-1].children.append(item) self.items.append(item)
def os6_parse(lines, indent=None, comment_tokens=None): sublevel_cmds = [ re.compile(r'^vlan.*$'), re.compile(r'^stack.*$'), re.compile(r'^interface.*$'), re.compile(r'datacenter-bridging.*$'), re.compile(r'line (console|telnet|ssh).*$'), re.compile(r'ip ssh !(server).*$'), re.compile(r'ip (dhcp|vrf).*$'), re.compile(r'(ip|mac|management|arp) access-list.*$'), re.compile(r'ipv6 (dhcp|router).*$'), re.compile(r'mail-server.*$'), re.compile(r'vpc domain.*$'), re.compile(r'router.*$'), re.compile(r'route-map.*$'), re.compile(r'policy-map.*$'), re.compile(r'class-map match-all.*$'), re.compile(r'captive-portal.*$'), re.compile(r'admin-profile.*$'), re.compile(r'link-dependency group.*$'), re.compile(r'banner motd.*$'), re.compile(r'openflow.*$'), re.compile(r'support-assist.*$'), re.compile(r'template.*$'), re.compile(r'address-family.*$'), re.compile(r'spanning-tree mst.*$'), re.compile(r'logging.*$'), re.compile(r'(radius-server|tacacs-server) host.*$') ] childline = re.compile(r'^exit$') config = list() parent = list() children = [] parent_match = False for line in str(lines).split('\n'): text = str(re.sub(r'([{};])', '', line)).strip() cfg = ConfigLine(text) cfg.raw = line if not text or ignore_line(text, comment_tokens): parent = list() children = [] continue else: parent_match = False # handle sublevel parent for pr in sublevel_cmds: if pr.match(line): if len(parent) != 0: cfg.parents.extend(parent) parent.append(cfg) config.append(cfg) if children: children.insert(len(parent) - 1, []) children[len(parent) - 2].append(cfg) parent_match = True continue # handle exit if childline.match(line): if children: parent[len(children) - 1].children.extend( children[len(children) - 1]) if len(children) > 1: parent[len(children) - 2].children.extend( parent[len(children) - 1].children) cfg.parents.extend(parent) children.pop() parent.pop() if not children: children = list() if parent: cfg.parents.extend(parent) parent = list() config.append(cfg) # handle sublevel children elif parent_match is False and len(parent) > 0: if not children: cfglist = [cfg] children.append(cfglist) else: children[len(parent) - 1].append(cfg) cfg.parents.extend(parent) config.append(cfg) # handle global commands elif not parent: config.append(cfg) return config
def os6_parse(lines, indent=None, comment_tokens=None): sublevel_cmds = [ re.compile(r'^vlan.*$'), re.compile(r'^stack.*$'), re.compile(r'^interface.*$'), re.compile(r'line (console|telnet|ssh).*$'), re.compile(r'ip ssh !(server).*$'), re.compile(r'ip (dhcp|vrf).*$'), re.compile(r'(ip|mac|management|arp) access-list.*$'), re.compile(r'ipv6 (dhcp|router).*$'), re.compile(r'mail-server.*$'), re.compile(r'vpc domain.*$'), re.compile(r'router.*$'), re.compile(r'route-map.*$'), re.compile(r'policy-map.*$'), re.compile(r'class-map match-all.*$'), re.compile(r'captive-portal.*$'), re.compile(r'admin-profile.*$'), re.compile(r'link-dependency group.*$'), re.compile(r'banner motd.*$'), re.compile(r'openflow.*$'), re.compile(r'support-assist.*$'), re.compile(r'(radius-server|tacacs-server) host.*$') ] childline = re.compile(r'^exit$') config = list() inSubLevel = False parent = None children = list() subcommandcount = 0 for line in str(lines).split('\n'): text = str(re.sub(r'([{};])', '', line)).strip() cfg = ConfigLine(text) cfg.raw = line if not text or ignore_line(text, comment_tokens): parent = None children = list() inSubLevel = False continue if inSubLevel is False: for pr in sublevel_cmds: if pr.match(line): parent = cfg config.append(parent) inSubLevel = True continue if parent is None: config.append(cfg) # handle sub level commands elif inSubLevel and childline.match(line): parent.children = children inSubLevel = False children = list() parent = None # handle top level commands elif inSubLevel: children.append(cfg) cfg.parents = [parent] config.append(cfg) else: # global level config.append(cfg) return config
def os6_parse(lines, indent=None, comment_tokens=None): sublevel_cmds = [ re.compile(r'^vlan.*$'), re.compile(r'^stack.*$'), re.compile(r'^interface.*$'), re.compile(r'datacenter-bridging.*$'), re.compile(r'line (console|telnet|ssh).*$'), re.compile(r'ip ssh !(server).*$'), re.compile(r'ip (dhcp|vrf).*$'), re.compile(r'(ip|mac|management|arp) access-list.*$'), re.compile(r'ipv6 (dhcp|router).*$'), re.compile(r'mail-server.*$'), re.compile(r'vpc domain.*$'), re.compile(r'router.*$'), re.compile(r'route-map.*$'), re.compile(r'policy-map.*$'), re.compile(r'class-map match-all.*$'), re.compile(r'captive-portal.*$'), re.compile(r'admin-profile.*$'), re.compile(r'link-dependency group.*$'), re.compile(r'banner motd.*$'), re.compile(r'openflow.*$'), re.compile(r'support-assist.*$'), re.compile(r'template.*$'), re.compile(r'address-family.*$'), re.compile(r'spanning-tree mst configuration.*$'), re.compile(r'logging.*$'), re.compile(r'(radius-server|tacacs-server) host.*$')] childline = re.compile(r'^exit$') config = list() parent = list() children = [] parent_match = False for line in str(lines).split('\n'): text = str(re.sub(r'([{};])', '', line)).strip() cfg = ConfigLine(text) cfg.raw = line if not text or ignore_line(text, comment_tokens): parent = list() children = [] continue else: parent_match = False # handle sublevel parent for pr in sublevel_cmds: if pr.match(line): if len(parent) != 0: cfg._parents.extend(parent) parent.append(cfg) config.append(cfg) if children: children.insert(len(parent) - 1, []) children[len(parent) - 2].append(cfg) parent_match = True continue # handle exit if childline.match(line): if children: parent[len(children) - 1]._children.extend(children[len(children) - 1]) if len(children) > 1: parent[len(children) - 2]._children.extend(parent[len(children) - 1]._children) cfg._parents.extend(parent) children.pop() parent.pop() if not children: children = list() if parent: cfg._parents.extend(parent) parent = list() config.append(cfg) # handle sublevel children elif parent_match is False and len(parent) > 0: if not children: cfglist = [cfg] children.append(cfglist) else: children[len(parent) - 1].append(cfg) cfg._parents.extend(parent) config.append(cfg) # handle global commands elif not parent: config.append(cfg) return config
def os6_parse(lines, indent=None, comment_tokens=None): sublevel_cmds = [ re.compile(r'^vlan.*$'), re.compile(r'^stack.*$'), re.compile(r'^interface.*$'), re.compile(r'line (console|telnet|ssh).*$'), re.compile(r'ip ssh !(server).*$'), re.compile(r'ip (dhcp|vrf).*$'), re.compile(r'(ip|mac|management|arp) access-list.*$'), re.compile(r'ipv6 (dhcp|router).*$'), re.compile(r'mail-server.*$'), re.compile(r'vpc domain.*$'), re.compile(r'router.*$'), re.compile(r'route-map.*$'), re.compile(r'policy-map.*$'), re.compile(r'class-map match-all.*$'), re.compile(r'captive-portal.*$'), re.compile(r'admin-profile.*$'), re.compile(r'link-dependency group.*$'), re.compile(r'banner motd.*$'), re.compile(r'openflow.*$'), re.compile(r'support-assist.*$'), re.compile(r'(radius-server|tacacs-server) host.*$')] childline = re.compile(r'^exit$') config = list() inSubLevel = False parent = None children = list() subcommandcount = 0 for line in str(lines).split('\n'): text = str(re.sub(r'([{};])', '', line)).strip() cfg = ConfigLine(text) cfg.raw = line if not text or ignore_line(text, comment_tokens): parent = None children = list() inSubLevel = False continue if inSubLevel is False: for pr in sublevel_cmds: if pr.match(line): parent = cfg config.append(parent) inSubLevel = True continue if parent is None: config.append(cfg) # handle sub level commands elif inSubLevel and childline.match(line): parent.children = children inSubLevel = False children = list() parent = None # handle top level commands elif inSubLevel: children.append(cfg) cfg.parents = [parent] config.append(cfg) else: # global level config.append(cfg) return config