def getFileHeader(heredisFile,fileHeaderClass): """return the file header""" fileHeader = fileHeaderClass() f = heredisFile.fdopen() header = f.read(2380) #f.close() (code,) = struct.unpack('<4s',header[:4]) if code != '\xC0\xDE\xCA\xFE': logger.error("ceci n'est pas un fichier Heredis valide") logger.error(RawDataHelper.str2hex(code)) raise ValueError,'Not a valid Heredis f' (fileHeader.unknown1,) = struct.unpack('<4s', header[4:8]) logger.debug('unknown : %s',fileHeader.unknown1) (fileHeader.software,) = RawDataHelper.cString2String(RawDataHelper.get('<32s',header,0x8)) fileHeader.software_version = int(fileHeader.software[8:11]) (fileHeader.unknown2,) = RawDataHelper.get('<H',header,0x50) logger.debug('unknown : %s',fileHeader.unknown2) (fileHeader.name,) = RawDataHelper.cString2String(RawDataHelper.get('<32s',header,0x7C)) (fileHeader.comment,) = RawDataHelper.cString2String(RawDataHelper.get('<255s',header,0x9C)) (fileHeader.version,) = RawDataHelper.cString2String(RawDataHelper.get('<32s',header,0x92C)) (fileHeader.versionComplete,) = RawDataHelper.cString2String(RawDataHelper.get('<32s',header,0x92C)) logger.info(fileHeader.versionComplete) logger.info(RawDataHelper.str2hex(fileHeader.versionComplete)) (fileHeader.lastId,) = RawDataHelper.get('<l',header,0x4C) index = 0x19C fileHeader.userFields = [] for i in range(10): (attr,tag) = RawDataHelper.cString2String(struct.unpack('<32s32s',header[index:index+64])) fileHeader.userFields.append((attr,tag)) index = index + 64 return fileHeader
def tableHeaderGenerator(heredisFile,headerClass): f = heredisFile.fdopen() f.seek(2380) #skip the file header pos = f.tell() buffer = f.read(80) while buffer: (code,name,itemSize,nbItem,tableSize) = struct.unpack("<4s40s12s12s12s",buffer) rawName = name if code == '\xC0\xDE\xCA\xFE': # ok a new table header was found try: itemSize = int(itemSize[:-1]) nbItem = int(nbItem[:-1]) tableSize = int(tableSize[:-1]) except: logger.exception('invalid table header at position 0x%x: %s' %(pos,(code,name,itemSize,nbItem,tableSize))) try: name = RawDataHelper.cString2String(name) except: logger.exception('invalid table name at position 0x%x: %s' %(pos,(code,name,itemSize,nbItem,tableSize))) name = RawDataHelper.str2hex(name) # raise HeredisError,"Entete de table invalide" else: # This is not a table header but... if heredisFile.fileHeader.software_version < 6: # an error ! logger.warning("The file is severously endommaged! Trying to recover") previousPos = pos pos = findNextTable(f) if pos: logger.warning('Table header found at position 0x%x' % pos) f.seek(pos, 0) buffer = f.read(80) continue else: logger.critical('Unable to recover from invalid table header at 0x%x!' % previousPos) buffer = None continue logger.critical("invalid code from table header at position 0x%x : %s" % (pos, RawDataHelper.str2hex(code))) else: # the number of remaining tables... (counter,) = struct.unpack('<I', buffer[:4]) logger.warning('%i remaining tables at position 0x%x' % (counter, pos)) pos += 4 f.seek(pos, 0) buffer = f.read(80) continue f.seek(pos+tableSize+80) logger.info("header %s", unicode(('0x%x' % pos,name,itemSize,nbItem,tableSize))) # g = file(unicode(pos) + '.test', 'wb') # g.write(rawName) # g.close() h = headerClass() h.pos = pos h.name = name h.itemSize = itemSize h.nbItem = nbItem h.tableSize = tableSize yield h pos = f.tell() buffer = f.read(80)