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)