def remove_chunks_higher_replication_degree(self): data = Data(self.db_path) chunks = data.get_ordered_chunks_difference_replication_degree() el = 0 while (self.backup_size < self.check_directory_size(self.backup_dir)): modification_id = chunks[el][4] chunk_number = chunks[el][1] sha256 = data.get_chunk_sha256(modification_id) data.delete_chunk_removed(chunk_number, sha256) file_name = self.backup_dir+str(sha256)+"_"+str(chunk_number)+".chunk" os.remove(file_name) message = "REMOVED " + VERSION + " " + sha256 + " " + str(chunk_number) self.shell.sendto(message, ("127.0.0.1", self.shell_port)) el +=1
def handle_shell_request(self, message,addr): args=message.split(" ") operation=args[0] data = Data(self.db_path) if(operation=="backup"): file_path=args[1] replication_degree=args[2] if(self.send_chunks(file_path,int(replication_degree))): self.shell.sendto("ok\n", addr) else: self.shell.sendto("fail\n", addr) elif(operation=="restore"): file_path=args[1] modifications=data.get_file_modifications(file_path) message="found "+ str(len(modifications)) for modification in modifications: modification_date=modification[2] modification_date=modification_date[:10]+"T"+modification_date[11:19] message+= " " + modification_date self.shell.sendto(message,addr) elif(operation=="restoremodification"): file_name = args[1] option = int(args[2]) modification = data.get_file_modifications(file_name)[option-1] sha256 = modification[1] chunks = int(modification[3]) self.restore_file_modification(sha256, chunks) self.get_file(sha256, file_name,chunks) elif(operation=="delete"): file_name=args[1] self.request_file_deletion(file_name) elif(operation=="delete2"): file_name=args[1] self.request_file_deletion2(file_name) elif(operation=="REMOVED"): if(self.can_send_removed): file_id=message.split(" ")[2] chunk_number=message.split(" ")[3] self.reject_putchunks[file_id+chunk_number]=datetime.now() + timedelta(0,60) message+=CRLF+CRLF self.mc.sendto(message,(self.mc_address,self.mc_port)) elif(operation=="deletechunk"): data= Data(self.db_path) file_id=message.split(" ")[1] chunk_number=message.split(" ")[2] filepath=self.backup_dir+file_id+"_"+chunk_number+".chunk" if (os.path.exists(filepath)): os.remove(filepath) data.delete_chunk_removed(chunk_number, file_id) elif(operation=="deleted"): file_id=message.split(" ")[1] if (file_id in self.pending_deletes): host=addr[0] try: self.pending_deletes[file_id][1].remove(host) if(len(self.pending_deletes[file_id][1])==0): del self.pending_deletes[file_id] except: pass