def __init__(self, path): self.out = JobOutput() if os.path.exists(path): self.installerName = os.path.basename(path) loadConfig = True else: self.installerName = path loadConfig = False self.newFileSuffix = ".new" self.backupSuffix = ".replaced.%s" % self.installerName self.options = {'mounts': [], # ex: [("//10.0.0.10/Music", "/home/Library/Music", "cifs", "guest,ro,soft"), (...)] 'permissions': {}, # ex: {"/usr/bin/mytop": "755"} 'filesToReplace': [], # ex: ["/etc/fstab"] 'addLinesToFiles': {}, # ex: {"/etc/ssh/ssh_config": ["line1","line2"} 'furtherInstructions': "%s installation finished." % self.installerName, # ex: "Please restart networking and update all packages" } if loadConfig: packageConfig = imp.load_source('package_config_module', path) self.options.update(packageConfig.__dict__)
return newFullPath def askUserForNewFileName(self, fullPath): self.out.put('File %s should be renamed, but this is disabled in the console version' % basename(fullPath), self.out.LOG_LEVEL_VERBOSE) return fullPath def getImageRotationByExif(self, fullPath): metadata = self.readExifMetadata(fullPath) rotationDegrees = {1: 0, 3: 180, 6:-90, 8: 90} key = metadata['Exif.Image.Orientation'].value if key in rotationDegrees: return rotationDegrees[key] return 0 if __name__ == "__main__": from PySystemMock import PySystemMock from JobOutput import JobOutput out = JobOutput() out.disableLogFile() system = PySystemMock(out) t = ImageFileInfoTool(out, system) TEST_FILE = 'test/Named image file.JPG' print "reading rotation degrees of %s (not the actual EXIF index; should be 0)" % TEST_FILE print t.getImageRotationByExif(TEST_FILE)
class DebianInstaller: def __init__(self, path): self.out = JobOutput() if os.path.exists(path): self.installerName = os.path.basename(path) loadConfig = True else: self.installerName = path loadConfig = False self.newFileSuffix = ".new" self.backupSuffix = ".replaced.%s" % self.installerName self.options = {'mounts': [], # ex: [("//10.0.0.10/Music", "/home/Library/Music", "cifs", "guest,ro,soft"), (...)] 'permissions': {}, # ex: {"/usr/bin/mytop": "755"} 'filesToReplace': [], # ex: ["/etc/fstab"] 'addLinesToFiles': {}, # ex: {"/etc/ssh/ssh_config": ["line1","line2"} 'furtherInstructions': "%s installation finished." % self.installerName, # ex: "Please restart networking and update all packages" } if loadConfig: packageConfig = imp.load_source('package_config_module', path) self.options.update(packageConfig.__dict__) def install(self): self.createBackupFiles() self.copyNewFilesOverExisting() self.addLinesToFiles() self.setMountPoints() self.mount() self.setPermissions() self.giveUserFurtherInstructions() def uninstall(self): self.unMount() self.restoreBackupFiles() self.mount() def createBackupFiles(self): fileNames = self.options['filesToReplace'] self.out.indent("creating %d backup files..." % len(fileNames)) for fileName in fileNames: self.createBackupFile(fileName) self.out.unIndent() def createBackupFile(self, fileName): targetFileName = fileName + self.backupSuffix if os.path.exists(fileName) and not os.path.exists(targetFileName): self.out.put("backing up %s > %s" % (fileName, targetFileName)) shutil.copyfile(fileName, targetFileName) else: self.out.put("skipping %s > %s" % (fileName, targetFileName)) def copyNewFilesOverExisting(self): fileNames = self.options['filesToReplace'] self.out.indent("copying %d replacement files..." % len(fileNames)) for fileName in fileNames: self.copyNewFileOverExisting(fileName) self.out.unIndent() def copyNewFileOverExisting(self, fileName): newFileName = fileName + self.newFileSuffix if os.path.exists(newFileName): self.out.put("copying content from %s > %s" % (newFileName, fileName)) newContent = open(newFileName, 'r').read() originalFile = open(fileName, 'w') originalFile.write(newContent) #os.unlink(newFileName) else: self.out.put("skipping %s > %s" % (newFileName, fileName)) def addLinesToFiles(self): for fileName in self.options['addLinesToFiles']: self.addLinesToFile(fileName, self.options['addLinesToFiles'][fileName]) def addLinesToFile(self, fileName, lines): self.out.indent("adding lines to file %s" % fileName) self.createBackupFile(fileName) fileObject = open(fileName, "a+r") shouldWrite = False for line in lines: line = line.rstrip("\r\n") + "\n" if not self.textExistsInFile(fileObject, line): # if ANY of the lines do not exist yet, then write ALL lines. self.out.put("text line %s doesn't exist yet, so new content will be added to %s" % (line, fileName)) shouldWrite = True break if shouldWrite: for line in lines: line = line.rstrip("\r\n") + "\n" fileObject.write(line) else: self.out.put("no original text was found, so nothing will be written.") fileObject.close() self.out.unIndent() def textExistsInFile(self, fileObject, text): fileObject.seek(0) # go back to start of file fileContent = fileObject.read() result = fileContent.count(text) return result def setMountPoints(self): lines = ["# Added by DebianInstaller (py-base)"] for mount in self.options['mounts']: lines.append("%s %s %s %s 0 0" % (mount[0], mount[1], mount[2], mount[3])) if mount[0][0] == '/': self.makeDir(mount[0]) self.makeDir(mount[1]) self.addLinesToFile('/etc/fstab', lines) def makeDir(self, path): try: os.makedirs(path) except os.error: pass def mount(self): os.system("mount -a") def unMount(self): os.system("umount -a") def setPermissions(self): self.out.indent("setting permissions...") for fileName in self.options['permissions']: self.out.put(fileName) os.system("chown root:root %s;chmod %s %s" % (fileName, self.options['permissions'][fileName], fileName)) self.out.unIndent() def giveUserFurtherInstructions(self): print "\n" print self.options['furtherInstructions'] def restoreBackupFiles(self): for fileName in self.options['filesToReplace']: self.restoreBackupFile(fileName) # these aren't listed in self.options['filesToReplace'] self.restoreBackupFile("/etc/fstab") self.restoreBackupFile("/etc/ssh/sshd_config") def restoreBackupFile(self, fileName): backupFileName = fileName + self.backupSuffix if os.path.exists(backupFileName): originalContent = open(backupFileName, 'r').read() originalFile = open(fileName, 'w') originalFile.write(originalContent) os.unlink(backupFileName)