Exemplo n.º 1
0
	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)))
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
	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
Exemplo n.º 5
0
    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)