def handle_job_finished(self): data = self._extract_data_from_message((yield self.read_message())) if not Request.is_valid(data, Request.Command.JOB_FINISHED): if Request.is_valid(data, Request.Command.JOB_FAILED): _logger.warn("[%s] Job failed!" % CLIENT) request = Request.request_from_data(data) ConverterWebSocketHandler.notify(NotificationType.JOB_FAILED, request.args) return raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) _logger.info("[%s]: Received file transfer notification" % SERVER) job_ID = int(request.args[Request.ARGS_JOB_ID]) file_name = str(job_ID) + CATROBAT_FILE_EXT file_size = int(request.args[Request.ARGS_FILE_SIZE]) file_hash = request.args[Request.ARGS_FILE_HASH] _logger.info("[%s]: Job ID: %d, File size: %d, SHA256: %s" % (CLIENT, job_ID, file_size, file_hash)) if file_size == 0: raise TCPConnectionException("Cannot transfer empty file...", context=request.args) _logger.debug("[%s]: Reply: Accepted!" % SERVER) yield self.send_message( Reply(result=True, msg="Ready for file transfer!")) download_dir = self.server.settings["download_dir"] file_path = os.path.join(download_dir, file_name) max_input_buffer_size = int( self.server.settings["max_input_buffer_size"]) with open(file_path, 'wb+', 0) as f: if file_size <= max_input_buffer_size: f.write((yield self.read_bytes(file_size))) else: transfered_bytes = 0 while transfered_bytes < file_size: buffer_size = min((file_size - transfered_bytes), max_input_buffer_size) f.write((yield self.read_bytes(buffer_size))) transfered_bytes += buffer_size f.seek(0, 0) computed_file_hash = hashlib.sha256(f.read()).hexdigest() if computed_file_hash != file_hash: raise TCPConnectionException( "Given hash value is not equal to computed hash value.", context=request.args) _logger.debug("[%s]: Reply: Accepted!" % SERVER) _logger.info( "OK! Hash is equal to computed hash value. Finished file transfer!" ) yield self.send_message(Reply(result=True, msg="OK! Hash is equal to computed " \ "hash value. Finished file transfer!")) ConverterWebSocketHandler.notify(NotificationType.JOB_FINISHED, request.args)
def handle_authentication(self): data = self._extract_data_from_message((yield self.read_message())) if not Request.is_valid(data, Request.Command.AUTH): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) address = self.connection.address host = address[0] if isinstance(address, tuple) else address allowed_auth_keys = self.server.settings["allowed_auth_keys"] allowed_auth_keys_for_host = [ auth_key["key"] for auth_key in allowed_auth_keys if auth_key["host"] == host ] if len(allowed_auth_keys_for_host) == 0: _logger.warn( "An intruder '%s' might have tried to connect to our server!" % (str(address))) # TODO: block him... # Don't tell the client that this hostname is forbidden raise TCPConnectionException("Invalid AUTH_KEY given.") if request.args[ Request.ARGS_AUTH_KEY] not in allowed_auth_keys_for_host: raise TCPConnectionException("Invalid AUTH_KEY given.") _logger.info("[%s]: Reply: Authentication successful!" % SERVER) yield self.send_message( Reply(result=True, msg="Authentication successful!"))
def handle_job_finished(self): data = self._extract_data_from_message((yield self.read_message())) if not Request.is_valid(data, Request.Command.JOB_FINISHED): if Request.is_valid(data, Request.Command.JOB_FAILED): _logger.warn("[%s] Job failed!" % CLIENT) request = Request.request_from_data(data) ConverterWebSocketHandler.notify(NotificationType.JOB_FAILED, request.args) return raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) _logger.info("[%s]: Received file transfer notification" % SERVER) job_ID = int(request.args[Request.ARGS_JOB_ID]) file_name = str(job_ID) + CATROBAT_FILE_EXT file_size = int(request.args[Request.ARGS_FILE_SIZE]) file_hash = request.args[Request.ARGS_FILE_HASH] _logger.info("[%s]: Job ID: %d, File size: %d, SHA256: %s" % (CLIENT, job_ID, file_size, file_hash)) if file_size == 0: raise TCPConnectionException("Cannot transfer empty file...", context=request.args) _logger.debug("[%s]: Reply: Accepted!" % SERVER) yield self.send_message(Reply(result=True, msg="Ready for file transfer!")) download_dir = self.server.settings["download_dir"] file_path = os.path.join(download_dir, file_name) max_input_buffer_size = int(self.server.settings["max_input_buffer_size"]) with open(file_path, 'wb+', 0) as f: if file_size <= max_input_buffer_size: f.write((yield self.read_bytes(file_size))) else: transfered_bytes = 0 while transfered_bytes < file_size: buffer_size = min((file_size - transfered_bytes), max_input_buffer_size) f.write((yield self.read_bytes(buffer_size))) transfered_bytes += buffer_size f.seek(0, 0) computed_file_hash = hashlib.sha256(f.read()).hexdigest() if computed_file_hash != file_hash: raise TCPConnectionException("Given hash value is not equal to computed hash value.", context=request.args) _logger.debug("[%s]: Reply: Accepted!" % SERVER) _logger.info("OK! Hash is equal to computed hash value. Finished file transfer!") yield self.send_message(Reply(result=True, msg="OK! Hash is equal to computed " \ "hash value. Finished file transfer!")) ConverterWebSocketHandler.notify(NotificationType.JOB_FINISHED, request.args)
def handle_job_output_notification(self, data): if not Request.is_valid(data, Request.Command.JOB_OUTPUT_NOTIFICATION): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) _logger.debug("[%s]: Received job output notification" % SERVER) for line in request.args[Request.ARGS_LINES]: _logger.debug("[%s]: %s" % (CLIENT, line)) # _logger.debug("[%s]: Reply: Accepted!" % SERVER) # yield self.send_message(Reply(result=True, msg="ACK")) ConverterWebSocketHandler.notify(NotificationType.JOB_OUTPUT, request.args)
def handle_job_output_notification(self, data): if not Request.is_valid(data, Request.Command.JOB_OUTPUT_NOTIFICATION): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) _logger.debug("[%s]: Received job output notification" % SERVER) for line in request.args[Request.ARGS_LINES]: _logger.debug("[%s]: %s" % (CLIENT, line)) # _logger.debug("[%s]: Reply: Accepted!" % SERVER) # yield self.send_message(Reply(result=True, msg="ACK")) ConverterWebSocketHandler.notify(NotificationType.JOB_OUTPUT, request.args)
def handle_job_started_notification(self): data = self._extract_data_from_message((yield self.read_message())) if not Request.is_valid(data, Request.Command.JOB_STARTED_NOTIFICATION): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) _logger.info("[%s]: Received job start notification" % SERVER) _logger.info("[%s]: Title of Scratch program: '%s'" % (CLIENT, unicode(request.args[Request.ARGS_TITLE]))) _logger.debug("[%s]: Reply: Accepted!" % SERVER) yield self.send_message(Reply(result=True, msg="ACK")) ConverterWebSocketHandler.notify(NotificationType.JOB_STARTED, request.args)
def handle_job_started_notification(self): data = self._extract_data_from_message((yield self.read_message())) if not Request.is_valid(data, Request.Command.JOB_STARTED_NOTIFICATION): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) _logger.info("[%s]: Received job start notification" % SERVER) _logger.info("[%s]: Title of Scratch program: '%s'" % (CLIENT, unicode(request.args[Request.ARGS_TITLE]))) _logger.debug("[%s]: Reply: Accepted!" % SERVER) yield self.send_message(Reply(result=True, msg="ACK")) ConverterWebSocketHandler.notify(NotificationType.JOB_STARTED, request.args)
def handle_job_progress_notification(self, data): if not Request.is_valid(data, Request.Command.JOB_PROGRESS_NOTIFICATION): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) if not isinstance(request.args[Request.ARGS_PROGRESS], int): raise TCPConnectionException("Progress parameter must be of type int!") _logger.debug("[%s]: Received job progress notification (Progress: %d%%)" % (SERVER, request.args[Request.ARGS_PROGRESS])) # _logger.debug("[%s]: Reply: Accepted!" % SERVER) # yield self.send_message(Reply(result=True, msg="ACK")) ConverterWebSocketHandler.notify(NotificationType.JOB_PROGRESS, request.args)
def handle_job_progress_notification(self, data): if not Request.is_valid(data, Request.Command.JOB_PROGRESS_NOTIFICATION): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) if not isinstance(request.args[Request.ARGS_PROGRESS], int): raise TCPConnectionException("Progress parameter must be of type int!") _logger.debug("[%s]: Received job progress notification (Progress: %d%%)" % (SERVER, request.args[Request.ARGS_PROGRESS])) # _logger.debug("[%s]: Reply: Accepted!" % SERVER) # yield self.send_message(Reply(result=True, msg="ACK")) ConverterWebSocketHandler.notify(NotificationType.JOB_PROGRESS, request.args)
def handle_job_conversion_finished_notification(self, data): if data == None or not Request.is_valid(data, Request.Command.JOB_CONVERSION_FINISHED_NOTIFICATION): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) _logger.info("[%s]: Received job finished notification" % SERVER) _logger.info("[%s]: %s " % (CLIENT, request.args[Request.ARGS_MSG])) exit_code = int(request.args[Request.ARGS_RESULT]) _logger.info("[%s]: Job finished with exit code: %d" % (SERVER, exit_code)) if exit_code != 0: raise TCPConnectionException("Job failed with exit code: %d" % exit_code, context=request.args) _logger.debug("[%s]: Reply: Accepted!" % SERVER) yield self.send_message(Reply(result=True, msg="ACK")) ConverterWebSocketHandler.notify(NotificationType.JOB_CONVERSION_FINISHED, request.args)
def handle_job_conversion_finished_notification(self, data): if data == None or not Request.is_valid(data, Request.Command.JOB_CONVERSION_FINISHED_NOTIFICATION): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) _logger.info("[%s]: Received job finished notification" % SERVER) _logger.info("[%s]: %s " % (CLIENT, request.args[Request.ARGS_MSG])) exit_code = int(request.args[Request.ARGS_RESULT]) _logger.info("[%s]: Job finished with exit code: %d" % (SERVER, exit_code)) if exit_code != 0: raise TCPConnectionException("Job failed with exit code: %d" % exit_code, context=request.args) _logger.debug("[%s]: Reply: Accepted!" % SERVER) yield self.send_message(Reply(result=True, msg="ACK")) ConverterWebSocketHandler.notify(NotificationType.JOB_CONVERSION_FINISHED, request.args)
def handle_authentication(self): data = self._extract_data_from_message((yield self.read_message())) if not Request.is_valid(data, Request.Command.AUTH): raise TCPConnectionException("Invalid data given!") request = Request.request_from_data(data) address = self.connection.address host = address[0] if isinstance(address, tuple) else address allowed_auth_keys = self.server.settings["allowed_auth_keys"] allowed_auth_keys_for_host = [auth_key["key"] for auth_key in allowed_auth_keys if auth_key["host"] == host] if len(allowed_auth_keys_for_host) == 0: _logger.warn("An intruder '%s' might have tried to connect to our server!" %(str(address))) # TODO: block him... # Don't tell the client that this hostname is forbidden raise TCPConnectionException("Invalid AUTH_KEY given.") if request.args[Request.ARGS_AUTH_KEY] not in allowed_auth_keys_for_host: raise TCPConnectionException("Invalid AUTH_KEY given.") _logger.info("[%s]: Reply: Authentication successful!" % SERVER) yield self.send_message(Reply(result=True, msg="Authentication successful!"))