Example #1
0
def _community(value):
    separator = value.find(':')
    if separator > 0:
        prefix = value[:separator]
        suffix = value[separator + 1:]

        if not prefix.isdigit() or not suffix.isdigit():
            raise ValueError('invalid community %s' % value)

        prefix, suffix = int(prefix), int(suffix)

        # XXX: FIXME: add a Community.MAX to pow(2,16) -1
        if prefix >= pow(2, 16):
            raise ValueError('invalid community %s (prefix too large)' % value)

        # XXX: FIXME: add a Community.MAX to pow(2,16) -1
        if suffix >= pow(2, 16):
            raise ValueError('invalid community %s (suffix too large)' % value)

        return Community(pack('!L', (prefix << 16) + suffix))

    elif value[:2].lower() == '0x':
        value = long(value, 16)
        # XXX: FIXME: add a Community.MAX to pow(2,16) -1
        if value >= pow(2, 32):
            raise ValueError('invalid community %s (too large)' % value)
        return Community(pack('!L', value))
    else:
        low = value.lower()
        if low == 'no-export':
            return Community(Community.NO_EXPORT)
        elif low == 'no-advertise':
            return Community(Community.NO_ADVERTISE)
        elif low == 'no-export-subconfed':
            return Community(Community.NO_EXPORT_SUBCONFED)
        # no-peer is not a correct syntax but I am sure someone will make the mistake :)
        elif low == 'nopeer' or low == 'no-peer':
            return Community(Community.NO_PEER)
        elif value.isdigit():
            value = unpack('!L', value)[0]
            if value >= pow(2, 32):
                raise ValueError('invalid community %s (too large)' % value)
            return Community(pack('!L', value))
        else:
            raise ValueError('invalid community name %s' % value)