Class: Puppet::FileServing::Fileset

Inherits:
Object
  • Object
show all
Defined in:
lib/puppet/file_serving/fileset.rb

Overview

Operate recursively on a path, returning a set of file paths.

Defined Under Namespace

Classes: FileSetEntry

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path, options = {}) ⇒ Fileset

Returns a new instance of Fileset.

Raises:

  • (ArgumentError)


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/puppet/file_serving/fileset.rb', line 29

def initialize(path, options = {})
  if Puppet::Util::Platform.windows?
    # REMIND: UNC path
    path = path.chomp(File::SEPARATOR) unless path =~ %r{^[A-Za-z]:/$}
  else
    path = path.chomp(File::SEPARATOR) unless path == File::SEPARATOR
  end
  raise ArgumentError, _("Fileset paths must be fully qualified: %{path}") % { path: path } unless Puppet::Util.absolute_path?(path)

  @path = path

  # Set our defaults.
  self.ignore = []
  self.links = :manage
  @recurse = false
  @recurselimit = :infinite
  @max_files = 0

  if options.is_a?(Puppet::Indirector::Request)
    initialize_from_request(options)
  else
    initialize_from_hash(options)
  end

  raise ArgumentError, _("Fileset paths must exist") unless valid?(path)
  # TRANSLATORS "recurse" and "recurselimit" are parameter names and should not be translated
  raise ArgumentError, _("Fileset recurse parameter must not be a number anymore, please use recurselimit") if @recurse.is_a?(Integer)
end

Instance Attribute Details

#checksum_typeObject

Returns the value of attribute checksum_type.



10
11
12
# File 'lib/puppet/file_serving/fileset.rb', line 10

def checksum_type
  @checksum_type
end

#ignoreObject

Returns the value of attribute ignore.



9
10
11
# File 'lib/puppet/file_serving/fileset.rb', line 9

def ignore
  @ignore
end

Returns the value of attribute links.



9
10
11
# File 'lib/puppet/file_serving/fileset.rb', line 9

def links
  @links
end

#max_filesObject

Returns the value of attribute max_files.



10
11
12
# File 'lib/puppet/file_serving/fileset.rb', line 10

def max_files
  @max_files
end

#pathObject (readonly)

Returns the value of attribute path.



9
10
11
# File 'lib/puppet/file_serving/fileset.rb', line 9

def path
  @path
end

#recurseObject

Returns the value of attribute recurse.



10
11
12
# File 'lib/puppet/file_serving/fileset.rb', line 10

def recurse
  @recurse
end

#recurselimitObject

Returns the value of attribute recurselimit.



10
11
12
# File 'lib/puppet/file_serving/fileset.rb', line 10

def recurselimit
  @recurselimit
end

Class Method Details

.merge(*filesets) ⇒ Object

Produce a hash of files, with merged so that earlier files with the same postfix win. E.g., /dir1/subfile beats /dir2/subfile. It’s a hash because we need to know the relative path of each file, and the base directory.

This will probably only ever be used for searching for plugins.


17
18
19
20
21
22
23
24
25
26
27
# File 'lib/puppet/file_serving/fileset.rb', line 17

def self.merge(*filesets)
  result = {}

  filesets.each do |fileset|
    fileset.files.each do |file|
      result[file] ||= fileset.path
    end
  end

  result
end

Instance Method Details

#filesObject

Return a list of all files in our fileset. This is different from the normal definition of find in that we support specific levels of recursion, which means we need to know when we’re going another level deep, which Find doesn’t do.



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/puppet/file_serving/fileset.rb', line 62

def files
  files = perform_recursion
  soft_max_files = 1000

  # munged_max_files is needed since puppet http handler is keeping negative numbers as strings
  # https://github.com/puppetlabs/puppet/blob/main/lib/puppet/network/http/handler.rb#L196-L197
  munged_max_files = max_files == '-1' ? -1 : max_files

  if munged_max_files > 0 && files.size > munged_max_files
    raise Puppet::Error, _("The directory '%{path}' contains %{entries} entries, which exceeds the limit of %{munged_max_files} specified by the max_files parameter for this resource. The limit may be increased, but be aware that large number of file resources can result in excessive resource consumption and degraded performance. Consider using an alternate method to manage large directory trees") % { path: path, entries: files.size, munged_max_files: munged_max_files }
  elsif munged_max_files == 0 && files.size > soft_max_files
    Puppet.warning _("The directory '%{path}' contains %{entries} entries, which exceeds the default soft limit %{soft_max_files} and may cause excessive resource consumption and degraded performance. To remove this warning set a value for `max_files` parameter or consider using an alternate method to manage large directory trees") % { path: path, entries: files.size, soft_max_files: soft_max_files }
  end

  # Now strip off the leading path, so each file becomes relative, and remove
  # any slashes that might end up at the beginning of the path.
  result = files.collect { |file| file.sub(%r{^#{Regexp.escape(@path)}/*}, '') }

  # And add the path itself.
  result.unshift(".")

  result
end