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.
- data/CHANGELOG +58 -0
- data/README +21 -18
- data/Rakefile +176 -36
- data/bin/puppet +34 -48
- data/bin/puppetca +41 -28
- data/bin/puppetd +87 -65
- data/bin/puppetdoc +99 -23
- data/bin/puppetmasterd +72 -91
- data/conf/redhat/client.init +80 -0
- data/conf/redhat/client.sysconfig +11 -0
- data/conf/redhat/fileserver.conf +12 -0
- data/conf/redhat/puppet.spec +130 -0
- data/conf/redhat/server.init +89 -0
- data/conf/redhat/server.sysconfig +9 -0
- data/examples/code/allatonce +2 -2
- data/examples/code/assignments +1 -1
- data/examples/code/classing +2 -2
- data/examples/code/components +2 -2
- data/examples/code/file.bl +5 -5
- data/examples/code/filedefaults +2 -2
- data/examples/code/fileparsing +1 -1
- data/examples/code/filerecursion +1 -1
- data/examples/code/functions +1 -1
- data/examples/code/groups +1 -1
- data/examples/code/importing +1 -1
- data/examples/code/nodes +1 -1
- data/examples/code/one +1 -1
- data/examples/code/relationships +2 -2
- data/examples/code/simpletests +5 -5
- data/examples/code/snippets/argumentdefaults +2 -2
- data/examples/code/snippets/casestatement +16 -8
- data/examples/code/snippets/classheirarchy.pp +4 -4
- data/examples/code/snippets/classincludes.pp +4 -4
- data/examples/code/snippets/classpathtest +2 -2
- data/examples/code/snippets/componentmetaparams.pp +11 -0
- data/examples/code/snippets/dirchmod +5 -5
- data/examples/code/snippets/emptyclass.pp +9 -0
- data/examples/code/snippets/failmissingexecpath.pp +1 -1
- data/examples/code/snippets/falsevalues.pp +1 -1
- data/examples/code/snippets/filecreate +5 -5
- data/examples/code/snippets/implicititeration +5 -5
- data/examples/code/snippets/multipleinstances +4 -4
- data/examples/code/snippets/namevartest +3 -3
- data/examples/code/snippets/scopetest +1 -1
- data/examples/code/snippets/selectorvalues.pp +3 -3
- data/examples/code/snippets/simpledefaults +2 -2
- data/examples/code/snippets/simpleselector +5 -5
- data/examples/code/snippets/singleary.pp +19 -0
- data/examples/root/etc/init.d/sleeper +3 -2
- data/ext/emacs/puppet-mode-init.el +6 -0
- data/ext/emacs/puppet-mode.el +189 -0
- data/ext/ldap/puppet.schema +17 -0
- data/ext/{module:puppet → module_puppet} +30 -31
- data/ext/vim/filetype.vim +9 -0
- data/ext/vim/puppet.vim +87 -0
- data/install.rb +63 -30
- data/lib/puppet.rb +216 -122
- data/lib/puppet/client.rb +51 -416
- data/lib/puppet/client/ca.rb +17 -0
- data/lib/puppet/client/dipper.rb +78 -0
- data/lib/puppet/client/file.rb +20 -0
- data/lib/puppet/client/log.rb +17 -0
- data/lib/puppet/client/master.rb +246 -0
- data/lib/puppet/client/proxy.rb +27 -0
- data/lib/puppet/client/status.rb +7 -0
- data/lib/puppet/config.rb +563 -13
- data/lib/puppet/daemon.rb +50 -22
- data/lib/puppet/element.rb +4 -4
- data/lib/puppet/event-loop.rb +1 -0
- data/lib/puppet/event-loop/better-definers.rb +367 -0
- data/lib/puppet/event-loop/event-loop.rb +355 -0
- data/lib/puppet/event-loop/signal-system.rb +220 -0
- data/lib/puppet/event.rb +9 -11
- data/lib/puppet/filetype.rb +195 -0
- data/lib/puppet/log.rb +35 -12
- data/lib/puppet/metric.rb +2 -2
- data/lib/puppet/networkclient.rb +145 -0
- data/lib/puppet/parameter.rb +335 -0
- data/lib/puppet/parser/ast.rb +42 -1453
- data/lib/puppet/parser/ast/astarray.rb +88 -0
- data/lib/puppet/parser/ast/branch.rb +47 -0
- data/lib/puppet/parser/ast/caseopt.rb +66 -0
- data/lib/puppet/parser/ast/casestatement.rb +78 -0
- data/lib/puppet/parser/ast/classdef.rb +78 -0
- data/lib/puppet/parser/ast/compdef.rb +111 -0
- data/lib/puppet/parser/ast/component.rb +105 -0
- data/lib/puppet/parser/ast/hostclass.rb +82 -0
- data/lib/puppet/parser/ast/leaf.rb +86 -0
- data/lib/puppet/parser/ast/node.rb +103 -0
- data/lib/puppet/parser/ast/nodedef.rb +68 -0
- data/lib/puppet/parser/ast/objectdef.rb +336 -0
- data/lib/puppet/parser/ast/objectparam.rb +30 -0
- data/lib/puppet/parser/ast/objectref.rb +76 -0
- data/lib/puppet/parser/ast/selector.rb +60 -0
- data/lib/puppet/parser/ast/typedefaults.rb +45 -0
- data/lib/puppet/parser/ast/vardef.rb +44 -0
- data/lib/puppet/parser/interpreter.rb +31 -14
- data/lib/puppet/parser/lexer.rb +2 -4
- data/lib/puppet/parser/parser.rb +332 -242
- data/lib/puppet/parser/scope.rb +55 -38
- data/lib/puppet/server.rb +43 -44
- data/lib/puppet/server/authstore.rb +3 -6
- data/lib/puppet/server/ca.rb +5 -2
- data/lib/puppet/server/filebucket.rb +2 -4
- data/lib/puppet/server/fileserver.rb +28 -12
- data/lib/puppet/server/logger.rb +15 -4
- data/lib/puppet/server/master.rb +62 -7
- data/lib/puppet/sslcertificates.rb +41 -607
- data/lib/puppet/sslcertificates/ca.rb +291 -0
- data/lib/puppet/sslcertificates/certificate.rb +283 -0
- data/lib/puppet/statechange.rb +6 -1
- data/lib/puppet/storage.rb +67 -56
- data/lib/puppet/transaction.rb +25 -9
- data/lib/puppet/transportable.rb +102 -22
- data/lib/puppet/type.rb +1096 -315
- data/lib/puppet/type/component.rb +30 -21
- data/lib/puppet/type/cron.rb +409 -448
- data/lib/puppet/type/exec.rb +234 -174
- data/lib/puppet/type/group.rb +65 -82
- data/lib/puppet/type/nameservice.rb +247 -3
- data/lib/puppet/type/nameservice/netinfo.rb +29 -40
- data/lib/puppet/type/nameservice/objectadd.rb +52 -66
- data/lib/puppet/type/nameservice/posix.rb +6 -194
- data/lib/puppet/type/package.rb +447 -295
- data/lib/puppet/type/package/apt.rb +51 -50
- data/lib/puppet/type/package/bsd.rb +82 -0
- data/lib/puppet/type/package/dpkg.rb +85 -88
- data/lib/puppet/type/package/rpm.rb +67 -63
- data/lib/puppet/type/package/sun.rb +119 -98
- data/lib/puppet/type/package/yum.rb +41 -37
- data/lib/puppet/type/parsedtype.rb +295 -0
- data/lib/puppet/type/parsedtype/host.rb +143 -0
- data/lib/puppet/type/parsedtype/port.rb +232 -0
- data/lib/puppet/type/parsedtype/sshkey.rb +129 -0
- data/lib/puppet/type/pfile.rb +484 -460
- data/lib/puppet/type/pfile/checksum.rb +237 -181
- data/lib/puppet/type/pfile/content.rb +67 -0
- data/lib/puppet/type/pfile/ensure.rb +212 -0
- data/lib/puppet/type/pfile/group.rb +106 -105
- data/lib/puppet/type/pfile/mode.rb +98 -101
- data/lib/puppet/type/pfile/source.rb +228 -209
- data/lib/puppet/type/pfile/type.rb +18 -21
- data/lib/puppet/type/pfile/uid.rb +127 -130
- data/lib/puppet/type/pfilebucket.rb +68 -63
- data/lib/puppet/type/schedule.rb +341 -0
- data/lib/puppet/type/service.rb +351 -255
- data/lib/puppet/type/service/base.rb +9 -14
- data/lib/puppet/type/service/debian.rb +32 -38
- data/lib/puppet/type/service/init.rb +130 -130
- data/lib/puppet/type/service/smf.rb +48 -20
- data/lib/puppet/type/state.rb +229 -16
- data/lib/puppet/type/symlink.rb +51 -63
- data/lib/puppet/type/tidy.rb +105 -102
- data/lib/puppet/type/user.rb +118 -180
- data/lib/puppet/util.rb +100 -6
- data/test/certmgr/certmgr.rb +0 -1
- data/test/client/client.rb +4 -4
- data/test/executables/puppetbin.rb +7 -14
- data/test/executables/puppetca.rb +18 -24
- data/test/executables/puppetd.rb +7 -16
- data/test/executables/puppetmasterd.rb +7 -9
- data/test/executables/puppetmodule.rb +11 -16
- data/test/language/ast.rb +11 -7
- data/test/language/interpreter.rb +1 -1
- data/test/language/scope.rb +2 -0
- data/test/language/snippets.rb +30 -5
- data/test/language/transportable.rb +77 -0
- data/test/other/config.rb +316 -0
- data/test/other/events.rb +22 -21
- data/test/other/log.rb +14 -14
- data/test/other/metrics.rb +4 -8
- data/test/other/overrides.rb +5 -5
- data/test/other/relationships.rb +4 -2
- data/test/other/storage.rb +64 -3
- data/test/other/transactions.rb +20 -20
- data/test/parser/parser.rb +7 -4
- data/test/puppet/conffiles.rb +12 -12
- data/test/puppet/defaults.rb +13 -11
- data/test/puppet/utiltest.rb +14 -11
- data/test/puppettest.rb +156 -48
- data/test/server/bucket.rb +2 -2
- data/test/server/fileserver.rb +6 -6
- data/test/server/logger.rb +19 -11
- data/test/server/master.rb +33 -4
- data/test/server/server.rb +2 -7
- data/test/types/basic.rb +5 -7
- data/test/types/component.rb +22 -18
- data/test/types/cron.rb +111 -44
- data/test/types/exec.rb +116 -59
- data/test/types/file.rb +262 -137
- data/test/types/filebucket.rb +13 -15
- data/test/types/fileignoresource.rb +12 -16
- data/test/types/filesources.rb +73 -48
- data/test/types/filetype.rb +13 -15
- data/test/types/group.rb +15 -13
- data/test/types/host.rb +146 -0
- data/test/types/package.rb +74 -63
- data/test/types/port.rb +139 -0
- data/test/types/query.rb +8 -8
- data/test/types/schedule.rb +335 -0
- data/test/types/service.rb +137 -21
- data/test/types/sshkey.rb +140 -0
- data/test/types/symlink.rb +3 -5
- data/test/types/tidy.rb +5 -14
- data/test/types/type.rb +67 -11
- data/test/types/user.rb +25 -23
- metadata +186 -122
- data/lib/puppet/type/pfile/create.rb +0 -108
- data/lib/puppet/type/pprocess.rb +0 -97
- data/lib/puppet/type/typegen.rb +0 -149
- data/lib/puppet/type/typegen/filerecord.rb +0 -243
- data/lib/puppet/type/typegen/filetype.rb +0 -316
- data/test/other/state.rb +0 -106
data/lib/puppet/type/group.rb
CHANGED
@@ -12,18 +12,31 @@ require 'puppet/type/state'
|
|
12
12
|
require 'puppet/type/nameservice'
|
13
13
|
|
14
14
|
module Puppet
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
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
|
-
|
60
|
+
self.fail "Invalid GID %s" % gid
|
48
61
|
end
|
49
62
|
when Symbol
|
50
|
-
unless gid == :auto or gid == :
|
51
|
-
|
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
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
84
|
+
@netinfodir = "groups"
|
102
85
|
|
103
|
-
|
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
|
-
|
109
|
-
|
92
|
+
isnamevar
|
93
|
+
end
|
110
94
|
|
111
|
-
|
112
|
-
|
113
|
-
|
95
|
+
def exists?
|
96
|
+
self.class.parentmodule.exists?(self)
|
97
|
+
end
|
114
98
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
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
|
-
|
133
|
-
|
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
|
-
|
142
|
-
|
143
|
-
|
111
|
+
def initialize(hash)
|
112
|
+
@groupinfo = nil
|
113
|
+
super
|
114
|
+
end
|
144
115
|
|
145
|
-
|
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
|
135
|
+
# $Id: group.rb 841 2006-01-18 17:24:15Z luke $
|
@@ -1,3 +1,247 @@
|
|
1
|
-
require 'puppet/type
|
2
|
-
|
3
|
-
|
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
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
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 = :
|
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
|