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:]
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
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