def perform!
      @started_at = Time.now.utc
      @time = package.time = started_at.strftime("%Y.%m.%d.%H.%M.%S")

      log!(:started)
      before_hook

      procedures.each do |procedure|
        procedure.is_a?(Proc) ? procedure.call : procedure.each(&:perform!)
      end

      syncers.each(&:perform!)
    rescue Interrupt
      @interrupted = true
      raise
    rescue Exception => err
      @exception = err
    ensure
      unless @interrupted
        set_exit_status
        @finished_at = Time.now.utc
        log!(:finished)
        after_hook
      end
    end
def perform!
      @started_at = Time.now.utc
      @time = package.time = started_at.strftime("%Y.%m.%d.%H.%M.%S")

      log!(:started)
      before_hook

      procedures.each do |procedure|
        procedure.is_a?(Proc) ? procedure.call : procedure.each(&:perform!)
      end

      syncers.each(&:perform!)
    rescue Interrupt
      @interrupted = true
      raise
    rescue Exception => err
      @exception = err
    ensure
      unless @interrupted
        set_exit_status
        @finished_at = Time.now.utc
        log!(:finished)
        after_hook
      end
    end
Performs the backup process

 Once complete, #exit_status will indicate the result of this process.

 If any errors occur during the backup process, all temporary files will
 be left in place. If the error occurs before Packaging, then the
 temporary folder (tmp_path/trigger) will remain and may contain all or
 some of the configured Archives and/or Database dumps. If the error
 occurs after Packaging, but before the Storages complete, then the final
 packaged files (located in the root of tmp_path) will remain.

 *** Important ***
 If an error occurs and any of the above mentioned temporary files remain,
 those files *** will be removed *** before the next scheduled backup for
 the same trigger.