Beispiel #1
0
 def save(self):
     """
  Save the list of subusers to disk.
 """
     serializedUnlockedSubusersDict = {}
     serializedLockedSubusersDict = {}
     for subuserName, subuser in self.items():
         serializedSubuser = {}
         serializedSubuser["source-repo"] = subuser.getImageSource(
         ).getRepository().getName()
         serializedSubuser["image-source"] = subuser.getImageSource(
         ).getName()
         serializedSubuser[
             "executable-shortcut-installed"] = subuser.isExecutableShortcutInstalled(
             )
         serializedSubuser["docker-image"] = subuser.getImageId()
         if subuser.locked():
             serializedLockedSubusersDict[subuserName] = serializedSubuser
         else:
             serializedUnlockedSubusersDict[subuserName] = serializedSubuser
     with open(
             os.path.join(self.getUser().getConfig()["registry-dir"],
                          "subusers.json"), 'w') as file_f:
         json.dump(serializedUnlockedSubusersDict,
                   file_f,
                   indent=1,
                   separators=(',', ': '))
     with open(
             os.path.join(
                 self.getUser().getConfig()["locked-subusers-path"]),
             'w') as file_f:
         json.dump(serializedLockedSubusersDict,
                   file_f,
                   indent=1,
                   separators=(',', ': '))
Beispiel #2
0
 def save(self):
     """
  Save the list of subusers to disk.
 """
     serializedSubusersDict = {}
     for subuserName, subuser in self.iteritems():
         serializedSubusersDict[subuserName] = {}
         serializedSubusersDict[subuserName][
             "source-repo"] = subuser.getImageSource().getRepository(
             ).getName()
         serializedSubusersDict[subuserName][
             "image-source"] = subuser.getImageSource().getName()
         serializedSubusersDict[subuserName][
             "executable-shortcut-installed"] = subuser.isExecutableShortcutInstalled(
             )
         serializedSubusersDict[subuserName][
             "docker-image"] = subuser.getImageId()
     with open(
             os.path.join(
                 self.getUser().getConfig().getSubusersDotJsonPath()),
             'w') as file_f:
         json.dump(serializedSubusersDict,
                   file_f,
                   indent=1,
                   separators=(',', ': '))
Beispiel #3
0
def verify(user,permissionsAccepter=None,checkForUpdatesExternally=False,subusers=[],prompt=False,useCache=False):
  """
   Ensure that:
     - Registry is consistent; warns the user about subusers that point to non-existant source images.
     - For each subuser there is an up-to-date image installed.
     - No-longer-needed temporary repositories are removed. All temporary repositories have at least one subuser who's image is built from one of the repository's image sources.
     - No-longer-needed installed images are removed.
  """
  user.getRegistry().log("Verifying subuser configuration.")
  user.getRegistry().log("Verifying registry consistency...")
  for _,subuser in user.getRegistry().getSubusers().items():
    try:
      subuser.getImageSource()
    except subuserlib.classes.subuser.NoImageSourceException:
      user.getRegistry().log("WARNING: "+subuser.getName()+" is no longer present in it's source repository. Support for this progam may have been dropped.")
      try:
        subusers.remove(subuser)
      except ValueError:
        pass
  user.getRegistry().log("Unregistering any non-existant installed images.")
  user.getInstalledImages().unregisterNonExistantImages()
  if subusers:
    user.getRegistry().setChanged(True)
    user.getRegistry().log("Approving permissions...",verbosityLevel=3)
    (failedSubusers,permissionParsingExceptions) = approvePermissions(user,subusers,permissionsAccepter)
    user.getRegistry().log("Permissions approved...",verbosityLevel=3)
    subusers = [x for x in subusers if x not in failedSubusers]
    for failedSubuser in failedSubusers:
      try:
        failedSubuser.getPermissions()
      except subuserlib.classes.subuser.SubuserHasNoPermissionsException:
        del user.getRegistry().getSubusers()[failedSubuser.getName()]
    subusers += ensureServiceSubusersAreSetup(user,subusers)
    installationTask = InstallationTask(user,subusersToBeUpdatedOrInstalled=subusers,checkForUpdatesExternally=checkForUpdatesExternally)
    outOfDateSubusers = installationTask.getOutOfDateSubusers()
    if outOfDateSubusers:
      user.getRegistry().log("New images for the following subusers need to be installed:")
      for subuser in outOfDateSubusers:
        user.getRegistry().log(subuser.getName())
      if (not prompt) or (prompt and (not input("Would you like to install those images now? [Y/n]") == "n")):
        installationTask.updateOutOfDateSubusers(useCache=useCache)
    for exception in permissionParsingExceptions:
      user.getRegistry().log(str(exception))
    subusersWhosImagesFailedToBuild = installationTask.getSubusersWhosImagesFailedToBuild()
    if subusersWhosImagesFailedToBuild:
      user.getRegistry().log("Images for the following subusers failed to build:")
    for subuser in subusersWhosImagesFailedToBuild:
      user.getRegistry().log(subuser.getName())
    for subuser in subusers:
      try:
        subuser.getRunReadyImage().setup()
        subuser.setupHomeDir()
      except subuserlib.classes.subuserSubmodules.run.runtimeCache.NoRuntimeCacheForSubusersWhichDontHaveExistantImagesException:
        pass
  user.getInstalledImages().save()
  trimUnneededTempRepos(user)
  rebuildBinDir(user)
  cleanupRuntimeDirs(user)
  cleanUpRuntimeCache(user)
  cleanUpAfterImproperlyTerminatedServices(user)
Beispiel #4
0
 def save(self):
   """
    Save the list of subusers to disk.
   """
   serializedSubusersDict = {}
   for subuserName,subuser in self.iteritems():
     serializedSubusersDict[subuserName] = {}
     serializedSubusersDict[subuserName]["source-repo"] = subuser.getImageSource().getRepository().getName()
     serializedSubusersDict[subuserName]["image-source"] = subuser.getImageSource().getName()
     serializedSubusersDict[subuserName]["executable-shortcut-installed"] = subuser.isExecutableShortcutInstalled()
     serializedSubusersDict[subuserName]["docker-image"] = subuser.getImageId()
   with open(os.path.join(self.getUser().getConfig().getSubusersDotJsonPath()), 'w') as file_f:
     json.dump(serializedSubusersDict, file_f, indent=1, separators=(',', ': '))
Beispiel #5
0
def trimUnneededTempRepos(user):
    user.getRegistry().log(
        "Running garbage collector on temporary repositories...")
    reposToRemove = []
    for repoId, repo in user.getRegistry().getRepositories(
    ).userRepositories.items():
        keep = False
        if repo.isTemporary():
            for _, installedImage in user.getInstalledImages().items():
                if repoId == installedImage.getSourceRepoId():
                    keep = True
            for _, subuser in user.getRegistry().getSubusers().items():
                try:
                    if repoId == subuser.getImageSource().getRepository(
                    ).getName():
                        keep = True
                except subuserlib.classes.subuser.NoImageSourceException:
                    pass
        else:
            keep = True
        if not keep:
            user.getRegistry().logChange(
                "Removing uneeded temporary repository: " +
                repo.getDisplayName())
            repo.removeGitRepo()
            reposToRemove.append(repoId)
    for repoId in reposToRemove:
        del user.getRegistry().getRepositories().userRepositories[repoId]
def approvePermissions(user,subuserNames,permissionsAccepter):
  subusersWhosPermissionsFailedToParse = []
  exceptions = []
  for subuserName in subuserNames:
    subuser = user.getRegistry().getSubusers()[subuserName]
    try:
      userApproved = subuser.getPermissions()
    except subuserlib.classes.subuser.SubuserHasNoPermissionsException:
      userApproved = None
    try:
      oldDefaults = subuser.getPermissionsTemplate()
      newDefaults = subuser.getImageSource().getPermissions()
      permissionsAccepter.accept(subuser=subuser,oldDefaults=oldDefaults,newDefaults=newDefaults,userApproved=userApproved)
      subuser.getPermissionsTemplate().update(subuser.getImageSource().getPermissions())
      subuser.getPermissionsTemplate().save()
    except SyntaxError as e:
      subusersWhosPermissionsFailedToParse.append(subuserName)
      exceptions.append(e)
  return (subusersWhosPermissionsFailedToParse,exceptions)
Beispiel #7
0
def approvePermissions(user, subuserNames, permissionsAccepter):
    subusersWhosPermissionsFailedToParse = []
    exceptions = []
    for subuserName in subuserNames:
        subuser = user.getRegistry().getSubusers()[subuserName]
        try:
            userApproved = subuser.getPermissions()
        except subuserlib.classes.subuser.SubuserHasNoPermissionsException:
            userApproved = None
        try:
            oldDefaults = subuser.getPermissionsTemplate()
            newDefaults = subuser.getImageSource().getPermissions()
            permissionsAccepter.accept(subuser=subuser,
                                       oldDefaults=oldDefaults,
                                       newDefaults=newDefaults,
                                       userApproved=userApproved)
            subuser.getPermissionsTemplate().update(
                subuser.getImageSource().getPermissions())
            subuser.getPermissionsTemplate().save()
        except SyntaxError as e:
            subusersWhosPermissionsFailedToParse.append(subuserName)
            exceptions.append(e)
    return (subusersWhosPermissionsFailedToParse, exceptions)
Beispiel #8
0
def approvePermissions(user,subusers,permissionsAccepter):
  subusersWhosPermissionsFailedToParse = []
  exceptions = []
  for subuser in subusers:
    if subuser.locked():
      continue
    try:
      userApproved = subuser.getPermissions()
    except subuserlib.classes.subuser.SubuserHasNoPermissionsException:
      userApproved = None
    try:
      oldDefaults = subuser.getPermissionsTemplate()
      newDefaults = subuser.getImageSource().getPermissions()
      permissionsAccepter.accept(subuser=subuser,oldDefaults=oldDefaults,newDefaults=newDefaults,userApproved=userApproved)
      subuser.getPermissionsTemplate().update(subuser.getImageSource().getPermissions())
      subuser.getPermissionsTemplate().save()
    except SyntaxError as e:
      subusersWhosPermissionsFailedToParse.append(subuser)
      exceptions.append(e)
    except subuserlib.classes.subuser.NoImageSourceException:
      subusersWhosPermissionsFailedToParse.append(subuser)
      user.getRegistry().log("Warning: The image source for subuser %s is no longer available."%subuser.getName())
  return (subusersWhosPermissionsFailedToParse,exceptions)
def trimUnneededTempRepos(user):
  user.getRegistry().log("Running garbage collector on temporary repositories...")
  reposToRemove = []
  for repoId,repo in user.getRegistry().getRepositories().userRepositories.items():
    keep = False
    if repo.isTemporary():
      for _,installedImage in user.getInstalledImages().items():
        if repoId == installedImage.getSourceRepoId():
          keep = True
      for _,subuser in user.getRegistry().getSubusers().items():
        if repoId == subuser.getImageSource().getRepository().getName():
          keep = True
    else:
      keep = True
    if not keep:
      user.getRegistry().logChange("Removing uneeded temporary repository: "+repo.getDisplayName())
      repo.removeGitRepo()
      reposToRemove.append(repoId)
  for repoId in reposToRemove:
    del user.getRegistry().getRepositories().userRepositories[repoId]
Beispiel #10
0
def verify(user,
           permissionsAccepter=None,
           checkForUpdatesExternally=False,
           subuserNames=[],
           prompt=False):
    """
   Ensure that:
     - Registry is consistent; warns the user about subusers that point to non-existant source images.
     - For each subuser there is an up-to-date image installed.
     - No-longer-needed temporary repositories are removed. All temporary repositories have at least one subuser who's image is built from one of the repository's image sources.
     - No-longer-needed installed images are removed.
  """
    user.getRegistry().log("Verifying subuser configuration.")
    user.getRegistry().log("Verifying registry consistency...")
    for _, subuser in user.getRegistry().getSubusers().items():
        try:
            subuser.getImageSource()
        except subuserlib.classes.subuser.NoImageSourceException:
            user.getRegistry().log(
                "WARNING: " + subuser.getName() +
                " is no longer present in it's source repository. Support for this progam may have been dropped."
            )
            try:
                subuserNames.remove(subuser.getName())
            except ValueError:
                pass
    user.getRegistry().log("Unregistering any non-existant installed images.")
    user.getInstalledImages().unregisterNonExistantImages()
    if subuserNames:
        user.getRegistry().setChanged(True)
        (failedSubuserNames, permissionParsingExceptions) = approvePermissions(
            user, subuserNames, permissionsAccepter)
        subuserNames = [x for x in subuserNames if x not in failedSubuserNames]
        subuserNames += ensureServiceSubusersAreSetup(user, subuserNames)
        subusers = [
            user.getRegistry().getSubusers()[subuserName]
            for subuserName in subuserNames
        ]
        installationTask = InstallationTask(
            user,
            subusersToBeUpdatedOrInstalled=subusers,
            checkForUpdatesExternally=checkForUpdatesExternally)
        outOfDateSubusers = installationTask.getOutOfDateSubusers()
        if outOfDateSubusers:
            user.getRegistry().log(
                "New images for the following subusers need to be installed:")
            for subuser in outOfDateSubusers:
                user.getRegistry().log(subuser.getName())
            if (not prompt) or (prompt and (not raw_input(
                    "Would you like to install those images now? [Y/n]")
                                            == "n")):
                installationTask.updateOutOfDateSubusers()
        for exception in permissionParsingExceptions:
            user.getRegistry().log(str(exception))
        subusersWhosImagesFailedToBuild = installationTask.getSubusersWhosImagesFailedToBuild(
        )
        if subusersWhosImagesFailedToBuild:
            user.getRegistry().log(
                "Images for the following subusers failed to build:")
        for subuser in subusersWhosImagesFailedToBuild:
            user.getRegistry().log(subuser.getName())
        for subuser in subusers:
            try:
                subuser.getRunReadyImage().setup()
                subuser.setupHomeDir()
            except subuserlib.classes.subuserSubmodules.run.runtimeCache.NoRuntimeCacheForSubusersWhichDontHaveExistantImagesException:
                pass
    user.getInstalledImages().save()
    trimUnneededTempRepos(user)
    rebuildBinDir(user)
    cleanupRuntimeDirs(user)
    cleanUpRuntimeCache(user)
    cleanUpAfterImproperlyTerminatedServices(user)