summaryrefslogtreecommitdiffstats
path: root/lib/puppet/util/settings
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2009-08-19 11:31:19 -0700
committerJames Turnbull <james@lovedthanlost.net>2009-08-24 11:36:20 +1000
commit058514aaf44f981a3239b402f2ff116ebf0d951f (patch)
tree12ee14aa7e1f693671167c2190ad1021e10d4fee /lib/puppet/util/settings
parentb0f219ad177c8e9c261578586f0324cef0c71cd2 (diff)
downloadpuppet-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.rb33
-rw-r--r--lib/puppet/util/settings/file_setting.rb102
-rw-r--r--lib/puppet/util/settings/setting.rb110
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
+