def _bind (self,ip,port): try: if isipv6(ip): s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, socket.IPPROTO_TCP) try: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) except (socket.error,AttributeError): pass s.bind((ip,port,0,0)) elif isipv4(ip): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP) try: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) except (socket.error,AttributeError): pass s.bind((ip,port)) else: return None s.setblocking(0) ##s.settimeout(0.0) s.listen(self._backlog) return s except socket.error, e: if e.args[0] == errno.EADDRINUSE: raise BindingError('could not listen on %s:%d, the port already in use by another application' % (ip,self._port)) elif e.args[0] == errno.EADDRNOTAVAIL: raise BindingError('could not listen on %s:%d, this is an invalid address' % (ip,self._port)) else: raise BindingError('could not listen on %s:%d (%s)' % (ip,self._port,errstr(e)))
def _operational(klass, parameters, tokeniser): def utf8(string): return string.encode('utf-8') def valid(_): return True def u32(_): return int(_) <= 0xFFFFFFFF def u64(_): return int(_) <= 0xFFFFFFFFFFFFFFFF def advisory(_): return len(_.encode('utf-8')) <= MAX_ADVISORY + 2 # the two quotes convert = {'afi': AFI.value, 'safi': SAFI.value, 'sequence': int, 'counter': int, 'advisory': utf8} validate = { 'afi': AFI.value, 'safi': SAFI.value, 'sequence': u32, 'counter': u64, } number = len(parameters) * 2 tokens = [] while len(tokens) != number: tokens.append(tokeniser()) data = {} while tokens and parameters: command = tokens.pop(0).lower() value = tokens.pop(0) if command == 'router-id': if isipv4(value): data['routerid'] = RouterID(value) else: raise ValueError('invalid operational value for %s' % command) continue expected = parameters.pop(0) if command != expected: raise ValueError('invalid operational syntax, unknown argument %s' % command) if not validate.get(command, valid)(value): raise ValueError('invalid operational value for %s' % command) data[command] = convert[command](value) if tokens or parameters: raise ValueError('invalid advisory syntax, missing argument(s) %s' % ', '.join(parameters)) if 'routerid' not in data: data['routerid'] = None return klass(**data)
def _operational (klass, parameters, tokeniser): def utf8 (string): return string.encode('utf-8') def valid (_): return True def u32 (_): return int(_) <= 0xFFFFFFFF def u64 (_): return long(_) <= 0xFFFFFFFFFFFFFFFF def advisory (_): return len(_.encode('utf-8')) <= MAX_ADVISORY + 2 # the two quotes convert = { 'afi': AFI.value, 'safi': SAFI.value, 'sequence': int, 'counter': long, 'advisory': utf8 } validate = { 'afi': AFI.value, 'safi': SAFI.value, 'sequence': u32, 'counter': u64, } number = len(parameters)*2 tokens = [] while len(tokens) != number: tokens.append(tokeniser()) data = {} while tokens and parameters: command = tokens.pop(0).lower() value = tokens.pop(0) if command == 'router-id': if isipv4(value): data['routerid'] = RouterID(value) else: raise ValueError('invalid operational value for %s' % command) continue expected = parameters.pop(0) if command != expected: raise ValueError('invalid operational syntax, unknown argument %s' % command) if not validate.get(command,valid)(value): raise ValueError('invalid operational value for %s' % command) data[command] = convert[command](value) if tokens or parameters: raise ValueError('invalid advisory syntax, missing argument(s) %s' % ', '.join(parameters)) if 'routerid' not in data: data['routerid'] = None return klass(**data)
def _single_operational (self, klass, scope, parameters, value): def utf8 (string): return string.encode('utf-8')[1:-1] convert = { 'afi': AFI.value, 'safi': SAFI.value, 'sequence': int, 'counter': long, 'advisory': utf8 } def valid (_): return True def u32 (_): return int(_) <= 0xFFFFFFFF def u64 (_): return long(_) <= 0xFFFFFFFFFFFFFFFF def advisory (_): return len(_.encode('utf-8')) <= MAX_ADVISORY + 2 # the two quotes validate = { 'afi': AFI.value, 'safi': SAFI.value, 'sequence': u32, 'counter': u64, } number = len(parameters)*2 tokens = formated(value).split(' ',number-1) if len(tokens) != number: return self.error.set('invalid operational syntax, wrong number of arguments') return False data = {} while tokens and parameters: command = tokens.pop(0).lower() value = tokens.pop(0) if command == 'router-id': if isipv4(value): data['routerid'] = RouterID(value) else: return self.error.set('invalid operational value for %s' % command) return False continue expected = parameters.pop(0) if command != expected: return self.error.set('invalid operational syntax, unknown argument %s' % command) return False if not validate.get(command,valid)(value): return self.error.set('invalid operational value for %s' % command) return False data[command] = convert[command](value) if tokens or parameters: return self.error.set('invalid advisory syntax, missing argument(s) %s' % ', '.join(parameters)) return False if 'routerid' not in data: data['routerid'] = None if 'operational-message' not in scope[-1]: scope[-1]['operational-message'] = [] # iterate on each family for the peer if multiprotocol is set. scope[-1]['operationa-messagel'].append(klass(**data)) return True
def _operational(self, klass, parameters, tokens): def utf8(string): return string.encode('utf-8')[1:-1] convert = { 'afi': AFI.value, 'safi': SAFI.value, 'sequence': int, 'counter': long, 'advisory': utf8 } def valid(_): return True def u32(_): return int(_) <= 0xFFFFFFFF def u64(_): return long(_) <= 0xFFFFFFFFFFFFFFFF def advisory(_): return len(_.encode('utf-8')) <= MAX_ADVISORY + 2 # the two quotes validate = { 'afi': AFI.value, 'safi': SAFI.value, 'sequence': u32, 'counter': u64, } number = len(parameters) * 2 tokens = formated(tokens).split(' ', number - 1) if len(tokens) != number: return self.error.set( 'invalid operational syntax, wrong number of arguments') data = {} while tokens and parameters: command = tokens.pop(0).lower() value = tokens.pop(0) if command == 'router-id': if isipv4(value): data['routerid'] = RouterID(value) else: self.error.set('invalid operational value for %s' % command) return None continue expected = parameters.pop(0) if command != expected: self.error.set( 'invalid operational syntax, unknown argument %s' % command) return None if not validate.get(command, valid)(value): self.error.set('invalid operational value for %s' % command) return None data[command] = convert[command](value) if tokens or parameters: self.error.set('invalid advisory syntax, missing argument(s) %s' % ', '.join(parameters)) return None if 'routerid' not in data: data['routerid'] = None return klass(**data)