summaryrefslogtreecommitdiffstats
path: root/lib/puppet/util/settings/setting.rb
blob: 489dfd01dac9b8227f3f0b829ced25e67acb49dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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