コード例 #1
0
ファイル: parser.py プロジェクト: gklinich/exabgp
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')
コード例 #2
0
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)
コード例 #3
0
 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