Esempio n. 1
0
    def _collectMigrationsInto(self, migrations, dirs, systemMigration=False):
        logger.debug("Collecting migrations from {}...", dirs)
        for dir in dirs:
            if os.path.isdir(dir):
                for file in os.listdir(dir):
                    file = os.path.join(dir, file)
                    if os.path.isfile(file):
                        logger.debug("Found migration at {}...", file)
                        metadata = MigrationMetadataReader(file).readMetadata()
                        if metadata.get("mechanic-migration-repeatable",
                                        None) == None:
                            logger.warn(
                                "No metadata present in {}. Default behaviour will change in next version, please add '# mechanic-migration-repeatable: true' to migration file to retain current behaviour.",
                                file)

                        migrationName = os.path.basename(file)
                        rootRequired = metadata.get(
                            "mechanic-root-required",
                            None) == True or re.match(
                                "^.*as[_]?(root|admin)\\..*$",
                                migrationName.lower())
                        migration = MechanicMigration(
                            file=file,
                            metadata=metadata,
                            name=migrationName,
                            systemMigration=systemMigration,
                            rootRequired=rootRequired)
                        if not migration.file in [m.file for m in migrations]:
                            migrations.append(migration)
  def readMetadata(self):
    metadata = {}
    with open(self.path, "r") as file:
      while True:
        line = file.readline()
        if not line:
          break

        line = line.rstrip()

        match = re.match('^\s*#\s*(mechanic-[A-Za-z0-9\-]+):\s*([^\s]+)\s*$', line)
        if match != None:
          key = match.group(1)
          value = self.coerce(match.group(2))
          metadata[key] = value

    logger.debug("Metadata of {}: {}", self.path, metadata)
    return metadata
Esempio n. 3
0
 def _executeMigration(self, migration, command, handleError):
     logger.debug("Running command: {}", command)
     migrationProcess = subprocess.Popen(command,
                                         bufsize=0,
                                         stdout=subprocess.PIPE,
                                         stderr=subprocess.STDOUT,
                                         stdin=None,
                                         shell=False,
                                         cwd=os.path.dirname(
                                             migration.file))
     while True:
         line = migrationProcess.stdout.readline()
         if not line:
             break
         logger.info("{}: {}", migration.name, line.strip())
     exitCode = migrationProcess.wait()
     if exitCode != 0:
         handleError("{} failed with exit code {}.", migration.name,
                     exitCode)
Esempio n. 4
0
  def _runFollowUpCommand(self, followUpCommand, env):
    try:
      if env.isEffectiveUserRoot() and not env.isRealUserRoot():
        followUpCommand2 = ['su', env.getRealUser(), '-c' ]
        followUpCommand2.extend(followUpCommand)
        if not self.config.dryRun:
          logger.debug("Running follow up command: {}", followUpCommand2)
          exitCode = os.execvpe(followUpCommand2[0], followUpCommand2, os.environ)
        else:
          logger.info("Would run follow up command: {}", followUpCommand2)
      else:
        if not self.config.dryRun:
          logger.debug("Running follow up command: {}", followUpCommand)
          exitCode = os.execvpe(followUpCommand[0], followUpCommand, os.environ)
        else:
          logger.info("Would run follow up command: {}", followUpCommand2)

      raise MechanicException("Running follow up command failed with {}.", exitCode)

    except Exception as e:
      raise MechanicException("Running follow up command failed with {}", e.message)
Esempio n. 5
0
    def collectMigrations(self, env, config):
        logger.debug("Collecting migrations...")
        migrations = []
        if env.isEffectiveUserRoot():
            logger.debug("Collecting system migrations...")
            self._collectMigrationsInto(migrations=migrations,
                                        dirs=config.systemMigrationDirs,
                                        systemMigration=True)

        logger.debug("Collecting user migrations...")
        self._collectMigrationsInto(migrations=migrations,
                                    dirs=config.userMigrationDirs)

        logger.debug("Collecting local migrations...")
        self._collectLocalMigrationsInto(migrations)
        migrations.sort(key=lambda m: m.name)
        return migrations
Esempio n. 6
0
    def __init__(self, env, argv):
        self.userMigrationDirs = [
            os.path.join(env.getRealUserHome(), ".mechanic2", "migration.d")
        ]
        self.systemMigrationDirs = ["/etc/mechanic2/migration.d"]
        self._parseOpts(argv)

        logger.debug("Real user: {}", env.getRealUser())
        logger.debug("Real user home: {}", env.getRealUserHome())
        logger.debug("Real user is root: {}", env.isRealUserRoot())
        logger.debug("Effective user is root: {}", env.isEffectiveUserRoot())

        logger.debug("System migration dirs: {}", self.systemMigrationDirs)
        logger.debug("User migration dirs: {}", self.userMigrationDirs)
        logger.debug("Commands: {}", self.commands)
        logger.debug("Follow up command: {}", self.followUpCommand)