コード例 #1
0
    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__)
コード例 #2
0
        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)
コード例 #3
0
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)