def as_path(tokeniser): as_path = [] insert = None while True: value = tokeniser() if value == '[': value = tokeniser.peek() if value != '{': insert = SEQUENCE() else: insert = CONFED_SEQUENCE() elif value == '(': value = tokeniser.peek() if value != '{': insert = SET() else: insert = CONFED_SET() elif len(as_path) == 0: try: return ASPath(ASN.from_string(value)) except ValueError: raise ValueError('could not parse as-path') else: raise ValueError('could not parse as-path') while True: value = tokeniser() # could be too nice eating a trailing and ignore a erroneous },, # but simpler that way if value in (',', '}'): continue if value in (')', ']'): as_path.append(insert) value = tokeniser.peek() if value in ('[', '('): break return ASPath(as_path) try: insert.append(ASN.from_string(value)) continue except ValueError: raise ValueError('could not parse as-path')
def as_path(tokeniser): as_seq = [] as_set = [] value = tokeniser() inset = False try: if value == '[': while True: value = tokeniser() if value == ',': continue if value in ('(', '['): inset = True while True: value = tokeniser() if value in (')', ']'): break as_set.append(ASN.from_string(value)) if value == ')': inset = False continue if value == ']': if inset: inset = False continue break as_seq.append(ASN.from_string(value)) else: as_seq.append(ASN.from_string(value)) except ValueError: raise ValueError('could not parse as-path') return ASPath(as_seq, as_set)
def aspath(self, scope, name, command, tokens): as_seq = [] as_set = [] asn = tokens.pop(0) inset = False try: if asn == '[': while True: try: asn = tokens.pop(0) except IndexError: return self.error.set(self.syntax) if asn == ',': continue if asn in ('(', '['): inset = True while True: try: asn = tokens.pop(0) except IndexError: return self.error.set(self.syntax) if asn == ')': break as_set.append(Basic.newASN(asn)) if asn == ')': inset = False continue if asn == ']': if inset: inset = False continue break as_seq.append(Basic.newASN(asn)) else: as_seq.append(Basic.newASN(asn)) except (IndexError, ValueError): return self.error.set(self.syntax) scope[-1]['announce'][-1].attributes.add(ASPath(as_seq, as_set)) return True