Пример #1
0
    def read_request(self, fileno):
        """Store information about the data request for processing"""
        try:
            new_request = self.connections[fileno].recv(
                WesEntropyDaemon.READ_SIZE)
            request = self.requests[fileno]['partial_req'] + new_request
        except IOError as error:
            if error.errno == errno.EAGAIN or error.errno == errno.EWOULDBLOCK:
                logging.warning("No data for recv to get. (error: %s)",
                                errno.errorcode[error.errno])
            else:
                logging.error("Error on recv (error: %s)",
                              errno.errorcode[error.errno])
                logging.debug("Calling handle_error on %s.", fileno)
                self.handle_error(fileno)

        num_requests = len(request) / 8

        logging.debug("Current num_requests: %i", num_requests)

        for index in range(num_requests):
            msg = DaemonMsg(request[8*index:8*index+8])
            if msg.is_rand_request():
                self.requests[fileno]['bytes_req'] += msg.get_num_bytes()
            elif msg.is_stats_request():
                self.requests[fileno]['send_stats'] = True
            else:
                continue

        self.requests[fileno]['partial_req'] = request[num_requests*8:]
Пример #2
0
    def request_stats(self):
        """Request stats from server."""
        success = False
        if self.socket is None:
            return success

        logging.debug("Request stats")
        request = DaemonMsg.construct_stats_request()

        bytes_written = 0
        try:
            bytes_written = self.socket.send(request)
        except IOError as error:
            logging.error("Error on send (error: %s)",
                          errno.errorcode[error.errno])

        if bytes_written == len(request):
            logging.debug("Requested stats")

            success = True
        else:
            logging.error("Failed to write all bytes: wrote %i",
                          bytes_written)
            self.destroy()
        return success
Пример #3
0
    def request_data(self, num_bytes):
        """Request num_bytes of entropy from server

        Return True if request is sent successfully.

        The variable timer is used to track how long it has been since
        the last communication with the server.

        If timer is None, timer is set to the time of the send.
        Otherwise, timer is not changed.
        """
        if num_bytes == 0:
            return True

        success = False

        logging.debug("Request %i bytes", num_bytes)
        if self.status_ok():
            request = DaemonMsg.construct_request(num_bytes)

            bytes_written = 0
            try:
                bytes_written = self.socket.send(request)
            except IOError as error:
                logging.error("Error on send (error: %s)", errno.errorcode[error.errno])

            if bytes_written == len(request):
                logging.debug("Requested %i bytes", num_bytes)
                self.outstanding_bytes += num_bytes
                if self.timer is None:
                    self.timer = datetime.datetime.now()

                success = True
            else:
                logging.error("Failed to write all bytes: wrote %i", bytes_written)
                self.destroy()
        return success