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

Constant Summary

Constants inherited from BaseSetting

BaseSetting::HOOK_TYPES

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, #print, #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

#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

#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


189
190
191
192
193
# File 'lib/puppet/settings/file_setting.rb', line 189

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


94
95
96
# File 'lib/puppet/settings/file_setting.rb', line 94

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”)


66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/puppet/settings/file_setting.rb', line 66

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


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

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


201
202
203
204
205
# File 'lib/puppet/settings/file_setting.rb', line 201

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


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

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”)


81
82
83
84
85
86
87
88
89
90
# File 'lib/puppet/settings/file_setting.rb', line 81

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


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

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.


122
123
124
125
126
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
# File 'lib/puppet/settings/file_setting.rb', line 122

def to_resource
  type = self.type
  return nil unless 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 || Puppet::FileSystem.exist?(path)
  return nil if path =~ /^\/dev/ || 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::Util::Platform.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


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

def type
  :file
end

#validate(value) ⇒ Object

Make sure any provided variables look up to something.


172
173
174
175
176
177
178
179
180
181
# File 'lib/puppet/settings/file_setting.rb', line 172

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