Exemple #1
0
def executeAction(configPath, options, config):
    """
   Executes the split backup action.

   @param configPath: Path to configuration file on disk.
   @type configPath: String representing a path on disk.

   @param options: Program command-line options.
   @type options: Options object.

   @param config: Program configuration.
   @type config: Config object.

   @raise ValueError: Under many generic error conditions
   @raise IOError: If there are I/O problems reading or writing files
   """
    logger.debug("Executing split extended action.")
    if config.options is None or config.stage is None:
        raise ValueError(
            "Cedar Backup configuration is not properly filled in.")
    local = LocalConfig(xmlPath=configPath)
    dailyDirs = findDailyDirs(config.stage.targetDir, SPLIT_INDICATOR)
    for dailyDir in dailyDirs:
        _splitDailyDir(dailyDir, local.split.sizeLimit, local.split.splitSize,
                       config.options.backupUser, config.options.backupGroup)
        writeIndicatorFile(dailyDir, SPLIT_INDICATOR,
                           config.options.backupUser,
                           config.options.backupGroup)
    logger.info("Executed the split extended action successfully.")
Exemple #2
0
def _writeStoreIndicator(config, stagingDirs):
    """
   Writes a store indicator file into staging directories.
   @param config: Config object.
   @param stagingDirs: Dictionary mapping directory path to date suffix.
   """
    for stagingDir in stagingDirs.keys():
        writeIndicatorFile(stagingDir, STORE_INDICATOR,
                           config.options.backupUser,
                           config.options.backupGroup)
Exemple #3
0
def writeStoreIndicator(config, stagingDirs):
   """
   Writes a store indicator file into staging directories.

   The store indicator is written into each of the staging directories when
   either a store or rebuild action has written the staging directory to disc.

   @param config: Config object.
   @param stagingDirs: Dictionary mapping directory path to date suffix.
   """
   for stagingDir in stagingDirs.keys():
      writeIndicatorFile(stagingDir, STORE_INDICATOR,
                         config.options.backupUser,
                         config.options.backupGroup)
 def testWriteIndicatorFile_002(self):
     """
   Test with a valid staging directory.
   """
     self.extractTar("tree8")
     stagingDir = self.buildPath([
         "tree8",
         "dir001",
     ])
     writeIndicatorFile(stagingDir, ENCRYPT_INDICATOR, None, None)
     self.failUnless(
         os.path.exists(
             self.buildPath([
                 "tree8",
                 "dir001",
                 ENCRYPT_INDICATOR,
             ])))
Exemple #5
0
def executeAction(configPath, options, config):
    """
   Executes the encrypt backup action.

   @param configPath: Path to configuration file on disk.
   @type configPath: String representing a path on disk.

   @param options: Program command-line options.
   @type options: Options object.

   @param config: Program configuration.
   @type config: Config object.

   @raise ValueError: Under many generic error conditions
   @raise IOError: If there are I/O problems reading or writing files
   """
    logger.debug("Executing encrypt extended action.")
    if config.options is None or config.stage is None:
        raise ValueError(
            "Cedar Backup configuration is not properly filled in.")
    local = LocalConfig(xmlPath=configPath)
    if local.encrypt.encryptMode not in [
            "gpg",
    ]:
        raise ValueError("Unknown encrypt mode [%s]" %
                         local.encrypt.encryptMode)
    if local.encrypt.encryptMode == "gpg":
        _confirmGpgRecipient(local.encrypt.encryptTarget)
    dailyDirs = findDailyDirs(config.stage.targetDir, ENCRYPT_INDICATOR)
    for dailyDir in dailyDirs:
        _encryptDailyDir(dailyDir, local.encrypt.encryptMode,
                         local.encrypt.encryptTarget,
                         config.options.backupUser, config.options.backupGroup)
        writeIndicatorFile(dailyDir, ENCRYPT_INDICATOR,
                           config.options.backupUser,
                           config.options.backupGroup)
    logger.info("Executed the encrypt extended action successfully.")
Exemple #6
0
def executeCollect(configPath, options, config):
   """
   Executes the collect backup action.

   @note: When the collect action is complete, we will write a collect
   indicator to the collect directory, so it's obvious that the collect action
   has completed.  The stage process uses this indicator to decide whether a
   peer is ready to be staged.

   @param configPath: Path to configuration file on disk.
   @type configPath: String representing a path on disk.

   @param options: Program command-line options.
   @type options: Options object.

   @param config: Program configuration.
   @type config: Config object.

   @raise ValueError: Under many generic error conditions
   @raise TarError: If there is a problem creating a tar file
   """
   logger.debug("Executing the 'collect' action.")
   if config.options is None or config.collect is None:
      raise ValueError("Collect configuration is not properly filled in.")
   if ((config.collect.collectFiles is None or len(config.collect.collectFiles) < 1) and
       (config.collect.collectDirs is None or len(config.collect.collectDirs) < 1)):
      raise ValueError("There must be at least one collect file or collect directory.")
   fullBackup = options.full
   logger.debug("Full backup flag is [%s]", fullBackup)
   todayIsStart = isStartOfWeek(config.options.startingDay)
   resetDigest = fullBackup or todayIsStart
   logger.debug("Reset digest flag is [%s]", resetDigest)
   if config.collect.collectFiles is not None:
      for collectFile in config.collect.collectFiles:
         logger.debug("Working with collect file [%s]", collectFile.absolutePath)
         collectMode = _getCollectMode(config, collectFile)
         archiveMode = _getArchiveMode(config, collectFile)
         digestPath = _getDigestPath(config, collectFile.absolutePath)
         tarfilePath = _getTarfilePath(config, collectFile.absolutePath, archiveMode)
         if fullBackup or (collectMode in ['daily', 'incr', ]) or (collectMode == 'weekly' and todayIsStart):
            logger.debug("File meets criteria to be backed up today.")
            _collectFile(config, collectFile.absolutePath, tarfilePath,
                         collectMode, archiveMode, resetDigest, digestPath)
         else:
            logger.debug("File will not be backed up, per collect mode.")
         logger.info("Completed collecting file [%s]", collectFile.absolutePath)
   if config.collect.collectDirs is not None:
      for collectDir in config.collect.collectDirs:
         logger.debug("Working with collect directory [%s]", collectDir.absolutePath)
         collectMode = _getCollectMode(config, collectDir)
         archiveMode = _getArchiveMode(config, collectDir)
         ignoreFile = _getIgnoreFile(config, collectDir)
         linkDepth = _getLinkDepth(collectDir)
         dereference = _getDereference(collectDir)
         recursionLevel = _getRecursionLevel(collectDir)
         (excludePaths, excludePatterns) = _getExclusions(config, collectDir)
         if fullBackup or (collectMode in ['daily', 'incr', ]) or (collectMode == 'weekly' and todayIsStart):
            logger.debug("Directory meets criteria to be backed up today.")
            _collectDirectory(config, collectDir.absolutePath,
                              collectMode, archiveMode, ignoreFile, linkDepth, dereference,
                              resetDigest, excludePaths, excludePatterns, recursionLevel)
         else:
            logger.debug("Directory will not be backed up, per collect mode.")
         logger.info("Completed collecting directory [%s]", collectDir.absolutePath)
   writeIndicatorFile(config.collect.targetDir, COLLECT_INDICATOR,
                      config.options.backupUser, config.options.backupGroup)
   logger.info("Executed the 'collect' action successfully.")
Exemple #7
0
      targetDir = stagingDirs[peer.name]
      if isRunningAsRoot():
         # Since we're running as root, we can change ownership
         ownership = getUidGid(config.options.backupUser,  config.options.backupGroup)
         logger.debug("Using target dir [%s], ownership [%d:%d].", targetDir, ownership[0], ownership[1])
      else:
         # Non-root cannot change ownership, so don't set it
         ownership = None
         logger.debug("Using target dir [%s], ownership [None].", targetDir)
      try:
         count = peer.stagePeer(targetDir=targetDir, ownership=ownership)  # note: utilize effective user's default umask
         logger.info("Staged %d files for peer [%s].", count, peer.name)
         peer.writeStageIndicator()
      except (ValueError, IOError, OSError), e:
         logger.error("Error staging [%s]: %s", peer.name, e)
   writeIndicatorFile(dailyDir, STAGE_INDICATOR, config.options.backupUser, config.options.backupGroup)
   logger.info("Executed the 'stage' action successfully.")


########################################################################
# Private utility functions
########################################################################

################################
# _createStagingDirs() function
################################

def _createStagingDirs(config, dailyDir, peers):
   """
   Creates staging directories as required.