puppet 0.22.4 → 0.23.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 +156 -0
- data/README +2 -2
- data/Rakefile +6 -6
- data/bin/filebucket +212 -0
- data/bin/puppet +2 -0
- data/bin/puppetca +2 -4
- data/bin/puppetd +16 -15
- data/bin/puppetdoc +46 -496
- data/bin/puppetmasterd +3 -5
- data/bin/puppetrun +8 -3
- data/bin/ralsh +271 -0
- data/conf/redhat/client.init +1 -1
- data/conf/redhat/puppet.spec +13 -2
- data/conf/solaris/pkginfo +1 -1
- data/ext/puppet-test +374 -0
- data/install.rb +40 -31
- data/lib/puppet.rb +39 -4
- data/lib/puppet/config_stores/rest.rb +60 -0
- data/lib/puppet/configuration.rb +312 -17
- data/lib/puppet/external/event-loop/event-loop.rb +4 -0
- data/lib/puppet/external/gratr/rdot.rb +1 -1
- data/lib/puppet/fact_stores/yaml.rb +42 -0
- data/lib/puppet/feature/base.rb +4 -1
- data/lib/puppet/metatype/attributes.rb +20 -43
- data/lib/puppet/metatype/container.rb +1 -36
- data/lib/puppet/metatype/evaluation.rb +48 -19
- data/lib/puppet/metatype/instances.rb +35 -1
- data/lib/puppet/metatype/metaparams.rb +23 -19
- data/lib/puppet/metatype/providers.rb +25 -38
- data/lib/puppet/network/client/ca.rb +8 -5
- data/lib/puppet/network/client/master.rb +59 -17
- data/lib/puppet/network/handler.rb +18 -1
- data/lib/puppet/network/handler/ca.rb +9 -3
- data/lib/puppet/network/handler/facts.rb +70 -0
- data/lib/puppet/network/handler/filebucket.rb +4 -1
- data/lib/puppet/network/handler/fileserver.rb +65 -21
- data/lib/puppet/network/handler/master.rb +6 -3
- data/lib/puppet/network/handler/report.rb +12 -26
- data/lib/puppet/network/handler/resource.rb +14 -2
- data/lib/puppet/network/handler/runner.rb +5 -1
- data/lib/puppet/network/handler/status.rb +5 -1
- data/lib/puppet/network/server/mongrel.rb +4 -4
- data/lib/puppet/network/server/webrick.rb +14 -3
- data/lib/puppet/parameter.rb +30 -25
- data/lib/puppet/parser/ast.rb +1 -6
- data/lib/puppet/parser/ast/component.rb +23 -20
- data/lib/puppet/parser/ast/hostclass.rb +7 -11
- data/lib/puppet/parser/ast/leaf.rb +4 -1
- data/lib/puppet/parser/ast/node.rb +6 -8
- data/lib/puppet/parser/functions.rb +7 -4
- data/lib/puppet/parser/interpreter.rb +155 -205
- data/lib/puppet/parser/lexer.rb +35 -2
- data/lib/puppet/parser/parser.rb +705 -612
- data/lib/puppet/parser/resource.rb +91 -48
- data/lib/puppet/parser/resource/param.rb +52 -29
- data/lib/puppet/parser/scope.rb +28 -23
- data/lib/puppet/pgraph.rb +26 -21
- data/lib/puppet/propertychange.rb +12 -12
- data/lib/puppet/provider.rb +102 -31
- data/lib/puppet/provider/cron/crontab.rb +7 -8
- data/lib/puppet/provider/group/groupadd.rb +4 -4
- data/lib/puppet/provider/group/pw.rb +3 -3
- data/lib/puppet/provider/mount.rb +8 -8
- data/lib/puppet/provider/mount/netinfo.rb +5 -5
- data/lib/puppet/provider/mount/parsed.rb +2 -2
- data/lib/puppet/provider/nameservice.rb +19 -31
- data/lib/puppet/provider/nameservice/netinfo.rb +14 -14
- data/lib/puppet/provider/nameservice/objectadd.rb +4 -4
- data/lib/puppet/provider/nameservice/pw.rb +4 -4
- data/lib/puppet/provider/package.rb +31 -0
- data/lib/puppet/provider/package/appdmg.rb +118 -0
- data/lib/puppet/provider/package/apple.rb +18 -16
- data/lib/puppet/provider/package/apt.rb +13 -15
- data/lib/puppet/provider/package/aptitude.rb +5 -3
- data/lib/puppet/provider/package/aptrpm.rb +9 -11
- data/lib/puppet/provider/package/blastwave.rb +9 -9
- data/lib/puppet/provider/package/darwinport.rb +12 -11
- data/lib/puppet/provider/package/dpkg.rb +20 -12
- data/lib/puppet/provider/package/fink.rb +87 -0
- data/lib/puppet/provider/package/freebsd.rb +10 -11
- data/lib/puppet/provider/package/gem.rb +15 -15
- data/lib/puppet/provider/package/openbsd.rb +12 -17
- data/lib/puppet/provider/package/pkgdmg.rb +90 -16
- data/lib/puppet/provider/package/portage.rb +20 -14
- data/lib/puppet/provider/package/ports.rb +15 -13
- data/lib/puppet/provider/package/rpm.rb +20 -23
- data/lib/puppet/provider/package/rug.rb +6 -8
- data/lib/puppet/provider/package/sun.rb +20 -18
- data/lib/puppet/provider/package/sunfreeware.rb +2 -2
- data/lib/puppet/provider/package/up2date.rb +6 -10
- data/lib/puppet/provider/package/urpmi.rb +51 -0
- data/lib/puppet/provider/package/yum.rb +15 -13
- data/lib/puppet/provider/parsedfile.rb +53 -63
- data/lib/puppet/provider/service/base.rb +13 -15
- data/lib/puppet/provider/service/debian.rb +4 -4
- data/lib/puppet/provider/service/gentoo.rb +4 -4
- data/lib/puppet/provider/service/init.rb +22 -15
- data/lib/puppet/provider/service/redhat.rb +6 -6
- data/lib/puppet/provider/service/smf.rb +6 -6
- data/lib/puppet/provider/user/netinfo.rb +5 -5
- data/lib/puppet/provider/user/pw.rb +10 -5
- data/lib/puppet/provider/user/useradd.rb +9 -14
- data/lib/puppet/provider/zone/solaris.rb +80 -45
- data/lib/puppet/rails.rb +3 -34
- data/lib/puppet/rails/database/schema.rb +45 -24
- data/lib/puppet/rails/fact_value.rb +1 -0
- data/lib/puppet/rails/host.rb +69 -40
- data/lib/puppet/rails/param_name.rb +3 -8
- data/lib/puppet/rails/param_value.rb +2 -1
- data/lib/puppet/rails/puppet_class.rb +0 -2
- data/lib/puppet/rails/puppet_tag.rb +5 -0
- data/lib/puppet/rails/resource.rb +41 -17
- data/lib/puppet/rails/resource_tag.rb +4 -0
- data/lib/puppet/reference/configuration.rb +149 -0
- data/lib/puppet/reference/function.rb +13 -0
- data/lib/puppet/reference/network.rb +37 -0
- data/lib/puppet/reference/providers.rb +118 -0
- data/lib/puppet/reference/report.rb +21 -0
- data/lib/puppet/reference/type.rb +152 -0
- data/lib/puppet/reports/rrdgraph.rb +21 -7
- data/lib/puppet/reports/tagmail.rb +4 -1
- data/lib/puppet/sslcertificates.rb +1 -49
- data/lib/puppet/sslcertificates/ca.rb +2 -79
- data/lib/puppet/sslcertificates/inventory.rb +0 -10
- data/lib/puppet/transaction.rb +24 -41
- data/lib/puppet/transaction/report.rb +27 -1
- data/lib/puppet/type.rb +7 -43
- data/lib/puppet/type/component.rb +198 -124
- data/lib/puppet/type/cron.rb +51 -42
- data/lib/puppet/type/exec.rb +20 -19
- data/lib/puppet/type/group.rb +6 -55
- data/lib/puppet/type/host.rb +16 -37
- data/lib/puppet/type/mount.rb +30 -17
- data/lib/puppet/type/notify.rb +7 -8
- data/lib/puppet/type/package.rb +44 -80
- data/lib/puppet/type/pfile.rb +50 -41
- data/lib/puppet/type/pfile/checksum.rb +82 -95
- data/lib/puppet/type/pfile/content.rb +21 -25
- data/lib/puppet/type/pfile/ensure.rb +32 -30
- data/lib/puppet/type/pfile/group.rb +21 -26
- data/lib/puppet/type/pfile/mode.rb +25 -32
- data/lib/puppet/type/pfile/owner.rb +23 -27
- data/lib/puppet/type/pfile/source.rb +42 -33
- data/lib/puppet/type/pfile/target.rb +20 -18
- data/lib/puppet/type/pfile/type.rb +6 -7
- data/lib/puppet/type/pfilebucket.rb +3 -3
- data/lib/puppet/type/port.rb +5 -7
- data/lib/puppet/type/property.rb +58 -61
- data/lib/puppet/type/resources.rb +12 -8
- data/lib/puppet/type/schedule.rb +8 -8
- data/lib/puppet/type/service.rb +26 -33
- data/lib/puppet/type/sshkey.rb +6 -7
- data/lib/puppet/type/tidy.rb +41 -35
- data/lib/puppet/type/user.rb +34 -67
- data/lib/puppet/type/yumrepo.rb +27 -12
- data/lib/puppet/type/zone.rb +71 -110
- data/lib/puppet/util.rb +46 -61
- data/lib/puppet/util/autoload.rb +59 -47
- data/lib/puppet/util/config.rb +160 -18
- data/lib/puppet/util/config_store.rb +61 -0
- data/lib/puppet/util/fact_store.rb +60 -0
- data/lib/puppet/util/instance_loader.rb +74 -0
- data/lib/puppet/util/loadedfile.rb +5 -8
- data/lib/puppet/util/metric.rb +17 -25
- data/lib/puppet/util/posix.rb +39 -7
- data/lib/puppet/util/provider_features.rb +9 -1
- data/lib/puppet/util/rails/collection_merger.rb +16 -1
- data/lib/puppet/util/reference.rb +189 -0
- data/lib/puppet/util/storage.rb +2 -2
- data/lib/puppet/util/subclass_loader.rb +9 -2
- data/test/language/ast.rb +4 -148
- data/test/language/ast/component.rb +10 -1
- data/test/language/collector.rb +1 -191
- data/test/language/interpreter.rb +284 -327
- data/test/language/lexer.rb +13 -1
- data/test/language/node.rb +1 -1
- data/test/language/parser.rb +17 -4
- data/test/language/resource.rb +67 -101
- data/test/language/scope.rb +18 -3
- data/test/language/snippets.rb +114 -151
- data/test/lib/puppettest.rb +13 -0
- data/test/lib/puppettest/exetest.rb +7 -0
- data/test/lib/puppettest/fakes.rb +39 -28
- data/test/lib/puppettest/railstesting.rb +1 -1
- data/test/lib/puppettest/support/assertions.rb +2 -2
- data/test/lib/puppettest/support/collection.rb +30 -0
- data/test/network/client/ca.rb +27 -1
- data/test/network/client/client.rb +3 -3
- data/test/network/client/master.rb +102 -1
- data/test/network/handler/ca.rb +35 -1
- data/test/network/handler/facts.rb +112 -0
- data/test/network/handler/fileserver.rb +25 -1
- data/test/network/handler/handler.rb +2 -2
- data/test/network/handler/master.rb +2 -49
- data/test/network/handler/resource.rb +5 -6
- data/test/network/server/mongrel_test.rb +65 -0
- data/test/network/server/webrick.rb +2 -2
- data/test/network/xmlrpc/client.rb +2 -1
- data/test/network/xmlrpc/processor.rb +2 -1
- data/test/other/pgraph.rb +6 -5
- data/test/other/propertychange.rb +11 -12
- data/test/other/report.rb +44 -27
- data/test/other/transactions.rb +17 -16
- data/test/puppet/tc_suidmanager.rb +2 -2
- data/test/rails/ast.rb +74 -0
- data/test/rails/collection.rb +214 -0
- data/test/rails/host.rb +49 -24
- data/test/rails/interpreter.rb +91 -0
- data/test/rails/railsparameter.rb +22 -11
- data/test/rails/railsresource.rb +140 -7
- data/test/ral/manager/attributes.rb +37 -13
- data/test/ral/manager/instances.rb +82 -0
- data/test/ral/manager/provider.rb +60 -22
- data/test/ral/manager/type.rb +9 -6
- data/test/ral/providers/cron/crontab.rb +59 -7
- data/test/ral/providers/group.rb +7 -7
- data/test/ral/providers/host/netinfo.rb +5 -6
- data/test/ral/providers/host/parsed.rb +4 -4
- data/test/ral/providers/mount/parsed.rb +11 -6
- data/test/ral/providers/nameservice.rb +2 -2
- data/test/ral/providers/package.rb +39 -14
- data/test/ral/providers/package/apt.rb +72 -3
- data/test/ral/providers/package/aptitude.rb +15 -12
- data/test/ral/providers/package/aptrpm.rb +3 -3
- data/test/ral/providers/package/dpkg.rb +2 -2
- data/test/ral/providers/parsedfile.rb +114 -88
- data/test/ral/providers/{parsedport.rb → port/parsed.rb} +1 -1
- data/test/ral/providers/provider.rb +93 -13
- data/test/ral/providers/service.rb +52 -26
- data/test/ral/providers/sshkey/parsed.rb +3 -3
- data/test/ral/providers/user.rb +19 -20
- data/test/ral/providers/user/useradd.rb +1 -5
- data/test/ral/types/cron.rb +49 -36
- data/test/ral/types/file.rb +38 -35
- data/test/ral/types/file/target.rb +4 -4
- data/test/ral/types/filesources.rb +24 -22
- data/test/ral/types/group.rb +4 -2
- data/test/ral/types/host.rb +17 -10
- data/test/ral/types/mount.rb +40 -23
- data/test/ral/types/package.rb +62 -5
- data/test/ral/types/parameter.rb +2 -2
- data/test/ral/types/property.rb +27 -20
- data/test/ral/types/resources.rb +4 -16
- data/test/ral/types/schedule.rb +2 -2
- data/test/ral/types/service.rb +2 -3
- data/test/ral/types/sshkey.rb +3 -3
- data/test/ral/types/tidy.rb +6 -15
- data/test/ral/types/user.rb +17 -17
- data/test/ral/types/yumrepo.rb +2 -2
- data/test/ral/types/zone.rb +71 -87
- data/test/util/autoload.rb +6 -21
- data/test/util/config.rb +201 -101
- data/test/util/fact_store.rb +67 -0
- data/test/util/features.rb +9 -6
- data/test/util/instance_loader.rb +53 -0
- data/test/util/loadedfile.rb +17 -1
- data/test/util/metrics.rb +54 -57
- data/test/util/posixtest.rb +8 -11
- data/test/util/utiltest.rb +31 -2
- metadata +520 -492
- data/TODO +0 -4
- data/lib/puppet/network/client/logger.rb +0 -6
- data/lib/puppet/network/handler/logger.rb +0 -52
- data/lib/puppet/rails/database/001_add_indexes.rb +0 -38
- data/lib/puppet/type/parsedtype.rb +0 -219
- data/test/network/handler/logger.rb +0 -183
@@ -4,35 +4,30 @@ Puppet::Type.type(:zone).provide(:solaris) do
|
|
4
4
|
commands :adm => "/usr/sbin/zoneadm", :cfg => "/usr/sbin/zonecfg"
|
5
5
|
defaultfor :operatingsystem => :solaris
|
6
6
|
|
7
|
+
mk_resource_methods
|
8
|
+
|
7
9
|
# Convert the output of a list into a hash
|
8
10
|
def self.line2hash(line)
|
9
11
|
fields = [:id, :name, :ensure, :path]
|
10
12
|
|
11
|
-
|
13
|
+
properties = {}
|
12
14
|
line.split(":").each_with_index { |value, index|
|
13
|
-
|
15
|
+
properties[fields[index]] = value
|
14
16
|
}
|
15
17
|
|
16
18
|
# Configured but not installed zones do not have IDs
|
17
|
-
if
|
18
|
-
|
19
|
+
if properties[:id] == "-"
|
20
|
+
properties.delete(:id)
|
19
21
|
end
|
20
22
|
|
21
|
-
|
23
|
+
properties[:ensure] = symbolize(properties[:ensure])
|
24
|
+
|
25
|
+
return properties
|
22
26
|
end
|
23
27
|
|
24
|
-
def self.
|
28
|
+
def self.instances
|
25
29
|
adm(:list, "-cp").split("\n").collect do |line|
|
26
|
-
|
27
|
-
|
28
|
-
obj = nil
|
29
|
-
unless obj = @model[hash[:name]]
|
30
|
-
obj = @model.create(:name => hash[:name])
|
31
|
-
end
|
32
|
-
|
33
|
-
obj.setstatus(hash)
|
34
|
-
|
35
|
-
obj
|
30
|
+
new(line2hash(line))
|
36
31
|
end
|
37
32
|
end
|
38
33
|
|
@@ -41,12 +36,12 @@ Puppet::Type.type(:zone).provide(:solaris) do
|
|
41
36
|
# If the thing is entirely absent, then we need to create the config.
|
42
37
|
str = %{create -b
|
43
38
|
set zonepath=%s
|
44
|
-
} % @
|
39
|
+
} % @resource[:path]
|
45
40
|
|
46
41
|
# Then perform all of our configuration steps. It's annoying
|
47
|
-
# that we need this much internal info on the
|
48
|
-
@
|
49
|
-
if property.is_a? ZoneConfigProperty and ! property.insync?
|
42
|
+
# that we need this much internal info on the resource.
|
43
|
+
@resource.send(:properties).each do |property|
|
44
|
+
if property.is_a? ZoneConfigProperty and ! property.insync?(properties[property.name])
|
50
45
|
str += property.configtext + "\n"
|
51
46
|
end
|
52
47
|
end
|
@@ -59,14 +54,39 @@ set zonepath=%s
|
|
59
54
|
zonecfg :delete, "-F"
|
60
55
|
end
|
61
56
|
|
57
|
+
def exists?
|
58
|
+
properties[:ensure] != :absent
|
59
|
+
end
|
60
|
+
|
61
|
+
# Clear out the cached values.
|
62
|
+
def flush
|
63
|
+
@property_hash.clear
|
64
|
+
end
|
65
|
+
|
62
66
|
def install
|
63
67
|
zoneadm :install
|
64
68
|
end
|
65
69
|
|
70
|
+
# Look up the current status.
|
71
|
+
def properties
|
72
|
+
if @property_hash.empty?
|
73
|
+
@property_hash = status || {}
|
74
|
+
if @property_hash.empty?
|
75
|
+
@property_hash[:ensure] = :absent
|
76
|
+
else
|
77
|
+
@resource.class.validproperties.each do |name|
|
78
|
+
@property_hash[name] ||= :absent
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
@property_hash.dup
|
84
|
+
end
|
85
|
+
|
66
86
|
# We need a way to test whether a zone is in process. Our 'ensure'
|
67
87
|
# property models the static states, but we need to handle the temporary ones.
|
68
88
|
def processing?
|
69
|
-
if hash =
|
89
|
+
if hash = status()
|
70
90
|
case hash[:ensure]
|
71
91
|
when "incomplete", "ready", "shutting_down"
|
72
92
|
true
|
@@ -92,7 +112,6 @@ set zonepath=%s
|
|
92
112
|
current = nil # reset it
|
93
113
|
when /^(\S+):\s*(.+)$/:
|
94
114
|
hash[$1.intern] = $2
|
95
|
-
#self.is = [$1.intern, $2]
|
96
115
|
when /^\s+(\S+):\s*(.+)$/:
|
97
116
|
if name
|
98
117
|
unless hash.include? name
|
@@ -111,27 +130,15 @@ set zonepath=%s
|
|
111
130
|
debug "Ignoring zone output '%s'" % line
|
112
131
|
end
|
113
132
|
end
|
114
|
-
return hash
|
115
|
-
end
|
116
133
|
|
117
|
-
|
118
|
-
if hash = statushash()
|
119
|
-
setstatus(hash)
|
120
|
-
|
121
|
-
# Now retrieve the configuration itself and set appropriately.
|
122
|
-
getconfig()
|
123
|
-
else
|
124
|
-
@properties.each do |name, property|
|
125
|
-
property.is = :absent
|
126
|
-
end
|
127
|
-
end
|
134
|
+
return hash
|
128
135
|
end
|
129
136
|
|
130
137
|
# Execute a configuration string. Can't be private because it's called
|
131
138
|
# by the properties.
|
132
139
|
def setconfig(str)
|
133
|
-
command = "#{command(:cfg)} -z %s -f -" % @
|
134
|
-
debug "Executing '%s' in zone %s with '%s'" % [command, @
|
140
|
+
command = "#{command(:cfg)} -z %s -f -" % @resource[:name]
|
141
|
+
debug "Executing '%s' in zone %s with '%s'" % [command, @resource[:name], str]
|
135
142
|
IO.popen(command, "w") do |pipe|
|
136
143
|
pipe.puts str
|
137
144
|
end
|
@@ -143,8 +150,8 @@ set zonepath=%s
|
|
143
150
|
|
144
151
|
def start
|
145
152
|
# Check the sysidcfg stuff
|
146
|
-
if cfg = @
|
147
|
-
path = File.join(@
|
153
|
+
if cfg = @resource[:sysidcfg]
|
154
|
+
path = File.join(@resource[:path], "root", "etc", "sysidcfg")
|
148
155
|
|
149
156
|
unless File.exists?(path)
|
150
157
|
begin
|
@@ -164,14 +171,21 @@ set zonepath=%s
|
|
164
171
|
end
|
165
172
|
|
166
173
|
# Return a hash of the current status of this zone.
|
167
|
-
def
|
174
|
+
def status
|
168
175
|
begin
|
169
|
-
output = adm "-z", @
|
176
|
+
output = adm "-z", @resource[:name], :list, "-p"
|
170
177
|
rescue Puppet::ExecutionFailure
|
171
178
|
return nil
|
172
179
|
end
|
173
180
|
|
174
|
-
|
181
|
+
main = self.class.line2hash(output.chomp)
|
182
|
+
|
183
|
+
# Now add in the configuration information
|
184
|
+
config_status.each do |name, value|
|
185
|
+
main[name] = value
|
186
|
+
end
|
187
|
+
|
188
|
+
main
|
175
189
|
end
|
176
190
|
|
177
191
|
def stop
|
@@ -188,21 +202,42 @@ set zonepath=%s
|
|
188
202
|
|
189
203
|
private
|
190
204
|
|
205
|
+
# Turn the results of getconfig into status information.
|
206
|
+
def config_status
|
207
|
+
config = getconfig()
|
208
|
+
result = {}
|
209
|
+
|
210
|
+
result[:autoboot] = config[:autoboot] ? config[:autoboot].intern : :absent
|
211
|
+
result[:pool] = config[:pool]
|
212
|
+
result[:shares] = config[:shares]
|
213
|
+
if dir = config["inherit-pkg-dir"]
|
214
|
+
result[:inherit] = dir.collect { |dirs| dirs[:dir] }
|
215
|
+
end
|
216
|
+
if net = config["net"]
|
217
|
+
result[:ip] = net.collect { |params| "%s:%s" % [params[:physical], params[:address]] }
|
218
|
+
end
|
219
|
+
|
220
|
+
result
|
221
|
+
end
|
222
|
+
|
191
223
|
def zoneadm(*cmd)
|
192
224
|
begin
|
193
|
-
adm("-z", @
|
225
|
+
adm("-z", @resource[:name], *cmd)
|
194
226
|
rescue Puppet::ExecutionFailure => detail
|
195
227
|
self.fail "Could not %s zone: %s" % [cmd[0], detail]
|
196
228
|
end
|
197
229
|
end
|
198
230
|
|
199
231
|
def zonecfg(*cmd)
|
232
|
+
# You apparently can't get the configuration of the global zone
|
233
|
+
return "" if self.name == "global"
|
234
|
+
|
200
235
|
begin
|
201
|
-
cfg("-z",
|
236
|
+
cfg("-z", self.name, *cmd)
|
202
237
|
rescue Puppet::ExecutionFailure => detail
|
203
238
|
self.fail "Could not %s zone: %s" % [cmd[0], detail]
|
204
239
|
end
|
205
240
|
end
|
206
241
|
end
|
207
242
|
|
208
|
-
# $Id: solaris.rb
|
243
|
+
# $Id: solaris.rb 2577 2007-06-14 03:39:23Z luke $
|
data/lib/puppet/rails.rb
CHANGED
@@ -4,36 +4,12 @@ require 'facter'
|
|
4
4
|
require 'puppet'
|
5
5
|
|
6
6
|
module Puppet::Rails
|
7
|
-
Puppet.config.setdefaults(:puppetmaster,
|
8
|
-
:dblocation => { :default => "$statedir/clientconfigs.sqlite3",
|
9
|
-
:mode => 0660,
|
10
|
-
:owner => "$user",
|
11
|
-
:group => "$group",
|
12
|
-
:desc => "The database cache for client configurations. Used for
|
13
|
-
querying within the language."
|
14
|
-
},
|
15
|
-
:dbadapter => [ "sqlite3", "The type of database to use." ],
|
16
|
-
:dbmigrate => [ false, "Whether to automatically migrate the database." ],
|
17
|
-
:dbname => [ "puppet", "The name of the database to use." ],
|
18
|
-
:dbserver => [ "localhost", "The database server for Client caching. Only
|
19
|
-
used when networked databases are used."],
|
20
|
-
:dbuser => [ "puppet", "The database user for Client caching. Only
|
21
|
-
used when networked databases are used."],
|
22
|
-
:dbpassword => [ "puppet", "The database password for Client caching. Only
|
23
|
-
used when networked databases are used."],
|
24
|
-
:railslog => {:default => "$logdir/rails.log",
|
25
|
-
:mode => 0600,
|
26
|
-
:owner => "$user",
|
27
|
-
:group => "$group",
|
28
|
-
:desc => "Where Rails-specific logs are sent"
|
29
|
-
}
|
30
|
-
)
|
31
7
|
|
32
8
|
def self.connect
|
33
9
|
# This global init does not work for testing, because we remove
|
34
10
|
# the state dir on every test.
|
35
11
|
unless ActiveRecord::Base.connected?
|
36
|
-
Puppet.config.use(:
|
12
|
+
Puppet.config.use(:main, :rails, :puppetmasterd)
|
37
13
|
|
38
14
|
ActiveRecord::Base.logger = Logger.new(Puppet[:railslog])
|
39
15
|
ActiveRecord::Base.allow_concurrency = true
|
@@ -85,13 +61,6 @@ module Puppet::Rails
|
|
85
61
|
if Puppet[:dbmigrate]
|
86
62
|
migrate()
|
87
63
|
end
|
88
|
-
|
89
|
-
# For now, we have to use :puppet, too, since non-puppetmasterd processes
|
90
|
-
# (including testing) put the logdir in :puppet, not in :puppetmasterd.
|
91
|
-
Puppet.config.use(:puppetmaster, :puppet)
|
92
|
-
|
93
|
-
# This has to come after we create the logdir with the :use above.
|
94
|
-
ActiveRecord::Base.logger = Logger.new(Puppet[:railslog])
|
95
64
|
end
|
96
65
|
|
97
66
|
# Migrate to the latest db schema.
|
@@ -127,7 +96,7 @@ module Puppet::Rails
|
|
127
96
|
raise Puppet::DevError, "No activerecord, cannot init Puppet::Rails"
|
128
97
|
end
|
129
98
|
|
130
|
-
Puppet.config.use(:
|
99
|
+
Puppet.config.use(:puppetmasterd, :rails)
|
131
100
|
|
132
101
|
begin
|
133
102
|
ActiveRecord::Base.establish_connection(database_arguments())
|
@@ -148,4 +117,4 @@ if Puppet.features.rails?
|
|
148
117
|
require 'puppet/rails/host'
|
149
118
|
end
|
150
119
|
|
151
|
-
# $Id: rails.rb
|
120
|
+
# $Id: rails.rb 2609 2007-06-18 18:46:00Z luke $
|
@@ -7,7 +7,7 @@ class Puppet::Rails::Schema
|
|
7
7
|
$stdout = File.open("/dev/null", "w")
|
8
8
|
ActiveRecord::Schema.define do
|
9
9
|
create_table :resources do |t|
|
10
|
-
t.column :title, :
|
10
|
+
t.column :title, :text, :null => false
|
11
11
|
t.column :restype, :string, :null => false
|
12
12
|
t.column :host_id, :integer
|
13
13
|
t.column :source_file_id, :integer
|
@@ -15,19 +15,40 @@ class Puppet::Rails::Schema
|
|
15
15
|
t.column :line, :integer
|
16
16
|
t.column :updated_at, :datetime
|
17
17
|
end
|
18
|
+
add_index :resources, :id, :integer => true
|
19
|
+
add_index :resources, :host_id, :integer => true
|
20
|
+
add_index :resources, :source_file_id, :integer => true
|
21
|
+
|
22
|
+
# Thanks, mysql! MySQL requires a length on indexes in text fields.
|
23
|
+
# So, we provide them for mysql and handle everything else specially.
|
24
|
+
if Puppet[:dbadapter] == "mysql"
|
25
|
+
execute "CREATE INDEX typentitle ON resources (restype,title(50));"
|
26
|
+
else
|
27
|
+
add_index :resources, [:title, :restype]
|
28
|
+
end
|
18
29
|
|
19
30
|
create_table :source_files do |t|
|
20
31
|
t.column :filename, :string
|
21
32
|
t.column :path, :string
|
22
33
|
t.column :updated_at, :datetime
|
23
34
|
end
|
35
|
+
add_index :source_files, :id, :integer => true
|
36
|
+
add_index :source_files, :filename
|
37
|
+
|
38
|
+
create_table :resource_tags do |t|
|
39
|
+
t.column :resource_id, :integer
|
40
|
+
t.column :puppet_tag_id, :integer
|
41
|
+
t.column :updated_at, :datetime
|
42
|
+
end
|
43
|
+
add_index :resource_tags, :id, :integer => true
|
44
|
+
add_index :resource_tags, :resource_id, :integer => true
|
45
|
+
add_index :resource_tags, :puppet_tag_id, :integer => true
|
24
46
|
|
25
|
-
create_table :
|
47
|
+
create_table :puppet_tags do |t|
|
26
48
|
t.column :name, :string
|
27
|
-
t.column :host_id, :integer
|
28
|
-
t.column :source_file_id, :integer
|
29
49
|
t.column :updated_at, :datetime
|
30
50
|
end
|
51
|
+
add_index :puppet_tags, :id, :integer => true
|
31
52
|
|
32
53
|
create_table :hosts do |t|
|
33
54
|
t.column :name, :string, :null => false
|
@@ -39,51 +60,51 @@ class Puppet::Rails::Schema
|
|
39
60
|
t.column :updated_at, :datetime
|
40
61
|
t.column :source_file_id, :integer
|
41
62
|
end
|
63
|
+
add_index :hosts, :id, :integer => true
|
64
|
+
add_index :hosts, :source_file_id, :integer => true
|
65
|
+
add_index :hosts, :name
|
42
66
|
|
43
67
|
create_table :fact_names do |t|
|
44
68
|
t.column :name, :string, :null => false
|
45
|
-
t.column :host_id, :integer, :null => false
|
46
69
|
t.column :updated_at, :datetime
|
47
70
|
end
|
71
|
+
add_index :fact_names, :id, :integer => true
|
72
|
+
add_index :fact_names, :name
|
48
73
|
|
49
74
|
create_table :fact_values do |t|
|
50
75
|
t.column :value, :text, :null => false
|
51
76
|
t.column :fact_name_id, :integer, :null => false
|
77
|
+
t.column :host_id, :integer, :null => false
|
52
78
|
t.column :updated_at, :datetime
|
53
79
|
end
|
80
|
+
add_index :fact_values, :id, :integer => true
|
81
|
+
add_index :fact_values, :fact_name_id, :integer => true
|
82
|
+
add_index :fact_values, :host_id, :integer => true
|
54
83
|
|
55
84
|
create_table :param_values do |t|
|
56
85
|
t.column :value, :text, :null => false
|
57
86
|
t.column :param_name_id, :integer, :null => false
|
87
|
+
t.column :line, :integer
|
88
|
+
t.column :resource_id, :integer
|
58
89
|
t.column :updated_at, :datetime
|
59
90
|
end
|
91
|
+
add_index :param_values, :id, :integer => true
|
92
|
+
add_index :param_values, :param_name_id, :integer => true
|
93
|
+
add_index :param_values, :resource_id, :integer => true
|
60
94
|
|
61
95
|
create_table :param_names do |t|
|
62
96
|
t.column :name, :string, :null => false
|
63
|
-
t.column :resource_id, :integer
|
64
|
-
t.column :line, :integer
|
65
97
|
t.column :updated_at, :datetime
|
66
98
|
end
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
t.column :updated_at, :datetime
|
71
|
-
end
|
72
|
-
|
73
|
-
create_table :taggings do |t|
|
74
|
-
t.column :tag_id, :integer
|
75
|
-
t.column :taggable_id, :integer
|
76
|
-
t.column :taggable_type, :string
|
77
|
-
t.column :updated_at, :datetime
|
78
|
-
end
|
79
|
-
end
|
80
|
-
$stdout.close
|
81
|
-
$stdout = oldout
|
82
|
-
oldout = nil
|
99
|
+
add_index :param_names, :id, :integer => true
|
100
|
+
add_index :param_names, :name
|
101
|
+
end
|
83
102
|
end
|
84
103
|
ensure
|
104
|
+
$stdout.close
|
85
105
|
$stdout = oldout if oldout
|
106
|
+
oldout = nil
|
86
107
|
end
|
87
108
|
end
|
88
109
|
|
89
|
-
# $Id: schema.rb
|
110
|
+
# $Id: schema.rb 2590 2007-06-15 19:30:20Z luke $
|
data/lib/puppet/rails/host.rb
CHANGED
@@ -9,16 +9,14 @@ class Puppet::Rails::Host < ActiveRecord::Base
|
|
9
9
|
include Puppet::Util
|
10
10
|
include Puppet::Util::CollectionMerger
|
11
11
|
|
12
|
-
has_many :fact_values, :
|
13
|
-
has_many :fact_names, :
|
12
|
+
has_many :fact_values, :dependent => :destroy
|
13
|
+
has_many :fact_names, :through => :fact_values
|
14
14
|
belongs_to :puppet_classes
|
15
15
|
has_many :source_files
|
16
16
|
has_many :resources,
|
17
|
-
:include =>
|
17
|
+
:include => :param_values,
|
18
18
|
:dependent => :destroy
|
19
19
|
|
20
|
-
acts_as_taggable
|
21
|
-
|
22
20
|
# If the host already exists, get rid of its objects
|
23
21
|
def self.clean(host)
|
24
22
|
if obj = self.find_by_name(host)
|
@@ -41,9 +39,7 @@ class Puppet::Rails::Host < ActiveRecord::Base
|
|
41
39
|
transaction do
|
42
40
|
#unless host = find_by_name(name)
|
43
41
|
seconds = Benchmark.realtime {
|
44
|
-
|
45
|
-
unless host = find_by_name(name, :include => {:fact_names => :fact_values})
|
46
|
-
#unless host = find_by_name(name)
|
42
|
+
unless host = find_by_name(name)
|
47
43
|
host = new(:name => name)
|
48
44
|
end
|
49
45
|
}
|
@@ -59,7 +55,6 @@ class Puppet::Rails::Host < ActiveRecord::Base
|
|
59
55
|
raise ArgumentError, "You must pass resources"
|
60
56
|
end
|
61
57
|
|
62
|
-
|
63
58
|
seconds = Benchmark.realtime {
|
64
59
|
host.setresources(hash[:resources])
|
65
60
|
}
|
@@ -73,54 +68,88 @@ class Puppet::Rails::Host < ActiveRecord::Base
|
|
73
68
|
return host
|
74
69
|
end
|
75
70
|
|
76
|
-
def tags=(tags)
|
77
|
-
tags.each do |tag|
|
78
|
-
self.tag_with tag
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
71
|
# Return the value of a fact.
|
83
72
|
def fact(name)
|
84
|
-
if fv = self.fact_values.find(:
|
85
|
-
|
73
|
+
if fv = self.fact_values.find(:all, :include => :fact_name,
|
74
|
+
:conditions => "fact_names.name = '#{name}'")
|
75
|
+
return fv
|
86
76
|
else
|
87
77
|
return nil
|
88
78
|
end
|
89
79
|
end
|
80
|
+
|
81
|
+
# returns a hash of fact_names.name => [ fact_values ] for this host.
|
82
|
+
def get_facts_hash
|
83
|
+
fact_values = self.fact_values.find(:all, :include => :fact_name)
|
84
|
+
return fact_values.inject({}) do | hash, value |
|
85
|
+
hash[value.fact_name.name] ||= []
|
86
|
+
hash[value.fact_name.name] << value
|
87
|
+
hash
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
90
91
|
|
91
92
|
def setfacts(facts)
|
92
93
|
facts = facts.dup
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
94
|
+
|
95
|
+
ar_hash_merge(get_facts_hash(), facts,
|
96
|
+
:create => Proc.new { |name, values|
|
97
|
+
fact_name = Puppet::Rails::FactName.find_or_create_by_name(name)
|
98
|
+
values = [values] unless values.is_a?(Array)
|
99
|
+
values.each do |value|
|
100
|
+
fact_values.build(:value => value,
|
101
|
+
:fact_name => fact_name)
|
102
|
+
end
|
103
|
+
}, :delete => Proc.new { |values|
|
104
|
+
values.each { |value| self.fact_values.delete(value) }
|
105
|
+
}, :modify => Proc.new { |db, mem|
|
106
|
+
mem = [mem].flatten
|
107
|
+
fact_name = db[0].fact_name
|
108
|
+
db_values = db.collect { |fact_value| fact_value.value }
|
109
|
+
(db_values - (db_values & mem)).each do |value|
|
110
|
+
db.find_all { |fact_value|
|
111
|
+
fact_value.value == value
|
112
|
+
}.each { |fact_value|
|
113
|
+
fact_values.delete(fact_value)
|
114
|
+
}
|
115
|
+
end
|
116
|
+
(mem - (db_values & mem)).each do |value|
|
117
|
+
fact_values.build(:value => value,
|
118
|
+
:fact_name => fact_name)
|
119
|
+
end
|
120
|
+
})
|
106
121
|
end
|
107
122
|
|
108
123
|
# Set our resources.
|
109
124
|
def setresources(list)
|
110
|
-
compiled = {}
|
111
|
-
remove = []
|
112
125
|
existing = nil
|
113
126
|
seconds = Benchmark.realtime {
|
114
|
-
|
115
|
-
|
116
|
-
#
|
127
|
+
|
128
|
+
# Preload the parameters with the resource query, but not the tags, since doing so makes the query take about 10x longer.
|
129
|
+
# I've left the other queries in so that it's straightforward to switch between them for testing, if we so desire.
|
130
|
+
#existing = resources.find(:all, :include => [{:param_values => :param_name, :resource_tags => :puppet_tag}, :source_file]).inject({}) do | hash, resource |
|
131
|
+
#existing = resources.find(:all, :include => [{:resource_tags => :puppet_tag}, :source_file]).inject({}) do | hash, resource |
|
132
|
+
existing = resources.find(:all, :include => [{:param_values => :param_name}, :source_file]).inject({}) do | hash, resource |
|
133
|
+
hash[resource.ref] = resource
|
134
|
+
hash
|
135
|
+
end
|
117
136
|
}
|
137
|
+
|
118
138
|
Puppet.notice("Searched for resources in %0.2f seconds" % seconds) if defined?(Puppet::TIME_DEBUG)
|
119
|
-
list.each do |resource|
|
120
|
-
compiled[resource.ref] = resource
|
121
|
-
end
|
122
139
|
|
123
|
-
|
140
|
+
compiled = list.inject({}) do |hash, resource|
|
141
|
+
hash[resource.ref] = resource
|
142
|
+
hash
|
143
|
+
end
|
144
|
+
|
145
|
+
ar_hash_merge(existing, compiled,
|
146
|
+
:create => Proc.new { |ref, resource|
|
147
|
+
resource.to_rails(self)
|
148
|
+
}, :delete => Proc.new { |resource|
|
149
|
+
self.resources.delete(resource)
|
150
|
+
}, :modify => Proc.new { |db, mem|
|
151
|
+
mem.modify_rails(db)
|
152
|
+
})
|
124
153
|
end
|
125
154
|
|
126
155
|
def update_connect_time
|
@@ -129,4 +158,4 @@ class Puppet::Rails::Host < ActiveRecord::Base
|
|
129
158
|
end
|
130
159
|
end
|
131
160
|
|
132
|
-
# $Id: host.rb
|
161
|
+
# $Id: host.rb 2616 2007-06-18 21:03:18Z luke $
|