diff options
| author | Luke Kanies <luke@madstop.com> | 2009-08-19 11:31:19 -0700 |
|---|---|---|
| committer | James Turnbull <james@lovedthanlost.net> | 2009-08-24 11:36:20 +1000 |
| commit | 058514aaf44f981a3239b402f2ff116ebf0d951f (patch) | |
| tree | 12ee14aa7e1f693671167c2190ad1021e10d4fee /lib/puppet/util/settings | |
| parent | b0f219ad177c8e9c261578586f0324cef0c71cd2 (diff) | |
| download | puppet-058514aaf44f981a3239b402f2ff116ebf0d951f.tar.gz puppet-058514aaf44f981a3239b402f2ff116ebf0d951f.tar.xz puppet-058514aaf44f981a3239b402f2ff116ebf0d951f.zip | |
Moving Setting classes into separate files
This isn't really a refactor, just moving code around.
I did some simple method renaming, also.
Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'lib/puppet/util/settings')
| -rw-r--r-- | lib/puppet/util/settings/boolean_setting.rb | 33 | ||||
| -rw-r--r-- | lib/puppet/util/settings/file_setting.rb | 102 | ||||
| -rw-r--r-- | lib/puppet/util/settings/setting.rb | 110 |
3 files changed, 245 insertions, 0 deletions
diff --git a/lib/puppet/util/settings/boolean_setting.rb b/lib/puppet/util/settings/boolean_setting.rb new file mode 100644 index 000000000..cc2704c4e --- /dev/null +++ b/lib/puppet/util/settings/boolean_setting.rb @@ -0,0 +1,33 @@ +require 'puppet/util/settings/setting' + +# A simple boolean. +class Puppet::Util::Settings::BooleanSetting < Puppet::Util::Settings::Setting + # get the arguments in getopt format + def getopt_args + if short + [["--#{name}", "-#{short}", GetoptLong::NO_ARGUMENT], + ["--no-#{name}", GetoptLong::NO_ARGUMENT]] + else + [["--#{name}", GetoptLong::NO_ARGUMENT], + ["--no-#{name}", GetoptLong::NO_ARGUMENT]] + end + end + + def optparse_args + if short + ["--[no-]#{name}", "-#{short}", desc, :NONE ] + else + ["--[no-]#{name}", desc, :NONE] + end + end + + def munge(value) + case value + when true, "true"; return true + when false, "false"; return false + else + raise ArgumentError, "Invalid value '%s' for %s" % + [value.inspect, @name] + end + end +end diff --git a/lib/puppet/util/settings/file_setting.rb b/lib/puppet/util/settings/file_setting.rb new file mode 100644 index 000000000..08d8039f4 --- /dev/null +++ b/lib/puppet/util/settings/file_setting.rb @@ -0,0 +1,102 @@ +require 'puppet/util/settings/setting' + +# A file. +class Puppet::Util::Settings::FileSetting < Puppet::Util::Settings::Setting + attr_writer :owner, :group + attr_accessor :mode, :create + + # Should we create files, rather than just directories? + def create_files? + create + end + + def group + if defined? @group + return @settings.convert(@group) + else + return nil + end + end + + def owner + if defined? @owner + return @settings.convert(@owner) + else + return nil + end + end + + # Set the type appropriately. Yep, a hack. This supports either naming + # the variable 'dir', or adding a slash at the end. + def munge(value) + # If it's not a fully qualified path... + if value.is_a?(String) and value !~ /^\$/ and value !~ /^\// and value != 'false' + # Make it one + value = File.join(Dir.getwd, value) + end + if value.to_s =~ /\/$/ + @type = :directory + return value.sub(/\/$/, '') + end + return value + end + + # Return the appropriate type. + def type + value = @settings.value(self.name) + if @name.to_s =~ /dir/ + return :directory + elsif value.to_s =~ /\/$/ + return :directory + elsif value.is_a? String + return :file + else + return nil + end + end + + # Turn our setting thing into a Puppet::Resource instance. + 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.join(Dir.getwd, path) unless path =~ /^\// + + return nil unless type == :directory or create_files? or File.exist?(path) + return nil if path =~ /^\/dev/ + + resource = Puppet::Resource.new(:file, path) + resource[:mode] = self.mode if self.mode + + if Puppet.features.root? + resource[:owner] = self.owner if self.owner + resource[:group] = self.group if self.group + end + + resource[:ensure] = type + resource[:loglevel] = :debug + resource[:backup] = false + + resource.tag(self.section, self.name, "settings") + + resource + end + + # Make sure any provided variables look up to something. + def validate(value) + return true unless value.is_a? String + value.scan(/\$(\w+)/) { |name| + name = $1 + unless @settings.include?(name) + raise ArgumentError, + "Settings parameter '%s' is undefined" % + name + end + } + end +end + diff --git a/lib/puppet/util/settings/setting.rb b/lib/puppet/util/settings/setting.rb new file mode 100644 index 000000000..e64cfd6c6 --- /dev/null +++ b/lib/puppet/util/settings/setting.rb @@ -0,0 +1,110 @@ +# The base element type. +class Puppet::Util::Settings::Setting + attr_accessor :name, :section, :default, :setbycli, :call_on_define + attr_reader :desc, :short + + def desc=(value) + @desc = value.gsub(/^\s*/, '') + end + + # get the arguments in getopt format + def getopt_args + if short + [["--#{name}", "-#{short}", GetoptLong::REQUIRED_ARGUMENT]] + else + [["--#{name}", GetoptLong::REQUIRED_ARGUMENT]] + end + end + + # get the arguments in OptionParser format + def optparse_args + if short + ["--#{name}", "-#{short}", desc, :REQUIRED] + else + ["--#{name}", desc, :REQUIRED] + end + end + + def hook=(block) + meta_def :handle, &block + end + + # Create the new element. Pretty much just sets the name. + def initialize(args = {}) + unless @settings = args.delete(:settings) + raise ArgumentError.new("You must refer to a settings object") + end + + args.each do |param, value| + method = param.to_s + "=" + unless self.respond_to? method + raise ArgumentError, "%s does not accept %s" % [self.class, param] + end + + self.send(method, value) + end + + unless self.desc + raise ArgumentError, "You must provide a description for the %s config option" % self.name + end + end + + def iscreated + @iscreated = true + end + + def iscreated? + if defined? @iscreated + return @iscreated + else + return false + end + end + + def set? + if defined? @value and ! @value.nil? + return true + else + return false + end + end + + # short name for the celement + def short=(value) + if value.to_s.length != 1 + raise ArgumentError, "Short names can only be one character." + end + @short = value.to_s + end + + # Convert the object to a config statement. + def to_config + str = @desc.gsub(/^/, "# ") + "\n" + + # Add in a statement about the default. + if defined? @default and @default + str += "# The default value is '%s'.\n" % @default + end + + # If the value has not been overridden, then print it out commented + # and unconverted, so it's clear that that's the default and how it + # works. + value = @settings.value(self.name) + + if value != @default + line = "%s = %s" % [@name, value] + else + line = "# %s = %s" % [@name, @default] + end + + str += line + "\n" + + str.gsub(/^/, " ") + end + + # Retrieves the value, or if it's not set, retrieves the default. + def value + @settings.value(self.name) + end +end + |
