\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/chef/embedded/lib/ruby/gems/2.7.0/gems/net-sftp-3.0.0/lib/net/sftp/operations/

Viewing File: dir.rb

require 'net/ssh/loggable'

module Net; module SFTP; module Operations

  # A convenience class for working with remote directories. It provides methods
  # for searching and enumerating directory entries, similarly to the standard
  # ::Dir class.
  #
  #   sftp.dir.foreach("/remote/path") do |entry|
  #     puts entry.name
  #   end
  #
  #   p sftp.dir.entries("/remote/path").map { |e| e.name }
  #
  #   sftp.dir.glob("/remote/path", "**/*.rb") do |entry|
  #     puts entry.name
  #   end
  class Dir
    # The SFTP session object that drives this directory factory.
    attr_reader :sftp

    # Create a new instance on top of the given SFTP session instance.
    def initialize(sftp)
      @sftp = sftp
    end

    # Calls the block once for each entry in the named directory on the
    # remote server. Yields a Name object to the block, rather than merely
    # the name of the entry.
    def foreach(path)
      handle = sftp.opendir!(path)
      while entries = sftp.readdir!(handle)
        entries.each { |entry| yield entry }
      end
      return nil
    ensure
      sftp.close!(handle) if handle
    end

    # Returns an array of Name objects representing the items in the given
    # remote directory, +path+.
    def entries(path)
      results = []
      foreach(path) { |entry| results << entry }
      return results
    end

    # Works as ::Dir.glob, matching (possibly recursively) all directory
    # entries under +path+ against +pattern+. If a block is given, matches
    # will be yielded to the block as they are found; otherwise, they will
    # be returned in an array when the method finishes.
    #
    # Because working over an SFTP connection is always going to be slower than
    # working purely locally, don't expect this method to perform with the
    # same level of alacrity that ::Dir.glob does; it will work best for
    # shallow directory hierarchies with relatively few directories, though
    # it should be able to handle modest numbers of files in each directory.
    def glob(path, pattern, flags=0)
      flags |= ::File::FNM_PATHNAME
      path = path.chop if path.end_with?('/') && path != '/'

      results = [] unless block_given?
      queue = entries(path).reject { |e| %w(. ..).include?(e.name) }
      while queue.any?
        entry = queue.shift

        if entry.directory? && !%w(. ..).include?(::File.basename(entry.name))
          queue += entries("#{path}/#{entry.name}").map do |e|
            e.name.replace("#{entry.name}/#{e.name}")
            e
          end
        end

        if ::File.fnmatch(pattern, entry.name, flags)
          if block_given?
            yield entry
          else
            results << entry
          end
        end
      end

      return results unless block_given?
    end

    # Identical to calling #glob with a +flags+ parameter of 0 and no block.
    # Simply returns the matched entries as an array.
    def [](path, pattern)
      glob(path, pattern, 0)
    end
  end

end; end; end