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.

Files changed (266) hide show
  1. data/CHANGELOG +94 -0
  2. data/Rakefile +0 -4
  3. data/bin/puppet +18 -10
  4. data/bin/puppetd +1 -1
  5. data/bin/puppetdoc +14 -4
  6. data/bin/puppetmasterd +1 -1
  7. data/bin/puppetrun +3 -8
  8. data/bin/ralsh +12 -11
  9. data/conf/freebsd/puppetd +1 -1
  10. data/conf/freebsd/puppetmasterd +1 -1
  11. data/conf/gentoo/puppet/puppet.conf +29 -0
  12. data/conf/namespaceauth.conf +20 -0
  13. data/conf/redhat/puppet.spec +4 -1
  14. data/conf/solaris/smf/puppetd.xml +1 -1
  15. data/conf/solaris/smf/puppetmasterd.xml +1 -1
  16. data/conf/suse/puppet.spec +10 -8
  17. data/examples/root/etc/puppet/{puppetmasterd.conf → puppet.conf} +6 -3
  18. data/ext/logcheck/puppet +7 -0
  19. data/ext/puppet-test +28 -5
  20. data/lib/puppet.rb +2 -1
  21. data/lib/puppet/defaults.rb +12 -5
  22. data/lib/puppet/dsl.rb +43 -45
  23. data/lib/puppet/external/{gratr/rdot.rb → dot.rb} +0 -0
  24. data/lib/puppet/external/nagios.rb +50 -0
  25. data/lib/puppet/external/nagios/base.rb +421 -0
  26. data/lib/puppet/external/nagios/parser.rb +816 -0
  27. data/lib/puppet/file_serving/file_base.rb +16 -3
  28. data/lib/puppet/file_serving/metadata.rb +29 -11
  29. data/lib/puppet/indirector/terminus.rb +1 -0
  30. data/lib/puppet/metatype/closure.rb +4 -0
  31. data/lib/puppet/metatype/evaluation.rb +2 -17
  32. data/lib/puppet/metatype/metaparams.rb +1 -1
  33. data/lib/puppet/network.rb +3 -0
  34. data/lib/puppet/network/client.rb +4 -5
  35. data/lib/puppet/network/client/master.rb +10 -7
  36. data/lib/puppet/network/handler/fileserver.rb +22 -45
  37. data/lib/puppet/network/http_pool.rb +3 -0
  38. data/lib/puppet/network/http_server/mongrel.rb +7 -1
  39. data/lib/puppet/network/http_server/webrick.rb +4 -3
  40. data/lib/puppet/network/xmlrpc/client.rb +12 -1
  41. data/lib/puppet/node/catalog.rb +51 -40
  42. data/lib/puppet/parser/ast.rb +27 -49
  43. data/lib/puppet/parser/ast/astarray.rb +5 -24
  44. data/lib/puppet/parser/ast/caseopt.rb +4 -4
  45. data/lib/puppet/parser/ast/casestatement.rb +4 -5
  46. data/lib/puppet/parser/ast/collection.rb +3 -5
  47. data/lib/puppet/parser/ast/collexpr.rb +3 -5
  48. data/lib/puppet/parser/ast/definition.rb +148 -159
  49. data/lib/puppet/parser/ast/else.rb +2 -3
  50. data/lib/puppet/parser/ast/function.rb +3 -10
  51. data/lib/puppet/parser/ast/hostclass.rb +66 -59
  52. data/lib/puppet/parser/ast/ifstatement.rb +4 -5
  53. data/lib/puppet/parser/ast/leaf.rb +6 -6
  54. data/lib/puppet/parser/ast/node.rb +26 -58
  55. data/lib/puppet/parser/ast/resource.rb +5 -7
  56. data/lib/puppet/parser/ast/resource_defaults.rb +2 -4
  57. data/lib/puppet/parser/ast/resource_override.rb +4 -6
  58. data/lib/puppet/parser/ast/resource_reference.rb +2 -4
  59. data/lib/puppet/parser/ast/resourceparam.rb +2 -4
  60. data/lib/puppet/parser/ast/selector.rb +5 -6
  61. data/lib/puppet/parser/ast/tag.rb +2 -4
  62. data/lib/puppet/parser/ast/vardef.rb +3 -4
  63. data/lib/puppet/parser/collector.rb +5 -5
  64. data/lib/puppet/parser/{compile.rb → compiler.rb} +69 -107
  65. data/lib/puppet/parser/functions.rb +3 -3
  66. data/lib/puppet/parser/interpreter.rb +32 -23
  67. data/lib/puppet/parser/lexer.rb +391 -282
  68. data/lib/puppet/parser/parser.rb +5 -4
  69. data/lib/puppet/parser/parser_support.rb +3 -6
  70. data/lib/puppet/parser/resource.rb +24 -36
  71. data/lib/puppet/parser/resource/param.rb +1 -1
  72. data/lib/puppet/parser/resource/reference.rb +7 -3
  73. data/lib/puppet/parser/scope.rb +12 -7
  74. data/lib/puppet/parser/templatewrapper.rb +1 -1
  75. data/lib/puppet/pgraph.rb +9 -98
  76. data/lib/puppet/provider/interface/redhat.rb +65 -65
  77. data/lib/puppet/provider/mount/parsed.rb +1 -1
  78. data/lib/puppet/provider/naginator.rb +55 -0
  79. data/lib/puppet/provider/nameservice/directoryservice.rb +6 -7
  80. data/lib/puppet/provider/package/fink.rb +0 -2
  81. data/lib/puppet/provider/package/gem.rb +9 -5
  82. data/lib/puppet/provider/package/openbsd.rb +1 -1
  83. data/lib/puppet/provider/package/pkgdmg.rb +3 -8
  84. data/lib/puppet/provider/package/portage.rb +4 -4
  85. data/lib/puppet/provider/package/yumhelper.py +8 -6
  86. data/lib/puppet/provider/parsedfile.rb +7 -1
  87. data/lib/puppet/provider/service/debian.rb +2 -0
  88. data/lib/puppet/provider/service/gentoo.rb +4 -0
  89. data/lib/puppet/provider/service/init.rb +1 -1
  90. data/lib/puppet/provider/sshkey/parsed.rb +2 -0
  91. data/lib/puppet/provider/user/useradd.rb +1 -1
  92. data/lib/puppet/rails.rb +4 -0
  93. data/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb +17 -0
  94. data/lib/puppet/rails/fact_value.rb +4 -0
  95. data/lib/puppet/rails/host.rb +1 -2
  96. data/lib/puppet/rails/param_value.rb +4 -0
  97. data/lib/puppet/rails/resource_tag.rb +4 -0
  98. data/lib/puppet/rails/source_file.rb +4 -1
  99. data/lib/puppet/relationship.rb +5 -1
  100. data/lib/puppet/reports/tagmail.rb +12 -1
  101. data/lib/puppet/resource_reference.rb +1 -1
  102. data/lib/puppet/simple_graph.rb +78 -11
  103. data/lib/puppet/sslcertificates.rb +1 -1
  104. data/lib/puppet/sslcertificates/ca.rb +3 -3
  105. data/lib/puppet/transaction.rb +7 -4
  106. data/lib/puppet/transportable.rb +1 -1
  107. data/lib/puppet/type.rb +3 -10
  108. data/lib/puppet/type/cron.rb +18 -0
  109. data/lib/puppet/type/exec.rb +18 -12
  110. data/lib/puppet/type/{pfile.rb → file.rb} +66 -84
  111. data/lib/puppet/type/file/checksum.rb +271 -0
  112. data/lib/puppet/type/{pfile → file}/content.rb +10 -15
  113. data/lib/puppet/type/{pfile → file}/ensure.rb +15 -8
  114. data/lib/puppet/type/{pfile → file}/group.rb +0 -0
  115. data/lib/puppet/type/{pfile → file}/mode.rb +0 -0
  116. data/lib/puppet/type/{pfile → file}/owner.rb +0 -0
  117. data/lib/puppet/type/{pfile → file}/source.rb +34 -48
  118. data/lib/puppet/type/{pfile → file}/target.rb +0 -0
  119. data/lib/puppet/type/{pfile → file}/type.rb +0 -0
  120. data/lib/puppet/type/{pfilebucket.rb → filebucket.rb} +0 -0
  121. data/lib/puppet/type/host.rb +13 -0
  122. data/lib/puppet/type/mailalias.rb +1 -1
  123. data/lib/puppet/type/nagios_command.rb +3 -0
  124. data/lib/puppet/type/nagios_contact.rb +3 -0
  125. data/lib/puppet/type/nagios_contactgroup.rb +3 -0
  126. data/lib/puppet/type/nagios_host.rb +3 -0
  127. data/lib/puppet/type/nagios_hostextinfo.rb +3 -0
  128. data/lib/puppet/type/nagios_hostgroup.rb +3 -0
  129. data/lib/puppet/type/nagios_hostgroupescalation.rb +3 -0
  130. data/lib/puppet/type/nagios_service.rb +3 -0
  131. data/lib/puppet/type/nagios_servicedependency.rb +3 -0
  132. data/lib/puppet/type/nagios_serviceescalation.rb +3 -0
  133. data/lib/puppet/type/nagios_serviceextinfo.rb +3 -0
  134. data/lib/puppet/type/nagios_timeperiod.rb +3 -0
  135. data/lib/puppet/type/package.rb +4 -12
  136. data/lib/puppet/type/service.rb +9 -0
  137. data/lib/puppet/type/sshkey.rb +3 -3
  138. data/lib/puppet/util/autoload.rb +5 -5
  139. data/lib/puppet/util/checksums.rb +51 -13
  140. data/lib/puppet/util/constant_inflector.rb +14 -0
  141. data/lib/puppet/util/filetype.rb +1 -1
  142. data/lib/puppet/util/graph.rb +3 -9
  143. data/lib/puppet/util/nagios_maker.rb +57 -0
  144. data/lib/puppet/util/settings.rb +19 -16
  145. data/lib/puppet/util/tagging.rb +39 -0
  146. data/test/executables/puppetbin.rb +17 -0
  147. data/test/language/ast.rb +8 -58
  148. data/test/language/ast/casestatement.rb +3 -3
  149. data/test/language/ast/resource.rb +6 -7
  150. data/test/language/ast/resource_reference.rb +12 -12
  151. data/test/language/ast/selector.rb +2 -2
  152. data/test/language/ast/variable.rb +2 -2
  153. data/test/language/functions.rb +24 -24
  154. data/test/language/parser.rb +20 -8
  155. data/test/language/resource.rb +5 -42
  156. data/test/language/scope.rb +21 -37
  157. data/test/language/snippets.rb +7 -0
  158. data/test/lib/puppettest.rb +28 -14
  159. data/test/lib/puppettest/parsertesting.rb +10 -10
  160. data/test/lib/puppettest/support/resources.rb +1 -1
  161. data/test/network/client/master.rb +10 -0
  162. data/test/network/handler/fileserver.rb +51 -49
  163. data/test/network/server/webrick.rb +1 -1
  164. data/test/other/dsl.rb +3 -4
  165. data/test/other/transactions.rb +6 -4
  166. data/test/rails/ast.rb +2 -2
  167. data/test/rails/configuration.rb +1 -1
  168. data/test/rails/railsparameter.rb +2 -0
  169. data/test/rails/railsresource.rb +1 -0
  170. data/test/ral/manager/type.rb +4 -4
  171. data/test/ral/providers/cron/crontab.rb +3 -1
  172. data/test/ral/providers/package.rb +1 -1
  173. data/test/ral/{types → type}/basic.rb +2 -2
  174. data/test/ral/{types → type}/cron.rb +0 -0
  175. data/test/ral/{types → type}/exec.rb +42 -2
  176. data/test/ral/{types → type}/file.rb +34 -79
  177. data/test/ral/{types → type}/file/target.rb +0 -0
  178. data/test/ral/{types → type}/filebucket.rb +0 -0
  179. data/test/ral/{types → type}/fileignoresource.rb +0 -0
  180. data/test/ral/{types → type}/filesources.rb +8 -27
  181. data/test/ral/{types → type}/group.rb +0 -0
  182. data/test/ral/{types → type}/host.rb +16 -0
  183. data/test/ral/{types → type}/mailalias.rb +0 -0
  184. data/test/ral/{types → type}/parameter.rb +0 -0
  185. data/test/ral/{types → type}/port.rb +0 -0
  186. data/test/ral/{types → type}/property.rb +0 -0
  187. data/test/ral/{types → type}/resources.rb +0 -0
  188. data/test/ral/{types → type}/service.rb +0 -0
  189. data/test/ral/{types → type}/sshkey.rb +0 -0
  190. data/test/ral/{types → type}/tidy.rb +1 -0
  191. data/test/ral/{types → type}/user.rb +0 -0
  192. data/test/ral/{types → type}/yumrepo.rb +0 -0
  193. data/test/ral/{types → type}/zone.rb +0 -0
  194. data/test/util/autoload.rb +24 -5
  195. metadata +60 -107
  196. data/conf/gentoo/puppet/puppetca.conf +0 -29
  197. data/conf/gentoo/puppet/puppetd.conf +0 -29
  198. data/conf/gentoo/puppet/puppetmasterd.conf +0 -29
  199. data/examples/root/etc/puppet/puppetd.conf +0 -4
  200. data/lib/puppet/external/gratr.rb +0 -33
  201. data/lib/puppet/external/gratr/adjacency_graph.rb +0 -257
  202. data/lib/puppet/external/gratr/base.rb +0 -34
  203. data/lib/puppet/external/gratr/biconnected.rb +0 -116
  204. data/lib/puppet/external/gratr/chinese_postman.rb +0 -123
  205. data/lib/puppet/external/gratr/common.rb +0 -73
  206. data/lib/puppet/external/gratr/comparability.rb +0 -92
  207. data/lib/puppet/external/gratr/digraph.rb +0 -116
  208. data/lib/puppet/external/gratr/digraph_distance.rb +0 -185
  209. data/lib/puppet/external/gratr/dot.rb +0 -90
  210. data/lib/puppet/external/gratr/edge.rb +0 -145
  211. data/lib/puppet/external/gratr/graph.rb +0 -303
  212. data/lib/puppet/external/gratr/graph_api.rb +0 -83
  213. data/lib/puppet/external/gratr/import.rb +0 -44
  214. data/lib/puppet/external/gratr/labels.rb +0 -90
  215. data/lib/puppet/external/gratr/maximum_flow.rb +0 -64
  216. data/lib/puppet/external/gratr/search.rb +0 -409
  217. data/lib/puppet/external/gratr/strong_components.rb +0 -127
  218. data/lib/puppet/external/gratr/undirected_graph.rb +0 -153
  219. data/lib/puppet/rails/external/tagging/acts_as_taggable.rb +0 -62
  220. data/lib/puppet/rails/external/tagging/init.rb +0 -5
  221. data/lib/puppet/rails/external/tagging/tag.rb +0 -50
  222. data/lib/puppet/rails/external/tagging/tagging.rb +0 -12
  223. data/lib/puppet/rails/puppet_class.rb +0 -6
  224. data/lib/puppet/reference/node_source.rb +0 -9
  225. data/lib/puppet/reference/report.rb +0 -21
  226. data/lib/puppet/type/pfile/checksum.rb +0 -326
  227. data/test/language/ast/definition.rb +0 -166
  228. data/test/language/ast/hostclass.rb +0 -184
  229. data/test/language/compile.rb +0 -569
  230. data/test/language/lexer.rb +0 -276
  231. data/test/lib/mocha.rb +0 -19
  232. data/test/lib/mocha/any_instance_method.rb +0 -35
  233. data/test/lib/mocha/auto_verify.rb +0 -113
  234. data/test/lib/mocha/central.rb +0 -35
  235. data/test/lib/mocha/class_method.rb +0 -62
  236. data/test/lib/mocha/deprecation.rb +0 -22
  237. data/test/lib/mocha/exception_raiser.rb +0 -17
  238. data/test/lib/mocha/expectation.rb +0 -378
  239. data/test/lib/mocha/expectation_error.rb +0 -6
  240. data/test/lib/mocha/infinite_range.rb +0 -25
  241. data/test/lib/mocha/inspect.rb +0 -39
  242. data/test/lib/mocha/instance_method.rb +0 -8
  243. data/test/lib/mocha/is_a.rb +0 -9
  244. data/test/lib/mocha/metaclass.rb +0 -7
  245. data/test/lib/mocha/missing_expectation.rb +0 -27
  246. data/test/lib/mocha/mock.rb +0 -207
  247. data/test/lib/mocha/multiple_yields.rb +0 -20
  248. data/test/lib/mocha/no_yields.rb +0 -11
  249. data/test/lib/mocha/object.rb +0 -110
  250. data/test/lib/mocha/parameter_matchers.rb +0 -9
  251. data/test/lib/mocha/parameter_matchers/all_of.rb +0 -39
  252. data/test/lib/mocha/parameter_matchers/any_of.rb +0 -44
  253. data/test/lib/mocha/parameter_matchers/anything.rb +0 -30
  254. data/test/lib/mocha/parameter_matchers/has_entry.rb +0 -39
  255. data/test/lib/mocha/parameter_matchers/has_key.rb +0 -39
  256. data/test/lib/mocha/parameter_matchers/has_value.rb +0 -39
  257. data/test/lib/mocha/parameter_matchers/includes.rb +0 -37
  258. data/test/lib/mocha/pretty_parameters.rb +0 -28
  259. data/test/lib/mocha/return_values.rb +0 -31
  260. data/test/lib/mocha/setup_and_teardown.rb +0 -23
  261. data/test/lib/mocha/single_return_value.rb +0 -24
  262. data/test/lib/mocha/single_yield.rb +0 -18
  263. data/test/lib/mocha/standalone.rb +0 -32
  264. data/test/lib/mocha/stub.rb +0 -18
  265. data/test/lib/mocha/test_case_adapter.rb +0 -49
  266. 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 ? File.join(path, relative_path) : 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
- # Set the octal mode, but as a string.
49
- @mode = "%o" % (stat.mode & 007777)
67
+ # We have to mask the mode, yay.
68
+ @mode = stat.mode & 007777
50
69
 
51
- if stat.ftype == "symlink"
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
- @checksum = get_checksum(real_path)
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
- unless currentvalues.include?(property)
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
- raise Puppet::Error, "Could not find #{description} %s[%s]" % [value[0].to_s.capitalize, value[1]]
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
@@ -0,0 +1,3 @@
1
+ # Just a stub, so we can correctly scope other classes.
2
+ module Puppet::Network # :nodoc:
3
+ 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
- Facter.each { |name,fact|
29
+ facts = Facter.to_hash.inject({}) do |newhash, array|
30
+ name, fact = array
31
31
  if down
32
- facts[name] = fact.to_s.downcase
32
+ newhash[name] = fact.to_s.downcase
33
33
  else
34
- facts[name] = fact.to_s
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["environment"] = Puppet[:environment]
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 = :ignore, client = nil, clientip = nil)
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
- mount.debug "Describing %s for %s" % [url, client]
73
- end
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
- obj = nil
76
- unless obj = mount.getfileobject(path, links, client)
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
- currentvalues = mount.check(obj)
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
- obj = nil
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 = nil
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
@@ -1,6 +1,9 @@
1
1
  require 'puppet/sslcertificates/support'
2
2
  require 'net/https'
3
3
 
4
+ module Puppet::Network
5
+ end
6
+
4
7
  # Manage Net::HTTP instances for keep-alive.
5
8
  module Puppet::Network::HttpPool
6
9
  # This handles reading in the key and such-like.
@@ -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
- client = Resolv.getname(ip)
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] == 'none'
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 'none' to disable CRL usage"
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
- @http.start unless @http.started?
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
@@ -1,5 +1,8 @@
1
1
  require 'puppet/indirector'
2
- require 'puppet/external/gratr/digraph'
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
- if @resource_table.include?(ref)
64
- raise ArgumentError, "Resource %s is already defined" % ref
65
- else
66
- @resource_table[ref] = resource
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
- resource.catalog = self unless is_relationship_graph
69
- add_vertex!(resource)
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
- raise(ArgumentError, "Cannot alias %s to %s; resource %s already exists" % [resource.ref, name, newref]) if @resource_table[newref]
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
- edges = proc do |edge|
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! vertex
331
+ @relationship_graph.add_vertex vertex
324
332
  vertex.builddepends.each do |edge|
325
- @relationship_graph.add_edge!(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!(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!(source, target, edge.label)
502
+ result.add_edge(source, target, edge.label)
492
503
  end
493
504
 
494
505
  map.clear
495
506
 
496
- result.add_class *self.classes
507
+ result.add_class(*self.classes)
497
508
  result.tag(*self.tags)
498
509
 
499
510
  return result