puppet 0.24.1 → 0.24.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/CHANGELOG +94 -0
- data/Rakefile +0 -4
- data/bin/puppet +18 -10
- data/bin/puppetd +1 -1
- data/bin/puppetdoc +14 -4
- data/bin/puppetmasterd +1 -1
- data/bin/puppetrun +3 -8
- data/bin/ralsh +12 -11
- data/conf/freebsd/puppetd +1 -1
- data/conf/freebsd/puppetmasterd +1 -1
- data/conf/gentoo/puppet/puppet.conf +29 -0
- data/conf/namespaceauth.conf +20 -0
- data/conf/redhat/puppet.spec +4 -1
- data/conf/solaris/smf/puppetd.xml +1 -1
- data/conf/solaris/smf/puppetmasterd.xml +1 -1
- data/conf/suse/puppet.spec +10 -8
- data/examples/root/etc/puppet/{puppetmasterd.conf → puppet.conf} +6 -3
- data/ext/logcheck/puppet +7 -0
- data/ext/puppet-test +28 -5
- data/lib/puppet.rb +2 -1
- data/lib/puppet/defaults.rb +12 -5
- data/lib/puppet/dsl.rb +43 -45
- data/lib/puppet/external/{gratr/rdot.rb → dot.rb} +0 -0
- data/lib/puppet/external/nagios.rb +50 -0
- data/lib/puppet/external/nagios/base.rb +421 -0
- data/lib/puppet/external/nagios/parser.rb +816 -0
- data/lib/puppet/file_serving/file_base.rb +16 -3
- data/lib/puppet/file_serving/metadata.rb +29 -11
- data/lib/puppet/indirector/terminus.rb +1 -0
- data/lib/puppet/metatype/closure.rb +4 -0
- data/lib/puppet/metatype/evaluation.rb +2 -17
- data/lib/puppet/metatype/metaparams.rb +1 -1
- data/lib/puppet/network.rb +3 -0
- data/lib/puppet/network/client.rb +4 -5
- data/lib/puppet/network/client/master.rb +10 -7
- data/lib/puppet/network/handler/fileserver.rb +22 -45
- data/lib/puppet/network/http_pool.rb +3 -0
- data/lib/puppet/network/http_server/mongrel.rb +7 -1
- data/lib/puppet/network/http_server/webrick.rb +4 -3
- data/lib/puppet/network/xmlrpc/client.rb +12 -1
- data/lib/puppet/node/catalog.rb +51 -40
- data/lib/puppet/parser/ast.rb +27 -49
- data/lib/puppet/parser/ast/astarray.rb +5 -24
- data/lib/puppet/parser/ast/caseopt.rb +4 -4
- data/lib/puppet/parser/ast/casestatement.rb +4 -5
- data/lib/puppet/parser/ast/collection.rb +3 -5
- data/lib/puppet/parser/ast/collexpr.rb +3 -5
- data/lib/puppet/parser/ast/definition.rb +148 -159
- data/lib/puppet/parser/ast/else.rb +2 -3
- data/lib/puppet/parser/ast/function.rb +3 -10
- data/lib/puppet/parser/ast/hostclass.rb +66 -59
- data/lib/puppet/parser/ast/ifstatement.rb +4 -5
- data/lib/puppet/parser/ast/leaf.rb +6 -6
- data/lib/puppet/parser/ast/node.rb +26 -58
- data/lib/puppet/parser/ast/resource.rb +5 -7
- data/lib/puppet/parser/ast/resource_defaults.rb +2 -4
- data/lib/puppet/parser/ast/resource_override.rb +4 -6
- data/lib/puppet/parser/ast/resource_reference.rb +2 -4
- data/lib/puppet/parser/ast/resourceparam.rb +2 -4
- data/lib/puppet/parser/ast/selector.rb +5 -6
- data/lib/puppet/parser/ast/tag.rb +2 -4
- data/lib/puppet/parser/ast/vardef.rb +3 -4
- data/lib/puppet/parser/collector.rb +5 -5
- data/lib/puppet/parser/{compile.rb → compiler.rb} +69 -107
- data/lib/puppet/parser/functions.rb +3 -3
- data/lib/puppet/parser/interpreter.rb +32 -23
- data/lib/puppet/parser/lexer.rb +391 -282
- data/lib/puppet/parser/parser.rb +5 -4
- data/lib/puppet/parser/parser_support.rb +3 -6
- data/lib/puppet/parser/resource.rb +24 -36
- data/lib/puppet/parser/resource/param.rb +1 -1
- data/lib/puppet/parser/resource/reference.rb +7 -3
- data/lib/puppet/parser/scope.rb +12 -7
- data/lib/puppet/parser/templatewrapper.rb +1 -1
- data/lib/puppet/pgraph.rb +9 -98
- data/lib/puppet/provider/interface/redhat.rb +65 -65
- data/lib/puppet/provider/mount/parsed.rb +1 -1
- data/lib/puppet/provider/naginator.rb +55 -0
- data/lib/puppet/provider/nameservice/directoryservice.rb +6 -7
- data/lib/puppet/provider/package/fink.rb +0 -2
- data/lib/puppet/provider/package/gem.rb +9 -5
- data/lib/puppet/provider/package/openbsd.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +3 -8
- data/lib/puppet/provider/package/portage.rb +4 -4
- data/lib/puppet/provider/package/yumhelper.py +8 -6
- data/lib/puppet/provider/parsedfile.rb +7 -1
- data/lib/puppet/provider/service/debian.rb +2 -0
- data/lib/puppet/provider/service/gentoo.rb +4 -0
- data/lib/puppet/provider/service/init.rb +1 -1
- data/lib/puppet/provider/sshkey/parsed.rb +2 -0
- data/lib/puppet/provider/user/useradd.rb +1 -1
- data/lib/puppet/rails.rb +4 -0
- data/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb +17 -0
- data/lib/puppet/rails/fact_value.rb +4 -0
- data/lib/puppet/rails/host.rb +1 -2
- data/lib/puppet/rails/param_value.rb +4 -0
- data/lib/puppet/rails/resource_tag.rb +4 -0
- data/lib/puppet/rails/source_file.rb +4 -1
- data/lib/puppet/relationship.rb +5 -1
- data/lib/puppet/reports/tagmail.rb +12 -1
- data/lib/puppet/resource_reference.rb +1 -1
- data/lib/puppet/simple_graph.rb +78 -11
- data/lib/puppet/sslcertificates.rb +1 -1
- data/lib/puppet/sslcertificates/ca.rb +3 -3
- data/lib/puppet/transaction.rb +7 -4
- data/lib/puppet/transportable.rb +1 -1
- data/lib/puppet/type.rb +3 -10
- data/lib/puppet/type/cron.rb +18 -0
- data/lib/puppet/type/exec.rb +18 -12
- data/lib/puppet/type/{pfile.rb → file.rb} +66 -84
- data/lib/puppet/type/file/checksum.rb +271 -0
- data/lib/puppet/type/{pfile → file}/content.rb +10 -15
- data/lib/puppet/type/{pfile → file}/ensure.rb +15 -8
- data/lib/puppet/type/{pfile → file}/group.rb +0 -0
- data/lib/puppet/type/{pfile → file}/mode.rb +0 -0
- data/lib/puppet/type/{pfile → file}/owner.rb +0 -0
- data/lib/puppet/type/{pfile → file}/source.rb +34 -48
- data/lib/puppet/type/{pfile → file}/target.rb +0 -0
- data/lib/puppet/type/{pfile → file}/type.rb +0 -0
- data/lib/puppet/type/{pfilebucket.rb → filebucket.rb} +0 -0
- data/lib/puppet/type/host.rb +13 -0
- data/lib/puppet/type/mailalias.rb +1 -1
- data/lib/puppet/type/nagios_command.rb +3 -0
- data/lib/puppet/type/nagios_contact.rb +3 -0
- data/lib/puppet/type/nagios_contactgroup.rb +3 -0
- data/lib/puppet/type/nagios_host.rb +3 -0
- data/lib/puppet/type/nagios_hostextinfo.rb +3 -0
- data/lib/puppet/type/nagios_hostgroup.rb +3 -0
- data/lib/puppet/type/nagios_hostgroupescalation.rb +3 -0
- data/lib/puppet/type/nagios_service.rb +3 -0
- data/lib/puppet/type/nagios_servicedependency.rb +3 -0
- data/lib/puppet/type/nagios_serviceescalation.rb +3 -0
- data/lib/puppet/type/nagios_serviceextinfo.rb +3 -0
- data/lib/puppet/type/nagios_timeperiod.rb +3 -0
- data/lib/puppet/type/package.rb +4 -12
- data/lib/puppet/type/service.rb +9 -0
- data/lib/puppet/type/sshkey.rb +3 -3
- data/lib/puppet/util/autoload.rb +5 -5
- data/lib/puppet/util/checksums.rb +51 -13
- data/lib/puppet/util/constant_inflector.rb +14 -0
- data/lib/puppet/util/filetype.rb +1 -1
- data/lib/puppet/util/graph.rb +3 -9
- data/lib/puppet/util/nagios_maker.rb +57 -0
- data/lib/puppet/util/settings.rb +19 -16
- data/lib/puppet/util/tagging.rb +39 -0
- data/test/executables/puppetbin.rb +17 -0
- data/test/language/ast.rb +8 -58
- data/test/language/ast/casestatement.rb +3 -3
- data/test/language/ast/resource.rb +6 -7
- data/test/language/ast/resource_reference.rb +12 -12
- data/test/language/ast/selector.rb +2 -2
- data/test/language/ast/variable.rb +2 -2
- data/test/language/functions.rb +24 -24
- data/test/language/parser.rb +20 -8
- data/test/language/resource.rb +5 -42
- data/test/language/scope.rb +21 -37
- data/test/language/snippets.rb +7 -0
- data/test/lib/puppettest.rb +28 -14
- data/test/lib/puppettest/parsertesting.rb +10 -10
- data/test/lib/puppettest/support/resources.rb +1 -1
- data/test/network/client/master.rb +10 -0
- data/test/network/handler/fileserver.rb +51 -49
- data/test/network/server/webrick.rb +1 -1
- data/test/other/dsl.rb +3 -4
- data/test/other/transactions.rb +6 -4
- data/test/rails/ast.rb +2 -2
- data/test/rails/configuration.rb +1 -1
- data/test/rails/railsparameter.rb +2 -0
- data/test/rails/railsresource.rb +1 -0
- data/test/ral/manager/type.rb +4 -4
- data/test/ral/providers/cron/crontab.rb +3 -1
- data/test/ral/providers/package.rb +1 -1
- data/test/ral/{types → type}/basic.rb +2 -2
- data/test/ral/{types → type}/cron.rb +0 -0
- data/test/ral/{types → type}/exec.rb +42 -2
- data/test/ral/{types → type}/file.rb +34 -79
- data/test/ral/{types → type}/file/target.rb +0 -0
- data/test/ral/{types → type}/filebucket.rb +0 -0
- data/test/ral/{types → type}/fileignoresource.rb +0 -0
- data/test/ral/{types → type}/filesources.rb +8 -27
- data/test/ral/{types → type}/group.rb +0 -0
- data/test/ral/{types → type}/host.rb +16 -0
- data/test/ral/{types → type}/mailalias.rb +0 -0
- data/test/ral/{types → type}/parameter.rb +0 -0
- data/test/ral/{types → type}/port.rb +0 -0
- data/test/ral/{types → type}/property.rb +0 -0
- data/test/ral/{types → type}/resources.rb +0 -0
- data/test/ral/{types → type}/service.rb +0 -0
- data/test/ral/{types → type}/sshkey.rb +0 -0
- data/test/ral/{types → type}/tidy.rb +1 -0
- data/test/ral/{types → type}/user.rb +0 -0
- data/test/ral/{types → type}/yumrepo.rb +0 -0
- data/test/ral/{types → type}/zone.rb +0 -0
- data/test/util/autoload.rb +24 -5
- metadata +60 -107
- data/conf/gentoo/puppet/puppetca.conf +0 -29
- data/conf/gentoo/puppet/puppetd.conf +0 -29
- data/conf/gentoo/puppet/puppetmasterd.conf +0 -29
- data/examples/root/etc/puppet/puppetd.conf +0 -4
- data/lib/puppet/external/gratr.rb +0 -33
- data/lib/puppet/external/gratr/adjacency_graph.rb +0 -257
- data/lib/puppet/external/gratr/base.rb +0 -34
- data/lib/puppet/external/gratr/biconnected.rb +0 -116
- data/lib/puppet/external/gratr/chinese_postman.rb +0 -123
- data/lib/puppet/external/gratr/common.rb +0 -73
- data/lib/puppet/external/gratr/comparability.rb +0 -92
- data/lib/puppet/external/gratr/digraph.rb +0 -116
- data/lib/puppet/external/gratr/digraph_distance.rb +0 -185
- data/lib/puppet/external/gratr/dot.rb +0 -90
- data/lib/puppet/external/gratr/edge.rb +0 -145
- data/lib/puppet/external/gratr/graph.rb +0 -303
- data/lib/puppet/external/gratr/graph_api.rb +0 -83
- data/lib/puppet/external/gratr/import.rb +0 -44
- data/lib/puppet/external/gratr/labels.rb +0 -90
- data/lib/puppet/external/gratr/maximum_flow.rb +0 -64
- data/lib/puppet/external/gratr/search.rb +0 -409
- data/lib/puppet/external/gratr/strong_components.rb +0 -127
- data/lib/puppet/external/gratr/undirected_graph.rb +0 -153
- data/lib/puppet/rails/external/tagging/acts_as_taggable.rb +0 -62
- data/lib/puppet/rails/external/tagging/init.rb +0 -5
- data/lib/puppet/rails/external/tagging/tag.rb +0 -50
- data/lib/puppet/rails/external/tagging/tagging.rb +0 -12
- data/lib/puppet/rails/puppet_class.rb +0 -6
- data/lib/puppet/reference/node_source.rb +0 -9
- data/lib/puppet/reference/report.rb +0 -21
- data/lib/puppet/type/pfile/checksum.rb +0 -326
- data/test/language/ast/definition.rb +0 -166
- data/test/language/ast/hostclass.rb +0 -184
- data/test/language/compile.rb +0 -569
- data/test/language/lexer.rb +0 -276
- data/test/lib/mocha.rb +0 -19
- data/test/lib/mocha/any_instance_method.rb +0 -35
- data/test/lib/mocha/auto_verify.rb +0 -113
- data/test/lib/mocha/central.rb +0 -35
- data/test/lib/mocha/class_method.rb +0 -62
- data/test/lib/mocha/deprecation.rb +0 -22
- data/test/lib/mocha/exception_raiser.rb +0 -17
- data/test/lib/mocha/expectation.rb +0 -378
- data/test/lib/mocha/expectation_error.rb +0 -6
- data/test/lib/mocha/infinite_range.rb +0 -25
- data/test/lib/mocha/inspect.rb +0 -39
- data/test/lib/mocha/instance_method.rb +0 -8
- data/test/lib/mocha/is_a.rb +0 -9
- data/test/lib/mocha/metaclass.rb +0 -7
- data/test/lib/mocha/missing_expectation.rb +0 -27
- data/test/lib/mocha/mock.rb +0 -207
- data/test/lib/mocha/multiple_yields.rb +0 -20
- data/test/lib/mocha/no_yields.rb +0 -11
- data/test/lib/mocha/object.rb +0 -110
- data/test/lib/mocha/parameter_matchers.rb +0 -9
- data/test/lib/mocha/parameter_matchers/all_of.rb +0 -39
- data/test/lib/mocha/parameter_matchers/any_of.rb +0 -44
- data/test/lib/mocha/parameter_matchers/anything.rb +0 -30
- data/test/lib/mocha/parameter_matchers/has_entry.rb +0 -39
- data/test/lib/mocha/parameter_matchers/has_key.rb +0 -39
- data/test/lib/mocha/parameter_matchers/has_value.rb +0 -39
- data/test/lib/mocha/parameter_matchers/includes.rb +0 -37
- data/test/lib/mocha/pretty_parameters.rb +0 -28
- data/test/lib/mocha/return_values.rb +0 -31
- data/test/lib/mocha/setup_and_teardown.rb +0 -23
- data/test/lib/mocha/single_return_value.rb +0 -24
- data/test/lib/mocha/single_yield.rb +0 -18
- data/test/lib/mocha/standalone.rb +0 -32
- data/test/lib/mocha/stub.rb +0 -18
- data/test/lib/mocha/test_case_adapter.rb +0 -49
- data/test/lib/mocha/yield_parameters.rb +0 -31
@@ -9,16 +9,28 @@ require 'puppet/file_serving'
|
|
9
9
|
class Puppet::FileServing::FileBase
|
10
10
|
attr_accessor :key
|
11
11
|
|
12
|
+
# Does our file exist?
|
13
|
+
def exist?
|
14
|
+
begin
|
15
|
+
stat
|
16
|
+
return true
|
17
|
+
rescue => detail
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
12
22
|
# Return the full path to our file. Fails if there's no path set.
|
13
23
|
def full_path
|
14
24
|
raise(ArgumentError, "You must set a path to get a file's path") unless self.path
|
15
25
|
|
16
|
-
relative_path
|
26
|
+
if relative_path.nil? or relative_path == ""
|
27
|
+
path
|
28
|
+
else
|
29
|
+
File.join(path, relative_path)
|
30
|
+
end
|
17
31
|
end
|
18
32
|
|
19
33
|
def initialize(key, options = {})
|
20
|
-
raise ArgumentError.new("Files must not be fully qualified") if path =~ /^#{::File::SEPARATOR}/
|
21
|
-
|
22
34
|
@key = key
|
23
35
|
@links = :manage
|
24
36
|
|
@@ -34,6 +46,7 @@ class Puppet::FileServing::FileBase
|
|
34
46
|
# Determine how we deal with links.
|
35
47
|
attr_reader :links
|
36
48
|
def links=(value)
|
49
|
+
value = :manage if value == :ignore
|
37
50
|
raise(ArgumentError, ":links can only be set to :manage or :follow") unless [:manage, :follow].include?(value)
|
38
51
|
@links = value
|
39
52
|
end
|
@@ -28,6 +28,25 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
|
|
28
28
|
|
29
29
|
attr_reader :path, :owner, :group, :mode, :checksum_type, :checksum, :ftype, :destination
|
30
30
|
|
31
|
+
PARAM_ORDER = [:mode, :ftype, :owner, :group]
|
32
|
+
|
33
|
+
def attributes_with_tabs
|
34
|
+
desc = []
|
35
|
+
PARAM_ORDER.each { |check|
|
36
|
+
check = :ftype if check == :type
|
37
|
+
desc << send(check)
|
38
|
+
}
|
39
|
+
|
40
|
+
case ftype
|
41
|
+
when "file", "directory": desc << checksum
|
42
|
+
when "link": desc << @destination
|
43
|
+
else
|
44
|
+
raise ArgumentError, "Cannot manage files of type %s" % ftype
|
45
|
+
end
|
46
|
+
|
47
|
+
return desc.join("\t")
|
48
|
+
end
|
49
|
+
|
31
50
|
def checksum_type=(type)
|
32
51
|
raise(ArgumentError, "Unsupported checksum type %s" % type) unless respond_to?("%s_file" % type)
|
33
52
|
|
@@ -45,13 +64,19 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
|
|
45
64
|
@ftype = stat.ftype
|
46
65
|
|
47
66
|
|
48
|
-
#
|
49
|
-
@mode =
|
67
|
+
# We have to mask the mode, yay.
|
68
|
+
@mode = stat.mode & 007777
|
50
69
|
|
51
|
-
|
70
|
+
case stat.ftype
|
71
|
+
when "file":
|
72
|
+
@checksum = ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, real_path)
|
73
|
+
when "directory": # Always just timestamp the directory.
|
74
|
+
sumtype = @checksum_type.to_s =~ /time/ ? @checksum_type : "ctime"
|
75
|
+
@checksum = ("{%s}" % sumtype) + send("%s_file" % sumtype, path).to_s
|
76
|
+
when "link":
|
52
77
|
@destination = File.readlink(real_path)
|
53
78
|
else
|
54
|
-
|
79
|
+
raise ArgumentError, "Cannot manage files of type %s" % stat.ftype
|
55
80
|
end
|
56
81
|
end
|
57
82
|
|
@@ -59,11 +84,4 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
|
|
59
84
|
@checksum_type = "md5"
|
60
85
|
super
|
61
86
|
end
|
62
|
-
|
63
|
-
private
|
64
|
-
|
65
|
-
# Retrieve our checksum.
|
66
|
-
def get_checksum(path)
|
67
|
-
("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, path)
|
68
|
-
end
|
69
87
|
end
|
@@ -66,6 +66,7 @@ class Puppet::Indirector::Terminus
|
|
66
66
|
subclass.terminus_type = self.name
|
67
67
|
|
68
68
|
# Our subclass is specifically associated with an indirection.
|
69
|
+
raise("Invalid name %s" % longname) unless names.length > 0
|
69
70
|
indirection_name = names.pop.sub(/^[A-Z]/) { |i| i.downcase }.gsub(/[A-Z]/) { |i| "_" + i.downcase }.intern
|
70
71
|
|
71
72
|
if indirection_name == "" or indirection_name.nil?
|
@@ -20,6 +20,10 @@ class Puppet::Type
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
def isomorphic?
|
24
|
+
self.class.isomorphic?
|
25
|
+
end
|
26
|
+
|
23
27
|
# is the instance a managed instance? A 'yes' here means that
|
24
28
|
# the instance was created from the language, vs. being created
|
25
29
|
# in order resolve other questions, such as finding a package
|
@@ -125,26 +125,14 @@ class Puppet::Type
|
|
125
125
|
raise Puppet::DevError, "Parameter ensure defined but missing from current values"
|
126
126
|
end
|
127
127
|
if @parameters.include?(:ensure) and ! ensureparam.insync?(currentvalues[ensureparam])
|
128
|
-
# self.info "ensuring %s from %s" %
|
129
|
-
# [@parameters[:ensure].should, @parameters[:ensure].is]
|
130
128
|
changes << Puppet::PropertyChange.new(ensureparam, currentvalues[ensureparam])
|
131
129
|
# Else, if the 'ensure' property is correctly absent, then do
|
132
130
|
# nothing
|
133
131
|
elsif @parameters.include?(:ensure) and currentvalues[ensureparam] == :absent
|
134
|
-
# self.info "Object is correctly absent"
|
135
132
|
return []
|
136
133
|
else
|
137
|
-
# if @parameters.include?(:ensure)
|
138
|
-
# self.info "ensure: Is: %s, Should: %s" %
|
139
|
-
# [@parameters[:ensure].is, @parameters[:ensure].should]
|
140
|
-
# else
|
141
|
-
# self.info "no ensure property"
|
142
|
-
# end
|
143
134
|
changes = properties().find_all { |property|
|
144
|
-
|
145
|
-
raise Puppet::DevError, "Property %s does not have a current value",
|
146
|
-
[property.name]
|
147
|
-
end
|
135
|
+
currentvalues[property] ||= :absent
|
148
136
|
! property.insync?(currentvalues[property])
|
149
137
|
}.collect { |property|
|
150
138
|
Puppet::PropertyChange.new(property, currentvalues[property])
|
@@ -152,10 +140,7 @@ class Puppet::Type
|
|
152
140
|
end
|
153
141
|
|
154
142
|
if Puppet[:debug] and changes.length > 0
|
155
|
-
self.debug("Changing " + changes.collect { |ch|
|
156
|
-
ch.property.name
|
157
|
-
}.join(",")
|
158
|
-
)
|
143
|
+
self.debug("Changing " + changes.collect { |ch| ch.property.name }.join(","))
|
159
144
|
end
|
160
145
|
|
161
146
|
changes
|
@@ -258,7 +258,7 @@ class Puppet::Type
|
|
258
258
|
@value.each do |value|
|
259
259
|
unless @resource.catalog.resource(*value)
|
260
260
|
description = self.class.direction == :in ? "dependency" : "dependent"
|
261
|
-
|
261
|
+
fail Puppet::Error, "Could not find #{description} %s[%s] for %s" % [value[0].to_s.capitalize, value[1], resource.ref]
|
262
262
|
end
|
263
263
|
end
|
264
264
|
end
|
@@ -7,6 +7,8 @@ require 'puppet/util/subclass_loader'
|
|
7
7
|
require 'puppet/util/methodhelper'
|
8
8
|
require 'puppet/sslcertificates/support'
|
9
9
|
|
10
|
+
require 'puppet/network/handler'
|
11
|
+
|
10
12
|
require 'net/http'
|
11
13
|
|
12
14
|
# Some versions of ruby don't have this method defined, which basically causes
|
@@ -95,9 +97,7 @@ class Puppet::Network::Client
|
|
95
97
|
|
96
98
|
# We have to start the HTTP connection manually before we start
|
97
99
|
# sending it requests or keep-alive won't work.
|
98
|
-
if @driver.respond_to? :start
|
99
|
-
@driver.start
|
100
|
-
end
|
100
|
+
@driver.start if @driver.respond_to? :start
|
101
101
|
|
102
102
|
@local = false
|
103
103
|
elsif hash.include?(driverparam)
|
@@ -107,8 +107,7 @@ class Puppet::Network::Client
|
|
107
107
|
end
|
108
108
|
@local = true
|
109
109
|
else
|
110
|
-
raise Puppet::Network::ClientError, "%s must be passed a Server or %s" %
|
111
|
-
[self.class, driverparam]
|
110
|
+
raise Puppet::Network::ClientError, "%s must be passed a Server or %s" % [self.class, driverparam]
|
112
111
|
end
|
113
112
|
end
|
114
113
|
|
@@ -26,22 +26,25 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
|
|
26
26
|
|
27
27
|
down = Puppet[:downcasefacts]
|
28
28
|
|
29
|
-
facts = {}
|
30
|
-
|
29
|
+
facts = Facter.to_hash.inject({}) do |newhash, array|
|
30
|
+
name, fact = array
|
31
31
|
if down
|
32
|
-
|
32
|
+
newhash[name] = fact.to_s.downcase
|
33
33
|
else
|
34
|
-
|
34
|
+
newhash[name] = fact.to_s
|
35
35
|
end
|
36
|
-
|
36
|
+
newhash
|
37
|
+
end
|
37
38
|
|
38
39
|
# Add our client version to the list of facts, so people can use it
|
39
40
|
# in their manifests
|
40
41
|
facts["clientversion"] = Puppet.version.to_s
|
41
42
|
|
42
43
|
# And add our environment as a fact.
|
43
|
-
facts
|
44
|
-
|
44
|
+
unless facts.include?("environment")
|
45
|
+
facts["environment"] = Puppet[:environment]
|
46
|
+
end
|
47
|
+
|
45
48
|
facts
|
46
49
|
end
|
47
50
|
|
@@ -5,6 +5,9 @@ require 'cgi'
|
|
5
5
|
require 'delegate'
|
6
6
|
require 'sync'
|
7
7
|
|
8
|
+
require 'puppet/file_serving'
|
9
|
+
require 'puppet/file_serving/metadata'
|
10
|
+
|
8
11
|
class Puppet::Network::Handler
|
9
12
|
AuthStoreError = Puppet::AuthStoreError
|
10
13
|
class FileServerError < Puppet::Error; end
|
@@ -59,40 +62,27 @@ class Puppet::Network::Handler
|
|
59
62
|
|
60
63
|
# Describe a given file. This returns all of the manageable aspects
|
61
64
|
# of that file.
|
62
|
-
def describe(url, links = :
|
65
|
+
def describe(url, links = :follow, client = nil, clientip = nil)
|
63
66
|
links = links.intern if links.is_a? String
|
64
67
|
|
65
|
-
if links == :manage
|
66
|
-
raise Puppet::Network::Handler::FileServerError, "Cannot currently copy links"
|
67
|
-
end
|
68
|
-
|
69
68
|
mount, path = convert(url, client, clientip)
|
70
69
|
|
71
|
-
if client
|
72
|
-
|
73
|
-
|
70
|
+
mount.debug("Describing %s for %s" % [url, client]) if client
|
71
|
+
|
72
|
+
# use the mount to resolve the path for us.
|
73
|
+
metadata = Puppet::FileServing::Metadata.new(url, :path => mount.file_path(path, client), :links => links)
|
74
74
|
|
75
|
-
|
76
|
-
|
75
|
+
return "" unless metadata.exist?
|
76
|
+
|
77
|
+
begin
|
78
|
+
metadata.collect_attributes
|
79
|
+
rescue => detail
|
80
|
+
puts detail.backtrace if Puppet[:trace]
|
81
|
+
Puppet.err detail
|
77
82
|
return ""
|
78
83
|
end
|
79
84
|
|
80
|
-
|
81
|
-
|
82
|
-
desc = []
|
83
|
-
CHECKPARAMS.each { |check|
|
84
|
-
if value = currentvalues[check]
|
85
|
-
desc << value
|
86
|
-
else
|
87
|
-
if check == "checksum" and currentvalues[:type] == "file"
|
88
|
-
mount.notice "File %s does not have data for %s" %
|
89
|
-
[obj.name, check]
|
90
|
-
end
|
91
|
-
desc << nil
|
92
|
-
end
|
93
|
-
}
|
94
|
-
|
95
|
-
return desc.join("\t")
|
85
|
+
return metadata.attributes_with_tabs
|
96
86
|
end
|
97
87
|
|
98
88
|
# Create a new fileserving module.
|
@@ -140,26 +130,18 @@ class Puppet::Network::Handler
|
|
140
130
|
def list(url, links = :ignore, recurse = false, ignore = false, client = nil, clientip = nil)
|
141
131
|
mount, path = convert(url, client, clientip)
|
142
132
|
|
143
|
-
if client
|
144
|
-
mount.debug "Listing %s for %s" % [url, client]
|
145
|
-
end
|
133
|
+
mount.debug "Listing %s for %s" % [url, client] if client
|
146
134
|
|
147
|
-
|
148
|
-
unless mount.path_exists?(path, client)
|
149
|
-
return ""
|
150
|
-
end
|
135
|
+
return "" unless mount.path_exists?(path, client)
|
151
136
|
|
152
137
|
desc = mount.list(path, recurse, ignore, client)
|
153
138
|
|
154
139
|
if desc.length == 0
|
155
|
-
mount.notice "Got no information on //%s/%s" %
|
156
|
-
[mount, path]
|
140
|
+
mount.notice "Got no information on //%s/%s" % [mount, path]
|
157
141
|
return ""
|
158
142
|
end
|
159
|
-
|
160
|
-
desc.collect { |sub|
|
161
|
-
sub.join("\t")
|
162
|
-
}.join("\n")
|
143
|
+
|
144
|
+
desc.collect { |sub| sub.join("\t") }.join("\n")
|
163
145
|
end
|
164
146
|
|
165
147
|
def local?
|
@@ -213,12 +195,7 @@ class Puppet::Network::Handler
|
|
213
195
|
return ""
|
214
196
|
end
|
215
197
|
|
216
|
-
str =
|
217
|
-
if links == :manage
|
218
|
-
raise Puppet::Error, "Cannot copy links yet."
|
219
|
-
else
|
220
|
-
str = mount.read_file(path, client)
|
221
|
-
end
|
198
|
+
str = mount.read_file(path, client)
|
222
199
|
|
223
200
|
if @local
|
224
201
|
return str
|
@@ -33,6 +33,7 @@ require 'xmlrpc/server'
|
|
33
33
|
require 'puppet/network/xmlrpc/server'
|
34
34
|
require 'puppet/network/http_server'
|
35
35
|
require 'puppet/network/client_request'
|
36
|
+
require 'puppet/network/handler'
|
36
37
|
require 'puppet/daemon'
|
37
38
|
|
38
39
|
require 'resolv'
|
@@ -127,7 +128,12 @@ module Puppet::Network
|
|
127
128
|
client = dn_matchdata[1].to_str
|
128
129
|
valid = (params[Puppet[:ssl_client_verify_header]] == 'SUCCESS')
|
129
130
|
else
|
130
|
-
|
131
|
+
begin
|
132
|
+
client = Resolv.getname(ip)
|
133
|
+
rescue => detail
|
134
|
+
Puppet.err "Could not resolve %s: %s" % [ip, detail]
|
135
|
+
client = "unknown"
|
136
|
+
end
|
131
137
|
valid = false
|
132
138
|
end
|
133
139
|
|
@@ -8,6 +8,7 @@ require 'puppet/sslcertificates/support'
|
|
8
8
|
require 'puppet/network/xmlrpc/webrick_servlet'
|
9
9
|
require 'puppet/network/http_server'
|
10
10
|
require 'puppet/network/client'
|
11
|
+
require 'puppet/network/handler'
|
11
12
|
|
12
13
|
module Puppet
|
13
14
|
class ServerError < RuntimeError; end
|
@@ -22,12 +23,12 @@ module Puppet
|
|
22
23
|
# with them, with flags appropriate for checking client
|
23
24
|
# certificates for revocation
|
24
25
|
def x509store
|
25
|
-
if Puppet[:cacrl] == '
|
26
|
+
if Puppet[:cacrl] == 'false'
|
26
27
|
# No CRL, no store needed
|
27
28
|
return nil
|
28
29
|
end
|
29
30
|
unless File.exist?(Puppet[:cacrl])
|
30
|
-
raise Puppet::Error, "Could not find CRL; set 'cacrl' to '
|
31
|
+
raise Puppet::Error, "Could not find CRL; set 'cacrl' to 'false' to disable CRL usage"
|
31
32
|
end
|
32
33
|
crl = OpenSSL::X509::CRL.new(File.read(Puppet[:cacrl]))
|
33
34
|
store = OpenSSL::X509::Store.new
|
@@ -133,7 +134,7 @@ module Puppet
|
|
133
134
|
|
134
135
|
handlers.collect { |handler, args|
|
135
136
|
hclass = nil
|
136
|
-
unless hclass = Handler.handler(handler)
|
137
|
+
unless hclass = Puppet::Network::Handler.handler(handler)
|
137
138
|
raise ServerError, "Invalid handler %s" % handler
|
138
139
|
end
|
139
140
|
hclass.new(args)
|
@@ -90,6 +90,13 @@ module Puppet::Network
|
|
90
90
|
@clients[handler] || self.mkclient(handler)
|
91
91
|
end
|
92
92
|
|
93
|
+
def http
|
94
|
+
unless @http
|
95
|
+
@http = Puppet::Network::HttpPool.http_instance(@host, @port, true)
|
96
|
+
end
|
97
|
+
@http
|
98
|
+
end
|
99
|
+
|
93
100
|
def initialize(hash = {})
|
94
101
|
hash[:Path] ||= "/RPC2"
|
95
102
|
hash[:Server] ||= Puppet[:server]
|
@@ -125,7 +132,11 @@ module Puppet::Network
|
|
125
132
|
end
|
126
133
|
|
127
134
|
def start
|
128
|
-
|
135
|
+
begin
|
136
|
+
@http.start unless @http.started?
|
137
|
+
rescue => detail
|
138
|
+
Puppet.err "Could not connect to server: %s" % detail
|
139
|
+
end
|
129
140
|
end
|
130
141
|
|
131
142
|
def local
|
data/lib/puppet/node/catalog.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'puppet/indirector'
|
2
|
-
require 'puppet/
|
2
|
+
require 'puppet/pgraph'
|
3
|
+
require 'puppet/transaction'
|
4
|
+
|
5
|
+
require 'puppet/util/tagging'
|
3
6
|
|
4
7
|
# This class models a node catalog. It is the thing
|
5
8
|
# meant to be passed from server to client, and it contains all
|
@@ -9,6 +12,8 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
9
12
|
extend Puppet::Indirector
|
10
13
|
indirects :catalog, :terminus_class => :compiler
|
11
14
|
|
15
|
+
include Puppet::Util::Tagging
|
16
|
+
|
12
17
|
# The host name this is a catalog for.
|
13
18
|
attr_accessor :name
|
14
19
|
|
@@ -59,14 +64,21 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
59
64
|
raise ArgumentError, "Can only add objects that respond to :ref"
|
60
65
|
end
|
61
66
|
|
67
|
+
fail_unless_unique(resource)
|
68
|
+
|
62
69
|
ref = resource.ref
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
70
|
+
|
71
|
+
@resource_table[ref] = resource
|
72
|
+
|
73
|
+
# If the name and title differ, set up an alias
|
74
|
+
#self.alias(resource, resource.name) if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
|
75
|
+
if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
|
76
|
+
self.alias(resource, resource.name) if resource.isomorphic?
|
67
77
|
end
|
68
|
-
|
69
|
-
|
78
|
+
|
79
|
+
resource.catalog = self if resource.respond_to?(:catalog=) and ! is_relationship_graph
|
80
|
+
|
81
|
+
add_vertex(resource)
|
70
82
|
end
|
71
83
|
end
|
72
84
|
|
@@ -75,7 +87,10 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
75
87
|
resource.ref =~ /^(.+)\[/
|
76
88
|
|
77
89
|
newref = "%s[%s]" % [$1 || resource.class.name, name]
|
78
|
-
|
90
|
+
if existing = @resource_table[newref]
|
91
|
+
return if existing == resource
|
92
|
+
raise(ArgumentError, "Cannot alias %s to %s; resource %s already exists" % [resource.ref, name, newref])
|
93
|
+
end
|
79
94
|
@resource_table[newref] = resource
|
80
95
|
@aliases[resource.ref] << newref
|
81
96
|
end
|
@@ -212,9 +227,8 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
212
227
|
# Create a proc for examining edges, which we'll use to build our tree
|
213
228
|
# of TransBuckets and TransObjects.
|
214
229
|
bucket = nil
|
215
|
-
|
230
|
+
walk(main, :out) do |source, target|
|
216
231
|
# The sources are always non-builtins.
|
217
|
-
source, target = edge.source, edge.target
|
218
232
|
unless tmp = buckets[source.to_s]
|
219
233
|
if tmp = buckets[source.to_s] = source.to_trans
|
220
234
|
bucket = tmp
|
@@ -239,11 +253,6 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
239
253
|
end
|
240
254
|
end
|
241
255
|
end
|
242
|
-
dfs(:start => main, :examine_edge => edges)
|
243
|
-
|
244
|
-
unless main
|
245
|
-
raise Puppet::DevError, "Could not find 'main' class; cannot generate catalog"
|
246
|
-
end
|
247
256
|
|
248
257
|
# Retrieve the bucket for the top-level scope and set the appropriate metadata.
|
249
258
|
unless result = buckets[main.to_s]
|
@@ -275,7 +284,6 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
275
284
|
super()
|
276
285
|
@name = name if name
|
277
286
|
@extraction_format ||= :transportable
|
278
|
-
@tags = []
|
279
287
|
@classes = []
|
280
288
|
@resource_table = {}
|
281
289
|
@transient_resources = []
|
@@ -320,9 +328,9 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
320
328
|
|
321
329
|
# First create the dependency graph
|
322
330
|
self.vertices.each do |vertex|
|
323
|
-
@relationship_graph.add_vertex
|
331
|
+
@relationship_graph.add_vertex vertex
|
324
332
|
vertex.builddepends.each do |edge|
|
325
|
-
@relationship_graph.add_edge
|
333
|
+
@relationship_graph.add_edge(edge)
|
326
334
|
end
|
327
335
|
end
|
328
336
|
|
@@ -332,7 +340,7 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
332
340
|
unless @relationship_graph.edge?(edge.source, edge.target) # don't let automatic relationships conflict with manual ones.
|
333
341
|
unless @relationship_graph.edge?(edge.target, edge.source)
|
334
342
|
vertex.debug "Autorequiring %s" % [edge.source]
|
335
|
-
@relationship_graph.add_edge
|
343
|
+
@relationship_graph.add_edge(edge)
|
336
344
|
else
|
337
345
|
vertex.debug "Skipping automatic relationship with %s" % (edge.source == vertex ? edge.target : edge.source)
|
338
346
|
end
|
@@ -388,25 +396,6 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
388
396
|
@resource_table.keys
|
389
397
|
end
|
390
398
|
|
391
|
-
# Add a tag.
|
392
|
-
def tag(*names)
|
393
|
-
names.each do |name|
|
394
|
-
name = name.to_s
|
395
|
-
@tags << name unless @tags.include?(name)
|
396
|
-
if name.include?("::")
|
397
|
-
name.split("::").each do |sub|
|
398
|
-
@tags << sub unless @tags.include?(sub)
|
399
|
-
end
|
400
|
-
end
|
401
|
-
end
|
402
|
-
nil
|
403
|
-
end
|
404
|
-
|
405
|
-
# Return the list of tags.
|
406
|
-
def tags
|
407
|
-
@tags.dup
|
408
|
-
end
|
409
|
-
|
410
399
|
# Convert our catalog into a RAL catalog.
|
411
400
|
def to_ral
|
412
401
|
to_catalog :to_type
|
@@ -454,6 +443,28 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
454
443
|
end
|
455
444
|
end
|
456
445
|
|
446
|
+
# Verify that the given resource isn't defined elsewhere.
|
447
|
+
def fail_unless_unique(resource)
|
448
|
+
# Short-curcuit the common case,
|
449
|
+
return unless existing_resource = @resource_table[resource.ref]
|
450
|
+
|
451
|
+
# Either it's a defined type, which are never
|
452
|
+
# isomorphic, or it's a non-isomorphic type, so
|
453
|
+
# we should throw an exception.
|
454
|
+
msg = "Duplicate definition: %s is already defined" % resource.ref
|
455
|
+
|
456
|
+
if existing_resource.file and existing_resource.line
|
457
|
+
msg << " in file %s at line %s" %
|
458
|
+
[existing_resource.file, existing_resource.line]
|
459
|
+
end
|
460
|
+
|
461
|
+
if resource.line or resource.file
|
462
|
+
msg << "; cannot redefine"
|
463
|
+
end
|
464
|
+
|
465
|
+
raise ArgumentError.new(msg)
|
466
|
+
end
|
467
|
+
|
457
468
|
# An abstracted method for converting one catalog into another type of catalog.
|
458
469
|
# This pretty much just converts all of the resources from one class to another, using
|
459
470
|
# a conversion method.
|
@@ -488,12 +499,12 @@ class Puppet::Node::Catalog < Puppet::PGraph
|
|
488
499
|
raise Puppet::DevError, "Could not find resource %s when converting %s resources" % [edge.target.ref, message]
|
489
500
|
end
|
490
501
|
|
491
|
-
result.add_edge
|
502
|
+
result.add_edge(source, target, edge.label)
|
492
503
|
end
|
493
504
|
|
494
505
|
map.clear
|
495
506
|
|
496
|
-
result.add_class
|
507
|
+
result.add_class(*self.classes)
|
497
508
|
result.tag(*self.tags)
|
498
509
|
|
499
510
|
return result
|