Exemplo n.º 1
0
class Reader(object):
    def __init__(self, file_path):
        self.file_path = file_path

        fd = gzip.open(file_path, "rb")

        bheader = fd.read(Header.SIZE)
        self.header = Header(bheader)

        fd.seek(self.header.data_start)
        bin_data = fd.read(self.header.data_size)

        self.fdata = Data(bin_data)
        fd.close()

    def print_root_files(self):

        self.header.print_header()

        for record in self.fdata.records:
            # print("{} : {:>8} {:>8}".format(record.name, record.size, record.st_ctime))
            if record.pid == 0:
                # 			start = r.daddr
                # 			size = r.dsize
                # 			self.__fd.seek(start)
                # 			bfile_data = self.__fd.read(size)
                # 			record = DataRecord(bfile_data)
                print("{} : {:>8} {:>8}".format(record.name, record.size,
                                                record.st_ctime))

    def print_tree(self):
        print("tree")
        self.header.print_header()

        Reader.reprint(self.fdata, 0, 0)

    @staticmethod
    def reprint(fdata, parent_id, ind):

        for record in fdata.records:
            if record.pid == parent_id:
                print(ind * "\t" + record.name + str(record.ftype))

                if record.ftype == 2:
                    Reader.reprint(fdata, record.fid, ind + 1)
Exemplo n.º 2
0
class Writer(object):
    def __init__(self, scan_path, out_file):
        self.scan_path = scan_path
        self.out_file = out_file

        self.header = Header()
        self.fdata = Data()

    def start(self):
        # fd = open(self.out_file, "wb")
        # fd.seek(Header.SIZE)

        etimer = ETimer()
        Writer.rescan(self.scan_path, self.fdata, 0, 1)
        etimer.elapsed("finish scan")

        # end_of_data_addr = fd.tell()

        # print("data writed, cur pos: ", end_of_data_addr)
        print("files: ", len(self.fdata.records))

        # etimer.elapsed("start pack dict")
        # bin_fdict = self.fdict.pack()
        # etimer.elapsed("finish pack dict")

        # fd.write(bin_fdict)

        bin_data = self.fdata.pack()

        self.header.data_start = Header.SIZE
        self.header.data_size = len(bin_data)
        # self.header.dict_start = end_of_data_addr
        # self.header.dict_size = self.fdict.get_bdata_size()
        self.header.total_records = len(self.fdata.records)

        self.header.print_header()

        bin_header = self.header.pack()
        # fd.seek(0)
        # fd.write(bin_header)

        # fd.close()

        #--- start write
        with gzip.open(self.out_file, "wb") as fd:
            fd.write(bin_header)
            fd.write(bin_data)

    @staticmethod
    def rescan(scan_path, fdata, parent_id, last_id):

        fid = last_id

        for f in os.listdir(scan_path):

            full_path = os.path.join(scan_path, f)

            if os.path.isfile(full_path):
                st = os.stat(full_path)
                record = fdata.append_file(f, parent_id, fid, st)

                fid += 1

            elif os.path.isdir(full_path):
                st = os.stat(full_path)
                record = fdata.append_dir(f, parent_id, fid, st)

                fid += 1

                fid = Writer.rescan(full_path, fdata, record.fid, fid)
            else:
                pass

        return fid
Exemplo n.º 3
0
class Writer(object):
	def __init__(self, scan_path, out_file):
		self.scan_path = scan_path
		self.out_file = out_file

		self.header = Header()
		self.fdict = Dict()


	def start(self):
		fd = open(self.out_file, "wb")
		fd.seek(Header.SIZE)

		etimer = ETimer()
		# Writer.rescan(self.scan_path, fd, self.fdict, 0, 1)
		self.__start_scan(self.scan_path, fd, self.fdict, 0, 1)
		etimer.elapsed("finish scan")

		end_of_data_addr = fd.tell()

		print("data writed, cur pos: ", end_of_data_addr)
		print("files: ", self.fdict.records_count)

		etimer.elapsed("start pack dict")
		bin_fdict = self.fdict.pack()
		etimer.elapsed("finish pack dict")
		# print(len(bin_fdict))

		# etimer.elapsed("start pack files")
		# bbb = b""
		# vvv = []
		# for r in FILES_LIST:
		# 	# bbb += 
		# 	vvv.append(r.pack())

		# bbb.join(vvv)
		# etimer.elapsed("finish pack files")


		fd.write(bin_fdict)


		self.header.data_start = Header.SIZE
		self.header.data_size = end_of_data_addr - Header.SIZE
		self.header.dict_start = end_of_data_addr
		self.header.dict_size = self.fdict.get_bdata_size()
		self.header.total_records = self.fdict.records_count

		self.header.print_header()

		bin_header = self.header.pack()
		fd.seek(0)
		fd.write(bin_header)

		fd.close()


	@dtimeit
	def __start_scan(self, scan_path, fd, fdict: Dict, parent_id, last_id):
		Writer.rescan(scan_path, fd, fdict, parent_id, last_id)



	@staticmethod
	def rescan(scan_path, fd, fdict: Dict, parent_id, last_id):

		
		fid = last_id

		for f in os.listdir(scan_path):
		
			full_path = os.path.join(scan_path, f)
			
			
			if os.path.isfile(full_path):
				st = os.stat(full_path)		
				record = Writer.make_file(f, parent_id, fid, st)
				brecord = record.pack()

				#--- make index
				curr_pos = fd.tell()
				fdict.append_record(record.fid, record.pid, curr_pos, len(brecord))

				#--- write bdata
				fd.write(brecord)
				
				fid += 1

			elif os.path.isdir(full_path):
				st = os.stat(full_path)	
				record = Writer.make_dir(f, parent_id, fid, st)
				brecord = record.pack()

				#--- make index
				curr_pos = fd.tell()
				fdict.append_record(record.fid, record.pid, curr_pos, len(brecord))

				#--- write bdata
				fd.write(brecord)
				fid +=1

				fid = Writer.rescan(full_path, fd, fdict, record.fid, fid)
			else:
				pass
			
		return fid




	@staticmethod
	def make_file(name, pid, fid, st):
		return Writer.make_ffile(name, pid, fid, st, 1)


	@staticmethod
	def make_dir(name, pid, fid, st):
		return Writer.make_ffile(name, pid, fid, st, 2)


	@staticmethod
	def make_ffile(name, pid, fid, st, ftype):
		record = DataRecord()
		record.name = name
		record.ftype = ftype
		record.pid = pid
		record.fid = fid

		record.size = st.st_size
		record.st_mode = st.st_mode

		record.st_uid = st.st_uid
		record.st_gid = st.st_gid

		record.st_ctime = st.st_ctime
		record.st_atime = st.st_atime
		record.st_mtime = st.st_mtime
	
		return record