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
@@ -0,0 +1,67 @@
|
|
1
|
+
module Puppet
|
2
|
+
Puppet.type(:file).newstate(:content) do
|
3
|
+
desc "Specify the contents of a file as a string. Newlines, tabs, and spaces
|
4
|
+
can be specified using the escaped syntax (e.g., \\n for a newline). The
|
5
|
+
primary purpose of this parameter is to provide a kind of limited
|
6
|
+
templating::
|
7
|
+
|
8
|
+
define resolve(nameserver1, nameserver2, domain, search) {
|
9
|
+
$str = \"search $search
|
10
|
+
domain $domain
|
11
|
+
nameserver $nameserver1
|
12
|
+
nameserver $nameserver2
|
13
|
+
\"
|
14
|
+
|
15
|
+
file { \"/etc/resolv.conf\":
|
16
|
+
content => $str
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
Yes, it's very primitive, and it's useless for larger files, but it
|
21
|
+
is mostly meant as a stopgap measure for simple cases."
|
22
|
+
|
23
|
+
def change_to_s
|
24
|
+
"synced"
|
25
|
+
end
|
26
|
+
|
27
|
+
# We should probably take advantage of existing md5 sums if they're there,
|
28
|
+
# but I really don't feel like dealing with the complexity right now.
|
29
|
+
def retrieve
|
30
|
+
unless FileTest.exists?(@parent.name)
|
31
|
+
@is = :absent
|
32
|
+
return
|
33
|
+
end
|
34
|
+
begin
|
35
|
+
@is = File.read(@parent.name)
|
36
|
+
rescue => detail
|
37
|
+
@is = nil
|
38
|
+
raise Puppet::Error, "Could not read %s: %s" %
|
39
|
+
[@parent.name, detail]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
# Just write our content out to disk.
|
45
|
+
def sync
|
46
|
+
begin
|
47
|
+
File.open(@parent.name, "w") { |f|
|
48
|
+
f.print self.should
|
49
|
+
f.flush
|
50
|
+
}
|
51
|
+
rescue => detail
|
52
|
+
raise Puppet::Error, "Could not write content to %s: %s" %
|
53
|
+
[@parent.name, detail]
|
54
|
+
end
|
55
|
+
|
56
|
+
@parent.setchecksum
|
57
|
+
|
58
|
+
if @is == :absent
|
59
|
+
return :file_created
|
60
|
+
else
|
61
|
+
return :file_changed
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# $Id: content.rb 883 2006-02-08 16:53:34Z luke $
|
@@ -0,0 +1,212 @@
|
|
1
|
+
module Puppet
|
2
|
+
Puppet.type(:file).ensurable do
|
3
|
+
require 'etc'
|
4
|
+
desc "Whether to create files that don't currently exist.
|
5
|
+
Possible values are *absent*, *present* (equivalent to *file*),
|
6
|
+
**file**/*directory*. Specifying 'absent' will delete the file,
|
7
|
+
although currently this will not recursively delete directories.
|
8
|
+
|
9
|
+
This is the only element with an *ensure* state that does not have
|
10
|
+
a default value."
|
11
|
+
|
12
|
+
# Most 'ensure' states have a default, but with files we, um, don't.
|
13
|
+
nodefault
|
14
|
+
|
15
|
+
#newvalue(:false) do
|
16
|
+
# # If they say "false" here, we just don't do anything at all; either
|
17
|
+
# # the file is there or it's not.
|
18
|
+
#end
|
19
|
+
|
20
|
+
newvalue(:absent) do
|
21
|
+
File.unlink(@parent.name)
|
22
|
+
end
|
23
|
+
|
24
|
+
aliasvalue(:false, :absent)
|
25
|
+
|
26
|
+
newvalue(:file) do
|
27
|
+
# Make sure we're not managing the content some other way
|
28
|
+
if state = @parent.state(:content) or state = @parent.state(:source)
|
29
|
+
state.sync
|
30
|
+
else
|
31
|
+
mode = @parent.should(:mode)
|
32
|
+
Puppet::Util.asuser(asuser(), @parent.should(:group)) {
|
33
|
+
f = nil
|
34
|
+
if mode
|
35
|
+
f = File.open(@parent[:path],"w", mode)
|
36
|
+
else
|
37
|
+
f = File.open(@parent[:path],"w")
|
38
|
+
end
|
39
|
+
|
40
|
+
f.flush
|
41
|
+
f.close
|
42
|
+
@parent.setchecksum
|
43
|
+
}
|
44
|
+
end
|
45
|
+
return :file_created
|
46
|
+
end
|
47
|
+
|
48
|
+
aliasvalue(:present, :file)
|
49
|
+
|
50
|
+
newvalue(:directory) do
|
51
|
+
mode = @parent.should(:mode)
|
52
|
+
Puppet::Util.asuser(asuser()) {
|
53
|
+
if mode
|
54
|
+
Dir.mkdir(@parent.name,mode)
|
55
|
+
else
|
56
|
+
Dir.mkdir(@parent.name)
|
57
|
+
end
|
58
|
+
}
|
59
|
+
@parent.setchecksum
|
60
|
+
return :directory_created
|
61
|
+
end
|
62
|
+
|
63
|
+
def asuser
|
64
|
+
if @parent.should(:owner) and ! @parent.should(:owner).is_a?(Symbol)
|
65
|
+
writeable = Puppet::Util.asuser(@parent.should(:owner)) {
|
66
|
+
FileTest.writable?(File.dirname(@parent[:path]))
|
67
|
+
}
|
68
|
+
|
69
|
+
# If the parent directory is writeable, then we execute
|
70
|
+
# as the user in question. Otherwise we'll rely on
|
71
|
+
# the 'owner' state to do things.
|
72
|
+
if writeable
|
73
|
+
asuser = @parent.should(:owner)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
return asuser
|
78
|
+
end
|
79
|
+
|
80
|
+
def check
|
81
|
+
basedir = File.dirname(@parent.name)
|
82
|
+
|
83
|
+
if ! FileTest.exists?(basedir)
|
84
|
+
raise Puppet::Error,
|
85
|
+
"Can not create %s; parent directory does not exist" %
|
86
|
+
@parent.name
|
87
|
+
elsif ! FileTest.directory?(basedir)
|
88
|
+
raise Puppet::Error,
|
89
|
+
"Can not create %s; %s is not a directory" %
|
90
|
+
[@parent.name, dirname]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def retrieve
|
95
|
+
if stat = @parent.stat(false)
|
96
|
+
@is = stat.ftype.intern
|
97
|
+
else
|
98
|
+
if self.should == :false
|
99
|
+
@is = :false
|
100
|
+
else
|
101
|
+
@is = :absent
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
#self.debug "'exists' state is %s" % self.is
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
# We can mostly rely on the superclass method, but we want other states
|
110
|
+
# to take precedence over 'ensure' if they are present.
|
111
|
+
# def sync
|
112
|
+
# # XXX This is a bad idea, because it almost guarantees bugs if we
|
113
|
+
# # introduce more states to manage content, but anything else is just
|
114
|
+
# # about as bad.
|
115
|
+
# event = nil
|
116
|
+
# #if state = @parent.state(:source) or state = @parent.state(:content)
|
117
|
+
# # event = state.sync
|
118
|
+
# #else
|
119
|
+
# event = super
|
120
|
+
# @parent.setchecksum
|
121
|
+
# #end
|
122
|
+
# return event
|
123
|
+
# end
|
124
|
+
|
125
|
+
def disabled_sync
|
126
|
+
event = nil
|
127
|
+
basedir = File.dirname(@parent.name)
|
128
|
+
|
129
|
+
if ! FileTest.exists?(basedir)
|
130
|
+
raise Puppet::Error,
|
131
|
+
"Can not create %s; parent directory does not exist" %
|
132
|
+
@parent.name
|
133
|
+
elsif ! FileTest.directory?(basedir)
|
134
|
+
raise Puppet::Error,
|
135
|
+
"Can not create %s; %s is not a directory" %
|
136
|
+
[@parent.name, dirname]
|
137
|
+
end
|
138
|
+
|
139
|
+
self.retrieve
|
140
|
+
if self.insync?
|
141
|
+
self.info "already in sync"
|
142
|
+
return nil
|
143
|
+
end
|
144
|
+
|
145
|
+
mode = @parent.should(:mode)
|
146
|
+
|
147
|
+
# First, determine if a user has been specified and if so if
|
148
|
+
# that user has write access to the parent dir
|
149
|
+
asuser = nil
|
150
|
+
if @parent.should(:owner) and ! @parent.should(:owner).is_a?(Symbol)
|
151
|
+
writeable = Puppet::Util.asuser(@parent.should(:owner)) {
|
152
|
+
FileTest.writable?(File.dirname(@parent[:path]))
|
153
|
+
}
|
154
|
+
|
155
|
+
# If the parent directory is writeable, then we execute
|
156
|
+
# as the user in question. Otherwise we'll rely on
|
157
|
+
# the 'owner' state to do things.
|
158
|
+
if writeable
|
159
|
+
asuser = @parent.should(:owner)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
begin
|
163
|
+
case self.should
|
164
|
+
when "file":
|
165
|
+
# just create an empty file
|
166
|
+
Puppet::Util.asuser(asuser, @parent.should(:group)) {
|
167
|
+
if mode
|
168
|
+
File.open(@parent[:path],"w", mode) {
|
169
|
+
}
|
170
|
+
else
|
171
|
+
File.open(@parent[:path],"w") {
|
172
|
+
}
|
173
|
+
end
|
174
|
+
}
|
175
|
+
event = :file_created
|
176
|
+
when "directory":
|
177
|
+
Puppet::Util.asuser(asuser) {
|
178
|
+
if mode
|
179
|
+
Dir.mkdir(@parent.name,mode)
|
180
|
+
else
|
181
|
+
Dir.mkdir(@parent.name)
|
182
|
+
end
|
183
|
+
}
|
184
|
+
event = :directory_created
|
185
|
+
when :absent:
|
186
|
+
# this is where the file should be deleted...
|
187
|
+
|
188
|
+
# This value is only valid when we're rolling back a creation,
|
189
|
+
# so we verify that the file has not been modified since then.
|
190
|
+
unless FileTest.size(@parent.name) == 0
|
191
|
+
raise Puppet::Error.new(
|
192
|
+
"Created file %s has since been modified; cannot roll back."
|
193
|
+
)
|
194
|
+
end
|
195
|
+
|
196
|
+
File.unlink(@parent.name)
|
197
|
+
else
|
198
|
+
error = Puppet::Error.new(
|
199
|
+
"Somehow got told to create a %s file" % self.should)
|
200
|
+
raise error
|
201
|
+
end
|
202
|
+
rescue => detail
|
203
|
+
raise Puppet::Error.new("Could not create %s: %s" %
|
204
|
+
[self.should, detail]
|
205
|
+
)
|
206
|
+
end
|
207
|
+
return event
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# $Id: ensure.rb 885 2006-02-08 17:44:44Z luke $
|
@@ -1,129 +1,130 @@
|
|
1
1
|
# Manage file group ownership.
|
2
2
|
module Puppet
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
rescue ArgumentError
|
15
|
-
return nil
|
16
|
-
end
|
17
|
-
if group.gid == ""
|
18
|
-
return nil
|
19
|
-
else
|
20
|
-
return group.name
|
21
|
-
end
|
3
|
+
Puppet.type(:file).newstate(:group) do
|
4
|
+
require 'etc'
|
5
|
+
desc "Which group should own the file. Argument can be either group
|
6
|
+
name or group ID."
|
7
|
+
@event = :file_changed
|
8
|
+
|
9
|
+
def id2name(id)
|
10
|
+
begin
|
11
|
+
group = Etc.getgrgid(id)
|
12
|
+
rescue ArgumentError
|
13
|
+
return nil
|
22
14
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
15
|
+
if group.gid == ""
|
16
|
+
return nil
|
17
|
+
else
|
18
|
+
return group.name
|
27
19
|
end
|
20
|
+
end
|
28
21
|
|
29
|
-
|
30
|
-
|
31
|
-
|
22
|
+
# We want to print names, not numbers
|
23
|
+
def is_to_s
|
24
|
+
id2name(@is) || @is
|
25
|
+
end
|
26
|
+
|
27
|
+
def should_to_s
|
28
|
+
id2name(self.should) || self.should
|
29
|
+
end
|
32
30
|
|
33
|
-
|
34
|
-
|
31
|
+
def retrieve
|
32
|
+
stat = @parent.stat(false)
|
35
33
|
|
34
|
+
if stat
|
36
35
|
self.is = stat.gid
|
36
|
+
else
|
37
|
+
self.is = :absent
|
37
38
|
end
|
39
|
+
end
|
38
40
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
if value.is_a?(Integer)
|
45
|
-
method = :getgrgid
|
46
|
-
else
|
47
|
-
method = :getgrnam
|
48
|
-
end
|
41
|
+
munge do |value|
|
42
|
+
method = nil
|
43
|
+
gid = nil
|
44
|
+
gname = nil
|
49
45
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# be the case any more
|
56
|
-
#os = Puppet::Fact["Operatingsystem"]
|
57
|
-
#case os
|
58
|
-
#when "Darwin":
|
59
|
-
# #gid = group.passwd
|
60
|
-
# gid = group.gid
|
61
|
-
#else
|
62
|
-
#end
|
63
|
-
|
64
|
-
gid = group.gid
|
65
|
-
gname = group.name
|
66
|
-
|
67
|
-
rescue ArgumentError => detail
|
68
|
-
raise Puppet::Error.new(
|
69
|
-
"Could not find group %s" % value)
|
70
|
-
rescue => detail
|
71
|
-
raise Puppet::Error.new(
|
72
|
-
"Could not find group %s: %s" % [self.should,detail])
|
73
|
-
end
|
74
|
-
if gid.nil?
|
75
|
-
raise Puppet::Error.new(
|
76
|
-
"Could not retrieve gid for %s" % @parent.name)
|
77
|
-
end
|
46
|
+
if value.is_a?(Integer)
|
47
|
+
method = :getgrgid
|
48
|
+
else
|
49
|
+
method = :getgrnam
|
50
|
+
end
|
78
51
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
52
|
+
begin
|
53
|
+
group = Etc.send(method,value)
|
54
|
+
|
55
|
+
# at one time, os x was putting the gid into the passwd
|
56
|
+
# field of the group struct, but that appears to not
|
57
|
+
# be the case any more
|
58
|
+
#os = Puppet::Fact["Operatingsystem"]
|
59
|
+
#case os
|
60
|
+
#when "Darwin":
|
61
|
+
# #gid = group.passwd
|
62
|
+
# gid = group.gid
|
63
|
+
#else
|
86
64
|
#end
|
87
65
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
66
|
+
gid = group.gid
|
67
|
+
gname = group.name
|
68
|
+
|
69
|
+
rescue ArgumentError => detail
|
70
|
+
raise Puppet::Error.new(
|
71
|
+
"Could not find group %s" % value)
|
72
|
+
rescue => detail
|
73
|
+
raise Puppet::Error.new(
|
74
|
+
"Could not find group %s: %s" % [self.should,detail])
|
75
|
+
end
|
76
|
+
if gid.nil?
|
77
|
+
raise Puppet::Error.new(
|
78
|
+
"Could not retrieve gid for %s" % @parent.name)
|
94
79
|
end
|
95
80
|
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
81
|
+
#unless Process.uid == 0
|
82
|
+
# groups = %x{groups}.chomp.split(/\s/)
|
83
|
+
# unless groups.include?(gname)
|
84
|
+
# self.notice "Cannot chgrp: not in group %s" % gname
|
85
|
+
# raise Puppet::Error.new(
|
86
|
+
# "Cannot chgrp: not in group %s" % gname)
|
87
|
+
# end
|
88
|
+
#end
|
89
|
+
|
90
|
+
if gid.nil?
|
91
|
+
raise Puppet::Error.new(
|
92
|
+
"Nil gid for %s" % @parent.name)
|
93
|
+
else
|
94
|
+
return gid
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Normal users will only be able to manage certain groups. Right now,
|
99
|
+
# we'll just let it fail, but we should probably set things up so
|
100
|
+
# that users get warned if they try to change to an unacceptable group.
|
101
|
+
def sync
|
102
|
+
if @is == :absent
|
103
|
+
@parent.stat(true)
|
104
|
+
self.retrieve
|
105
|
+
|
106
|
+
if @is == :absent
|
107
|
+
self.info "File '%s' does not exist; cannot chgrp" %
|
108
|
+
@parent[:path]
|
109
|
+
return nil
|
113
110
|
end
|
114
111
|
|
115
|
-
|
116
|
-
|
117
|
-
File.chown(nil,self.should,@parent[:path])
|
118
|
-
rescue => detail
|
119
|
-
error = Puppet::Error.new( "failed to chgrp %s to %s: %s" %
|
120
|
-
[@parent[:path], self.should, detail.message])
|
121
|
-
raise error
|
112
|
+
if self.insync?
|
113
|
+
return nil
|
122
114
|
end
|
123
|
-
return :inode_changed
|
124
115
|
end
|
116
|
+
|
117
|
+
begin
|
118
|
+
# set owner to nil so it's ignored
|
119
|
+
File.chown(nil,self.should,@parent[:path])
|
120
|
+
rescue => detail
|
121
|
+
error = Puppet::Error.new( "failed to chgrp %s to %s: %s" %
|
122
|
+
[@parent[:path], self.should, detail.message])
|
123
|
+
raise error
|
124
|
+
end
|
125
|
+
return :file_changed
|
125
126
|
end
|
126
127
|
end
|
127
128
|
end
|
128
129
|
|
129
|
-
# $Id: group.rb
|
130
|
+
# $Id: group.rb 862 2006-01-31 02:07:56Z luke $
|