Exemplo n.º 1
0
    def testFileChanges(self):
        (built, d) = self.buildRecipe(recipes.testRecipe1, "TestRecipe1")
        (name, version, flavor) = built[0]
        version = versions.VersionFromString(version)

        (fd, path) = tempfile.mkstemp()
        os.close(fd)

        repos = self.openRepository()
        repos.createChangeSetFile(
            [(name, (None, None), (version, flavor), 1)], path)

        infc = filecontainer.FileContainer(open(path))
        os.unlink(path)

        (fd, path) = tempfile.mkstemp()
        os.close(fd)
        outfc = filecontainer.FileContainer(open(path, "w"))

        n = 0
        while True:
            next = infc.getNextFile()
            if not next:
                break
            (name, tag, f) = next
            n += 1
            if n == 2 or n == 5:
                # modify the file a bit
                contents = gzip.GzipFile(None, "r", fileobj = f).read()
                contents = chr(ord(contents[0]) ^ 0xff) + contents[1:]
                outfc.addFile(name, filecontents.FromString(contents), tag)
            else:
                contents = filecontents.FromFile(f)
                outfc.addFile(name, filecontents.FromFile(f), tag,
                        precompressed=True)

        infc.close()
        outfc.close()

        self.resetRepository()
        repos = self.openRepository()

        try:
            self.assertRaises(errors.IntegrityError,
                              self.updatePkg, self.rootDir, path)
            self.assertRaises(errors.IntegrityError,
                              repos.commitChangeSetFile, path)
        finally:
            os.unlink(path)
Exemplo n.º 2
0
    def getFileContents(self, repos, fileList, callback=None):
        contents = []
        needed = []
        for idx, item in enumerate(fileList):
            fileId, fileVersion = item[0:2]

            fileHash = str(self.hashFile(fileId, fileVersion))
            if self.store.hasFile(fileHash):
                f = self.store.openFile(fileHash)
                content = filecontents.FromFile(f)
                contents.append(content)
            else:
                contents.append(None)
                needed.append((idx, (fileId, fileVersion), fileHash))

        total = len(needed)
        newContents = repos.getFileContents([x[1] for x in needed],
                                            callback=callback)
        itemList = itertools.izip(newContents, needed)
        for content, (idx, (fileId, fileVersion), fileHash) in itemList:
            if not self.readOnly:
                self.store.addFile(content.get(),
                                   fileHash,
                                   integrityCheck=False)
            contents[idx] = content

        return contents
Exemplo n.º 3
0
    def commitChangeSet(self, cs, mirror=False, hidden=False, serialize=False,
                        callback=None,
                        statusPath = None):
        # let's make sure commiting this change set is a sane thing to attempt
        for trvCs in cs.iterNewTroveList():
            v = trvCs.getNewVersion()
            if v.isOnLocalHost():
                label = v.branch().label()
                raise errors.CommitError('can not commit items on '
                                         '%s label' %(label.asString()))
        if self.requireSigs:
            threshold = openpgpfile.TRUST_FULL
        else:
            threshold = openpgpfile.TRUST_UNTRUSTED
        # Callback for signature verification and progress
        if statusPath:
            assert not callback
            callback = UpdateCallback(statusPath=statusPath,
                    trustThreshold=threshold,
                    keyCache=self.troveStore.keyTable.keyCache)
        # Restore contents first, before any shared database resources get
        # locked.
        preRestored = set()
        for sha1, fobj in cs.iterRegularFileContents():
            cont = filecontents.FromFile(fobj, compressed=True)
            self._storeFileFromContents(cont, sha1, restoreContents=True,
                    precompressed=True)
            preRestored.add(sha1)
        cs.reset()
        self.troveStore.begin(serialize)
        try:
            # reset time stamps only if we're not mirroring.
            FilesystemChangeSetJob(self, cs, self.serverNameList,
                                   resetTimestamps = not mirror,
                                   callback=callback,
                                   mirror = mirror,
                                   hidden = hidden,
                                   requireSigs = self.requireSigs,
                                   preRestored=preRestored,
                                   )
        except (openpgpfile.KeyNotFound, errors.DigitalSignatureVerificationError):
            # don't be quite so noisy, this is a common error
            self.troveStore.rollback()
            raise
        except:
            print >> sys.stderr, "exception occurred while committing change set"
            print >> sys.stderr, ''.join(traceback.format_exception(*sys.exc_info()))
            print >> sys.stderr, "attempting rollback"
            self.troveStore.rollback()
            raise
        else:
            if self.paranoidCommits:
                for trvCs in cs.iterNewTroveList():
                    newTuple = trvCs.getNewNameVersionFlavor()
                    if newTuple[1] is None:
                        continue

                    trv = self.getTrove(withFiles = True, *newTuple)
                    assert(trv.verifyDigests())
            self.troveStore.commit()
Exemplo n.º 4
0
    def __init__(self, **kwargs):
        _File.__init__(self, **kwargs)
        if isinstance(self.contents, str):
            self.contents = filecontents.FromString(self.contents)
        else:
            self.contents = filecontents.FromFile(self.contents)

        self._enforceMutuallyExclusiveFlags()
Exemplo n.º 5
0
    def testReset(self):

        class UncloseableFile(StringIO.StringIO):

            def close(self):
                assert(0)

        # Make sure writing a changeset doesn't close the filecontent objects
        # inside of it.
        otherCs = changeset.ChangeSet()
        otherCs.addFileContents("0pathId", "0fileId",
                                changeset.ChangedFileTypes.file,
                                filecontents.FromFile(UncloseableFile("foo")),
                                1)
        otherCs.addFileContents("1pathId", "1fileId",
                                changeset.ChangedFileTypes.file,
                                filecontents.FromFile(UncloseableFile("foo")),
                                0)
        otherCs.writeToFile(self.workDir + "/test1.ccs")

        cs = changeset.ReadOnlyChangeSet()
        cs.merge(otherCs)
        cs.writeToFile(self.workDir + "/test2.ccs")
        assert(open(self.workDir + "/test1.ccs").read() ==
              (open(self.workDir + "/test2.ccs").read()))

        cs.reset()
        cs.writeToFile(self.workDir + "/test3.ccs")
        assert(open(self.workDir + "/test1.ccs").read() ==
              (open(self.workDir + "/test3.ccs").read()))

        otherCs = changeset.ChangeSetFromFile(self.workDir + "/test1.ccs")
        cs1 = changeset.ReadOnlyChangeSet()
        cs1.merge(otherCs)

        otherCs.reset()
        cs2 = changeset.ReadOnlyChangeSet()
        cs2.merge(otherCs)

        assert([ x[0] for x in cs1.fileQueue ] ==
                    [ x[0] for x in cs2.fileQueue ])
        assert(cs1.configCache == cs2.configCache)
Exemplo n.º 6
0
    def getFileContentsObjects(self, server, fileList, callback, outF,
                               compressed):
        if not isinstance(self.c[server], ShimServerProxy):
            return netclient.NetworkRepositoryClient.getFileContentsObjects(
                self, server, fileList, callback, outF, compressed)
        filePaths = self.c[server].getFileContents(fileList)
        fileObjList = []
        for path in filePaths:
            if compressed:
                fileObjList.append(
                    filecontents.FromFilesystem(path, compressed = True))
            else:
                f = gzip.GzipFile(path, "r")
                fileObjList.append(filecontents.FromFile(f))

        return fileObjList
Exemplo n.º 7
0
 def getFileContentsFromTrove(self, n, v, f, pathList,
                              callback = None, compressed = False):
     server = v.trailingLabel().getHost()
     if not isinstance(self.c[server], ShimServerProxy):
         return netclient.NetworkRepositoryClient.getFileContentsFromTrove(
             self, n, v, f, pathList, callback = callback,
             compressed = compressed)
     pathList = [self.fromPath(x) for x in pathList]
     v = self.fromVersion(v)
     f = self.fromFlavor(f)
     filePaths = self.c[server].getFileContentsFromTrove(n,v,f,
                                                         pathList)
     fileObjList = []
     for path in filePaths:
         if compressed:
             fileObjList.append(
                 filecontents.FromFilesystem(path, compressed = True))
         else:
             f = gzip.GzipFile(path, "r")
             fileObjList.append(filecontents.FromFile(f))
     return fileObjList
Exemplo n.º 8
0
 def test07_BadRpmCapsule(self):
     cmp = self.addRPMComponent("ghost:rpm=1.0", 'epoch-1.0-1.i386.rpm')
     repos = self.openRepository()
     orig = self.workDir + '/ghost.ccs'
     modified = self.workDir + '/ghost-new.ccs'
     repos.createChangeSetFile([ (cmp.getName(), (None, None),
                                  cmp.getNameVersionFlavor()[1:],
                                  True) ], orig)
     fc = filecontainer.FileContainer(
                             util.ExtendedFile(orig, buffering = False))
     newFc = filecontainer.FileContainer(
                     util.ExtendedFile(modified, "w", buffering = False))
     # CONARYCHANGESET
     (name, tag, contents) = fc.getNextFile()
     newFc.addFile(name, filecontents.FromFile(contents), tag,
                   precompressed = True)
     # the RPM
     (name, tag, contents) = fc.getNextFile()
     contents = filecontents.FromString("busted!")
     newFc.addFile(name, contents, tag)
     cs = changeset.ChangeSetFromFile(modified)
     # this throws away the output about the install failing
     self.assertRaises(files.Sha1Exception, self.captureOutput,
                       self.updatePkg, self.rootDir, cs)