# File lib/simp/cli/config/items/action/copy_simp_to_environments_action.rb, line 22
    def apply
      @applied_status = :failed

      enable_copy

      if Dir.exists?(@dest_dir)
        backup_dir = "#{::Utils.puppet_info[:environment_path]}.bak"
        backup = File.join(backup_dir, "simp.#{@start_time.strftime('%Y%m%dT%H%M%S')}")
        debug( "Backing up #{@dest_dir} to #{backup}" )
        FileUtils.mkdir_p(backup_dir)
        group_id = File.stat(::Utils.puppet_info[:environment_path]).gid
        File.chown(nil, group_id, backup_dir)
        FileUtils.mv(@dest_dir, backup)
      end

      simp_env_dir = File.join(@source_dir, 'environments', 'simp')
      debug( "Copying SIMP environment installed at #{simp_env_dir} to \n" +
        "    #{File.dirname(@dest_dir)}" )
      cmd = "#{@copy_script} --rpm_dir=#{simp_env_dir} --rpm_section='post' --rpm_status=1" +
        " --target_dir='.'"
      return unless show_wait_spinner {
        execute(cmd)
      }

      modules_dir = File.join(@source_dir, 'modules')
      debug( "Copying SIMP modules installed at #{modules_dir} to \n    #{File.dirname(@dest_dir)}" )
      module_list = Dir.glob(File.join(modules_dir, '*'))
      module_list.sort.each do |module_dir|
        debug( "Copying SIMP module #{File.basename(module_dir)} to \n    #{File.dirname(@dest_dir)}")
        cmd = "#{@copy_script} --rpm_dir=#{module_dir} --rpm_section='post' --rpm_status=1"
        return unless show_wait_spinner {
          execute(cmd)
        }
      end
      @applied_status = :succeeded
    end