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
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)
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))
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))
def getClientDataFiles(self): if self.clientDataFiles: return self.clientDataFiles self.clientDataFiles = findFiles(self.getProductClientDataDir()) return self.clientDataFiles
def testFindFilesWithEmptyDirectory(tempDir): assert [] == findFiles(tempDir)
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))