puppet 0.18.4 → 0.22.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +288 -0
- data/README +2 -2
- data/Rakefile +78 -5
- data/bin/puppet +28 -36
- data/bin/puppetca +81 -38
- data/bin/puppetd +65 -62
- data/bin/puppetdoc +409 -140
- data/bin/puppetmasterd +59 -47
- data/bin/puppetrun +38 -23
- data/conf/freebsd/puppetd +26 -0
- data/conf/freebsd/puppetmasterd +26 -0
- data/conf/gentoo/conf.d/puppet +5 -0
- data/conf/gentoo/conf.d/puppetmaster +12 -0
- data/conf/gentoo/init.d/puppet +38 -0
- data/conf/gentoo/init.d/puppetmaster +50 -0
- data/conf/gentoo/puppet/fileserver.conf +12 -0
- data/conf/gentoo/puppet/puppetca.conf +29 -0
- data/conf/gentoo/puppet/puppetd.conf +29 -0
- data/conf/gentoo/puppet/puppetmasterd.conf +29 -0
- data/conf/redhat/client.init +10 -5
- data/conf/redhat/client.sysconfig +1 -1
- data/conf/redhat/fileserver.conf +2 -2
- data/conf/redhat/logrotate +1 -1
- data/conf/redhat/no-lockdir.patch +13 -0
- data/conf/redhat/puppet.spec +65 -8
- data/conf/redhat/puppetd.conf +0 -4
- data/conf/redhat/server.init +3 -6
- data/conf/solaris/pkginfo +1 -1
- data/conf/solaris/smf/svc-puppetd +2 -2
- data/conf/suse/client.init +142 -0
- data/conf/suse/puppet.spec +221 -0
- data/conf/suse/server.init +162 -0
- data/examples/code/mac_automount.pp +16 -0
- data/examples/root/bin/sleeper +3 -5
- data/examples/root/etc/init.d/sleeper +8 -2
- data/examples/root/etc/puppet/fileserver.conf +12 -2
- data/examples/root/etc/puppet/namespaceauth.conf +20 -0
- data/examples/root/etc/puppet/puppetd.conf +4 -0
- data/examples/root/etc/puppet/puppetmasterd.conf +6 -9
- data/examples/root/etc/puppet/tagmail.conf +1 -0
- data/ext/emacs/puppet-mode.el +46 -1
- data/ext/logcheck/puppet +15 -0
- data/ext/module_puppet +15 -23
- data/ext/vim/puppet.vim +4 -2
- data/install.rb +2 -1
- data/lib/puppet.rb +76 -207
- data/lib/puppet/configuration.rb +331 -0
- data/lib/puppet/daemon.rb +63 -246
- data/lib/puppet/dsl.rb +371 -0
- data/lib/puppet/element.rb +8 -26
- data/lib/puppet/error.rb +54 -0
- data/lib/puppet/event.rb +8 -243
- data/lib/puppet/{base64.rb → external/base64.rb} +0 -0
- data/lib/puppet/external/event-loop.rb +1 -0
- data/lib/puppet/{event-loop → external/event-loop}/better-definers.rb +0 -0
- data/lib/puppet/{event-loop → external/event-loop}/event-loop.rb +2 -2
- data/lib/puppet/{event-loop → external/event-loop}/signal-system.rb +1 -1
- data/lib/puppet/external/gratr.rb +33 -0
- data/lib/puppet/external/gratr/adjacency_graph.rb +257 -0
- data/lib/puppet/external/gratr/base.rb +34 -0
- data/lib/puppet/external/gratr/biconnected.rb +116 -0
- data/lib/puppet/external/gratr/chinese_postman.rb +123 -0
- data/lib/puppet/external/gratr/common.rb +73 -0
- data/lib/puppet/external/gratr/comparability.rb +92 -0
- data/lib/puppet/external/gratr/digraph.rb +116 -0
- data/lib/puppet/external/gratr/digraph_distance.rb +185 -0
- data/lib/puppet/external/gratr/dot.rb +90 -0
- data/lib/puppet/external/gratr/edge.rb +145 -0
- data/lib/puppet/external/gratr/graph.rb +303 -0
- data/lib/puppet/external/gratr/graph_api.rb +83 -0
- data/lib/puppet/external/gratr/import.rb +44 -0
- data/lib/puppet/external/gratr/labels.rb +90 -0
- data/lib/puppet/external/gratr/maximum_flow.rb +64 -0
- data/lib/puppet/external/gratr/rdot.rb +327 -0
- data/lib/puppet/external/gratr/search.rb +409 -0
- data/lib/puppet/external/gratr/strong_components.rb +127 -0
- data/lib/puppet/external/gratr/undirected_graph.rb +153 -0
- data/lib/puppet/{lock.rb → external/lock.rb} +1 -1
- data/lib/puppet/feature/base.rb +20 -0
- data/lib/puppet/feature/rails.rb +52 -0
- data/lib/puppet/metatype/attributes.rb +719 -0
- data/lib/puppet/metatype/closure.rb +111 -0
- data/lib/puppet/metatype/container.rb +94 -0
- data/lib/puppet/metatype/evaluation.rb +118 -0
- data/lib/puppet/metatype/instances.rb +261 -0
- data/lib/puppet/metatype/manager.rb +169 -0
- data/lib/puppet/metatype/metaparams.rb +409 -0
- data/lib/puppet/metatype/providers.rb +260 -0
- data/lib/puppet/metatype/relationships.rb +116 -0
- data/lib/puppet/metatype/schedules.rb +39 -0
- data/lib/puppet/metatype/tags.rb +39 -0
- data/lib/puppet/modules.rb +113 -0
- data/lib/puppet/network/authconfig.rb +168 -0
- data/lib/puppet/network/authorization.rb +84 -0
- data/lib/puppet/network/authstore.rb +293 -0
- data/lib/puppet/network/client.rb +187 -0
- data/lib/puppet/network/client/ca.rb +56 -0
- data/lib/puppet/network/client/dipper.rb +81 -0
- data/lib/puppet/network/client/file.rb +7 -0
- data/lib/puppet/network/client/logger.rb +6 -0
- data/lib/puppet/network/client/master.rb +644 -0
- data/lib/puppet/{client → network/client}/proxy.rb +3 -3
- data/lib/puppet/{client/reporter.rb → network/client/report.rb} +4 -7
- data/lib/puppet/{client/pelement.rb → network/client/resource.rb} +6 -19
- data/lib/puppet/network/client/runner.rb +13 -0
- data/lib/puppet/network/client/status.rb +5 -0
- data/lib/puppet/network/client_request.rb +32 -0
- data/lib/puppet/network/handler.rb +33 -0
- data/lib/puppet/{server → network/handler}/ca.rb +5 -6
- data/lib/puppet/network/handler/filebucket.rb +180 -0
- data/lib/puppet/{server → network/handler}/fileserver.rb +277 -219
- data/lib/puppet/{server → network/handler}/logger.rb +3 -5
- data/lib/puppet/{server → network/handler}/master.rb +42 -8
- data/lib/puppet/network/handler/report.rb +158 -0
- data/lib/puppet/network/handler/resource.rb +190 -0
- data/lib/puppet/{server → network/handler}/runner.rb +17 -18
- data/lib/puppet/network/handler/status.rb +13 -0
- data/lib/puppet/network/rights.rb +74 -0
- data/lib/puppet/network/server.rb +5 -0
- data/lib/puppet/network/server/mongrel.rb +138 -0
- data/lib/puppet/network/server/webrick.rb +153 -0
- data/lib/puppet/network/xmlrpc/client.rb +129 -0
- data/lib/puppet/network/xmlrpc/processor.rb +91 -0
- data/lib/puppet/network/xmlrpc/server.rb +20 -0
- data/lib/puppet/network/xmlrpc/webrick_servlet.rb +121 -0
- data/lib/puppet/parameter.rb +390 -346
- data/lib/puppet/parser/ast.rb +116 -147
- data/lib/puppet/parser/ast/astarray.rb +17 -33
- data/lib/puppet/parser/ast/branch.rb +2 -0
- data/lib/puppet/parser/ast/caseopt.rb +7 -12
- data/lib/puppet/parser/ast/casestatement.rb +23 -32
- data/lib/puppet/parser/ast/collection.rb +19 -80
- data/lib/puppet/parser/ast/collexpr.rb +81 -0
- data/lib/puppet/parser/ast/component.rb +160 -89
- data/lib/puppet/parser/ast/else.rb +30 -0
- data/lib/puppet/parser/ast/function.rb +9 -2
- data/lib/puppet/parser/ast/hostclass.rb +47 -131
- data/lib/puppet/parser/ast/ifstatement.rb +43 -0
- data/lib/puppet/parser/ast/leaf.rb +10 -21
- data/lib/puppet/parser/ast/node.rb +32 -79
- data/lib/puppet/parser/ast/resourcedef.rb +222 -0
- data/lib/puppet/parser/ast/{typedefaults.rb → resourcedefaults.rb} +10 -16
- data/lib/puppet/parser/ast/resourceoverride.rb +62 -0
- data/lib/puppet/parser/ast/{objectparam.rb → resourceparam.rb} +12 -6
- data/lib/puppet/parser/ast/resourceref.rb +44 -0
- data/lib/puppet/parser/ast/selector.rb +16 -8
- data/lib/puppet/parser/ast/tag.rb +3 -1
- data/lib/puppet/parser/ast/vardef.rb +8 -12
- data/lib/puppet/parser/collector.rb +181 -0
- data/lib/puppet/parser/functions.rb +191 -36
- data/lib/puppet/parser/interpreter.rb +802 -380
- data/lib/puppet/parser/lexer.rb +86 -19
- data/lib/puppet/parser/parser.rb +1123 -960
- data/lib/puppet/parser/resource.rb +353 -0
- data/lib/puppet/parser/resource/param.rb +57 -0
- data/lib/puppet/parser/resource/reference.rb +71 -0
- data/lib/puppet/parser/scope.rb +573 -1000
- data/lib/puppet/parser/templatewrapper.rb +54 -0
- data/lib/puppet/pgraph.rb +208 -0
- data/lib/puppet/propertychange.rb +143 -0
- data/lib/puppet/provider.rb +302 -0
- data/lib/puppet/provider/cron/crontab.rb +187 -0
- data/lib/puppet/provider/group/groupadd.rb +29 -0
- data/lib/puppet/provider/group/netinfo.rb +12 -0
- data/lib/puppet/provider/group/pw.rb +31 -0
- data/lib/puppet/provider/host/netinfo.rb +18 -0
- data/lib/puppet/provider/host/parsed.rb +73 -0
- data/lib/puppet/provider/mount.rb +57 -0
- data/lib/puppet/provider/mount/netinfo.rb +38 -0
- data/lib/puppet/provider/mount/parsed.rb +37 -0
- data/lib/puppet/provider/nameservice.rb +344 -0
- data/lib/puppet/provider/nameservice/netinfo.rb +210 -0
- data/lib/puppet/provider/nameservice/objectadd.rb +45 -0
- data/lib/puppet/provider/nameservice/pw.rb +22 -0
- data/lib/puppet/provider/package/apple.rb +53 -0
- data/lib/puppet/provider/package/apt.rb +119 -0
- data/lib/puppet/provider/package/aptitude.rb +30 -0
- data/lib/puppet/provider/package/aptrpm.rb +79 -0
- data/lib/puppet/provider/package/blastwave.rb +114 -0
- data/lib/puppet/provider/package/darwinport.rb +88 -0
- data/lib/puppet/provider/package/dpkg.rb +109 -0
- data/lib/puppet/provider/package/freebsd.rb +43 -0
- data/lib/puppet/provider/package/gem.rb +104 -0
- data/lib/puppet/provider/package/openbsd.rb +93 -0
- data/lib/puppet/provider/package/pkgdmg.rb +119 -0
- data/lib/puppet/provider/package/portage.rb +112 -0
- data/lib/puppet/provider/package/ports.rb +94 -0
- data/lib/puppet/provider/package/rpm.rb +125 -0
- data/lib/puppet/provider/package/rug.rb +53 -0
- data/lib/puppet/provider/package/sun.rb +168 -0
- data/lib/puppet/provider/package/sunfreeware.rb +9 -0
- data/lib/puppet/provider/package/up2date.rb +45 -0
- data/lib/puppet/provider/package/yum.rb +54 -0
- data/lib/puppet/provider/parsedfile.rb +342 -0
- data/lib/puppet/provider/port/parsed.rb +174 -0
- data/lib/puppet/provider/service/base.rb +136 -0
- data/lib/puppet/provider/service/debian.rb +32 -0
- data/lib/puppet/provider/service/gentoo.rb +49 -0
- data/lib/puppet/{type → provider}/service/init.rb +42 -40
- data/lib/puppet/provider/service/redhat.rb +59 -0
- data/lib/puppet/{type → provider}/service/smf.rb +24 -13
- data/lib/puppet/provider/sshkey/parsed.rb +36 -0
- data/lib/puppet/provider/user/netinfo.rb +106 -0
- data/lib/puppet/provider/user/pw.rb +41 -0
- data/lib/puppet/provider/user/useradd.rb +67 -0
- data/lib/puppet/provider/zone/solaris.rb +208 -0
- data/lib/puppet/rails.rb +102 -66
- data/lib/puppet/rails/database/001_add_indexes.rb +38 -0
- data/lib/puppet/rails/database/schema.rb +89 -0
- data/lib/puppet/rails/external/tagging/acts_as_taggable.rb +62 -0
- data/lib/puppet/rails/external/tagging/init.rb +5 -0
- data/lib/puppet/rails/external/tagging/tag.rb +50 -0
- data/lib/puppet/rails/external/tagging/tagging.rb +12 -0
- data/lib/puppet/rails/fact_name.rb +7 -0
- data/lib/puppet/rails/fact_value.rb +5 -0
- data/lib/puppet/rails/host.rb +95 -46
- data/lib/puppet/rails/param_name.rb +28 -0
- data/lib/puppet/rails/param_value.rb +5 -0
- data/lib/puppet/rails/puppet_class.rb +9 -0
- data/lib/puppet/rails/resource.rb +95 -0
- data/lib/puppet/rails/source_file.rb +5 -0
- data/lib/puppet/relationship.rb +63 -0
- data/lib/puppet/reports/log.rb +14 -0
- data/lib/puppet/reports/rrdgraph.rb +114 -10
- data/lib/puppet/reports/store.rb +64 -0
- data/lib/puppet/reports/tagmail.rb +144 -71
- data/lib/puppet/sslcertificates.rb +38 -5
- data/lib/puppet/sslcertificates/ca.rb +142 -37
- data/lib/puppet/sslcertificates/certificate.rb +3 -3
- data/lib/puppet/sslcertificates/inventory.rb +53 -0
- data/lib/puppet/sslcertificates/support.rb +128 -0
- data/lib/puppet/transaction.rb +568 -189
- data/lib/puppet/transaction/report.rb +14 -3
- data/lib/puppet/transportable.rb +18 -10
- data/lib/puppet/type.rb +279 -2299
- data/lib/puppet/type/component.rb +63 -63
- data/lib/puppet/type/cron.rb +294 -710
- data/lib/puppet/type/exec.rb +185 -129
- data/lib/puppet/type/group.rb +38 -89
- data/lib/puppet/type/host.rb +110 -0
- data/lib/puppet/type/mount.rb +189 -0
- data/lib/puppet/type/notify.rb +47 -0
- data/lib/puppet/type/package.rb +129 -257
- data/lib/puppet/type/parsedtype.rb +172 -297
- data/lib/puppet/type/pfile.rb +540 -319
- data/lib/puppet/type/pfile/checksum.rb +103 -76
- data/lib/puppet/type/pfile/content.rb +16 -10
- data/lib/puppet/type/pfile/ensure.rb +52 -34
- data/lib/puppet/type/pfile/group.rb +25 -18
- data/lib/puppet/type/pfile/mode.rb +7 -4
- data/lib/puppet/type/pfile/{uid.rb → owner.rb} +21 -17
- data/lib/puppet/type/pfile/source.rb +119 -124
- data/lib/puppet/type/pfile/target.rb +29 -45
- data/lib/puppet/type/pfile/type.rb +2 -2
- data/lib/puppet/type/pfilebucket.rb +18 -14
- data/lib/puppet/type/port.rb +121 -0
- data/lib/puppet/type/property.rb +530 -0
- data/lib/puppet/type/resources.rb +150 -0
- data/lib/puppet/type/schedule.rb +38 -22
- data/lib/puppet/type/service.rb +70 -326
- data/lib/puppet/type/sshkey.rb +76 -0
- data/lib/puppet/type/tidy.rb +197 -97
- data/lib/puppet/type/user.rb +107 -183
- data/lib/puppet/type/yumrepo.rb +53 -34
- data/lib/puppet/type/zone.rb +55 -208
- data/lib/puppet/util.rb +239 -201
- data/lib/puppet/util/autoload.rb +107 -0
- data/lib/puppet/util/classgen.rb +208 -0
- data/lib/puppet/{config.rb → util/config.rb} +102 -54
- data/lib/puppet/util/docs.rb +104 -0
- data/lib/puppet/util/errors.rb +55 -0
- data/lib/puppet/util/execution.rb +22 -0
- data/lib/puppet/util/feature.rb +76 -0
- data/lib/puppet/util/fileparsing.rb +380 -0
- data/lib/puppet/util/filetype.rb +300 -0
- data/lib/puppet/util/graph.rb +39 -0
- data/lib/puppet/util/inifile.rb +209 -0
- data/lib/puppet/util/loadedfile.rb +71 -0
- data/lib/puppet/util/log.rb +549 -0
- data/lib/puppet/util/logging.rb +20 -0
- data/lib/puppet/util/metaid.rb +22 -0
- data/lib/puppet/util/methodhelper.rb +37 -0
- data/lib/puppet/util/metric.rb +160 -0
- data/lib/puppet/util/package.rb +31 -0
- data/lib/puppet/util/pidlock.rb +68 -0
- data/lib/puppet/util/plist.rb +24 -0
- data/lib/puppet/util/plist/generator.rb +226 -0
- data/lib/puppet/util/plist/parser.rb +227 -0
- data/lib/puppet/util/posix.rb +87 -0
- data/lib/puppet/util/provider_features.rb +170 -0
- data/lib/puppet/util/rails/collection_merger.rb +42 -0
- data/lib/puppet/util/storage.rb +103 -0
- data/lib/puppet/util/subclass_loader.rb +83 -0
- data/lib/puppet/util/suidmanager.rb +86 -0
- data/lib/puppet/util/variables.rb +39 -0
- data/lib/puppet/util/warnings.rb +15 -0
- data/test/Rakefile +97 -0
- data/test/certmgr/ca.rb +81 -0
- data/test/certmgr/certmgr.rb +77 -50
- data/test/certmgr/inventory.rb +79 -0
- data/test/certmgr/support.rb +81 -0
- data/test/executables/filebucket.rb +49 -0
- data/test/executables/puppetbin.rb +28 -12
- data/test/executables/puppetca.rb +75 -54
- data/test/executables/puppetd.rb +10 -13
- data/test/executables/puppetmasterd.rb +12 -17
- data/test/executables/puppetmodule.rb +18 -17
- data/test/language/ast.rb +242 -798
- data/test/language/ast/casestatement.rb +104 -0
- data/test/language/ast/component.rb +133 -0
- data/test/language/ast/hostclass.rb +162 -0
- data/test/language/ast/selector.rb +62 -0
- data/test/language/ast/variable.rb +31 -0
- data/test/language/collector.rb +369 -0
- data/test/language/functions.rb +305 -18
- data/test/language/interpreter.rb +894 -125
- data/test/language/lexer.rb +98 -12
- data/test/language/node.rb +37 -53
- data/test/language/parser.rb +455 -148
- data/test/language/resource.rb +535 -0
- data/test/language/scope.rb +451 -561
- data/test/language/snippets.rb +101 -111
- data/test/language/transportable.rb +6 -8
- data/test/lib/mocha.rb +19 -0
- data/test/lib/mocha/any_instance_method.rb +35 -0
- data/test/lib/mocha/auto_verify.rb +113 -0
- data/test/lib/mocha/central.rb +35 -0
- data/test/lib/mocha/class_method.rb +62 -0
- data/test/lib/mocha/expectation.rb +295 -0
- data/test/lib/mocha/expectation_error.rb +6 -0
- data/test/lib/mocha/infinite_range.rb +27 -0
- data/test/lib/mocha/inspect.rb +37 -0
- data/test/lib/mocha/instance_method.rb +8 -0
- data/test/lib/mocha/metaclass.rb +7 -0
- data/test/lib/mocha/mock.rb +20 -0
- data/test/lib/mocha/mock_methods.rb +122 -0
- data/test/lib/mocha/object.rb +100 -0
- data/test/lib/mocha/pretty_parameters.rb +28 -0
- data/test/lib/mocha/setup_and_teardown.rb +23 -0
- data/test/lib/mocha/standalone.rb +30 -0
- data/test/lib/mocha/test_case_adapter.rb +49 -0
- data/test/lib/mocha_standalone.rb +2 -0
- data/test/lib/puppettest.rb +294 -0
- data/test/lib/puppettest/certificates.rb +61 -0
- data/test/lib/puppettest/exetest.rb +123 -0
- data/test/lib/puppettest/fakes.rb +194 -0
- data/test/lib/puppettest/fileparsing.rb +33 -0
- data/test/lib/puppettest/filetesting.rb +231 -0
- data/test/lib/puppettest/graph.rb +41 -0
- data/test/lib/puppettest/parsertesting.rb +392 -0
- data/test/lib/puppettest/railstesting.rb +56 -0
- data/test/lib/puppettest/reporttesting.rb +19 -0
- data/test/lib/puppettest/resourcetesting.rb +73 -0
- data/test/lib/puppettest/servertest.rb +72 -0
- data/test/lib/puppettest/support.rb +8 -0
- data/test/lib/puppettest/support/assertions.rb +101 -0
- data/test/lib/puppettest/support/helpers.rb +23 -0
- data/test/lib/puppettest/support/resources.rb +37 -0
- data/test/lib/puppettest/support/utils.rb +160 -0
- data/test/lib/puppettest/testcase.rb +48 -0
- data/test/lib/rake/puppet_test_loader.rb +17 -0
- data/test/lib/rake/puppet_testtask.rb +17 -0
- data/test/lib/spec.rb +8 -0
- data/test/lib/spec/callback.rb +11 -0
- data/test/lib/spec/callback/callback_container.rb +60 -0
- data/test/lib/spec/callback/extensions/module.rb +24 -0
- data/test/lib/spec/callback/extensions/object.rb +37 -0
- data/test/lib/spec/deprecated.rb +3 -0
- data/test/lib/spec/expectations.rb +59 -0
- data/test/lib/spec/expectations/differs/default.rb +62 -0
- data/test/lib/spec/expectations/errors.rb +6 -0
- data/test/lib/spec/expectations/extensions.rb +3 -0
- data/test/lib/spec/expectations/extensions/object.rb +109 -0
- data/test/lib/spec/expectations/extensions/proc.rb +57 -0
- data/test/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
- data/test/lib/spec/expectations/handler.rb +47 -0
- data/test/lib/spec/expectations/should.rb +5 -0
- data/test/lib/spec/expectations/should/base.rb +64 -0
- data/test/lib/spec/expectations/should/change.rb +69 -0
- data/test/lib/spec/expectations/should/have.rb +128 -0
- data/test/lib/spec/expectations/should/not.rb +74 -0
- data/test/lib/spec/expectations/should/should.rb +81 -0
- data/test/lib/spec/expectations/sugar.rb +47 -0
- data/test/lib/spec/matchers.rb +160 -0
- data/test/lib/spec/matchers/be.rb +161 -0
- data/test/lib/spec/matchers/be_close.rb +37 -0
- data/test/lib/spec/matchers/change.rb +120 -0
- data/test/lib/spec/matchers/eql.rb +43 -0
- data/test/lib/spec/matchers/equal.rb +43 -0
- data/test/lib/spec/matchers/has.rb +44 -0
- data/test/lib/spec/matchers/have.rb +140 -0
- data/test/lib/spec/matchers/include.rb +50 -0
- data/test/lib/spec/matchers/match.rb +41 -0
- data/test/lib/spec/matchers/raise_error.rb +100 -0
- data/test/lib/spec/matchers/respond_to.rb +35 -0
- data/test/lib/spec/matchers/satisfy.rb +47 -0
- data/test/lib/spec/matchers/throw_symbol.rb +75 -0
- data/test/lib/spec/mocks.rb +232 -0
- data/test/lib/spec/mocks/argument_expectation.rb +132 -0
- data/test/lib/spec/mocks/error_generator.rb +85 -0
- data/test/lib/spec/mocks/errors.rb +10 -0
- data/test/lib/spec/mocks/extensions/object.rb +3 -0
- data/test/lib/spec/mocks/message_expectation.rb +231 -0
- data/test/lib/spec/mocks/methods.rb +40 -0
- data/test/lib/spec/mocks/mock.rb +26 -0
- data/test/lib/spec/mocks/mock_handler.rb +166 -0
- data/test/lib/spec/mocks/order_group.rb +29 -0
- data/test/lib/spec/rake/spectask.rb +173 -0
- data/test/lib/spec/rake/verify_rcov.rb +47 -0
- data/test/lib/spec/runner.rb +132 -0
- data/test/lib/spec/runner/backtrace_tweaker.rb +55 -0
- data/test/lib/spec/runner/command_line.rb +34 -0
- data/test/lib/spec/runner/context.rb +154 -0
- data/test/lib/spec/runner/context_eval.rb +142 -0
- data/test/lib/spec/runner/context_runner.rb +55 -0
- data/test/lib/spec/runner/drb_command_line.rb +21 -0
- data/test/lib/spec/runner/execution_context.rb +17 -0
- data/test/lib/spec/runner/extensions/kernel.rb +17 -0
- data/test/lib/spec/runner/extensions/object.rb +32 -0
- data/test/lib/spec/runner/formatter.rb +5 -0
- data/test/lib/spec/runner/formatter/base_text_formatter.rb +118 -0
- data/test/lib/spec/runner/formatter/html_formatter.rb +219 -0
- data/test/lib/spec/runner/formatter/progress_bar_formatter.rb +27 -0
- data/test/lib/spec/runner/formatter/rdoc_formatter.rb +22 -0
- data/test/lib/spec/runner/formatter/specdoc_formatter.rb +23 -0
- data/test/lib/spec/runner/heckle_runner.rb +71 -0
- data/test/lib/spec/runner/heckle_runner_win.rb +10 -0
- data/test/lib/spec/runner/option_parser.rb +224 -0
- data/test/lib/spec/runner/reporter.rb +105 -0
- data/test/lib/spec/runner/spec_matcher.rb +25 -0
- data/test/lib/spec/runner/spec_parser.rb +41 -0
- data/test/lib/spec/runner/spec_should_raise_handler.rb +74 -0
- data/test/lib/spec/runner/specification.rb +114 -0
- data/test/lib/spec/translator.rb +87 -0
- data/test/lib/spec/version.rb +30 -0
- data/test/lib/stubba.rb +2 -0
- data/test/network/authconfig.rb +72 -0
- data/test/network/authorization.rb +138 -0
- data/test/network/authstore.rb +450 -0
- data/test/network/client/ca.rb +38 -0
- data/test/{client → network/client}/client.rb +107 -24
- data/test/network/client/dipper.rb +35 -0
- data/test/network/client/master.rb +627 -0
- data/test/{client/pelement.rb → network/client/resource.rb} +13 -29
- data/test/network/client_request.rb +39 -0
- data/test/network/daemon.rb +71 -0
- data/test/{server → network/handler}/bucket.rb +103 -27
- data/test/{server → network/handler}/ca.rb +14 -19
- data/test/{server → network/handler}/fileserver.rb +443 -68
- data/test/network/handler/handler.rb +64 -0
- data/test/{server → network/handler}/logger.rb +26 -26
- data/test/network/handler/master.rb +352 -0
- data/test/network/handler/report.rb +185 -0
- data/test/{server/pelement.rb → network/handler/resource.rb} +25 -38
- data/test/{server → network/handler}/runner.rb +17 -16
- data/test/network/rights.rb +38 -0
- data/test/network/server/webrick.rb +140 -0
- data/test/network/xmlrpc/client.rb +68 -0
- data/test/network/xmlrpc/processor.rb +80 -0
- data/test/network/xmlrpc/server.rb +28 -0
- data/test/network/xmlrpc/webrick_servlet.rb +26 -0
- data/test/other/dsl.rb +218 -0
- data/test/other/events.rb +22 -15
- data/test/other/overrides.rb +9 -14
- data/test/other/pgraph.rb +289 -0
- data/test/other/propertychange.rb +142 -0
- data/test/other/provider.rb +162 -0
- data/test/other/puppet.rb +63 -10
- data/test/other/relationship.rb +74 -0
- data/test/other/relationships.rb +199 -123
- data/test/other/report.rb +152 -23
- data/test/other/transactions.rb +824 -78
- data/test/puppet/conffiles.rb +16 -11
- data/test/puppet/defaults.rb +7 -10
- data/test/puppet/{error.rb → errortest.rb} +5 -8
- data/test/puppet/modules.rb +58 -0
- data/test/puppet/tc_suidmanager.rb +107 -0
- data/test/rails/host.rb +177 -0
- data/test/rails/rails.rb +27 -0
- data/test/rails/railsparameter.rb +62 -0
- data/test/rails/railsresource.rb +100 -0
- data/test/ral/manager/attributes.rb +296 -0
- data/test/ral/manager/manager.rb +55 -0
- data/test/ral/manager/provider.rb +54 -0
- data/test/ral/manager/type.rb +837 -0
- data/test/ral/providers/cron/crontab.rb +346 -0
- data/test/ral/providers/group.rb +252 -0
- data/test/ral/providers/host/netinfo.rb +58 -0
- data/test/ral/providers/host/parsed.rb +226 -0
- data/test/ral/providers/mount/netinfo.rb +80 -0
- data/test/ral/providers/mount/parsed.rb +223 -0
- data/test/ral/providers/nameservice.rb +33 -0
- data/test/ral/providers/package.rb +253 -0
- data/test/ral/providers/package/apt.rb +89 -0
- data/test/ral/providers/package/aptitude.rb +69 -0
- data/test/ral/providers/package/aptrpm.rb +89 -0
- data/test/ral/providers/package/dpkg.rb +64 -0
- data/test/ral/providers/parsedfile.rb +668 -0
- data/test/ral/providers/parsedport.rb +233 -0
- data/test/ral/providers/provider.rb +423 -0
- data/test/{types → ral/providers}/service.rb +20 -121
- data/test/ral/providers/service/base.rb +75 -0
- data/test/ral/providers/sshkey/parsed.rb +111 -0
- data/test/ral/providers/user.rb +567 -0
- data/test/ral/providers/user/useradd.rb +250 -0
- data/test/ral/types/basic.rb +90 -0
- data/test/ral/types/component.rb +113 -0
- data/test/ral/types/cron.rb +480 -0
- data/test/{types → ral/types}/exec.rb +278 -82
- data/test/ral/types/file.rb +1799 -0
- data/test/ral/types/file/target.rb +363 -0
- data/test/{types → ral/types}/filebucket.rb +15 -17
- data/test/{types → ral/types}/fileignoresource.rb +9 -15
- data/test/ral/types/filesources.rb +1046 -0
- data/test/ral/types/group.rb +169 -0
- data/test/ral/types/host.rb +155 -0
- data/test/ral/types/mount.rb +312 -0
- data/test/ral/types/package.rb +85 -0
- data/test/ral/types/parameter.rb +172 -0
- data/test/ral/types/port.rb +148 -0
- data/test/ral/types/property.rb +343 -0
- data/test/ral/types/resources.rb +221 -0
- data/test/{types → ral/types}/schedule.rb +34 -12
- data/test/ral/types/service.rb +37 -0
- data/test/{types → ral/types}/sshkey.rb +75 -65
- data/test/ral/types/tidy.rb +240 -0
- data/test/ral/types/user.rb +493 -0
- data/test/{types → ral/types}/yumrepo.rb +7 -11
- data/test/{types → ral/types}/zone.rb +45 -45
- data/test/tagging/tagging.rb +17 -26
- data/test/util/autoload.rb +130 -0
- data/test/util/classgen.rb +227 -0
- data/test/{other → util}/config.rb +373 -113
- data/test/util/execution.rb +34 -0
- data/test/util/features.rb +94 -0
- data/test/util/fileparsing.rb +677 -0
- data/test/{other → util}/filetype.rb +9 -12
- data/test/util/graph.rb +108 -0
- data/test/{other → util}/inifile.rb +24 -11
- data/test/util/loadedfile.rb +106 -0
- data/test/{other → util}/log.rb +96 -50
- data/test/{other → util}/metrics.rb +7 -17
- data/test/util/package.rb +27 -0
- data/test/util/pidlock.rb +126 -0
- data/test/util/posixtest.rb +173 -0
- data/test/util/storage.rb +123 -0
- data/test/util/subclass_loader.rb +100 -0
- data/test/util/utiltest.rb +368 -0
- metadata +449 -169
- data/examples/code/classing +0 -35
- data/examples/code/failers/badclassnoparam +0 -10
- data/examples/code/failers/badclassparam +0 -10
- data/examples/code/failers/badcompnoparam +0 -9
- data/examples/code/failers/badcompparam +0 -9
- data/examples/code/failers/badtypeparam +0 -3
- data/examples/code/failers/noobjectrvalue +0 -1
- data/examples/code/snippets/aliastest.pp +0 -16
- data/examples/code/snippets/argumentdefaults +0 -14
- data/examples/code/snippets/casestatement.pp +0 -58
- data/examples/code/snippets/classheirarchy.pp +0 -15
- data/examples/code/snippets/classincludes.pp +0 -17
- data/examples/code/snippets/classpathtest +0 -11
- data/examples/code/snippets/componentmetaparams.pp +0 -11
- data/examples/code/snippets/deepclassheirarchy.pp +0 -23
- data/examples/code/snippets/defineoverrides.pp +0 -17
- data/examples/code/snippets/dirchmod +0 -19
- data/examples/code/snippets/emptyclass.pp +0 -9
- data/examples/code/snippets/emptyexec.pp +0 -3
- data/examples/code/snippets/failmissingexecpath.pp +0 -13
- data/examples/code/snippets/falsevalues.pp +0 -3
- data/examples/code/snippets/filecreate +0 -11
- data/examples/code/snippets/implicititeration +0 -15
- data/examples/code/snippets/multipleinstances +0 -7
- data/examples/code/snippets/namevartest +0 -9
- data/examples/code/snippets/scopetest +0 -13
- data/examples/code/snippets/selectorvalues.pp +0 -42
- data/examples/code/snippets/simpledefaults +0 -5
- data/examples/code/snippets/simpleselector +0 -38
- data/examples/code/snippets/singleary.pp +0 -19
- data/examples/code/snippets/singlequote.pp +0 -11
- data/examples/code/snippets/singleselector.pp +0 -22
- data/examples/code/snippets/tag.pp +0 -9
- data/examples/code/snippets/tagged.pp +0 -35
- data/lib/puppet/client.rb +0 -177
- data/lib/puppet/client/ca.rb +0 -21
- data/lib/puppet/client/dipper.rb +0 -76
- data/lib/puppet/client/file.rb +0 -20
- data/lib/puppet/client/log.rb +0 -17
- data/lib/puppet/client/master.rb +0 -531
- data/lib/puppet/client/runner.rb +0 -17
- data/lib/puppet/client/status.rb +0 -7
- data/lib/puppet/event-loop.rb +0 -1
- data/lib/puppet/filetype.rb +0 -308
- data/lib/puppet/inifile.rb +0 -201
- data/lib/puppet/log.rb +0 -524
- data/lib/puppet/metric.rb +0 -132
- data/lib/puppet/networkclient.rb +0 -175
- data/lib/puppet/parsedfile.rb +0 -58
- data/lib/puppet/parser/ast/classdef.rb +0 -79
- data/lib/puppet/parser/ast/compdef.rb +0 -75
- data/lib/puppet/parser/ast/nodedef.rb +0 -73
- data/lib/puppet/parser/ast/objectdef.rb +0 -284
- data/lib/puppet/parser/ast/objectref.rb +0 -77
- data/lib/puppet/rails/database.rb +0 -40
- data/lib/puppet/rails/rails_object.rb +0 -42
- data/lib/puppet/rails/rails_parameter.rb +0 -5
- data/lib/puppet/server.rb +0 -196
- data/lib/puppet/server/authconfig.rb +0 -177
- data/lib/puppet/server/authstore.rb +0 -226
- data/lib/puppet/server/filebucket.rb +0 -155
- data/lib/puppet/server/pelement.rb +0 -188
- data/lib/puppet/server/report.rb +0 -184
- data/lib/puppet/server/rights.rb +0 -78
- data/lib/puppet/server/servlet.rb +0 -274
- data/lib/puppet/statechange.rb +0 -129
- data/lib/puppet/storage.rb +0 -98
- data/lib/puppet/type/nameservice.rb +0 -264
- data/lib/puppet/type/nameservice/netinfo.rb +0 -232
- data/lib/puppet/type/nameservice/objectadd.rb +0 -146
- data/lib/puppet/type/nameservice/posix.rb +0 -12
- data/lib/puppet/type/nameservice/pw.rb +0 -107
- data/lib/puppet/type/package/apple.rb +0 -41
- data/lib/puppet/type/package/apt.rb +0 -107
- data/lib/puppet/type/package/blastwave.rb +0 -136
- data/lib/puppet/type/package/darwinport.rb +0 -97
- data/lib/puppet/type/package/dpkg.rb +0 -113
- data/lib/puppet/type/package/freebsd.rb +0 -19
- data/lib/puppet/type/package/gem.rb +0 -119
- data/lib/puppet/type/package/openbsd.rb +0 -112
- data/lib/puppet/type/package/ports.rb +0 -103
- data/lib/puppet/type/package/rpm.rb +0 -121
- data/lib/puppet/type/package/sun.rb +0 -174
- data/lib/puppet/type/package/sunfreeware.rb +0 -7
- data/lib/puppet/type/package/yum.rb +0 -52
- data/lib/puppet/type/parsedtype/host.rb +0 -144
- data/lib/puppet/type/parsedtype/mount.rb +0 -271
- data/lib/puppet/type/parsedtype/port.rb +0 -261
- data/lib/puppet/type/parsedtype/sshkey.rb +0 -123
- data/lib/puppet/type/service/base.rb +0 -12
- data/lib/puppet/type/service/debian.rb +0 -46
- data/lib/puppet/type/service/redhat.rb +0 -38
- data/lib/puppet/type/state.rb +0 -393
- data/lib/puppet/type/symlink.rb +0 -186
- data/test/client/master.rb +0 -207
- data/test/language/rails.rb +0 -105
- data/test/other/parsedfile.rb +0 -58
- data/test/other/storage.rb +0 -100
- data/test/puppet/utiltest.rb +0 -299
- data/test/puppettest.rb +0 -1170
- data/test/server/authconfig.rb +0 -56
- data/test/server/authstore.rb +0 -218
- data/test/server/master.rb +0 -201
- data/test/server/report.rb +0 -93
- data/test/server/rights.rb +0 -41
- data/test/server/server.rb +0 -152
- data/test/test +0 -61
- data/test/types/basic.rb +0 -117
- data/test/types/component.rb +0 -298
- data/test/types/cron.rb +0 -718
- data/test/types/file.rb +0 -1314
- data/test/types/filesources.rb +0 -590
- data/test/types/group.rb +0 -323
- data/test/types/host.rb +0 -186
- data/test/types/mount.rb +0 -294
- data/test/types/package.rb +0 -538
- data/test/types/parameter.rb +0 -107
- data/test/types/port.rb +0 -201
- data/test/types/query.rb +0 -101
- data/test/types/state.rb +0 -92
- data/test/types/symlink.rb +0 -120
- data/test/types/tidy.rb +0 -102
- data/test/types/type.rb +0 -469
- data/test/types/user.rb +0 -563
|
@@ -93,7 +93,7 @@ class Puppet::SSLCertificates::Certificate
|
|
|
93
93
|
end
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
@
|
|
96
|
+
@ttl = hash[:ttl] || 365 * 24 * 60 * 60
|
|
97
97
|
@selfsign = hash[:selfsign] || false
|
|
98
98
|
@encrypt = hash[:encrypt] || false
|
|
99
99
|
@replace = hash[:replace] || false
|
|
@@ -206,7 +206,7 @@ class Puppet::SSLCertificates::Certificate
|
|
|
206
206
|
|
|
207
207
|
args = {
|
|
208
208
|
:name => self.certname,
|
|
209
|
-
:
|
|
209
|
+
:ttl => @ttl,
|
|
210
210
|
:issuer => nil,
|
|
211
211
|
:serial => 0x0,
|
|
212
212
|
:publickey => @key.public_key
|
|
@@ -280,4 +280,4 @@ class Puppet::SSLCertificates::Certificate
|
|
|
280
280
|
end
|
|
281
281
|
end
|
|
282
282
|
|
|
283
|
-
# $Id: certificate.rb
|
|
283
|
+
# $Id: certificate.rb 1581 2006-09-13 16:50:43Z lutter $
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# A module for keeping track of all the certificates issued by the CA, ever
|
|
2
|
+
# Maintains the file "$cadir/inventory.txt"
|
|
3
|
+
module Puppet::SSLCertificates
|
|
4
|
+
module Inventory
|
|
5
|
+
|
|
6
|
+
Puppet.config.setdefaults(:ca,
|
|
7
|
+
:cert_inventory => {
|
|
8
|
+
:default => "$cadir/inventory.txt",
|
|
9
|
+
:mode => 0644,
|
|
10
|
+
:owner => "$user",
|
|
11
|
+
:group => "$group",
|
|
12
|
+
:desc => "A Complete listing of all certificates"
|
|
13
|
+
}
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
# Add CERT to the inventory of issued certs in '$cadir/inventory.txt'
|
|
17
|
+
# If no inventory exists yet, build an inventory and list all the
|
|
18
|
+
# certificates that have been signed so far
|
|
19
|
+
def self.add(cert)
|
|
20
|
+
unless FileTest.exists?(Puppet[:cert_inventory])
|
|
21
|
+
inited = false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
Puppet.config.write(:cert_inventory, "a") do |f|
|
|
25
|
+
unless inited
|
|
26
|
+
f.puts self.init
|
|
27
|
+
end
|
|
28
|
+
f.puts format(cert)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def self.init
|
|
35
|
+
inv = "# Inventory of signed certificates\n"
|
|
36
|
+
inv += "# SERIAL NOT_BEFORE NOT_AFTER SUBJECT\n"
|
|
37
|
+
Dir.glob(File::join(Puppet[:signeddir], "*.pem")) do |f|
|
|
38
|
+
inv += format(OpenSSL::X509::Certificate.new(File::read(f))) + "\n"
|
|
39
|
+
end
|
|
40
|
+
return inv
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.format(cert)
|
|
44
|
+
iso = '%Y-%m-%dT%H:%M:%S%Z'
|
|
45
|
+
return "0x%04x %s %s %s" % [cert.serial,
|
|
46
|
+
cert.not_before.strftime(iso),
|
|
47
|
+
cert.not_after.strftime(iso),
|
|
48
|
+
cert.subject]
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# $Id$
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
require 'puppet/sslcertificates'
|
|
2
|
+
|
|
3
|
+
# A module to handle reading of certificates.
|
|
4
|
+
module Puppet::SSLCertificates::Support
|
|
5
|
+
class MissingCertificate < Puppet::Error; end
|
|
6
|
+
class InvalidCertificate < Puppet::Error; end
|
|
7
|
+
|
|
8
|
+
attr_reader :cacert
|
|
9
|
+
|
|
10
|
+
# Some metaprogramming to create methods for retrieving and creating keys.
|
|
11
|
+
# This probably isn't fewer lines than defining each separately...
|
|
12
|
+
def self.keytype(name, options, &block)
|
|
13
|
+
var = "@%s" % name
|
|
14
|
+
|
|
15
|
+
maker = "mk_%s" % name
|
|
16
|
+
reader = "read_%s" % name
|
|
17
|
+
|
|
18
|
+
unless param = options[:param]
|
|
19
|
+
raise ArgumentError, "You must specify the parameter for the key"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
unless klass = options[:class]
|
|
23
|
+
raise ArgumentError, "You must specify the class for the key"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Define the method that creates it.
|
|
27
|
+
define_method(maker, &block)
|
|
28
|
+
|
|
29
|
+
# Define the reading method.
|
|
30
|
+
define_method(reader) do
|
|
31
|
+
return nil unless FileTest.exists?(Puppet[param])
|
|
32
|
+
begin
|
|
33
|
+
instance_variable_set(var,
|
|
34
|
+
klass.new(File.read(Puppet[param])))
|
|
35
|
+
rescue => detail
|
|
36
|
+
raise InvalidCertificate, "Could not read %s: %s" %
|
|
37
|
+
[param, detail]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Define the overall method, which just calls the reader and maker
|
|
42
|
+
# as appropriate.
|
|
43
|
+
define_method(name) do
|
|
44
|
+
unless instance_variable_get(var)
|
|
45
|
+
unless cert = send(reader)
|
|
46
|
+
cert = send(maker)
|
|
47
|
+
Puppet.config.write(param) { |f| f.puts cert.to_pem }
|
|
48
|
+
end
|
|
49
|
+
instance_variable_set(var, cert)
|
|
50
|
+
end
|
|
51
|
+
instance_variable_get(var)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# The key pair.
|
|
56
|
+
keytype :key, :param => :hostprivkey, :class => OpenSSL::PKey::RSA do
|
|
57
|
+
Puppet.info "Creating a new SSL key at %s" % Puppet[:hostprivkey]
|
|
58
|
+
key = OpenSSL::PKey::RSA.new(Puppet[:keylength])
|
|
59
|
+
|
|
60
|
+
# Our key meta programming can only handle one file, so we have
|
|
61
|
+
# to separately write out the public key.
|
|
62
|
+
Puppet.config.write(:hostpubkey) do |f|
|
|
63
|
+
f.print key.public_key.to_pem
|
|
64
|
+
end
|
|
65
|
+
return key
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Our certificate request
|
|
69
|
+
keytype :csr, :param => :hostcsr, :class => OpenSSL::X509::Request do
|
|
70
|
+
Puppet.info "Creating a new certificate request for %s" %
|
|
71
|
+
Puppet[:certname]
|
|
72
|
+
|
|
73
|
+
csr = OpenSSL::X509::Request.new
|
|
74
|
+
csr.version = 0
|
|
75
|
+
csr.subject = OpenSSL::X509::Name.new([["CN", Puppet[:certname]]])
|
|
76
|
+
csr.public_key = key.public_key
|
|
77
|
+
csr.sign(key, OpenSSL::Digest::MD5.new)
|
|
78
|
+
|
|
79
|
+
return csr
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
keytype :cert, :param => :hostcert, :class => OpenSSL::X509::Certificate do
|
|
83
|
+
raise MissingCertificate, "No host certificate"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
keytype :ca_cert, :param => :localcacert, :class => OpenSSL::X509::Certificate do
|
|
87
|
+
raise MissingCertificate, "No CA certificate"
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Request a certificate from the remote system. This does all of the work
|
|
91
|
+
# of creating the cert request, contacting the remote system, and
|
|
92
|
+
# storing the cert locally.
|
|
93
|
+
def requestcert
|
|
94
|
+
begin
|
|
95
|
+
cert, cacert = caclient.getcert(@csr.to_pem)
|
|
96
|
+
rescue => detail
|
|
97
|
+
if Puppet[:trace]
|
|
98
|
+
puts detail.backtrace
|
|
99
|
+
end
|
|
100
|
+
raise Puppet::Error.new("Certificate retrieval failed: %s" %
|
|
101
|
+
detail)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
if cert.nil? or cert == ""
|
|
105
|
+
return nil
|
|
106
|
+
end
|
|
107
|
+
Puppet.config.write(:hostcert) do |f| f.print cert end
|
|
108
|
+
Puppet.config.write(:localcacert) do |f| f.print cacert end
|
|
109
|
+
#File.open(@certfile, "w", 0644) { |f| f.print cert }
|
|
110
|
+
#File.open(@cacertfile, "w", 0644) { |f| f.print cacert }
|
|
111
|
+
begin
|
|
112
|
+
@cert = OpenSSL::X509::Certificate.new(cert)
|
|
113
|
+
@cacert = OpenSSL::X509::Certificate.new(cacert)
|
|
114
|
+
retrieved = true
|
|
115
|
+
rescue => detail
|
|
116
|
+
raise Puppet::Error.new(
|
|
117
|
+
"Invalid certificate: %s" % detail
|
|
118
|
+
)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
unless @cert.check_private_key(@key)
|
|
122
|
+
raise Puppet::DevError, "Received invalid certificate"
|
|
123
|
+
end
|
|
124
|
+
return retrieved
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# $Id: support.rb 2259 2007-03-06 19:03:05Z luke $
|
data/lib/puppet/transaction.rb
CHANGED
|
@@ -1,19 +1,33 @@
|
|
|
1
|
-
# the class that actually walks our
|
|
1
|
+
# the class that actually walks our resource/property tree, collects the changes,
|
|
2
2
|
# and performs them
|
|
3
3
|
|
|
4
4
|
require 'puppet'
|
|
5
|
-
require 'puppet/
|
|
5
|
+
require 'puppet/propertychange'
|
|
6
6
|
|
|
7
7
|
module Puppet
|
|
8
8
|
class Transaction
|
|
9
|
-
attr_accessor :component, :
|
|
9
|
+
attr_accessor :component, :resources, :ignoreschedules, :ignoretags
|
|
10
|
+
attr_accessor :relgraph, :sorted_resources, :configurator
|
|
11
|
+
|
|
12
|
+
attr_reader :report
|
|
13
|
+
|
|
14
|
+
attr_writer :tags
|
|
10
15
|
|
|
11
16
|
include Puppet::Util
|
|
12
17
|
|
|
18
|
+
Puppet.config.setdefaults(:puppet,
|
|
19
|
+
:graph => [false, "Whether to create dot graph files for the different
|
|
20
|
+
configuration graphs. These dot files can be interpreted by tools
|
|
21
|
+
like OmniGraffle or dot (which is part of ImageMagick)."],
|
|
22
|
+
:graphdir => ["$statedir/graphs", "Where to store dot-outputted graphs."]
|
|
23
|
+
)
|
|
13
24
|
Puppet.config.setdefaults(:transaction,
|
|
14
|
-
:tags => ["", "Tags to use to find
|
|
15
|
-
only
|
|
16
|
-
Values must be comma-separated."]
|
|
25
|
+
:tags => ["", "Tags to use to find resources. If this is set, then
|
|
26
|
+
only resources tagged with the specified tags will be applied.
|
|
27
|
+
Values must be comma-separated."],
|
|
28
|
+
:evaltrace => [false, "Whether each resource should log when it is
|
|
29
|
+
being evaluated. This allows you to interactively see exactly
|
|
30
|
+
what is being done."]
|
|
17
31
|
)
|
|
18
32
|
|
|
19
33
|
# Add some additional times for reporting
|
|
@@ -23,50 +37,78 @@ class Transaction
|
|
|
23
37
|
end
|
|
24
38
|
end
|
|
25
39
|
|
|
26
|
-
#
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if @
|
|
33
|
-
|
|
34
|
-
[
|
|
35
|
-
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
if skip
|
|
39
|
-
child.warning "Skipping because of failed dependencies"
|
|
40
|
-
@objectmetrics[:skipped] += 1
|
|
41
|
-
return []
|
|
40
|
+
# Check to see if we should actually allow deleition.
|
|
41
|
+
def allow_processing?(resource, changes)
|
|
42
|
+
# If a resource is going to be deleted but it still has
|
|
43
|
+
# dependencies, then don't delete it unless it's implicit or the
|
|
44
|
+
# dependency is itself being deleted.
|
|
45
|
+
if resource.purging? and resource.deleting?
|
|
46
|
+
if deps = @relgraph.dependents(resource) and ! deps.empty? and deps.detect { |d| ! d.deleting? }
|
|
47
|
+
resource.warning "%s still depend%s on me -- not purging" %
|
|
48
|
+
[deps.collect { |r| r.ref }.join(","), deps.length > 1 ? "":"s"]
|
|
49
|
+
return false
|
|
42
50
|
end
|
|
43
51
|
end
|
|
44
52
|
|
|
53
|
+
return true
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Apply all changes for a resource, returning a list of the events
|
|
57
|
+
# generated.
|
|
58
|
+
def apply(resource)
|
|
45
59
|
begin
|
|
46
|
-
changes =
|
|
60
|
+
changes = resource.evaluate
|
|
47
61
|
rescue => detail
|
|
48
|
-
if Puppet[:
|
|
62
|
+
if Puppet[:trace]
|
|
49
63
|
puts detail.backtrace
|
|
50
64
|
end
|
|
51
65
|
|
|
52
|
-
|
|
66
|
+
resource.err "Failed to retrieve current state of resource: %s" % detail
|
|
53
67
|
|
|
54
68
|
# Mark that it failed
|
|
55
|
-
@failures[
|
|
69
|
+
@failures[resource] += 1
|
|
56
70
|
|
|
57
71
|
# And then return
|
|
58
72
|
return []
|
|
59
73
|
end
|
|
60
74
|
|
|
61
|
-
unless changes.is_a?
|
|
62
|
-
changes = [changes]
|
|
63
|
-
end
|
|
75
|
+
changes = [changes] unless changes.is_a?(Array)
|
|
64
76
|
|
|
65
77
|
if changes.length > 0
|
|
66
|
-
@
|
|
78
|
+
@resourcemetrics[:out_of_sync] += 1
|
|
67
79
|
end
|
|
68
80
|
|
|
69
|
-
|
|
81
|
+
return [] if changes.empty? or ! allow_processing?(resource, changes)
|
|
82
|
+
|
|
83
|
+
resourceevents = apply_changes(resource, changes)
|
|
84
|
+
|
|
85
|
+
# If there were changes and the resource isn't in noop mode...
|
|
86
|
+
unless changes.empty? or changes.include?(:noop)
|
|
87
|
+
# Record when we last synced
|
|
88
|
+
resource.cache(:synced, Time.now)
|
|
89
|
+
|
|
90
|
+
# Flush, if appropriate
|
|
91
|
+
if resource.respond_to?(:flush)
|
|
92
|
+
resource.flush
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# And set a trigger for refreshing this resource if it's a
|
|
96
|
+
# self-refresher
|
|
97
|
+
if resource.self_refresh? and ! resource.deleting?
|
|
98
|
+
# Create an edge with this resource as both the source and
|
|
99
|
+
# target. The triggering method treats these specially for
|
|
100
|
+
# logging.
|
|
101
|
+
events = resourceevents.collect { |e| e.event }
|
|
102
|
+
set_trigger(Puppet::Relationship.new(resource, resource, :callback => :refresh, :event => events))
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
resourceevents
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Apply each change in turn.
|
|
110
|
+
def apply_changes(resource, changes)
|
|
111
|
+
changes.collect { |change|
|
|
70
112
|
@changes << change
|
|
71
113
|
@count += 1
|
|
72
114
|
change.transaction = self
|
|
@@ -76,9 +118,12 @@ class Transaction
|
|
|
76
118
|
# event if they want
|
|
77
119
|
events = [change.forward].flatten.reject { |e| e.nil? }
|
|
78
120
|
rescue => detail
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
121
|
+
if Puppet[:trace]
|
|
122
|
+
puts detail.backtrace
|
|
123
|
+
end
|
|
124
|
+
change.property.err "change from %s to %s failed: %s" %
|
|
125
|
+
[change.property.is_to_s, change.property.should_to_s, detail]
|
|
126
|
+
@failures[resource] += 1
|
|
82
127
|
next
|
|
83
128
|
# FIXME this should support using onerror to determine
|
|
84
129
|
# behaviour; or more likely, the client calling us
|
|
@@ -87,46 +132,164 @@ class Transaction
|
|
|
87
132
|
|
|
88
133
|
# Mark that our change happened, so it can be reversed
|
|
89
134
|
# if we ever get to that point
|
|
90
|
-
unless events.nil? or (events.is_a?(Array) and events.empty?)
|
|
135
|
+
unless events.nil? or (events.is_a?(Array) and (events.empty?) or events.include?(:noop))
|
|
91
136
|
change.changed = true
|
|
92
|
-
@
|
|
137
|
+
@resourcemetrics[:applied] += 1
|
|
93
138
|
end
|
|
94
139
|
|
|
95
140
|
events
|
|
96
141
|
}.flatten.reject { |e| e.nil? }
|
|
97
|
-
|
|
98
|
-
unless changes.empty?
|
|
99
|
-
# Record when we last synced
|
|
100
|
-
child.cache(:synced, Time.now)
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
childevents
|
|
104
142
|
end
|
|
105
143
|
|
|
106
|
-
# Find all of the changed
|
|
144
|
+
# Find all of the changed resources.
|
|
107
145
|
def changed?
|
|
108
146
|
@changes.find_all { |change| change.changed }.collect { |change|
|
|
109
|
-
change.
|
|
147
|
+
change.property.parent
|
|
110
148
|
}.uniq
|
|
111
149
|
end
|
|
150
|
+
|
|
151
|
+
# Do any necessary cleanup. If we don't get rid of the graphs, the
|
|
152
|
+
# contained resources might never get cleaned up.
|
|
153
|
+
def cleanup
|
|
154
|
+
if defined? @generated
|
|
155
|
+
@generated.each do |resource|
|
|
156
|
+
resource.remove
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
if defined? @relgraph
|
|
160
|
+
@relgraph.clear
|
|
161
|
+
end
|
|
162
|
+
@resources.clear
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Copy an important relationships from the parent to the newly-generated
|
|
166
|
+
# child resource.
|
|
167
|
+
def copy_relationships(resource, children)
|
|
168
|
+
depthfirst = resource.depthfirst?
|
|
169
|
+
|
|
170
|
+
children.each do |gen_child|
|
|
171
|
+
if depthfirst
|
|
172
|
+
edge = [gen_child, resource]
|
|
173
|
+
else
|
|
174
|
+
edge = [resource, gen_child]
|
|
175
|
+
end
|
|
176
|
+
unless @relgraph.edge?(edge[1], edge[0])
|
|
177
|
+
@relgraph.add_edge!(*edge)
|
|
178
|
+
else
|
|
179
|
+
@relgraph.add_vertex!(gen_child)
|
|
180
|
+
resource.debug "Skipping automatic relationship to %s" % gen_child
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Are we deleting this resource?
|
|
186
|
+
def deleting?(changes)
|
|
187
|
+
changes.detect { |change|
|
|
188
|
+
change.property.name == :ensure and change.should == :absent
|
|
189
|
+
}
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# See if the resource generates new resources at evaluation time.
|
|
193
|
+
def eval_generate(resource)
|
|
194
|
+
if resource.respond_to?(:eval_generate)
|
|
195
|
+
begin
|
|
196
|
+
children = resource.eval_generate
|
|
197
|
+
rescue => detail
|
|
198
|
+
if Puppet[:trace]
|
|
199
|
+
puts detail.backtrace
|
|
200
|
+
end
|
|
201
|
+
resource.err "Failed to generate additional resources during transaction: %s" %
|
|
202
|
+
detail
|
|
203
|
+
return nil
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
if children
|
|
207
|
+
children.each do |child|
|
|
208
|
+
child.finish
|
|
209
|
+
# Make sure that the vertex is in the relationship graph.
|
|
210
|
+
@relgraph.add_vertex!(child)
|
|
211
|
+
end
|
|
212
|
+
@generated += children
|
|
213
|
+
return children
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Evaluate a single resource.
|
|
219
|
+
def eval_resource(resource, checkskip = true)
|
|
220
|
+
events = []
|
|
221
|
+
|
|
222
|
+
if resource.is_a?(Puppet::Type::Component)
|
|
223
|
+
raise Puppet::DevError, "Got a component to evaluate"
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
if checkskip and skip?(resource)
|
|
227
|
+
@resourcemetrics[:skipped] += 1
|
|
228
|
+
else
|
|
229
|
+
@resourcemetrics[:scheduled] += 1
|
|
230
|
+
|
|
231
|
+
changecount = @changes.length
|
|
232
|
+
|
|
233
|
+
# We need to generate first regardless, because the recursive
|
|
234
|
+
# actions sometimes change how the top resource is applied.
|
|
235
|
+
children = eval_generate(resource)
|
|
236
|
+
|
|
237
|
+
if children and resource.depthfirst?
|
|
238
|
+
children.each do |child|
|
|
239
|
+
# The child will never be skipped when the parent isn't
|
|
240
|
+
events += eval_resource(child, false)
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# Perform the actual changes
|
|
245
|
+
seconds = thinmark do
|
|
246
|
+
events += apply(resource)
|
|
247
|
+
end
|
|
112
248
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
events.each do |event|
|
|
117
|
-
source = event.source
|
|
118
|
-
start = source
|
|
119
|
-
|
|
120
|
-
while source
|
|
121
|
-
Puppet::Event::Subscription.targets_of(event, source) do |sub|
|
|
122
|
-
start.info "Scheduling %s of %s[%s]" %
|
|
123
|
-
[sub.callback, sub.target.class.name, sub.target.name]
|
|
124
|
-
@targets[sub.target][event] = sub
|
|
249
|
+
if children and ! resource.depthfirst?
|
|
250
|
+
children.each do |child|
|
|
251
|
+
events += eval_resource(child, false)
|
|
125
252
|
end
|
|
253
|
+
end
|
|
126
254
|
|
|
127
|
-
|
|
255
|
+
# Create a child/parent relationship. We do this after everything else because
|
|
256
|
+
# we want explicit relationships to be able to override automatic relationships,
|
|
257
|
+
# including this one.
|
|
258
|
+
if children
|
|
259
|
+
copy_relationships(resource, children)
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
# A bit of hackery here -- if skipcheck is true, then we're the
|
|
263
|
+
# top-level resource. If that's the case, then make sure all of
|
|
264
|
+
# the changes list this resource as a proxy. This is really only
|
|
265
|
+
# necessary for rollback, since we know the generating resource
|
|
266
|
+
# during forward changes.
|
|
267
|
+
if children and checkskip
|
|
268
|
+
@changes[changecount..-1].each { |change| change.proxy = resource }
|
|
128
269
|
end
|
|
270
|
+
|
|
271
|
+
# Keep track of how long we spend in each type of resource
|
|
272
|
+
@timemetrics[resource.class.name] += seconds
|
|
129
273
|
end
|
|
274
|
+
|
|
275
|
+
# Check to see if there are any events for this resource
|
|
276
|
+
if triggedevents = trigger(resource)
|
|
277
|
+
events += triggedevents
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# Collect the targets of any subscriptions to those events. We pass
|
|
281
|
+
# the parent resource in so it will override the source in the events,
|
|
282
|
+
# since eval_generated children can't have direct relationships.
|
|
283
|
+
@relgraph.matching_edges(events, resource).each do |edge|
|
|
284
|
+
edge = edge.dup
|
|
285
|
+
label = edge.label
|
|
286
|
+
label[:event] = events.collect { |e| e.event }
|
|
287
|
+
edge.label = label
|
|
288
|
+
set_trigger(edge)
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
# And return the events for collection
|
|
292
|
+
events
|
|
130
293
|
end
|
|
131
294
|
|
|
132
295
|
# This method does all the actual work of running a transaction. It
|
|
@@ -134,54 +297,33 @@ class Transaction
|
|
|
134
297
|
# necessary events.
|
|
135
298
|
def evaluate
|
|
136
299
|
@count = 0
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if tags.nil? or tags == ""
|
|
141
|
-
tags = nil
|
|
142
|
-
else
|
|
143
|
-
tags = [tags] unless tags.is_a? Array
|
|
144
|
-
tags = tags.collect do |tag|
|
|
145
|
-
tag.split(/\s*,\s*/)
|
|
146
|
-
end.flatten
|
|
147
|
-
end
|
|
148
|
-
|
|
300
|
+
|
|
301
|
+
graph(@resources, :resources)
|
|
302
|
+
|
|
149
303
|
# Start logging.
|
|
150
|
-
Puppet::Log.newdestination(@report)
|
|
304
|
+
Puppet::Util::Log.newdestination(@report)
|
|
305
|
+
|
|
306
|
+
prepare()
|
|
151
307
|
|
|
152
308
|
begin
|
|
153
|
-
allevents = @
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
events = apply(child)
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
# Keep track of how long we spend in each type of object
|
|
165
|
-
@timemetrics[child.class.name] += seconds
|
|
166
|
-
|
|
167
|
-
# Collect the targets of any subscriptions to those events
|
|
168
|
-
collecttargets(events)
|
|
169
|
-
else
|
|
170
|
-
child.debug "Not scheduled"
|
|
171
|
-
end
|
|
172
|
-
else
|
|
173
|
-
child.debug "Not tagged with %s" % tags.join(", ")
|
|
309
|
+
allevents = @sorted_resources.collect { |resource|
|
|
310
|
+
if resource.is_a?(Puppet::Type::Component)
|
|
311
|
+
Puppet.warning "Somehow left a component in the relationship graph"
|
|
312
|
+
next
|
|
313
|
+
end
|
|
314
|
+
ret = nil
|
|
315
|
+
seconds = thinmark do
|
|
316
|
+
ret = eval_resource(resource)
|
|
174
317
|
end
|
|
175
318
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
events
|
|
319
|
+
if Puppet[:evaltrace]
|
|
320
|
+
resource.info "Evaluated in %0.2f seconds" % seconds
|
|
321
|
+
end
|
|
322
|
+
ret
|
|
181
323
|
}.flatten.reject { |e| e.nil? }
|
|
182
324
|
ensure
|
|
183
325
|
# And then close the transaction log.
|
|
184
|
-
Puppet::Log.close(@report)
|
|
326
|
+
Puppet::Util::Log.close(@report)
|
|
185
327
|
end
|
|
186
328
|
|
|
187
329
|
Puppet.debug "Finishing transaction %s with %s changes" %
|
|
@@ -190,54 +332,74 @@ class Transaction
|
|
|
190
332
|
allevents
|
|
191
333
|
end
|
|
192
334
|
|
|
193
|
-
# Determine whether a given
|
|
335
|
+
# Determine whether a given resource has failed.
|
|
194
336
|
def failed?(obj)
|
|
195
|
-
@failures[obj] > 0
|
|
337
|
+
if @failures[obj] > 0
|
|
338
|
+
return @failures[obj]
|
|
339
|
+
else
|
|
340
|
+
return false
|
|
341
|
+
end
|
|
196
342
|
end
|
|
197
343
|
|
|
198
|
-
# this
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
# Metrics for distributing times across the different types.
|
|
214
|
-
@timemetrics = Hash.new(0)
|
|
215
|
-
|
|
216
|
-
# The number of objects that were triggered in this run
|
|
217
|
-
@triggered = Hash.new { |hash, key|
|
|
218
|
-
hash[key] = Hash.new(0)
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
# Targets of being triggered.
|
|
222
|
-
@targets = Hash.new do |hash, key|
|
|
223
|
-
hash[key] = {}
|
|
344
|
+
# Does this resource have any failed dependencies?
|
|
345
|
+
def failed_dependencies?(resource)
|
|
346
|
+
# First make sure there are no failed dependencies. To do this,
|
|
347
|
+
# we check for failures in any of the vertexes above us. It's not
|
|
348
|
+
# enough to check the immediate dependencies, which is why we use
|
|
349
|
+
# a tree from the reversed graph.
|
|
350
|
+
skip = false
|
|
351
|
+
deps = @relgraph.dependencies(resource)
|
|
352
|
+
deps.each do |dep|
|
|
353
|
+
if fails = failed?(dep)
|
|
354
|
+
resource.notice "Dependency %s[%s] has %s failures" %
|
|
355
|
+
[dep.class.name, dep.name, @failures[dep]]
|
|
356
|
+
skip = true
|
|
357
|
+
end
|
|
224
358
|
end
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
359
|
+
|
|
360
|
+
return skip
|
|
361
|
+
end
|
|
362
|
+
|
|
363
|
+
# Collect any dynamically generated resources.
|
|
364
|
+
def generate
|
|
365
|
+
list = @resources.vertices
|
|
366
|
+
|
|
367
|
+
# Store a list of all generated resources, so that we can clean them up
|
|
368
|
+
# after the transaction closes.
|
|
369
|
+
@generated = []
|
|
370
|
+
|
|
371
|
+
newlist = []
|
|
372
|
+
while ! list.empty?
|
|
373
|
+
list.each do |resource|
|
|
374
|
+
if resource.respond_to?(:generate)
|
|
375
|
+
begin
|
|
376
|
+
made = resource.generate
|
|
377
|
+
rescue => detail
|
|
378
|
+
resource.err "Failed to generate additional resources: %s" %
|
|
379
|
+
detail
|
|
380
|
+
end
|
|
381
|
+
next unless made
|
|
382
|
+
unless made.is_a?(Array)
|
|
383
|
+
made = [made]
|
|
384
|
+
end
|
|
385
|
+
made.uniq!
|
|
386
|
+
made.each do |res|
|
|
387
|
+
@resources.add_vertex!(res)
|
|
388
|
+
newlist << res
|
|
389
|
+
@generated << res
|
|
390
|
+
res.finish
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
list.clear
|
|
395
|
+
list = newlist
|
|
396
|
+
newlist = []
|
|
233
397
|
end
|
|
234
|
-
|
|
235
|
-
@report = Report.new
|
|
236
398
|
end
|
|
237
399
|
|
|
238
400
|
# Generate a transaction report.
|
|
239
|
-
def
|
|
240
|
-
@
|
|
401
|
+
def generate_report
|
|
402
|
+
@resourcemetrics[:failed] = @failures.find_all do |name, num|
|
|
241
403
|
num > 0
|
|
242
404
|
end.length
|
|
243
405
|
|
|
@@ -257,10 +419,10 @@ class Transaction
|
|
|
257
419
|
end
|
|
258
420
|
end
|
|
259
421
|
|
|
260
|
-
# Add all of the metrics related to
|
|
261
|
-
@report.newmetric(:
|
|
422
|
+
# Add all of the metrics related to resource count and status
|
|
423
|
+
@report.newmetric(:resources, @resourcemetrics)
|
|
262
424
|
|
|
263
|
-
# Record the relative time spent in each
|
|
425
|
+
# Record the relative time spent in each resource.
|
|
264
426
|
@report.newmetric(:time, @timemetrics)
|
|
265
427
|
|
|
266
428
|
# Then all of the change-related metrics
|
|
@@ -273,6 +435,133 @@ class Transaction
|
|
|
273
435
|
return @report
|
|
274
436
|
end
|
|
275
437
|
|
|
438
|
+
# Produce the graph files if requested.
|
|
439
|
+
def graph(gr, name)
|
|
440
|
+
# We don't want to graph the configuration process.
|
|
441
|
+
return if self.configurator
|
|
442
|
+
|
|
443
|
+
return unless Puppet[:graph]
|
|
444
|
+
|
|
445
|
+
file = File.join(Puppet[:graphdir], "%s.dot" % name.to_s)
|
|
446
|
+
File.open(file, "w") { |f|
|
|
447
|
+
f.puts gr.to_dot("name" => name.to_s.capitalize)
|
|
448
|
+
}
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
# this should only be called by a Puppet::Type::Component resource now
|
|
452
|
+
# and it should only receive an array
|
|
453
|
+
def initialize(resources)
|
|
454
|
+
if resources.is_a?(Puppet::PGraph)
|
|
455
|
+
@resources = resources
|
|
456
|
+
else
|
|
457
|
+
@resources = resources.to_graph
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
@resourcemetrics = {
|
|
461
|
+
:total => @resources.vertices.length,
|
|
462
|
+
:out_of_sync => 0, # The number of resources that had changes
|
|
463
|
+
:applied => 0, # The number of resources fixed
|
|
464
|
+
:skipped => 0, # The number of resources skipped
|
|
465
|
+
:restarted => 0, # The number of resources triggered
|
|
466
|
+
:failed_restarts => 0, # The number of resources that fail a trigger
|
|
467
|
+
:scheduled => 0 # The number of resources scheduled
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
# Metrics for distributing times across the different types.
|
|
471
|
+
@timemetrics = Hash.new(0)
|
|
472
|
+
|
|
473
|
+
# The number of resources that were triggered in this run
|
|
474
|
+
@triggered = Hash.new { |hash, key|
|
|
475
|
+
hash[key] = Hash.new(0)
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
# Targets of being triggered.
|
|
479
|
+
@targets = Hash.new do |hash, key|
|
|
480
|
+
hash[key] = []
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
# The changes we're performing
|
|
484
|
+
@changes = []
|
|
485
|
+
|
|
486
|
+
# The resources that have failed and the number of failures each. This
|
|
487
|
+
# is used for skipping resources because of failed dependencies.
|
|
488
|
+
@failures = Hash.new do |h, key|
|
|
489
|
+
h[key] = 0
|
|
490
|
+
end
|
|
491
|
+
|
|
492
|
+
@report = Report.new
|
|
493
|
+
@count = 0
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
# Prefetch any providers that support it. We don't support prefetching
|
|
497
|
+
# types, just providers.
|
|
498
|
+
def prefetch
|
|
499
|
+
@resources.collect { |obj|
|
|
500
|
+
if pro = obj.provider
|
|
501
|
+
pro.class
|
|
502
|
+
else
|
|
503
|
+
nil
|
|
504
|
+
end
|
|
505
|
+
}.reject { |o| o.nil? }.uniq.each do |klass|
|
|
506
|
+
# XXX We need to do something special here in case of failure.
|
|
507
|
+
if klass.respond_to?(:prefetch)
|
|
508
|
+
klass.prefetch
|
|
509
|
+
end
|
|
510
|
+
end
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
# Prepare to evaluate the elements in a transaction.
|
|
514
|
+
def prepare
|
|
515
|
+
prefetch()
|
|
516
|
+
|
|
517
|
+
# Now add any dynamically generated resources
|
|
518
|
+
generate()
|
|
519
|
+
|
|
520
|
+
# Create a relationship graph from our resource graph
|
|
521
|
+
@relgraph = relationship_graph
|
|
522
|
+
|
|
523
|
+
@sorted_resources = @relgraph.topsort
|
|
524
|
+
|
|
525
|
+
# Now make sure no cycles crept into our graph.
|
|
526
|
+
@relgraph.check_cycle(@sorted_resources)
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
# Create a graph of all of the relationships in our resource graph.
|
|
530
|
+
def relationship_graph
|
|
531
|
+
graph = Puppet::PGraph.new
|
|
532
|
+
|
|
533
|
+
# First create the dependency graph
|
|
534
|
+
@resources.vertices.each do |vertex|
|
|
535
|
+
graph.add_vertex!(vertex)
|
|
536
|
+
vertex.builddepends.each do |edge|
|
|
537
|
+
graph.add_edge!(edge)
|
|
538
|
+
end
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
# Lastly, add in any autorequires
|
|
542
|
+
graph.vertices.each do |vertex|
|
|
543
|
+
vertex.autorequire.each do |edge|
|
|
544
|
+
unless graph.edge?(edge)
|
|
545
|
+
unless graph.edge?(edge.target, edge.source)
|
|
546
|
+
vertex.debug "Autorequiring %s" % [edge.source]
|
|
547
|
+
graph.add_edge!(edge)
|
|
548
|
+
else
|
|
549
|
+
vertex.debug "Skipping automatic relationship with %s" % (edge.source == vertex ? edge.target : edge.source)
|
|
550
|
+
end
|
|
551
|
+
end
|
|
552
|
+
end
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
graph(graph, :relationships)
|
|
556
|
+
|
|
557
|
+
# Then splice in the container information
|
|
558
|
+
graph.splice!(@resources, Puppet::Type::Component)
|
|
559
|
+
|
|
560
|
+
graph(graph, :expanded_relationships)
|
|
561
|
+
|
|
562
|
+
return graph
|
|
563
|
+
end
|
|
564
|
+
|
|
276
565
|
# Roll all completed changes back.
|
|
277
566
|
def rollback
|
|
278
567
|
@targets.clear
|
|
@@ -287,92 +576,182 @@ class Transaction
|
|
|
287
576
|
events = change.backward
|
|
288
577
|
rescue => detail
|
|
289
578
|
Puppet.err("%s rollback failed: %s" % [change,detail])
|
|
290
|
-
if Puppet[:
|
|
579
|
+
if Puppet[:trace]
|
|
291
580
|
puts detail.backtrace
|
|
292
581
|
end
|
|
293
582
|
next
|
|
294
583
|
# at this point, we would normally do error handling
|
|
295
584
|
# but i haven't decided what to do for that yet
|
|
296
|
-
# so just record that a sync failed for a given
|
|
297
|
-
#@@failures[change.
|
|
585
|
+
# so just record that a sync failed for a given resource
|
|
586
|
+
#@@failures[change.property.parent] += 1
|
|
298
587
|
# this still could get hairy; what if file contents changed,
|
|
299
588
|
# but a chmod failed? how would i handle that error? dern
|
|
300
589
|
end
|
|
301
|
-
|
|
302
|
-
|
|
590
|
+
|
|
591
|
+
# FIXME This won't work right now.
|
|
592
|
+
@relgraph.matching_edges(events).each do |edge|
|
|
593
|
+
@targets[edge.target] << edge
|
|
594
|
+
end
|
|
303
595
|
|
|
304
596
|
# Now check to see if there are any events for this child.
|
|
305
597
|
# Kind of hackish, since going backwards goes a change at a
|
|
306
598
|
# time, not a child at a time.
|
|
307
|
-
trigger(change.
|
|
599
|
+
trigger(change.property.parent)
|
|
308
600
|
|
|
309
601
|
# And return the events for collection
|
|
310
602
|
events
|
|
311
603
|
}.flatten.reject { |e| e.nil? }
|
|
312
604
|
end
|
|
605
|
+
|
|
606
|
+
# Is the resource currently scheduled?
|
|
607
|
+
def scheduled?(resource)
|
|
608
|
+
self.ignoreschedules or resource.scheduled?
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
# Set an edge to be triggered when we evaluate its target.
|
|
612
|
+
def set_trigger(edge)
|
|
613
|
+
return unless method = edge.callback
|
|
614
|
+
return unless edge.target.respond_to?(method)
|
|
615
|
+
if edge.target.respond_to?(:ref)
|
|
616
|
+
unless edge.source == edge.target
|
|
617
|
+
edge.source.info "Scheduling %s of %s" % [edge.callback, edge.target.ref]
|
|
618
|
+
end
|
|
619
|
+
end
|
|
620
|
+
@targets[edge.target] << edge
|
|
621
|
+
end
|
|
622
|
+
|
|
623
|
+
# Should this resource be skipped?
|
|
624
|
+
def skip?(resource)
|
|
625
|
+
skip = false
|
|
626
|
+
if ! tagged?(resource)
|
|
627
|
+
resource.debug "Not tagged with %s" % tags.join(", ")
|
|
628
|
+
elsif ! scheduled?(resource)
|
|
629
|
+
resource.debug "Not scheduled"
|
|
630
|
+
elsif failed_dependencies?(resource)
|
|
631
|
+
resource.warning "Skipping because of failed dependencies"
|
|
632
|
+
else
|
|
633
|
+
return false
|
|
634
|
+
end
|
|
635
|
+
return true
|
|
636
|
+
end
|
|
637
|
+
|
|
638
|
+
# The tags we should be checking.
|
|
639
|
+
def tags
|
|
640
|
+
# Allow the tags to be overridden
|
|
641
|
+
unless defined? @tags
|
|
642
|
+
@tags = Puppet[:tags]
|
|
643
|
+
end
|
|
644
|
+
|
|
645
|
+
unless defined? @processed_tags
|
|
646
|
+
if @tags.nil? or @tags == ""
|
|
647
|
+
@tags = []
|
|
648
|
+
else
|
|
649
|
+
@tags = [@tags] unless @tags.is_a? Array
|
|
650
|
+
@tags = @tags.collect do |tag|
|
|
651
|
+
tag.split(/\s*,\s*/)
|
|
652
|
+
end.flatten
|
|
653
|
+
end
|
|
654
|
+
@processed_tags = true
|
|
655
|
+
end
|
|
656
|
+
|
|
657
|
+
@tags
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
# Is this resource tagged appropriately?
|
|
661
|
+
def tagged?(resource)
|
|
662
|
+
self.ignoretags or tags.empty? or resource.tagged?(tags)
|
|
663
|
+
end
|
|
664
|
+
|
|
665
|
+
# Are there any edges that target this resource?
|
|
666
|
+
def targeted?(resource)
|
|
667
|
+
# The default value is a new array so we have to test the length of it.
|
|
668
|
+
@targets.include?(resource) and @targets[resource].length > 0
|
|
669
|
+
end
|
|
313
670
|
|
|
314
671
|
# Trigger any subscriptions to a child. This does an upwardly recursive
|
|
315
|
-
# search -- it triggers the passed
|
|
672
|
+
# search -- it triggers the passed resource, but also the resource's parent
|
|
316
673
|
# and so on up the tree.
|
|
317
|
-
def trigger(
|
|
318
|
-
|
|
674
|
+
def trigger(resource)
|
|
675
|
+
return nil unless targeted?(resource)
|
|
319
676
|
callbacks = Hash.new { |hash, key| hash[key] = [] }
|
|
320
|
-
sources = Hash.new { |hash, key| hash[key] = [] }
|
|
321
|
-
|
|
322
|
-
while obj
|
|
323
|
-
if @targets.include?(obj)
|
|
324
|
-
callbacks.clear
|
|
325
|
-
sources.clear
|
|
326
|
-
@targets[obj].each do |event, sub|
|
|
327
|
-
# Collect all of the subs for each callback
|
|
328
|
-
callbacks[sub.callback] << sub
|
|
329
|
-
|
|
330
|
-
# And collect the sources for logging
|
|
331
|
-
sources[event.source] << sub.callback
|
|
332
|
-
end
|
|
333
677
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
678
|
+
trigged = []
|
|
679
|
+
@targets[resource].each do |edge|
|
|
680
|
+
# Collect all of the subs for each callback
|
|
681
|
+
callbacks[edge.callback] << edge
|
|
682
|
+
end
|
|
683
|
+
|
|
684
|
+
callbacks.each do |callback, subs|
|
|
685
|
+
noop = true
|
|
686
|
+
subs.each do |edge|
|
|
687
|
+
if edge.event.nil? or ! edge.event.include?(:noop)
|
|
688
|
+
noop = false
|
|
337
689
|
end
|
|
690
|
+
end
|
|
338
691
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
# At this point, just log failures, don't try to react
|
|
343
|
-
# to them in any way.
|
|
344
|
-
begin
|
|
345
|
-
obj.send(callback)
|
|
346
|
-
@objectmetrics[:restarted] += 1
|
|
347
|
-
rescue => detail
|
|
348
|
-
obj.err "Failed to call %s on %s: %s" %
|
|
349
|
-
[callback, obj, detail]
|
|
692
|
+
if noop
|
|
693
|
+
resource.notice "Would have triggered %s from %s dependencies" %
|
|
694
|
+
[callback, subs.length]
|
|
350
695
|
|
|
351
|
-
|
|
696
|
+
# And then add an event for it.
|
|
697
|
+
return [Puppet::Event.new(
|
|
698
|
+
:event => :noop,
|
|
699
|
+
:transaction => self,
|
|
700
|
+
:source => resource
|
|
701
|
+
)]
|
|
702
|
+
end
|
|
352
703
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
704
|
+
if subs.length == 1 and subs[0].source == resource
|
|
705
|
+
message = "Refreshing self"
|
|
706
|
+
else
|
|
707
|
+
message = "Triggering '%s' from %s dependencies" %
|
|
708
|
+
[callback, subs.length]
|
|
709
|
+
end
|
|
710
|
+
resource.notice message
|
|
711
|
+
|
|
712
|
+
# At this point, just log failures, don't try to react
|
|
713
|
+
# to them in any way.
|
|
714
|
+
begin
|
|
715
|
+
resource.send(callback)
|
|
716
|
+
@resourcemetrics[:restarted] += 1
|
|
717
|
+
rescue => detail
|
|
718
|
+
resource.err "Failed to call %s on %s: %s" %
|
|
719
|
+
[callback, resource, detail]
|
|
720
|
+
|
|
721
|
+
@resourcemetrics[:failed_restarts] += 1
|
|
357
722
|
|
|
358
|
-
|
|
723
|
+
if Puppet[:trace]
|
|
724
|
+
puts detail.backtrace
|
|
359
725
|
end
|
|
360
726
|
end
|
|
361
727
|
|
|
362
|
-
|
|
728
|
+
# And then add an event for it.
|
|
729
|
+
trigged << Puppet::Event.new(
|
|
730
|
+
:event => :triggered,
|
|
731
|
+
:transaction => self,
|
|
732
|
+
:source => resource
|
|
733
|
+
)
|
|
734
|
+
|
|
735
|
+
triggered(resource, callback)
|
|
736
|
+
end
|
|
737
|
+
|
|
738
|
+
if trigged.empty?
|
|
739
|
+
return nil
|
|
740
|
+
else
|
|
741
|
+
return trigged
|
|
363
742
|
end
|
|
364
743
|
end
|
|
365
744
|
|
|
366
|
-
def triggered(
|
|
367
|
-
@triggered[
|
|
745
|
+
def triggered(resource, method)
|
|
746
|
+
@triggered[resource][method] += 1
|
|
368
747
|
end
|
|
369
748
|
|
|
370
|
-
def triggered?(
|
|
371
|
-
@triggered[
|
|
749
|
+
def triggered?(resource, method)
|
|
750
|
+
@triggered[resource][method]
|
|
372
751
|
end
|
|
373
752
|
end
|
|
374
753
|
end
|
|
375
754
|
|
|
376
755
|
require 'puppet/transaction/report'
|
|
377
756
|
|
|
378
|
-
# $Id: transaction.rb
|
|
757
|
+
# $Id: transaction.rb 2372 2007-03-30 00:47:03Z luke $
|