Пример #1
0
    def rebuild_manifest(self):
        """Rebuild the manifest object if it is missing

        Iterates through all objects in the repository looking for archive metadata blocks.
        """
        self.report_progress(
            'Rebuilding missing manifest, this might take some time...',
            error=True)
        manifest = Manifest(self.key, self.repository)
        for chunk_id, _ in self.chunks.iteritems():
            cdata = self.repository.get(chunk_id)
            data = self.key.decrypt(chunk_id, cdata)
            # Some basic sanity checks of the payload before feeding it into msgpack
            if len(data) < 2 or ((data[0] & 0xf0) != 0x80) or (
                (data[1] & 0xe0) != 0xa0):
                continue
            if not b'cmdline' in data or not b'\xa7version\x01' in data:
                continue
            try:
                archive = msgpack.unpackb(data)
            except:
                continue
            if isinstance(
                    archive,
                    dict) and b'items' in archive and b'cmdline' in archive:
                self.report_progress('Found archive ' +
                                     archive[b'name'].decode('utf-8'),
                                     error=True)
                manifest.archives[archive[b'name'].decode('utf-8')] = {
                    b'id': chunk_id,
                    b'time': archive[b'time']
                }
        self.report_progress('Manifest rebuild complete', error=True)
        return manifest
Пример #2
0
 def do_init(self, args):
     """Initialize an empty repository"""
     print('Initializing repository at "%s"' % args.repository.orig)
     repository = self.open_repository(args.repository, create=True)
     key = key_creator(repository, args)
     manifest = Manifest(key, repository)
     manifest.key = key
     manifest.write()
     repository.commit()
     return self.exit_code
Пример #3
0
 def do_init(self, args):
     """Initialize an empty repository"""
     print('Initializing repository at "%s"' % args.repository.orig)
     repository = self.open_repository(args.repository,
                                       create=True,
                                       exclusive=True)
     key = key_creator(repository, args)
     manifest = Manifest(key, repository)
     manifest.key = key
     manifest.write()
     repository.commit()
     Cache(repository, key, manifest, warn_if_unencrypted=False)
     return self.exit_code