def phase_two(self): hash = None i = -1 for message in self.phase_two_messages: i += 1 # Sent ANP transport header log.debug("Phase 2: sending ANPT header %i, size %i." % ( i, message.size )) self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_2, message.size) log.debug("Phase 2: sent ANPT header %i, size %i." % ( i, message.size )) # Send base message anp message. kanp.send_anpt_msg(self.writer, message.anpm) if not hash: hash = hashlib.md5() j = -1 for subm in message.sub_messages: j += 1 if isinstance(subm, PhaseTwoChunkSubMessage): # send chunk log.debug("Phase 2: preparing file %i chunk %i anp message." % ( i, j )) bytes = subm.chunk.read() hash.update(bytes) subm.anpm.add_bin(bytes) log.debug("Phase 2: sending file %i chunk %i anp message." % ( i, j )) kanp.send_anpt_msg(self.writer, subm.anpm) log.debug("Phase 2: sent file %i chunk %i anp message." % ( i, j )) else: assert isinstance(subm, PhaseTwoCommitSubMessage) # send commit log.debug("Phase 2: preparing file %i commit anp message." % ( i )) bytes = hash.digest() subm.anpm.add_bin(bytes) hash = hashlib.md5() log.debug("Phase 2: sending file %i commit anp message." % ( i )) kanp.send_anpt_msg(self.writer, subm.anpm) log.debug("Phase 2: sent file %i commit anp message." % ( i )) # get response log.debug("Phase 2: getting %i reply." % ( i )) h, m = kanp.get_anpt_all(self.reader) log.debug("Phase 2: got %i reply." % ( i )) if h.type == kanp.KANP_RES_FAIL: raise kanp.KANPFailure(m.get_u32(), m.get_str()) assert h.type == kanp.KANP_RES_OK # get response h, m = kanp.get_anpt_all(self.reader) log.debug("Phase 2: got final reply.") if h.type == kanp.KANP_RES_FAIL: raise kanp.KANPFailure(m.get_u32(), m.get_str()) assert h.type == kanp.KANP_RES_OK log.debug("File upload finished.")
def get_kcd_upload_ticket(self, workspace_id, share_id, user_id, email_id='kwmo'): # Connect to KCD. self.connect() # Select workspace role. self.select_role(kanp.KANP_KCD_ROLE_WORKSPACE) # Connect to workspace. self.connect_workspace(workspace_id = int(workspace_id), user_id = user_id, email_id = email_id, password = self.conf.kcd_passwd) # Send the command to KCD. am = kanp.ANP_msg() am.add_u64(workspace_id) am.add_u32(share_id) payload = am.get_payload() self.send_command_header(kanp.KANP_CMD_KFS_UPLOAD_REQ, len(payload)) self.write(payload) log.debug("Sent upload request to KCD for workspace %i, share %i." % ( workspace_id, share_id ) ) # Get command result. h, m = kanp.get_anpt_all(self) # Close KCD connection. self.close() # Handle result. if h.type != kanp.KANP_RES_KFS_UPLOAD_REQ: log.debug("Got result type '%s'." % ( kanp.get_kanp_constant(h.type, 'KANP_') ) ) assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) ticket = m.get_bin() return ticket
def connect_workspace(self, workspace_id, last_evt_id=0, last_evt_timestamp=0, user_id=0, real_name='', email_address='', email_id='', ticket='', password='', delete_on_login=0): # Create ANP command. m = kanp.ANP_msg() m.add_u64(workspace_id) m.add_u32(delete_on_login) m.add_u64(last_evt_id) m.add_u64(last_evt_timestamp) m.add_u32(user_id) m.add_str(real_name) m.add_str(email_address) m.add_str(email_id) m.add_bin(ticket) m.add_str(password) # Send the command to KCD. payload = m.get_payload() self.send_command_header(kanp.KANP_CMD_KWS_CONNECT_KWS, len(payload)) log.debug("Sent anp command to connect to workspace %i." % (workspace_id)) self.write(payload) # Get command result. h, m = kanp.get_anpt_all(self) if h.type != kanp.KANP_RES_KWS_CONNECT_KWS: assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) # Decode result. result = m.get_u32() error = m.get_str() user_id = m.get_u32() email_id = m.get_str() last_evt_id = m.get_u64() secure = m.get_u32() password_assigned = m.get_u32() kwmo_server = m.get_str() if result != kanp.KANP_KWS_LOGIN_OK: raise kanp.KANPFailure(result, error) log.debug("Connected to workspace %i." % (workspace_id))
def select_role(self, role): log.debug("select_role() called") # send request m = kanp.ANP_msg() m.add_u32(role) payload = m.get_payload() self.send_command_header(kanp.KANP_CMD_MGT_SELECT_ROLE, len(payload)) self.write(payload) # get response h, m = kanp.get_anpt_all(self) if h.type != kanp.KANP_RES_OK: assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) assert h.type == kanp.KANP_RES_OK log.debug("Role %i selected." % (role))
def select_role(self, role): log.debug("select_role() called") # send request m = kanp.ANP_msg() m.add_u32(role) payload = m.get_payload() self.send_command_header(kanp.KANP_CMD_MGT_SELECT_ROLE, len(payload)) self.write(payload) # get response h, m = kanp.get_anpt_all(self) if h.type != kanp.KANP_RES_OK: assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) assert h.type == kanp.KANP_RES_OK log.debug("Role %i selected." % ( role ))
def get_kcd_upload_ticket(self, workspace_id, share_id, user_id, email_id='kwmo'): # Connect to KCD. self.connect() # Select workspace role. self.select_role(kanp.KANP_KCD_ROLE_WORKSPACE) # Connect to workspace. self.connect_workspace(workspace_id=int(workspace_id), user_id=user_id, email_id=email_id, password=self.conf.kcd_passwd) # Send the command to KCD. am = kanp.ANP_msg() am.add_u64(workspace_id) am.add_u32(share_id) payload = am.get_payload() self.send_command_header(kanp.KANP_CMD_KFS_UPLOAD_REQ, len(payload)) self.write(payload) log.debug("Sent upload request to KCD for workspace %i, share %i." % (workspace_id, share_id)) # Get command result. h, m = kanp.get_anpt_all(self) # Close KCD connection. self.close() # Handle result. if h.type != kanp.KANP_RES_KFS_UPLOAD_REQ: log.debug("Got result type '%s'." % (kanp.get_kanp_constant(h.type, 'KANP_'))) assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) ticket = m.get_bin() return ticket
def connect_workspace(self, workspace_id, last_evt_id=0, last_evt_timestamp=0, user_id=0, real_name='', email_address='', email_id='', ticket='', password='', delete_on_login=0): # Create ANP command. m = kanp.ANP_msg() m.add_u64(workspace_id) m.add_u32(delete_on_login) m.add_u64(last_evt_id) m.add_u64(last_evt_timestamp) m.add_u32(user_id) m.add_str(real_name) m.add_str(email_address) m.add_str(email_id) m.add_bin(ticket) m.add_str(password) # Send the command to KCD. payload = m.get_payload() self.send_command_header(kanp.KANP_CMD_KWS_CONNECT_KWS, len(payload)) log.debug("Sent anp command to connect to workspace %i." % ( workspace_id ) ) self.write(payload) # Get command result. h, m = kanp.get_anpt_all(self) if h.type != kanp.KANP_RES_KWS_CONNECT_KWS: assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) # Decode result. result = m.get_u32() error = m.get_str() user_id = m.get_u32() email_id = m.get_str() last_evt_id = m.get_u64() secure = m.get_u32() password_assigned = m.get_u32() kwmo_server = m.get_str() if result != kanp.KANP_KWS_LOGIN_OK: raise kanp.KANPFailure(result, error) log.debug("Connected to workspace %i." % ( workspace_id ) )
def send_invitation(self, workspace_id, message, invitees): # Create command. m = kanp.ANP_msg() m.add_u64(workspace_id) m.add_str(message) m.add_u32(len(invitees)) for invitee in invitees: m.add_str(invitee.real_name) m.add_str(invitee.email_address) m.add_u64(invitee.key_id) m.add_str(invitee.org_name) m.add_str(invitee.password) m.add_u32(int(invitee.send_mail)) # Send the command to KCD. payload = m.get_payload() self.send_command_header(kanp.KANP_CMD_KWS_INVITE_KWS, len(payload)) log.debug("Sent anp invite command for workspace %i." % (workspace_id)) self.write(payload) # Get command result. h, m = kanp.get_anpt_all(self) if h.type != kanp.KANP_RES_KWS_INVITE_KWS: log.debug("Received type '%s'." % (str(h.type))) assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) # Decode the result. ws_url = m.get_str() invitees_nb = m.get_u32() for i in range(0, invitees_nb): invitees[i].email_id = m.get_str() invitees[i].url = m.get_str() invitees[i].error = m.get_str() return ws_url, invitees
def phase_2_send_message_with_one_submessage(self, subm): # Prepare ANP message. message = PhaseTwoMessage() message.anpm = kanp.ANP_msg() message.anpm.add_u32(1) # Send only one sub-message # Calculate base messasge size. message.size = message.anpm.get_payload_size() #log.debug("Base message size: %i bytes." % ( message.size )) # Calculate total sub-message size. subm.size = subm.anpm.get_payload_size() log.debug("Chunk sub-message size: %i bytes." % ( subm.size )) total_size = message.size + subm.size # Sent ANP transport header #log.debug("Phase 2: sending ANPT header with data size %i." % ( total_size )) self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_2, total_size) #log.debug("Phase 2: sent ANPT header, size %i." % ( total_size )) # Send base message. kanp.send_anpt_msg(self.writer, message.anpm) # Send sub-message. kanp.send_anpt_msg(self.writer, subm.anpm) # get response #log.debug("Phase 2: getting reply.") h, m = kanp.get_anpt_all(self.reader) #log.debug("ANP RESPONSE DUMP: %s" % (str(m.dump()))) #log.debug("Phase 2: got reply.") if h.type == kanp.KANP_RES_FAIL: raise kanp.KANPFailure(m.get_u32(), m.get_str()) assert h.type == kanp.KANP_RES_OK
def send_invitation(self, workspace_id, message, invitees): # Create command. m = kanp.ANP_msg() m.add_u64(workspace_id) m.add_str(message) m.add_u32(len(invitees)) for invitee in invitees: m.add_str(invitee.real_name) m.add_str(invitee.email_address) m.add_u64(invitee.key_id) m.add_str(invitee.org_name) m.add_str(invitee.password) m.add_u32(int(invitee.send_mail)) # Send the command to KCD. payload = m.get_payload() self.send_command_header(kanp.KANP_CMD_KWS_INVITE_KWS, len(payload)) log.debug("Sent anp invite command for workspace %i." % ( workspace_id ) ) self.write(payload) # Get command result. h, m = kanp.get_anpt_all(self) if h.type != kanp.KANP_RES_KWS_INVITE_KWS: log.debug("Received type '%s'." % ( str(h.type) ) ) assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) # Decode the result. ws_url = m.get_str() invitees_nb = m.get_u32() for i in range(0, invitees_nb): invitees[i].email_id = m.get_str() invitees[i].url = m.get_str() invitees[i].error = m.get_str() return ws_url, invitees
def phase_2_send_message_with_one_submessage(self, subm): # Prepare ANP message. message = PhaseTwoMessage() message.anpm = kanp.ANP_msg() message.anpm.add_u32(1) # Send only one sub-message # Calculate base messasge size. message.size = message.anpm.get_payload_size() #log.debug("Base message size: %i bytes." % ( message.size )) # Calculate total sub-message size. subm.size = subm.anpm.get_payload_size() log.debug("Chunk sub-message size: %i bytes." % (subm.size)) total_size = message.size + subm.size # Sent ANP transport header #log.debug("Phase 2: sending ANPT header with data size %i." % ( total_size )) self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_2, total_size) #log.debug("Phase 2: sent ANPT header, size %i." % ( total_size )) # Send base message. kanp.send_anpt_msg(self.writer, message.anpm) # Send sub-message. kanp.send_anpt_msg(self.writer, subm.anpm) # get response #log.debug("Phase 2: getting reply.") h, m = kanp.get_anpt_all(self.reader) #log.debug("ANP RESPONSE DUMP: %s" % (str(m.dump()))) #log.debug("Phase 2: got reply.") if h.type == kanp.KANP_RES_FAIL: raise kanp.KANPFailure(m.get_u32(), m.get_str()) assert h.type == kanp.KANP_RES_OK
def phase_one(self, email_id, ticket): # Prepare phase one ANP message. m = kanp.ANP_msg() m.add_bin(ticket) m.add_u64(email_id) m.add_u32(len(self.kfs_entries)) for kfs_entry in self.kfs_entries: if kfs_entry.kfs_op == kanp.KANP_KFS_OP_CREATE_FILE: m.add_u32(5) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.parent_inode_id) m.add_u64(kfs_entry.parent_commit_id) m.add_str(kfs_entry.name) elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_UPDATE_FILE: m.add_u32(4) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.inode) m.add_u64(kfs_entry.commit_id) elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_CREATE_DIR: m.add_u32(5) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.parent_inode_id) m.add_u64(kfs_entry.parent_commit_id) m.add_str(kfs_entry.name) elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_DELETE_DIR: m.add_u32(4) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.inode_id) m.add_u64(kfs_entry.commit_id) elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_DELETE_FILE: m.add_u32(4) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.inode_id) m.add_u64(kfs_entry.commit_id) else: raise Exception("Unexpected KFS operation: '%s'." % ( str(kfs_entry.kfs_op) ) ) # Send phase one ANP message to KCD. payload = m.get_payload() self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_1, len(payload)) self.writer.write(payload) log.debug("Phase 1 data sent.") # Get phase one result. h, m = kanp.get_anpt_all(self.reader) if h.type != kanp.KANP_RES_KFS_PHASE_1: assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) log.debug("Got phase 1 reply.") # Handle phase one reply. phase_two_needed = False commit_id = m.get_u64() nb_op = m.get_u32() assert nb_op == len(self.kfs_entries) for i in range(0, nb_op): errno = m.get_u32() error = m.get_str() if error: log.debug( "Phase 1: KFS operation %i error: errno=%i, error='%s'" % \ ( i, errno, error )) self.kfs_entries[i].kfs_error = error
def phase_two(self): hash = None i = -1 for message in self.phase_two_messages: i += 1 # Sent ANP transport header log.debug("Phase 2: sending ANPT header %i, size %i." % (i, message.size)) self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_2, message.size) log.debug("Phase 2: sent ANPT header %i, size %i." % (i, message.size)) # Send base message anp message. kanp.send_anpt_msg(self.writer, message.anpm) if not hash: hash = hashlib.md5() j = -1 for subm in message.sub_messages: j += 1 if isinstance(subm, PhaseTwoChunkSubMessage): # send chunk log.debug( "Phase 2: preparing file %i chunk %i anp message." % (i, j)) bytes = subm.chunk.read() hash.update(bytes) subm.anpm.add_bin(bytes) log.debug( "Phase 2: sending file %i chunk %i anp message." % (i, j)) kanp.send_anpt_msg(self.writer, subm.anpm) log.debug("Phase 2: sent file %i chunk %i anp message." % (i, j)) else: assert isinstance(subm, PhaseTwoCommitSubMessage) # send commit log.debug( "Phase 2: preparing file %i commit anp message." % (i)) bytes = hash.digest() subm.anpm.add_bin(bytes) hash = hashlib.md5() log.debug("Phase 2: sending file %i commit anp message." % (i)) kanp.send_anpt_msg(self.writer, subm.anpm) log.debug("Phase 2: sent file %i commit anp message." % (i)) # get response log.debug("Phase 2: getting %i reply." % (i)) h, m = kanp.get_anpt_all(self.reader) log.debug("Phase 2: got %i reply." % (i)) if h.type == kanp.KANP_RES_FAIL: raise kanp.KANPFailure(m.get_u32(), m.get_str()) assert h.type == kanp.KANP_RES_OK # get response h, m = kanp.get_anpt_all(self.reader) log.debug("Phase 2: got final reply.") if h.type == kanp.KANP_RES_FAIL: raise kanp.KANPFailure(m.get_u32(), m.get_str()) assert h.type == kanp.KANP_RES_OK log.debug("File upload finished.")
def phase_one(self, email_id, ticket): # Prepare phase one ANP message. m = kanp.ANP_msg() m.add_bin(ticket) m.add_u64(email_id) m.add_u32(len(self.kfs_entries)) for kfs_entry in self.kfs_entries: if kfs_entry.kfs_op == kanp.KANP_KFS_OP_CREATE_FILE: m.add_u32(5) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.parent_inode_id) m.add_u64(kfs_entry.parent_commit_id) m.add_str(kfs_entry.name) elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_UPDATE_FILE: m.add_u32(4) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.inode) m.add_u64(kfs_entry.commit_id) elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_CREATE_DIR: m.add_u32(5) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.parent_inode_id) m.add_u64(kfs_entry.parent_commit_id) m.add_str(kfs_entry.name) elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_DELETE_DIR: m.add_u32(4) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.inode_id) m.add_u64(kfs_entry.commit_id) elif kfs_entry.kfs_op == kanp.KANP_KFS_OP_DELETE_FILE: m.add_u32(4) # nb of elements m.add_u32(kfs_entry.kfs_op) m.add_u64(kfs_entry.inode_id) m.add_u64(kfs_entry.commit_id) else: raise Exception("Unexpected KFS operation: '%s'." % (str(kfs_entry.kfs_op))) # Send phase one ANP message to KCD. payload = m.get_payload() self.writer.send_command_header(kanp.KANP_CMD_KFS_PHASE_1, len(payload)) self.writer.write(payload) log.debug("Phase 1 data sent.") # Get phase one result. h, m = kanp.get_anpt_all(self.reader) if h.type != kanp.KANP_RES_KFS_PHASE_1: assert h.type == kanp.KANP_RES_FAIL raise kanp.KANPFailure(m.get_u32(), m.get_str()) log.debug("Got phase 1 reply.") # Handle phase one reply. phase_two_needed = False commit_id = m.get_u64() nb_op = m.get_u32() assert nb_op == len(self.kfs_entries) for i in range(0, nb_op): errno = m.get_u32() error = m.get_str() if error: log.debug( "Phase 1: KFS operation %i error: errno=%i, error='%s'" % \ ( i, errno, error )) self.kfs_entries[i].kfs_error = error