puppet 0.13.6 → 0.16.0

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 (149) hide show
  1. data/CHANGELOG +57 -0
  2. data/Rakefile +38 -410
  3. data/bin/puppet +14 -12
  4. data/bin/puppetca +1 -3
  5. data/bin/puppetd +25 -7
  6. data/bin/puppetdoc +161 -104
  7. data/bin/puppetmasterd +4 -4
  8. data/conf/epm.list +8 -0
  9. data/conf/redhat/client.init +6 -1
  10. data/conf/redhat/no-chuser-0.15.1.patch +38 -0
  11. data/conf/redhat/puppet.spec +20 -5
  12. data/conf/redhat/puppetd.conf +1 -1
  13. data/conf/redhat/puppetmasterd.conf +1 -1
  14. data/conf/redhat/server.init +2 -4
  15. data/examples/code/snippets/{casestatement → casestatement.pp} +12 -1
  16. data/examples/code/snippets/selectorvalues.pp +15 -0
  17. data/examples/code/snippets/singleselector.pp +22 -0
  18. data/examples/code/snippets/tag.pp +9 -0
  19. data/ext/module_puppet +1 -1
  20. data/install.rb +303 -303
  21. data/lib/puppet.rb +7 -9
  22. data/lib/puppet/client.rb +18 -5
  23. data/lib/puppet/client/dipper.rb +12 -10
  24. data/lib/puppet/client/master.rb +113 -41
  25. data/lib/puppet/client/pelement.rb +20 -0
  26. data/lib/puppet/config.rb +113 -6
  27. data/lib/puppet/element.rb +1 -3
  28. data/lib/puppet/event.rb +12 -23
  29. data/lib/puppet/filetype.rb +93 -5
  30. data/lib/puppet/inifile.rb +201 -0
  31. data/lib/puppet/log.rb +18 -6
  32. data/lib/puppet/parameter.rb +80 -29
  33. data/lib/puppet/parser/ast.rb +6 -4
  34. data/lib/puppet/parser/ast/caseopt.rb +13 -4
  35. data/lib/puppet/parser/ast/casestatement.rb +2 -2
  36. data/lib/puppet/parser/ast/component.rb +4 -14
  37. data/lib/puppet/parser/ast/hostclass.rb +1 -1
  38. data/lib/puppet/parser/ast/leaf.rb +12 -0
  39. data/lib/puppet/parser/ast/node.rb +4 -4
  40. data/lib/puppet/parser/ast/objectdef.rb +5 -51
  41. data/lib/puppet/parser/ast/selector.rb +2 -0
  42. data/lib/puppet/parser/ast/tag.rb +26 -0
  43. data/lib/puppet/parser/interpreter.rb +89 -74
  44. data/lib/puppet/parser/lexer.rb +4 -3
  45. data/lib/puppet/parser/parser.rb +440 -378
  46. data/lib/puppet/parser/scope.rb +844 -887
  47. data/lib/puppet/server.rb +12 -1
  48. data/lib/puppet/server/authconfig.rb +166 -0
  49. data/lib/puppet/server/authstore.rb +8 -6
  50. data/lib/puppet/server/ca.rb +23 -26
  51. data/lib/puppet/server/filebucket.rb +24 -23
  52. data/lib/puppet/server/fileserver.rb +116 -47
  53. data/lib/puppet/server/master.rb +58 -19
  54. data/lib/puppet/server/pelement.rb +176 -0
  55. data/lib/puppet/server/rights.rb +78 -0
  56. data/lib/puppet/server/servlet.rb +19 -6
  57. data/lib/puppet/sslcertificates.rb +4 -2
  58. data/lib/puppet/sslcertificates/ca.rb +66 -34
  59. data/lib/puppet/storage.rb +20 -26
  60. data/lib/puppet/transaction.rb +49 -92
  61. data/lib/puppet/type.rb +142 -35
  62. data/lib/puppet/type/cron.rb +29 -14
  63. data/lib/puppet/type/exec.rb +92 -35
  64. data/lib/puppet/type/group.rb +29 -11
  65. data/lib/puppet/type/nameservice.rb +50 -1
  66. data/lib/puppet/type/nameservice/netinfo.rb +68 -1
  67. data/lib/puppet/type/nameservice/objectadd.rb +1 -0
  68. data/lib/puppet/type/package.rb +150 -109
  69. data/lib/puppet/type/package/apple.rb +27 -0
  70. data/lib/puppet/type/package/apt.rb +1 -0
  71. data/lib/puppet/type/package/darwinport.rb +97 -0
  72. data/lib/puppet/type/package/dpkg.rb +10 -2
  73. data/lib/puppet/type/package/freebsd.rb +19 -0
  74. data/lib/puppet/type/package/{bsd.rb → openbsd.rb} +36 -7
  75. data/lib/puppet/type/package/ports.rb +98 -0
  76. data/lib/puppet/type/package/rpm.rb +43 -7
  77. data/lib/puppet/type/package/sun.rb +53 -36
  78. data/lib/puppet/type/package/yum.rb +5 -16
  79. data/lib/puppet/type/parsedtype.rb +41 -29
  80. data/lib/puppet/type/parsedtype/host.rb +13 -5
  81. data/lib/puppet/type/parsedtype/mount.rb +250 -0
  82. data/lib/puppet/type/parsedtype/port.rb +8 -6
  83. data/lib/puppet/type/pfile.rb +284 -30
  84. data/lib/puppet/type/pfile/checksum.rb +96 -68
  85. data/lib/puppet/type/pfile/content.rb +16 -13
  86. data/lib/puppet/type/pfile/ensure.rb +64 -126
  87. data/lib/puppet/type/pfile/group.rb +12 -5
  88. data/lib/puppet/type/pfile/mode.rb +16 -4
  89. data/lib/puppet/type/pfile/source.rb +47 -73
  90. data/lib/puppet/type/pfile/target.rb +81 -0
  91. data/lib/puppet/type/pfile/uid.rb +10 -3
  92. data/lib/puppet/type/pfilebucket.rb +12 -3
  93. data/lib/puppet/type/schedule.rb +5 -1
  94. data/lib/puppet/type/service.rb +138 -66
  95. data/lib/puppet/type/service/debian.rb +9 -3
  96. data/lib/puppet/type/service/init.rb +51 -56
  97. data/lib/puppet/type/service/smf.rb +16 -6
  98. data/lib/puppet/type/state.rb +71 -32
  99. data/lib/puppet/type/symlink.rb +12 -7
  100. data/lib/puppet/type/tidy.rb +5 -1
  101. data/lib/puppet/type/user.rb +116 -20
  102. data/lib/puppet/type/yumrepo.rb +314 -0
  103. data/lib/puppet/util.rb +84 -14
  104. data/test/client/client.rb +41 -18
  105. data/test/client/master.rb +50 -4
  106. data/test/executables/puppetbin.rb +31 -4
  107. data/test/executables/puppetca.rb +18 -2
  108. data/test/language/ast.rb +201 -31
  109. data/test/language/interpreter.rb +8 -2
  110. data/test/{parser → language}/lexer.rb +1 -1
  111. data/test/language/node.rb +84 -0
  112. data/test/{parser → language}/parser.rb +1 -1
  113. data/test/language/scope.rb +101 -2
  114. data/test/language/snippets.rb +23 -2
  115. data/test/other/config.rb +99 -1
  116. data/test/other/filetype.rb +95 -0
  117. data/test/other/inifile.rb +114 -0
  118. data/test/other/log.rb +3 -2
  119. data/test/other/transactions.rb +55 -10
  120. data/test/puppet/utiltest.rb +25 -1
  121. data/test/puppettest.rb +140 -46
  122. data/test/server/authconfig.rb +56 -0
  123. data/test/server/bucket.rb +32 -18
  124. data/test/server/fileserver.rb +75 -30
  125. data/test/server/master.rb +27 -4
  126. data/test/server/pelement.rb +298 -0
  127. data/test/server/rights.rb +41 -0
  128. data/test/server/server.rb +2 -2
  129. data/test/tagging/tagging.rb +100 -1
  130. data/test/types/basic.rb +3 -3
  131. data/test/types/cron.rb +24 -1
  132. data/test/types/exec.rb +99 -1
  133. data/test/types/file.rb +298 -2
  134. data/test/types/filebucket.rb +4 -15
  135. data/test/types/filesources.rb +43 -14
  136. data/test/types/group.rb +1 -13
  137. data/test/types/mount.rb +277 -0
  138. data/test/types/package.rb +164 -33
  139. data/test/types/parameter.rb +107 -0
  140. data/test/types/port.rb +2 -1
  141. data/test/types/service.rb +37 -2
  142. data/test/types/state.rb +92 -0
  143. data/test/types/symlink.rb +30 -2
  144. data/test/types/tidy.rb +2 -14
  145. data/test/types/type.rb +35 -1
  146. data/test/types/user.rb +110 -1
  147. data/test/types/yumrepo.rb +95 -0
  148. metadata +316 -290
  149. data/test/types/filetype.rb +0 -160
@@ -0,0 +1,27 @@
1
+ module Puppet
2
+ # OS X Packaging sucks. We can install packages, but that's about it.
3
+ Puppet.type(:package).newpkgtype(:apple) do
4
+ def query
5
+ if FileTest.exists?("/Library/Receipts/#{self[:name]}.pkg")
6
+ return {:name => self[:name], :ensure => :present}
7
+ else
8
+ return nil
9
+ end
10
+ end
11
+
12
+ def install
13
+ source = nil
14
+ unless source = self[:source]
15
+ self.fail "Mac OS X packages must specify a package source"
16
+ end
17
+
18
+ output = %x{/usr/sbin/installer -pkg #{source} -target / 2>&1}
19
+
20
+ unless $? == 0
21
+ raise Puppet::PackageError.new(output)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ # $Id: apple.rb 1055 2006-04-03 17:08:21Z luke $
@@ -30,6 +30,7 @@ module Puppet
30
30
  # What's the latest package version available?
31
31
  def latest
32
32
  cmd = "apt-cache showpkg %s" % self[:name]
33
+ self.info "Executing %s" % cmd.inspect
33
34
  output = %x{#{cmd} 2>&1}
34
35
 
35
36
  unless $? == 0
@@ -0,0 +1,97 @@
1
+ module Puppet
2
+ Puppet.type(:package).newpkgtype(:darwinport) do
3
+ def port
4
+ "/opt/local/bin/port"
5
+ end
6
+
7
+ def eachpkgashash
8
+ # list out all of the packages
9
+ open("| #{port} list installed") { |process|
10
+ regex = %r{(\S+)\s+@(\S+)\s+(\S+)}
11
+ fields = [:name, :version, :location]
12
+ hash = {}
13
+
14
+ # now turn each returned line into a package object
15
+ process.each { |line|
16
+ hash.clear
17
+
18
+ if match = regex.match(line)
19
+ fields.zip(match.captures) { |field,value|
20
+ hash[field] = value
21
+ }
22
+
23
+ hash.delete :location
24
+ hash[:ensure] = hash[:version]
25
+ yield hash.dup
26
+ else
27
+ raise Puppet::DevError,
28
+ "Failed to match dpkg line %s" % line
29
+ end
30
+ }
31
+ }
32
+ end
33
+
34
+ def install
35
+ should = self.should(:ensure)
36
+
37
+ # Seems like you can always say 'upgrade'
38
+ cmd = "#{port()} upgrade #{self[:name]}"
39
+
40
+ self.info "Executing %s" % cmd.inspect
41
+ output = %x{#{cmd} 2>&1}
42
+
43
+ unless $? == 0
44
+ raise Puppet::PackageError.new(output)
45
+ end
46
+ end
47
+
48
+ def list
49
+ packages = []
50
+
51
+ eachpkgashash do |hash|
52
+ pkg = Puppet.type(:package).installedpkg(hash)
53
+ packages << pkg
54
+ end
55
+
56
+ return packages
57
+ end
58
+
59
+ def query
60
+ version = nil
61
+ eachpkgashash do |hash|
62
+ if hash[:name] == self[:name]
63
+ return hash
64
+ end
65
+ end
66
+
67
+ return nil
68
+ end
69
+
70
+ def latest
71
+ info = %x{#{port()} search '^#{self[:name]}$' 2>/dev/null}
72
+
73
+ if $? != 0 or info =~ /^Error/
74
+ return nil
75
+ end
76
+
77
+ ary = info.split(/\s+/)
78
+ version = ary[2].sub(/^@/, '')
79
+
80
+ return version
81
+ end
82
+
83
+ def uninstall
84
+ cmd = "#{port()} uninstall #{self[:name]}"
85
+ output = %x{#{cmd} 2>&1}
86
+ if $? != 0
87
+ raise Puppet::PackageError.new(output)
88
+ end
89
+ end
90
+
91
+ def update
92
+ return install()
93
+ end
94
+ end
95
+ end
96
+
97
+ # $Id: darwinport.rb 1080 2006-04-05 08:08:00Z luke $
@@ -67,7 +67,7 @@ module Puppet
67
67
  open("| dpkg -l") { |process|
68
68
  # our regex for matching dpkg output
69
69
  regex = %r{^(\S+)\s+(\S+)\s+(\S+)\s+(.+)$}
70
- fields = [:status, :name, :absent, :description]
70
+ fields = [:status, :name, :version, :description]
71
71
  hash = {}
72
72
 
73
73
  5.times { process.gets } # throw away the header
@@ -80,6 +80,14 @@ module Puppet
80
80
  fields.zip(match.captures) { |field,value|
81
81
  hash[field] = value
82
82
  }
83
+
84
+ if self.is_a? Puppet::Type and type = self[:type]
85
+ hash[:type] = type
86
+ elsif self.is_a? Module and self.respond_to? :name
87
+ hash[:type] = self.name
88
+ else
89
+ raise Puppet::DevError, "Cannot determine package type"
90
+ end
83
91
  packages.push Puppet.type(:package).installedpkg(hash)
84
92
  else
85
93
  raise Puppet::DevError,
@@ -102,4 +110,4 @@ module Puppet
102
110
  end
103
111
  end
104
112
 
105
- # $Id: dpkg.rb 922 2006-02-16 19:10:34Z luke $
113
+ # $Id: dpkg.rb 1124 2006-04-20 07:00:10Z luke $
@@ -0,0 +1,19 @@
1
+ module Puppet
2
+ Puppet.type(:package).newpkgtype(:freebsd, :openbsd) do
3
+ def listcmd
4
+ "pkg_info"
5
+ end
6
+
7
+ def query
8
+ list
9
+
10
+ if self[:version]
11
+ return :listed
12
+ else
13
+ return nil
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ # $Id: freebsd.rb 1079 2006-04-05 06:54:13Z luke $
@@ -1,5 +1,11 @@
1
1
  module Puppet
2
- Puppet.type(:package).newpkgtype(:bsd) do
2
+ Puppet.type(:package).newpkgtype(:openbsd) do
3
+ def listcmd
4
+ "pkg_info -a"
5
+ end
6
+
7
+ module_function :listcmd
8
+
3
9
  def install
4
10
  should = self.should(:ensure)
5
11
 
@@ -42,8 +48,13 @@ module Puppet
42
48
  def list
43
49
  packages = []
44
50
 
51
+ if self.is_a? Puppet::Type
52
+ debug "Executing %s" % listcmd().inspect
53
+ else
54
+ Puppet.debug "Executing %s" % listcmd().inspect
55
+ end
45
56
  # list out all of the packages
46
- open("| pkg_info -a") { |process|
57
+ open("| #{listcmd()}") { |process|
47
58
  # our regex for matching dpkg output
48
59
  regex = %r{^(\S+)-(\d\S+)\s+(.+)}
49
60
  fields = [:name, :version, :description]
@@ -51,20 +62,38 @@ module Puppet
51
62
 
52
63
  # now turn each returned line into a package object
53
64
  process.each { |line|
65
+ hash.clear
54
66
  if match = regex.match(line)
55
- hash.clear
56
-
57
67
  fields.zip(match.captures) { |field,value|
58
68
  hash[field] = value
59
69
  }
60
- packages.push Puppet.type(:package).installedpkg(hash)
70
+ yup = nil
71
+ name = hash[:name]
72
+ hash[:ensure] = :present
73
+
74
+ if self.is_a? Puppet::Type and type = self[:type]
75
+ hash[:type] = type
76
+ elsif self.is_a? Module and self.respond_to? :name
77
+ hash[:type] = self.name
78
+ else
79
+ raise Puppet::DevError, "Cannot determine package type"
80
+ end
81
+
82
+ pkg = Puppet.type(:package).installedpkg(hash)
83
+ packages << pkg
61
84
  else
62
85
  raise Puppet::DevError,
63
86
  "Failed to match dpkg line %s" % line
64
87
  end
65
88
  }
66
89
  }
67
- ENV["COLUMNS"] = oldcol
90
+
91
+ # Mark any packages we didn't find as absent
92
+ Puppet.type(:package).each do |pkg|
93
+ unless packages.include? pkg
94
+ pkg.is = [:ensure, :absent]
95
+ end
96
+ end
68
97
 
69
98
  return packages
70
99
  end
@@ -79,4 +108,4 @@ module Puppet
79
108
  end
80
109
  end
81
110
 
82
- # $Id: bsd.rb 922 2006-02-16 19:10:34Z luke $
111
+ # $Id: openbsd.rb 1128 2006-04-21 03:06:54Z luke $
@@ -0,0 +1,98 @@
1
+ module Puppet
2
+ Puppet.type(:package).newpkgtype(:ports, :openbsd) do
3
+ # I hate ports
4
+ %w{INTERACTIVE UNAME}.each do |var|
5
+ if ENV.include?(var)
6
+ ENV.delete(var)
7
+ end
8
+ end
9
+ def install
10
+ # -p: create a package
11
+ # -N: install if the package is missing, otherwise upgrade
12
+ # -P: prefer binary packages
13
+ cmd = "/usr/local/sbin/portupgrade -p -N -P #{self[:name]}"
14
+
15
+ self.debug "Executing %s" % cmd.inspect
16
+ output = %x{#{cmd} 2>&1}
17
+
18
+ unless $? == 0
19
+ raise Puppet::PackageError.new(output)
20
+ end
21
+ end
22
+
23
+ # If there are multiple packages, we only use the last one
24
+ def latest
25
+ cmd = "/usr/local/sbin/portversion -v #{self[:name]}"
26
+
27
+ self.debug "Executing %s" % cmd.inspect
28
+ output = %x{#{cmd} 2>/dev/null}.chomp
29
+ line = output.split("\n").pop
30
+
31
+ unless line =~ /^(\S+)\s+(\S)\s+(.+)$/
32
+ # There's no "latest" version, so just return a placeholder
33
+ return :latest
34
+ end
35
+
36
+ pkgstuff = $1
37
+ match = $2
38
+ info = $3
39
+
40
+ unless pkgstuff =~ /^(\w+)-([0-9].+)$/
41
+ raise Puppet::PackageError,
42
+ "Could not match package info '%s'" % pkgstuff
43
+ end
44
+
45
+ name, version = $1, $2
46
+
47
+ if match == "=" or match == ">"
48
+ # we're up to date or more recent
49
+ return version
50
+ end
51
+
52
+ # Else, we need to be updated; we need to pull out the new version
53
+
54
+ unless info =~ /\((\w+) has (.+)\)/
55
+ raise Puppet::PackageError,
56
+ "Could not match version info '%s'" % info
57
+ end
58
+
59
+ source, newversion = $1, $2
60
+
61
+ debug "Newer version in %s" % source
62
+ return newversion
63
+ end
64
+
65
+ def listcmd
66
+ "pkg_info"
67
+ end
68
+
69
+ module_function :listcmd
70
+
71
+ def query
72
+ list
73
+
74
+ if self[:version] and @states[:ensure].is != :absent
75
+ return :listed
76
+ else
77
+ return nil
78
+ end
79
+ end
80
+
81
+ def uninstall
82
+ cmd = "/usr/local/sbin/pkg_deinstall #{self[:name]}"
83
+ self.debug "Executing %s" % cmd.inspect
84
+ output = %x{#{cmd} 2>&1}
85
+
86
+ unless $? == 0
87
+ raise Puppet::PackageError.new(output)
88
+ end
89
+
90
+ end
91
+
92
+ def update
93
+ install()
94
+ end
95
+ end
96
+ end
97
+
98
+ # $Id: ports.rb 1128 2006-04-21 03:06:54Z luke $
@@ -1,5 +1,6 @@
1
1
  module Puppet
2
2
  Puppet.type(:package).newpkgtype(:rpm) do
3
+ VERSIONSTRING = "%{VERSION}-%{RELEASE}"
3
4
  def query
4
5
  fields = {
5
6
  :name => "NAME",
@@ -8,7 +9,7 @@ module Puppet
8
9
  }
9
10
 
10
11
  cmd = "rpm -q #{self[:name]} --qf '%s\n'" %
11
- "%{NAME} %{VERSION}-%{RELEASE}"
12
+ "%{NAME} #{VERSIONSTRING}"
12
13
 
13
14
  self.debug "Executing %s" % cmd.inspect
14
15
  # list out all of the packages
@@ -40,11 +41,24 @@ module Puppet
40
41
  return hash
41
42
  end
42
43
 
44
+ # Here we just retrieve the version from the file specified in the source.
45
+ def latest
46
+ unless source = self[:source]
47
+ self.fail "RPMs must specify a package source"
48
+ end
49
+
50
+ cmd = "rpm -p -q --qf '#{VERSIONSTRING}' #{self[:source]}"
51
+ self.debug "Executing %s" % cmd.inspect
52
+ version = %x{#{cmd}}
53
+
54
+ return version
55
+ end
56
+
43
57
  def list
44
58
  packages = []
45
59
 
46
60
  # list out all of the packages
47
- open("| rpm -q -a --qf '%{NAME} %{VERSION}\n'") { |process|
61
+ open("| rpm -q -a --qf '%{NAME} #{VERSIONSTRING}\n'") { |process|
48
62
  # our regex for matching dpkg output
49
63
  regex = %r{^(\S+)\s+(\S+)}
50
64
  fields = [:name, :ensure]
@@ -58,6 +72,13 @@ module Puppet
58
72
  fields.zip(match.captures) { |field,value|
59
73
  hash[field] = value
60
74
  }
75
+ if self.is_a? Puppet::Type and type = self[:type]
76
+ hash[:type] = type
77
+ elsif self.is_a? Module and self.respond_to? :name
78
+ hash[:type] = self.name
79
+ else
80
+ raise Puppet::DevError, "Cannot determine package type"
81
+ end
61
82
  packages.push Puppet.type(:package).installedpkg(hash)
62
83
  else
63
84
  raise "failed to match rpm line %s" % line
@@ -68,11 +89,22 @@ module Puppet
68
89
  return packages
69
90
  end
70
91
 
71
- # we need package retrieval mechanisms before we can have package
72
- # installation mechanisms...
73
- #type.install = proc { |pkg|
74
- # raise "installation not implemented yet"
75
- #}
92
+ def install
93
+ source = nil
94
+ unless source = self[:source]
95
+ self.fail "RPMs must specify a package source"
96
+ end
97
+
98
+ flag = "-i"
99
+ if @states[:ensure].is != :absent
100
+ flag = "-U"
101
+ end
102
+ output = %x{rpm #{flag} #{source} 2>&1}
103
+
104
+ unless $? == 0
105
+ raise Puppet::PackageError.new(output)
106
+ end
107
+ end
76
108
 
77
109
  def uninstall
78
110
  cmd = "rpm -e %s" % self[:name]
@@ -81,5 +113,9 @@ module Puppet
81
113
  raise output
82
114
  end
83
115
  end
116
+
117
+ def update
118
+ self.install
119
+ end
84
120
  end
85
121
  end