예제 #1
0
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)
예제 #2
0
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