puppet 0.9.2 → 0.13.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 (213) hide show
  1. data/CHANGELOG +58 -0
  2. data/README +21 -18
  3. data/Rakefile +176 -36
  4. data/bin/puppet +34 -48
  5. data/bin/puppetca +41 -28
  6. data/bin/puppetd +87 -65
  7. data/bin/puppetdoc +99 -23
  8. data/bin/puppetmasterd +72 -91
  9. data/conf/redhat/client.init +80 -0
  10. data/conf/redhat/client.sysconfig +11 -0
  11. data/conf/redhat/fileserver.conf +12 -0
  12. data/conf/redhat/puppet.spec +130 -0
  13. data/conf/redhat/server.init +89 -0
  14. data/conf/redhat/server.sysconfig +9 -0
  15. data/examples/code/allatonce +2 -2
  16. data/examples/code/assignments +1 -1
  17. data/examples/code/classing +2 -2
  18. data/examples/code/components +2 -2
  19. data/examples/code/file.bl +5 -5
  20. data/examples/code/filedefaults +2 -2
  21. data/examples/code/fileparsing +1 -1
  22. data/examples/code/filerecursion +1 -1
  23. data/examples/code/functions +1 -1
  24. data/examples/code/groups +1 -1
  25. data/examples/code/importing +1 -1
  26. data/examples/code/nodes +1 -1
  27. data/examples/code/one +1 -1
  28. data/examples/code/relationships +2 -2
  29. data/examples/code/simpletests +5 -5
  30. data/examples/code/snippets/argumentdefaults +2 -2
  31. data/examples/code/snippets/casestatement +16 -8
  32. data/examples/code/snippets/classheirarchy.pp +4 -4
  33. data/examples/code/snippets/classincludes.pp +4 -4
  34. data/examples/code/snippets/classpathtest +2 -2
  35. data/examples/code/snippets/componentmetaparams.pp +11 -0
  36. data/examples/code/snippets/dirchmod +5 -5
  37. data/examples/code/snippets/emptyclass.pp +9 -0
  38. data/examples/code/snippets/failmissingexecpath.pp +1 -1
  39. data/examples/code/snippets/falsevalues.pp +1 -1
  40. data/examples/code/snippets/filecreate +5 -5
  41. data/examples/code/snippets/implicititeration +5 -5
  42. data/examples/code/snippets/multipleinstances +4 -4
  43. data/examples/code/snippets/namevartest +3 -3
  44. data/examples/code/snippets/scopetest +1 -1
  45. data/examples/code/snippets/selectorvalues.pp +3 -3
  46. data/examples/code/snippets/simpledefaults +2 -2
  47. data/examples/code/snippets/simpleselector +5 -5
  48. data/examples/code/snippets/singleary.pp +19 -0
  49. data/examples/root/etc/init.d/sleeper +3 -2
  50. data/ext/emacs/puppet-mode-init.el +6 -0
  51. data/ext/emacs/puppet-mode.el +189 -0
  52. data/ext/ldap/puppet.schema +17 -0
  53. data/ext/{module:puppet → module_puppet} +30 -31
  54. data/ext/vim/filetype.vim +9 -0
  55. data/ext/vim/puppet.vim +87 -0
  56. data/install.rb +63 -30
  57. data/lib/puppet.rb +216 -122
  58. data/lib/puppet/client.rb +51 -416
  59. data/lib/puppet/client/ca.rb +17 -0
  60. data/lib/puppet/client/dipper.rb +78 -0
  61. data/lib/puppet/client/file.rb +20 -0
  62. data/lib/puppet/client/log.rb +17 -0
  63. data/lib/puppet/client/master.rb +246 -0
  64. data/lib/puppet/client/proxy.rb +27 -0
  65. data/lib/puppet/client/status.rb +7 -0
  66. data/lib/puppet/config.rb +563 -13
  67. data/lib/puppet/daemon.rb +50 -22
  68. data/lib/puppet/element.rb +4 -4
  69. data/lib/puppet/event-loop.rb +1 -0
  70. data/lib/puppet/event-loop/better-definers.rb +367 -0
  71. data/lib/puppet/event-loop/event-loop.rb +355 -0
  72. data/lib/puppet/event-loop/signal-system.rb +220 -0
  73. data/lib/puppet/event.rb +9 -11
  74. data/lib/puppet/filetype.rb +195 -0
  75. data/lib/puppet/log.rb +35 -12
  76. data/lib/puppet/metric.rb +2 -2
  77. data/lib/puppet/networkclient.rb +145 -0
  78. data/lib/puppet/parameter.rb +335 -0
  79. data/lib/puppet/parser/ast.rb +42 -1453
  80. data/lib/puppet/parser/ast/astarray.rb +88 -0
  81. data/lib/puppet/parser/ast/branch.rb +47 -0
  82. data/lib/puppet/parser/ast/caseopt.rb +66 -0
  83. data/lib/puppet/parser/ast/casestatement.rb +78 -0
  84. data/lib/puppet/parser/ast/classdef.rb +78 -0
  85. data/lib/puppet/parser/ast/compdef.rb +111 -0
  86. data/lib/puppet/parser/ast/component.rb +105 -0
  87. data/lib/puppet/parser/ast/hostclass.rb +82 -0
  88. data/lib/puppet/parser/ast/leaf.rb +86 -0
  89. data/lib/puppet/parser/ast/node.rb +103 -0
  90. data/lib/puppet/parser/ast/nodedef.rb +68 -0
  91. data/lib/puppet/parser/ast/objectdef.rb +336 -0
  92. data/lib/puppet/parser/ast/objectparam.rb +30 -0
  93. data/lib/puppet/parser/ast/objectref.rb +76 -0
  94. data/lib/puppet/parser/ast/selector.rb +60 -0
  95. data/lib/puppet/parser/ast/typedefaults.rb +45 -0
  96. data/lib/puppet/parser/ast/vardef.rb +44 -0
  97. data/lib/puppet/parser/interpreter.rb +31 -14
  98. data/lib/puppet/parser/lexer.rb +2 -4
  99. data/lib/puppet/parser/parser.rb +332 -242
  100. data/lib/puppet/parser/scope.rb +55 -38
  101. data/lib/puppet/server.rb +43 -44
  102. data/lib/puppet/server/authstore.rb +3 -6
  103. data/lib/puppet/server/ca.rb +5 -2
  104. data/lib/puppet/server/filebucket.rb +2 -4
  105. data/lib/puppet/server/fileserver.rb +28 -12
  106. data/lib/puppet/server/logger.rb +15 -4
  107. data/lib/puppet/server/master.rb +62 -7
  108. data/lib/puppet/sslcertificates.rb +41 -607
  109. data/lib/puppet/sslcertificates/ca.rb +291 -0
  110. data/lib/puppet/sslcertificates/certificate.rb +283 -0
  111. data/lib/puppet/statechange.rb +6 -1
  112. data/lib/puppet/storage.rb +67 -56
  113. data/lib/puppet/transaction.rb +25 -9
  114. data/lib/puppet/transportable.rb +102 -22
  115. data/lib/puppet/type.rb +1096 -315
  116. data/lib/puppet/type/component.rb +30 -21
  117. data/lib/puppet/type/cron.rb +409 -448
  118. data/lib/puppet/type/exec.rb +234 -174
  119. data/lib/puppet/type/group.rb +65 -82
  120. data/lib/puppet/type/nameservice.rb +247 -3
  121. data/lib/puppet/type/nameservice/netinfo.rb +29 -40
  122. data/lib/puppet/type/nameservice/objectadd.rb +52 -66
  123. data/lib/puppet/type/nameservice/posix.rb +6 -194
  124. data/lib/puppet/type/package.rb +447 -295
  125. data/lib/puppet/type/package/apt.rb +51 -50
  126. data/lib/puppet/type/package/bsd.rb +82 -0
  127. data/lib/puppet/type/package/dpkg.rb +85 -88
  128. data/lib/puppet/type/package/rpm.rb +67 -63
  129. data/lib/puppet/type/package/sun.rb +119 -98
  130. data/lib/puppet/type/package/yum.rb +41 -37
  131. data/lib/puppet/type/parsedtype.rb +295 -0
  132. data/lib/puppet/type/parsedtype/host.rb +143 -0
  133. data/lib/puppet/type/parsedtype/port.rb +232 -0
  134. data/lib/puppet/type/parsedtype/sshkey.rb +129 -0
  135. data/lib/puppet/type/pfile.rb +484 -460
  136. data/lib/puppet/type/pfile/checksum.rb +237 -181
  137. data/lib/puppet/type/pfile/content.rb +67 -0
  138. data/lib/puppet/type/pfile/ensure.rb +212 -0
  139. data/lib/puppet/type/pfile/group.rb +106 -105
  140. data/lib/puppet/type/pfile/mode.rb +98 -101
  141. data/lib/puppet/type/pfile/source.rb +228 -209
  142. data/lib/puppet/type/pfile/type.rb +18 -21
  143. data/lib/puppet/type/pfile/uid.rb +127 -130
  144. data/lib/puppet/type/pfilebucket.rb +68 -63
  145. data/lib/puppet/type/schedule.rb +341 -0
  146. data/lib/puppet/type/service.rb +351 -255
  147. data/lib/puppet/type/service/base.rb +9 -14
  148. data/lib/puppet/type/service/debian.rb +32 -38
  149. data/lib/puppet/type/service/init.rb +130 -130
  150. data/lib/puppet/type/service/smf.rb +48 -20
  151. data/lib/puppet/type/state.rb +229 -16
  152. data/lib/puppet/type/symlink.rb +51 -63
  153. data/lib/puppet/type/tidy.rb +105 -102
  154. data/lib/puppet/type/user.rb +118 -180
  155. data/lib/puppet/util.rb +100 -6
  156. data/test/certmgr/certmgr.rb +0 -1
  157. data/test/client/client.rb +4 -4
  158. data/test/executables/puppetbin.rb +7 -14
  159. data/test/executables/puppetca.rb +18 -24
  160. data/test/executables/puppetd.rb +7 -16
  161. data/test/executables/puppetmasterd.rb +7 -9
  162. data/test/executables/puppetmodule.rb +11 -16
  163. data/test/language/ast.rb +11 -7
  164. data/test/language/interpreter.rb +1 -1
  165. data/test/language/scope.rb +2 -0
  166. data/test/language/snippets.rb +30 -5
  167. data/test/language/transportable.rb +77 -0
  168. data/test/other/config.rb +316 -0
  169. data/test/other/events.rb +22 -21
  170. data/test/other/log.rb +14 -14
  171. data/test/other/metrics.rb +4 -8
  172. data/test/other/overrides.rb +5 -5
  173. data/test/other/relationships.rb +4 -2
  174. data/test/other/storage.rb +64 -3
  175. data/test/other/transactions.rb +20 -20
  176. data/test/parser/parser.rb +7 -4
  177. data/test/puppet/conffiles.rb +12 -12
  178. data/test/puppet/defaults.rb +13 -11
  179. data/test/puppet/utiltest.rb +14 -11
  180. data/test/puppettest.rb +156 -48
  181. data/test/server/bucket.rb +2 -2
  182. data/test/server/fileserver.rb +6 -6
  183. data/test/server/logger.rb +19 -11
  184. data/test/server/master.rb +33 -4
  185. data/test/server/server.rb +2 -7
  186. data/test/types/basic.rb +5 -7
  187. data/test/types/component.rb +22 -18
  188. data/test/types/cron.rb +111 -44
  189. data/test/types/exec.rb +116 -59
  190. data/test/types/file.rb +262 -137
  191. data/test/types/filebucket.rb +13 -15
  192. data/test/types/fileignoresource.rb +12 -16
  193. data/test/types/filesources.rb +73 -48
  194. data/test/types/filetype.rb +13 -15
  195. data/test/types/group.rb +15 -13
  196. data/test/types/host.rb +146 -0
  197. data/test/types/package.rb +74 -63
  198. data/test/types/port.rb +139 -0
  199. data/test/types/query.rb +8 -8
  200. data/test/types/schedule.rb +335 -0
  201. data/test/types/service.rb +137 -21
  202. data/test/types/sshkey.rb +140 -0
  203. data/test/types/symlink.rb +3 -5
  204. data/test/types/tidy.rb +5 -14
  205. data/test/types/type.rb +67 -11
  206. data/test/types/user.rb +25 -23
  207. metadata +186 -122
  208. data/lib/puppet/type/pfile/create.rb +0 -108
  209. data/lib/puppet/type/pprocess.rb +0 -97
  210. data/lib/puppet/type/typegen.rb +0 -149
  211. data/lib/puppet/type/typegen/filerecord.rb +0 -243
  212. data/lib/puppet/type/typegen/filetype.rb +0 -316
  213. data/test/other/state.rb +0 -106
@@ -12,18 +12,31 @@ require 'puppet/type/state'
12
12
  require 'puppet/type/nameservice'
13
13
 
14
14
  module Puppet
15
- class State
16
- module GroupGID
17
- def self.doc
18
- "The group ID. Must be specified numerically. If not
15
+ newtype(:group, Puppet::Type::NSSType) do
16
+ @doc = "Manage groups. This type can only create groups. Group
17
+ membership must be managed on individual users. This element type
18
+ uses the prescribed native tools for creating groups and generally
19
+ uses POSIX APIs for retrieving information about them. It does
20
+ not directly modify /etc/group or anything.
21
+
22
+ For most platforms, the tools used are ``groupadd`` and its ilk;
23
+ for Mac OS X, NetInfo is used. This is currently unconfigurable,
24
+ but if you desperately need it to be so, please contact us."
25
+
26
+ case Facter["operatingsystem"].value
27
+ when "Darwin":
28
+ @parentstate = Puppet::NameService::NetInfo::NetInfoState
29
+ @parentmodule = Puppet::NameService::NetInfo
30
+ else
31
+ @parentstate = Puppet::NameService::ObjectAdd::ObjectAddGroup
32
+ @parentmodule = Puppet::NameService::ObjectAdd
33
+ end
34
+
35
+ newstate(:gid, @parentstate) do
36
+ desc "The group ID. Must be specified numerically. If not
19
37
  specified, a number will be picked, which can result in ID
20
38
  differences across systems and thus is not recommended. The
21
39
  GID is picked according to local system standards."
22
- end
23
-
24
- def self.name
25
- :gid
26
- end
27
40
 
28
41
  def autogen
29
42
  highest = 0
@@ -38,21 +51,22 @@ module Puppet
38
51
  return highest + 1
39
52
  end
40
53
 
41
- def shouldprocess(gid)
54
+ munge do |gid|
42
55
  case gid
43
56
  when String
44
57
  if gid =~ /^[-0-9]+$/
45
58
  gid = Integer(gid)
46
59
  else
47
- raise Puppet::Error, "Invalid GID %s" % gid
60
+ self.fail "Invalid GID %s" % gid
48
61
  end
49
62
  when Symbol
50
- unless gid == :auto or gid == :notfound
51
- raise Puppet::DevError, "Invalid GID %s" % gid
63
+ unless gid == :auto or gid == :absent
64
+ self.devfail "Invalid GID %s" % gid
52
65
  end
53
66
  if gid == :auto
54
67
  unless self.class.autogen?
55
- gid = autogen
68
+ gid = autogen()
69
+ @parent.log "autogenerated value as %s" % gid
56
70
  end
57
71
  end
58
72
  end
@@ -62,91 +76,60 @@ module Puppet
62
76
  return gid
63
77
  end
64
78
  end
65
- end
66
-
67
- class Type
68
- class Group < Type
69
- statenames = [
70
- "GroupGID"
71
- ]
72
- case Facter["operatingsystem"].value
73
- when "Darwin":
74
- @statemodule = Puppet::NameService::NetInfo
75
- else
76
- @statemodule = Puppet::NameService::ObjectAdd
77
- end
78
79
 
79
- @states = statenames.collect { |name|
80
- fullname = @statemodule.to_s + "::" + name
81
- begin
82
- eval(fullname)
83
- rescue NameError
84
- raise Puppet::DevError, "Could not retrieve state class %s" %
85
- fullname
86
- end
87
- }.each { |klass|
88
- klass.complete
89
- }
90
-
91
- @name = :group
92
- @namevar = :name
93
-
94
- @parameters = [:name]
95
-
96
- class << self
97
- attr_accessor :netinfodir
98
- attr_accessor :statemodule
99
- end
80
+ class << self
81
+ attr_accessor :netinfodir
82
+ end
100
83
 
101
- @netinfodir = "groups"
84
+ @netinfodir = "groups"
102
85
 
103
- @paramdoc[:name] = "The group name. While naming limitations vary by
86
+ newparam(:name) do
87
+ desc "The group name. While naming limitations vary by
104
88
  system, it is advisable to keep the name to the degenerate
105
89
  limitations, which is a maximum of 8 characters beginning with
106
90
  a letter."
107
91
 
108
- @doc = "Manage groups. This type can only create groups. Group
109
- membership must be managed on individual users."
92
+ isnamevar
93
+ end
110
94
 
111
- def exists?
112
- self.class.statemodule.exists?(self)
113
- end
95
+ def exists?
96
+ self.class.parentmodule.exists?(self)
97
+ end
114
98
 
115
- def getinfo(refresh = false)
116
- if @groupinfo.nil? or refresh == true
117
- begin
118
- @groupinfo = Etc.getgrnam(self.name)
119
- rescue ArgumentError => detail
120
- @groupinfo = nil
121
- end
99
+ def getinfo(refresh = false)
100
+ if @groupinfo.nil? or refresh == true
101
+ begin
102
+ @groupinfo = Etc.getgrnam(self.name)
103
+ rescue ArgumentError => detail
104
+ @groupinfo = nil
122
105
  end
123
-
124
- @groupinfo
125
- end
126
-
127
- def initialize(hash)
128
- @groupinfo = nil
129
- super
130
106
  end
131
107
 
132
- def retrieve
133
- if self.exists?
134
- super
135
- else
136
- # the group does not exist
137
- unless @states.include?(:gid)
138
- self[:gid] = :auto
139
- end
108
+ @groupinfo
109
+ end
140
110
 
141
- @states.each { |name, state|
142
- state.is = :notfound
143
- }
111
+ def initialize(hash)
112
+ @groupinfo = nil
113
+ super
114
+ end
144
115
 
145
- return
116
+ def retrieve
117
+ if self.exists?
118
+ super
119
+ else
120
+ # the group does not exist
121
+ unless @states.include?(:gid)
122
+ self[:gid] = :auto
146
123
  end
124
+
125
+ @states.each { |name, state|
126
+ state.is = :absent
127
+ }
128
+
129
+ return
147
130
  end
148
131
  end
149
132
  end
150
133
  end
151
134
 
152
- # $Id: group.rb 731 2005-10-26 04:44:25Z luke $
135
+ # $Id: group.rb 841 2006-01-18 17:24:15Z luke $
@@ -1,3 +1,247 @@
1
- require 'puppet/type/nameservice/posix'
2
- require 'puppet/type/nameservice/netinfo'
3
- require 'puppet/type/nameservice/objectadd'
1
+ require 'puppet/type'
2
+
3
+ module Puppet
4
+ class Type
5
+ class NSSType < Puppet::Type
6
+ class << self
7
+ attr_reader :parentstate, :parentmodule
8
+
9
+ # Seems a lot like this should be elsewhere,
10
+ # but we'd have to have a different parent class for
11
+ # netinfo types if that were the case.
12
+ attr_accessor :netinfodir
13
+
14
+ def newstate(*args, &block)
15
+ s = super(*args, &block)
16
+
17
+ if s.respond_to?(:finish)
18
+ s.finish
19
+ end
20
+ end
21
+ end
22
+
23
+ # Create the object. We have to call the 'syncname' method
24
+ # on one of the non-ensure states, because the ensure state is not
25
+ # a subclass of NSSState. Just find the first one and call it.
26
+ def create
27
+ @states.find { |name, state|
28
+ state.is_a?(Puppet::State::NSSState)
29
+ }[1].syncname(:present)
30
+ end
31
+
32
+ # Remove it
33
+ def destroy
34
+ @states.find { |name, state|
35
+ state.is_a?(Puppet::State::NSSState)
36
+ }[1].syncname(:absent)
37
+ end
38
+ end
39
+ end
40
+
41
+ class State
42
+ # This is the state that all other Nameservice states descend from. It sets
43
+ # the standard for how one interacts with these state objects, but it leaves
44
+ # out any implementation details. See the 'posix' stuff for the basics
45
+ # on how to retrieve information on most systems, but any adding of information
46
+ # is done specially per-system (e.g., netinfo, useradd, adduser).
47
+ class NSSState < Puppet::State
48
+ class << self
49
+ # Are all changes to states done in one step or do all states need
50
+ # to be synced individually? This differentiates between netinfo,
51
+ # in which creation cannot be used to fill out information, and
52
+ # things like useradd, in which creation can be done with all
53
+ # information in one swell foop.
54
+ def allatonce?
55
+ Puppet.info "Returning allatonce %s" % @allatonce
56
+ if defined? @allatonce
57
+ return @allatonce
58
+ else
59
+ return false
60
+ end
61
+ end
62
+
63
+ # Yes, this value will autogenerate.
64
+ def isautogen
65
+ @isautogen = true
66
+ end
67
+
68
+ def noautogen
69
+ @isautogen = false
70
+ end
71
+
72
+ # Can we autogenerate a value for this field? If a required field
73
+ # can be autogenerated then we don't require a value.
74
+ def autogen?
75
+ if defined? @isautogen and @isautogen
76
+ return true
77
+ else
78
+ return false
79
+ end
80
+ end
81
+
82
+ # Yes, this field is optional
83
+ def isoptional
84
+ @isoptional = true
85
+ end
86
+
87
+ # Is this field optional? Defaults to false.
88
+ def isoptional?
89
+ if defined? @isoptional
90
+ return @isoptional
91
+ else
92
+ return false
93
+ end
94
+ end
95
+
96
+ # What method is used to retrieve the value from the POSIX struct?
97
+ # Really, these method names should be stored in this class somewhere,
98
+ # in a map or something, but then I would have to differentiate
99
+ # between the different posix classes (e.g., user and group). In the
100
+ # end, we're _only_ using classes that _do_ have posix structs,
101
+ # so we might as well store the method in the class definition,
102
+ # rather than forcing it to be abstracted out or whatever.
103
+ def posixmethod
104
+ if defined? @posixmethod
105
+ return @posixmethod
106
+ else
107
+ return self.name
108
+ end
109
+ end
110
+ end
111
+
112
+ # We use the POSIX interfaces to retrieve all information, so we don't
113
+ # have to worry about abstracting that across the system. Any class
114
+ # can still override this, but it should work for the vast majority of
115
+ # cases.
116
+ def retrieve
117
+ if obj = @parent.getinfo(true)
118
+
119
+ if method = self.class.posixmethod || self.class.name
120
+ @is = obj.send(method)
121
+ else
122
+ self.devfail "%s has no posixmethod" % self.class
123
+ end
124
+ else
125
+ @is = :absent
126
+ end
127
+ end
128
+
129
+ # Sync the information.
130
+ def sync
131
+ event = nil
132
+ # they're in sync some other way
133
+ if self.insync?
134
+ return nil
135
+ end
136
+ if @is == :absent
137
+ self.retrieve
138
+ if self.insync?
139
+ return nil
140
+ end
141
+ end
142
+ # # if the object needs to be created or deleted,
143
+ # # depend on another method to do it all at once
144
+ # if @is == :absent or self.should == :absent
145
+ # Puppet.info "creating"
146
+ # event = syncname()
147
+ #
148
+ # Puppet.info "created with event %s" % event
149
+ #
150
+ # return event
151
+ # # if the whole object is created at once, just return
152
+ # # an event saying so
153
+ # #if self.class.allatonce?
154
+ # # return event
155
+ # #end
156
+ # end
157
+
158
+ unless @parent.exists?
159
+ self.devfail "%s %s does not exist; cannot set %s" %
160
+ [@parent.class.name, @parent.name, self.class.name]
161
+ end
162
+
163
+ # this needs to be set either by the individual state
164
+ # or its parent class
165
+ cmd = self.modifycmd
166
+
167
+ self.debug "Executing %s" % cmd.inspect
168
+
169
+ output = %x{#{cmd} 2>&1}
170
+
171
+
172
+ unless $? == 0
173
+ self.fail "Could not modify %s on %s %s: %s" %
174
+ [self.class.name, @parent.class.name,
175
+ @parent.name, output]
176
+ end
177
+
178
+ if event
179
+ return event
180
+ else
181
+ return "#{@parent.class.name}_modified".intern
182
+ end
183
+ end
184
+
185
+ # This is only used when creating or destroying the object.
186
+ def syncname(value)
187
+ cmd = nil
188
+ event = nil
189
+ case value
190
+ when :absent
191
+ # we need to remove the object...
192
+ unless @parent.exists?
193
+ @parent.info "already absent"
194
+ # the object already doesn't exist
195
+ return nil
196
+ end
197
+
198
+ # again, needs to be set by the ind. state or its
199
+ # parent
200
+ cmd = self.deletecmd
201
+ type = "delete"
202
+ when :present
203
+ if @parent.exists?
204
+ @parent.info "already exists"
205
+ # The object already exists
206
+ return nil
207
+ end
208
+
209
+ # blah blah, define elsewhere, blah blah
210
+ cmd = self.addcmd
211
+ type = "create"
212
+ end
213
+ self.debug "Executing %s" % cmd.inspect
214
+
215
+ output = %x{#{cmd} 2>&1}
216
+
217
+ unless $? == 0
218
+ raise Puppet::Error, "Could not %s %s %s: %s" %
219
+ [type, @parent.class.name, @parent.name, output]
220
+ end
221
+
222
+ # we want object creation to show up as one event,
223
+ # not many
224
+ unless self.class.allatonce?
225
+ Puppet.debug "%s is not allatonce" % self.class.name
226
+ if type == "create"
227
+ @parent.eachstate { |state|
228
+ state.sync
229
+ state.retrieve
230
+ }
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
236
+ end
237
+
238
+ # Here's where we decide what type of objects we'll be dealing with.
239
+ case Facter["operatingsystem"].value
240
+ when "Darwin":
241
+ require 'puppet/type/nameservice/netinfo'
242
+ else
243
+ require 'puppet/type/nameservice/objectadd'
244
+ end
245
+
246
+
247
+ # $Id: nameservice.rb 841 2006-01-18 17:24:15Z luke $
@@ -5,13 +5,9 @@ require 'puppet'
5
5
  require 'puppet/type/nameservice/posix'
6
6
 
7
7
  module Puppet
8
- class Type
9
- # Return the NetInfo directory in which a given object type is stored.
10
- # Defaults to the type's name if @netinfodir is unset.
11
- end
12
-
13
8
  module NameService
14
9
  module NetInfo
10
+ # Verify that we've got all of the commands we need.
15
11
  def self.test
16
12
  system("which niutil > /dev/null 2>&1")
17
13
 
@@ -32,6 +28,7 @@ module Puppet
32
28
  end
33
29
  end
34
30
 
31
+ # Does the object already exist?
35
32
  def self.exists?(obj)
36
33
  cmd = "nidump -r /%s/%s /" %
37
34
  [obj.class.netinfodir, obj.name]
@@ -45,6 +42,7 @@ module Puppet
45
42
  end
46
43
  end
47
44
 
45
+ # Attempt to flush the database, but this doesn't seem to work at all.
48
46
  def self.flush
49
47
  output = %x{lookupd -flushcache 2>&1}
50
48
 
@@ -53,19 +51,37 @@ module Puppet
53
51
  end
54
52
  end
55
53
 
56
- class NetInfoState < POSIX::POSIXState
57
- def self.allatonce?
58
- false
59
- end
60
-
54
+ # The state responsible for handling netinfo objects. Because they
55
+ # are all accessed using the exact same interface, we can just
56
+ # abstract the differents using a simple map where necessary
57
+ # (the netinfokeymap).
58
+ class NetInfoState < Puppet::State::NSSState
59
+ # Similar to posixmethod, what key do we use to get data? Defaults
60
+ # to being the object name.
61
61
  def self.netinfokey
62
- if defined? @netinfokey and @netinfokey
62
+ if defined? @netinfokey
63
63
  return @netinfokey
64
64
  else
65
65
  return self.name
66
66
  end
67
67
  end
68
68
 
69
+ def self.setkey(key)
70
+ @netinfokey = key
71
+ end
72
+
73
+ def self.finish
74
+ @allatonce = false
75
+ case self.name
76
+ when :comment: setkey "realname"
77
+ when :uid:
78
+ noautogen
79
+ when :gid:
80
+ noautogen
81
+ end
82
+ end
83
+
84
+ # Retrieve the data, yo.
69
85
  def retrieve
70
86
  NetInfo.flush
71
87
  dir = @parent.class.netinfodir
@@ -98,10 +114,11 @@ module Puppet
98
114
  }
99
115
 
100
116
  unless defined? @is
101
- @is = :notfound
117
+ @is = :absent
102
118
  end
103
119
  end
104
120
 
121
+ # How to add an object.
105
122
  def addcmd
106
123
  creatorcmd("-create")
107
124
  end
@@ -140,34 +157,6 @@ module Puppet
140
157
  cmd.join(" ")
141
158
  end
142
159
  end
143
-
144
- class GroupGID < NetInfoState
145
- end
146
-
147
- class UserUID < NetInfoState
148
- end
149
-
150
- class UserGID < NetInfoState
151
- end
152
-
153
- class UserComment < NetInfoState
154
- @netinfokey = "realname"
155
- end
156
-
157
- class UserHome < NetInfoState
158
- end
159
-
160
- class UserShell < NetInfoState
161
- end
162
-
163
- class UserLocked < NetInfoState
164
- end
165
-
166
- class UserExpire < NetInfoState
167
- end
168
-
169
- class UserInactive < NetInfoState
170
- end
171
160
  end
172
161
  end
173
162
  end