예제 #1
0
def testFindFilesFindsFolders():
	expectedFolders = ['top1', 'top2', os.path.join('top1', 'sub11')]

	with preparedDemoFolders() as demoFolder:
		folders = findFiles(demoFolder)
		for folder in expectedFolders:
			assert folder in folders
예제 #2
0
def setRights(path=u'/'):
    LOGGER.debug(u"Setting rights on {0!r}", path)
    LOGGER.debug("euid is {0}", os.geteuid())

    dirAndRights = getDirectoriesAndExpectedRights(path)

    for startPath, rights in filterDirsAndRights(path, dirAndRights):
        if os.path.isfile(path):
            chown(path, rights.uid, rights.gid)
            setRightsOnFile(os.path.abspath(path), rights.files)
            continue

        LOGGER.notice(u"Setting rights on directory {0!r}", startPath)
        LOGGER.debug2(u"Rights configuration: {0}", rights)
        chown(startPath, rights.uid, rights.gid)
        os.chmod(startPath, rights.directories)
        for filepath in findFiles(startPath,
                                  prefix=startPath,
                                  returnLinks=rights.correctLinks,
                                  excludeFile=re.compile(r"(.swp|~)$")):
            chown(filepath, rights.uid, rights.gid)
            if os.path.isdir(filepath):
                LOGGER.debug(u"Setting rights on directory {0!r}", filepath)
                os.chmod(filepath, rights.directories)
            elif os.path.isfile(filepath):
                setRightsOnFile(filepath, rights.files)

        if startPath.startswith(u'/var/lib/opsi') and _HAS_ROOT_RIGHTS:
            clientUserUid = pwd.getpwnam(_CLIENT_USER)[2]
            fileAdminGroupGid = grp.getgrnam(_FILE_ADMIN_GROUP)[2]

            os.chmod(u'/var/lib/opsi', 0o750)
            chown(u'/var/lib/opsi', clientUserUid, fileAdminGroupGid)
            setRightsOnSSHDirectory(clientUserUid, fileAdminGroupGid)
예제 #3
0
def testParsingPackageContentFile(outsideFile, outsideDir):
    with workInTemporaryDirectory() as tempDir:
        content = fillDirectory(tempDir)

        outsideLink = 'jlink'
        assert outsideLink not in content
        for filename in (f for f, t in content.items() if t == 'f'):
            os.symlink(outsideFile, os.path.join(tempDir, outsideLink))
            content[outsideLink] = 'f'
            break

        outsideDirLink = 'dlink'
        assert outsideDirLink not in content
        for dirname in (f for f, t in content.items() if t == 'd'):
            os.symlink(outsideDir, os.path.join(tempDir, outsideDirLink))
            content[outsideDirLink] = 'd'
            break

        filename = os.path.join(tempDir, 'test.files')
        contentFile = PackageContentFile(filename)
        contentFile.setProductClientDataDir(tempDir)
        clientDataFiles = findFiles(tempDir)
        contentFile.setClientDataFiles(clientDataFiles)
        contentFile.generate()
        del contentFile

        # Checking the parsing feature of PackageContentFile
        readContentFile = PackageContentFile(filename)
        contents = readContentFile.parse()
        assert len(contents) == len(content)

        for filename, entry in contents.items():
            assert filename
            assert not filename.startswith("'")
            assert not filename.endswith("'")

            entryType = entry['type']
            assert entryType == content[filename]

            if entryType == 'd':
                assert entry['size'] == 0
                assert entry['md5sum'] == ''
                assert entry['target'] == ''
            elif entryType == 'f':
                assert entry['size'] > 0
                hashSum = entry['md5sum']
                assert hashSum
                assert not hashSum.startswith("'")
                assert not hashSum.endswith("'")
                assert entry['target'] == ''
            elif entryType == 'l':
                assert entry['size'] == 0
                assert not entry['md5sum']
                target = entry['target']
                assert target
                assert not target.startswith("'")
                assert not target.endswith("'")
            else:
                raise RuntimeError("Unexpected type in {0!r}".format(entry))
예제 #4
0
    def pack(self, progressSubject=None):
        # Create temporary directory
        if os.path.exists(self.tmpPackDir):
            shutil.rmtree(self.tmpPackDir)
        os.mkdir(self.tmpPackDir)

        archives = []
        diskusage = 0
        dirs = [u'CLIENT_DATA', u'SERVER_DATA', u'OPSI']

        try:
            if self.customName:
                found = False
                for i, currentDir in enumerate(dirs):
                    customDir = u"%s.%s" % (currentDir, self.customName)
                    if os.path.exists(
                            os.path.join(self.packageSourceDir, customDir)):
                        found = True
                        if self.customOnly:
                            dirs[i] = customDir
                        else:
                            dirs.append(customDir)
                if not found:
                    raise RuntimeError(u"No custom dirs found for '%s'" %
                                       self.customName)

            # Try to define diskusage from Sourcedirectory to prevent a override from cpio sizelimit.
            for d in dirs:
                if not os.path.exists(os.path.join(self.packageSourceDir,
                                                   d)) and d != u'OPSI':
                    logger.info(u"Directory '%s' does not exist" %
                                os.path.join(self.packageSourceDir, d))
                    continue
                fileList = findFiles(os.path.join(self.packageSourceDir, d),
                                     excludeDir=EXCLUDE_DIRS_ON_PACK_REGEX,
                                     excludeFile=EXCLUDE_FILES_ON_PACK_REGEX,
                                     followLinks=self.dereference)
                if fileList:
                    for f in fileList:
                        diskusage = diskusage + os.path.getsize(
                            os.path.join(self.packageSourceDir, d, f))

            if diskusage >= 2147483648:
                logger.info(
                    u"Switching to tar format, because sourcefiles overrides cpio sizelimit."
                )
                self.format = u'tar'

            for d in dirs:
                if not os.path.exists(os.path.join(self.packageSourceDir,
                                                   d)) and d != u'OPSI':
                    logger.info(u"Directory '%s' does not exist" %
                                os.path.join(self.packageSourceDir, d))
                    continue

                fileList = findFiles(os.path.join(self.packageSourceDir, d),
                                     excludeDir=EXCLUDE_DIRS_ON_PACK_REGEX,
                                     excludeFile=EXCLUDE_FILES_ON_PACK_REGEX,
                                     followLinks=self.dereference)

                if d.startswith(u'SERVER_DATA'):
                    # Never change permissions of existing directories in /
                    tmp = []
                    for f in fileList:
                        if f.find(os.sep) == -1:
                            logger.info(u"Skipping dir '%s'" % f)
                            continue
                        tmp.append(f)

                    fileList = tmp

                if not fileList:
                    logger.notice(u"Skipping empty dir '%s'" %
                                  os.path.join(self.packageSourceDir, d))
                    continue

                filename = os.path.join(self.tmpPackDir,
                                        u'%s.%s' % (d, self.format))
                if self.compression == 'gzip':
                    filename += u'.gz'
                elif self.compression == 'bzip2':
                    filename += u'.bz2'
                archive = Archive(filename,
                                  format=self.format,
                                  compression=self.compression,
                                  progressSubject=progressSubject)
                if progressSubject:
                    progressSubject.reset()
                    progressSubject.setMessage(
                        u'Creating archive %s' %
                        os.path.basename(archive.getFilename()))
                archive.create(fileList=fileList,
                               baseDir=os.path.join(self.packageSourceDir, d),
                               dereference=self.dereference)
                archives.append(filename)

            archive = Archive(self.packageFile,
                              format=self.format,
                              compression=None,
                              progressSubject=progressSubject)
            if progressSubject:
                progressSubject.reset()
                progressSubject.setMessage(
                    u'Creating archive %s' %
                    os.path.basename(archive.getFilename()))
            archive.create(fileList=archives, baseDir=self.tmpPackDir)
        except Exception as e:
            self.cleanup()
            raise RuntimeError(u"Failed to create package '%s': %s" %
                               (self.packageFile, e))
예제 #5
0
    def getClientDataFiles(self):
        if self.clientDataFiles:
            return self.clientDataFiles

        self.clientDataFiles = findFiles(self.getProductClientDataDir())
        return self.clientDataFiles
예제 #6
0
def testFindFilesWithEmptyDirectory(tempDir):
	assert [] == findFiles(tempDir)
예제 #7
0
def testPackageContentFileCreation(outsideFile, outsideDir):
    with workInTemporaryDirectory() as tempDir:
        content = fillDirectory(tempDir)

        outsideLink = 'jlink'
        assert outsideLink not in content
        for filename in (f for f, t in content.items() if t == 'f'):
            os.symlink(outsideFile, os.path.join(tempDir, outsideLink))
            content[outsideLink] = 'f'
            break

        outsideDirLink = 'dlink'
        assert outsideDirLink not in content
        for dirname in (f for f, t in content.items() if t == 'd'):
            os.symlink(outsideDir, os.path.join(tempDir, outsideDirLink))
            content[outsideDirLink] = 'd'
            break

        clientDataFiles = findFiles(tempDir)

        filename = os.path.join(tempDir, 'test.files')
        contentFile = PackageContentFile(filename)
        contentFile.setProductClientDataDir(tempDir)
        contentFile.setClientDataFiles(clientDataFiles)
        contentFile.generate()

        assert os.path.exists(filename)
        assert os.path.getsize(filename) > 10, 'Generated file is empty!'

        # Manual parsing of the file contents to ensure that the
        # format matches our requirements.
        with open(filename) as generatedFile:
            for line in generatedFile:
                try:
                    entry, path, size = line.split(' ', 2)

                    path = path.strip("'")
                    assert entry == content.pop(path), "Type mismatch!"

                    if path == outsideLink:
                        assert entry == 'f'
                    elif path == outsideDirLink:
                        assert entry == 'd'

                    if entry == 'd':
                        assert int(size.strip()) == 0
                    elif entry == 'f':
                        size, hashSum = size.split(' ', 1)

                        assert os.path.getsize(path) == int(size)

                        assert not hashSum.startswith("'")
                        assert not hashSum.endswith("'")
                        hashSum = hashSum.strip()
                        assert md5sum(path) == hashSum
                    elif entry == 'l':
                        size, target = size.split(' ', 1)

                        assert int(size) == 0

                        target = target.strip()
                        assert target.startswith("'")
                        assert target.endswith("'")
                        target = target.strip("'")
                        assert target
                    else:
                        raise RuntimeError(
                            "Unexpected type {0!r}".format(entry))
                except Exception:
                    print("Processing line {0!r} failed".format(line))
                    raise

        assert not content, "Files not listed in content file: {0}".format(
            ', '.join(content))