Class: Puppet::FileSystem::FileImpl Private

Inherits:
Object
  • Object
show all
Defined in:
lib/puppet/file_system/file_impl.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Abstract implementation of the Puppet::FileSystem

Direct Known Subclasses

Posix

Instance Method Summary collapse

Instance Method Details

#assert_path(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/puppet/file_system/file_impl.rb', line 10

def assert_path(path)
  return path if path.is_a?(Pathname)

  # Some paths are string, or in the case of WatchedFile, it pretends to be
  # one by implementing to_str.
  if path.respond_to?(:to_str)
    Pathname.new(path)
  else
    raise ArgumentError, _("FileSystem implementation expected Pathname, got: '%{klass}'") % { klass: path.class }
  end
end

#basename(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



39
40
41
# File 'lib/puppet/file_system/file_impl.rb', line 39

def basename(path)
  path.basename.to_s
end

#binread(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Raises:

  • (NotImplementedError)


93
94
95
# File 'lib/puppet/file_system/file_impl.rb', line 93

def binread(path)
  raise NotImplementedError
end

#children(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



125
126
127
# File 'lib/puppet/file_system/file_impl.rb', line 125

def children(path)
  path.children
end

#chmod(mode, path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



157
158
159
# File 'lib/puppet/file_system/file_impl.rb', line 157

def chmod(mode, path)
  FileUtils.chmod(mode, path)
end

#compare_stream(path, stream) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



153
154
155
# File 'lib/puppet/file_system/file_impl.rb', line 153

def compare_stream(path, stream)
  ::File.open(path, 0, 'rb') { |this| FileUtils.compare_stream(this, stream) }
end

#dir(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



35
36
37
# File 'lib/puppet/file_system/file_impl.rb', line 35

def dir(path)
  path.dirname
end

#directory?(path) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


101
102
103
# File 'lib/puppet/file_system/file_impl.rb', line 101

def directory?(path)
  ::File.directory?(path)
end

#each_line(path, &block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



75
76
77
78
79
80
81
# File 'lib/puppet/file_system/file_impl.rb', line 75

def each_line(path, &block)
  ::File.open(path) do |f|
    f.each_line do |line|
      yield line
    end
  end
end

#exclusive_create(path, mode, &block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



47
48
49
50
# File 'lib/puppet/file_system/file_impl.rb', line 47

def exclusive_create(path, mode, &block)
  opt = File::CREAT | File::EXCL | File::WRONLY
  self.open(path, mode, opt, &block)
end

#exclusive_open(path, mode, options = 'r', timeout = 300, &block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/puppet/file_system/file_impl.rb', line 52

def exclusive_open(path, mode, options = 'r', timeout = 300, &block)
  wait = 0.001 + (Kernel.rand / 1000)
  written = false
  until written
    ::File.open(path, options, mode) do |rf|
      if rf.flock(::File::LOCK_EX | ::File::LOCK_NB)
        Puppet.debug { _("Locked '%{path}'") % { path: path } }
        yield rf
        written = true
        Puppet.debug { _("Unlocked '%{path}'") % { path: path } }
      else
        Puppet.debug { "Failed to lock '%s' retrying in %.2f milliseconds" % [path, wait * 1000] }
        sleep wait
        timeout -= wait
        wait *= 2
        if timeout < 0
          raise Timeout::Error, _("Timeout waiting for exclusive lock on %{path}") % { path: path }
        end
      end
    end
  end
end

#executable?(path) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


109
110
111
# File 'lib/puppet/file_system/file_impl.rb', line 109

def executable?(path)
  ::File.executable?(path)
end

#exist?(path) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


97
98
99
# File 'lib/puppet/file_system/file_impl.rb', line 97

def exist?(path)
  ::File.exist?(path)
end

#expand_path(path, dir_string = nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



26
27
28
29
# File 'lib/puppet/file_system/file_impl.rb', line 26

def expand_path(path, dir_string = nil)
  # ensure `nil` values behave like underlying File.expand_path
  ::File.expand_path(path.nil? ? nil : path_string(path), dir_string)
end

#file?(path) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


105
106
107
# File 'lib/puppet/file_system/file_impl.rb', line 105

def file?(path)
  ::File.file?(path)
end

#lstat(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



149
150
151
# File 'lib/puppet/file_system/file_impl.rb', line 149

def lstat(path)
  ::File.lstat(path)
end

#mkpath(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



121
122
123
# File 'lib/puppet/file_system/file_impl.rb', line 121

def mkpath(path)
  path.mkpath
end

#open(path, mode, options, &block) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



31
32
33
# File 'lib/puppet/file_system/file_impl.rb', line 31

def open(path, mode, options, &block)
  ::File.open(path, options, mode, &block)
end

#path_string(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



22
23
24
# File 'lib/puppet/file_system/file_impl.rb', line 22

def path_string(path)
  path.to_s
end

#pathname(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



6
7
8
# File 'lib/puppet/file_system/file_impl.rb', line 6

def pathname(path)
  path.is_a?(Pathname) ? path : Pathname.new(path)
end

#read(path, opts = {}) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



83
84
85
# File 'lib/puppet/file_system/file_impl.rb', line 83

def read(path, opts = {})
  path.read(**opts)
end

#read_preserve_line_endings(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



87
88
89
90
91
# File 'lib/puppet/file_system/file_impl.rb', line 87

def read_preserve_line_endings(path)
  default_encoding = Encoding.default_external.name
  encoding = default_encoding.downcase.start_with?('utf-') ? "bom|#{default_encoding}" : default_encoding
  read(path, encoding: encoding)
end

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



137
138
139
# File 'lib/puppet/file_system/file_impl.rb', line 137

def readlink(path)
  ::File.readlink(path)
end

#replace_file(path, mode = nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
# File 'lib/puppet/file_system/file_impl.rb', line 161

def replace_file(path, mode = nil)
  begin
    stat = lstat(path)
    gid = stat.gid
    uid = stat.uid
    mode ||= stat.mode & 0o7777
  rescue Errno::ENOENT
    mode ||= 0o640
  end

  tempfile = Puppet::FileSystem::Uniquefile.new(Puppet::FileSystem.basename_string(path), Puppet::FileSystem.dir_string(path))
  begin
    begin
      yield tempfile
      tempfile.flush
      tempfile.fsync
    ensure
      tempfile.close
    end

    tempfile_path = tempfile.path
    FileUtils.chown(uid, gid, tempfile_path) if uid && gid
    chmod(mode, tempfile_path)
    ::File.rename(tempfile_path, path_string(path))
  ensure
    tempfile.close!
  end
end

#size(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



43
44
45
# File 'lib/puppet/file_system/file_impl.rb', line 43

def size(path)
  path.size
end

#stat(path) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



145
146
147
# File 'lib/puppet/file_system/file_impl.rb', line 145

def stat(path)
  ::File.stat(path)
end

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



129
130
131
# File 'lib/puppet/file_system/file_impl.rb', line 129

def symlink(path, dest, options = {})
  FileUtils.symlink(path, dest, **options)
end

#symlink?(path) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


133
134
135
# File 'lib/puppet/file_system/file_impl.rb', line 133

def symlink?(path)
  ::File.symlink?(path)
end

#touch(path, mtime: nil) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



117
118
119
# File 'lib/puppet/file_system/file_impl.rb', line 117

def touch(path, mtime: nil)
  ::FileUtils.touch(path, mtime: mtime)
end

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



141
142
143
# File 'lib/puppet/file_system/file_impl.rb', line 141

def unlink(*paths)
  ::File.unlink(*paths)
end

#writable?(path) ⇒ Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


113
114
115
# File 'lib/puppet/file_system/file_impl.rb', line 113

def writable?(path)
  path.writable?
end