Class: Puppet::Settings::FileSetting

Inherits:
StringSetting show all
Defined in:
lib/puppet/settings/file_setting.rb

Overview

A file.

Defined Under Namespace

Classes: Root, Service, SettingError, Unspecified

Instance Attribute Summary collapse

Attributes inherited from BaseSetting

#call_hook, #default, #deprecated, #desc, #name, #section, #short

Instance Method Summary collapse

Methods inherited from BaseSetting

#allowed_on_commandline?, available_call_hook_values, #call_hook_on_define?, #call_hook_on_initialize?, #completely_deprecated?, #deprecated?, #getopt_args, #has_hook?, #hook=, #inspect, #iscreated, #iscreated?, #optparse_args, #to_config, #value

Constructor Details

#initialize(args) ⇒ FileSetting

Returns a new instance of FileSetting.



58
59
60
61
62
# File 'lib/puppet/settings/file_setting.rb', line 58

def initialize(args)
  @group = Unspecified.new
  @owner = Unspecified.new
  super(args)
end

Instance Attribute Details

#createObject

Returns the value of attribute create.



56
57
58
# File 'lib/puppet/settings/file_setting.rb', line 56

def create
  @create
end

#modeObject

Returns the value of attribute mode.



56
57
58
# File 'lib/puppet/settings/file_setting.rb', line 56

def mode
  @mode
end

Instance Method Details

#create_files?Boolean

Should we create files, rather than just directories?

Returns:

  • (Boolean)


65
66
67
# File 'lib/puppet/settings/file_setting.rb', line 65

def create_files?
  create
end

#exclusive_open(option = 'r', &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.

Parameters:

  • option (String) (defaults to: 'r')

    Extra file operation mode information to use (defaults to read-only mode ‘r’) This is the standard mechanism Ruby uses in the IO class, and therefore encoding may be explicitly like fmode : encoding or fmode : “BOM|UTF-*” for example, a:ASCII or w+:UTF-8



193
194
195
196
197
# File 'lib/puppet/settings/file_setting.rb', line 193

def exclusive_open(option = 'r', &block)
  controlled_access do |mode|
    Puppet::FileSystem.exclusive_open(file(), mode, option, &block)
  end
end

#groupString?

Returns the name of the group to use for the file or nil if the group should not be managed.

Returns:

  • (String, nil)

    the name of the group to use for the file or nil if the group should not be managed



99
100
101
# File 'lib/puppet/settings/file_setting.rb', line 99

def group
  @group.value
end

#group=(value) ⇒ Object

Parameters:

  • value (String)

    the group to use on the created file (can only be “root” or “service”)



71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/puppet/settings/file_setting.rb', line 71

def group=(value)
  @group = case value
           when "root"
             Root.new
           when "service"
             # Group falls back to `nil` because we cannot assume that a "root" group exists.
             # Some systems have root group, others have wheel, others have something else.
             Service.new(:group, nil, @settings, :service_group_available?)
           else
             unknown_value(':group', value)
           end
end

#munge(value) ⇒ Object



115
116
117
118
119
120
# File 'lib/puppet/settings/file_setting.rb', line 115

def munge(value)
  if value.is_a?(String) and value != ':memory:' # for sqlite3 in-memory tests
    value = File.expand_path(value)
  end
  value
end

#open(option = 'r', &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.

Parameters:

  • option (String) (defaults to: 'r')

    Extra file operation mode information to use (defaults to read-only mode ‘r’) This is the standard mechanism Ruby uses in the IO class, and therefore encoding may be explicitly like fmode : encoding or fmode : “BOM|UTF-*” for example, a:ASCII or w+:UTF-8



205
206
207
208
209
# File 'lib/puppet/settings/file_setting.rb', line 205

def open(option = 'r', &block)
  controlled_access do |mode|
    Puppet::FileSystem.open(file, mode, option, &block)
  end
end

#ownerString?

Returns the name of the user to use for the file or nil if the user should not be managed.

Returns:

  • (String, nil)

    the name of the user to use for the file or nil if the user should not be managed



105
106
107
# File 'lib/puppet/settings/file_setting.rb', line 105

def owner
  @owner.value
end

#owner=(value) ⇒ Object

Parameters:

  • value (String)

    the owner to use on the created file (can only be “root” or “service”)



86
87
88
89
90
91
92
93
94
95
# File 'lib/puppet/settings/file_setting.rb', line 86

def owner=(value)
  @owner = case value
           when "root"
             Root.new
           when "service"
             Service.new(:user, "root", @settings, :service_user_available?)
           else
             unknown_value(':owner', value)
           end
end

#set_meta(meta) ⇒ Object



109
110
111
112
113
# File 'lib/puppet/settings/file_setting.rb', line 109

def set_meta(meta)
  self.owner = meta.owner if meta.owner
  self.group = meta.group if meta.group
  self.mode = meta.mode if meta.mode
end

#to_resourceObject

Turn our setting thing into a Puppet::Resource instance.



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/puppet/settings/file_setting.rb', line 127

def to_resource
  return nil unless type = self.type

  path = self.value

  return nil unless path.is_a?(String)

  # Make sure the paths are fully qualified.
  path = File.expand_path(path)

  return nil unless type == :directory or create_files? or Puppet::FileSystem.exist?(path)
  return nil if path =~ /^\/dev/ or path =~ /^[A-Z]:\/dev/i

  resource = Puppet::Resource.new(:file, path)

  if Puppet[:manage_internal_file_permissions]
    if self.mode
      # This ends up mimicking the munge method of the mode
      # parameter to make sure that we're always passing the string
      # version of the octal number.  If we were setting the
      # 'should' value for mode rather than the 'is', then the munge
      # method would be called for us automatically.  Normally, one
      # wouldn't need to call the munge method manually, since
      # 'should' gets set by the provider and it should be able to
      # provide the data in the appropriate format.
      mode = self.mode
      mode = mode.to_i(8) if mode.is_a?(String)
      mode = mode.to_s(8)
      resource[:mode] = mode
    end

    # REMIND fails on Windows because chown/chgrp functionality not supported yet
    if Puppet.features.root? and !Puppet.features.microsoft_windows?
      resource[:owner] = self.owner if self.owner
      resource[:group] = self.group if self.group
    end
  end

  resource[:ensure] = type
  resource[:loglevel] = :debug
  resource[:links] = :follow
  resource[:backup] = false

  resource.tag(self.section, self.name, "settings")

  resource
end

#typeObject



122
123
124
# File 'lib/puppet/settings/file_setting.rb', line 122

def type
  :file
end

#validate(value) ⇒ Object

Make sure any provided variables look up to something.



176
177
178
179
180
181
182
183
184
185
# File 'lib/puppet/settings/file_setting.rb', line 176

def validate(value)
  return true unless value.is_a? String
  value.scan(/\$(\w+)/) { |name|
    name = $1
    unless @settings.include?(name)
      raise ArgumentError,
        _("Settings parameter '%{name}' is undefined") % { name: name }
    end
  }
end