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
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# the available clients
|
|
2
|
+
|
|
3
|
+
require 'puppet'
|
|
4
|
+
require 'puppet/daemon'
|
|
5
|
+
require 'puppet/network/xmlrpc/client'
|
|
6
|
+
require 'puppet/util/subclass_loader'
|
|
7
|
+
require 'puppet/util/methodhelper'
|
|
8
|
+
require 'puppet/sslcertificates/support'
|
|
9
|
+
|
|
10
|
+
require 'net/http'
|
|
11
|
+
|
|
12
|
+
# Some versions of ruby don't have this method defined, which basically causes
|
|
13
|
+
# us to never use ssl. Yay.
|
|
14
|
+
class Net::HTTP
|
|
15
|
+
def use_ssl?
|
|
16
|
+
if defined? @use_ssl
|
|
17
|
+
@use_ssl
|
|
18
|
+
else
|
|
19
|
+
false
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# The base class for all of the clients. Many clients just directly
|
|
25
|
+
# call methods, but some of them need to do some extra work or
|
|
26
|
+
# provide a different interface.
|
|
27
|
+
class Puppet::Network::Client
|
|
28
|
+
Client = self
|
|
29
|
+
include Puppet::Daemon
|
|
30
|
+
include Puppet::Util
|
|
31
|
+
extend Puppet::Util::SubclassLoader
|
|
32
|
+
include Puppet::Util::MethodHelper
|
|
33
|
+
|
|
34
|
+
# This handles reading in the key and such-like.
|
|
35
|
+
include Puppet::SSLCertificates::Support
|
|
36
|
+
|
|
37
|
+
attr_accessor :schedule, :lastrun, :local, :stopping
|
|
38
|
+
|
|
39
|
+
attr_reader :driver
|
|
40
|
+
|
|
41
|
+
# Set up subclass loading
|
|
42
|
+
handle_subclasses :client, "puppet/network/client"
|
|
43
|
+
|
|
44
|
+
# Determine what clients look for when being passed an object for local
|
|
45
|
+
# client/server stuff. E.g., you could call Client::CA.new(:CA => ca).
|
|
46
|
+
def self.drivername
|
|
47
|
+
unless defined? @drivername
|
|
48
|
+
@drivername = self.name
|
|
49
|
+
end
|
|
50
|
+
@drivername
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Figure out the handler for our client.
|
|
54
|
+
def self.handler
|
|
55
|
+
unless defined? @handler
|
|
56
|
+
@handler = Puppet::Network::Handler.handler(self.name)
|
|
57
|
+
end
|
|
58
|
+
@handler
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# The class that handles xmlrpc interaction for us.
|
|
62
|
+
def self.xmlrpc_client
|
|
63
|
+
unless defined? @xmlrpc_client
|
|
64
|
+
@xmlrpc_client = Puppet::Network::XMLRPCClient.handler_class(self.handler)
|
|
65
|
+
end
|
|
66
|
+
@xmlrpc_client
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Create our client.
|
|
70
|
+
def initialize(hash)
|
|
71
|
+
# to whom do we connect?
|
|
72
|
+
@server = nil
|
|
73
|
+
|
|
74
|
+
if hash.include?(:Cache)
|
|
75
|
+
@cache = hash[:Cache]
|
|
76
|
+
else
|
|
77
|
+
@cache = true
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
driverparam = self.class.drivername
|
|
81
|
+
if hash.include?(:Server)
|
|
82
|
+
args = {:Server => hash[:Server]}
|
|
83
|
+
@server = hash[:Server]
|
|
84
|
+
args[:Port] = hash[:Port] || Puppet[:masterport]
|
|
85
|
+
|
|
86
|
+
@driver = self.class.xmlrpc_client.new(args)
|
|
87
|
+
|
|
88
|
+
if self.read_cert
|
|
89
|
+
@driver.cert_setup(self)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
@local = false
|
|
93
|
+
elsif hash.include?(driverparam)
|
|
94
|
+
@driver = hash[driverparam]
|
|
95
|
+
if @driver == true
|
|
96
|
+
@driver = self.class.handler.new
|
|
97
|
+
end
|
|
98
|
+
@local = true
|
|
99
|
+
else
|
|
100
|
+
raise Puppet::Network::ClientError, "%s must be passed a Server or %s" %
|
|
101
|
+
[self.class, driverparam]
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Are we a local client?
|
|
106
|
+
def local?
|
|
107
|
+
if defined? @local and @local
|
|
108
|
+
true
|
|
109
|
+
else
|
|
110
|
+
false
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Make sure we set the driver up when we read the cert in.
|
|
115
|
+
def read_cert
|
|
116
|
+
if super
|
|
117
|
+
@driver.cert_setup(self) if @driver.respond_to?(:cert_setup)
|
|
118
|
+
return true
|
|
119
|
+
else
|
|
120
|
+
return false
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# A wrapper method to run and then store the last run time
|
|
125
|
+
def runnow
|
|
126
|
+
if self.stopping
|
|
127
|
+
Puppet.notice "In shutdown progress; skipping run"
|
|
128
|
+
return
|
|
129
|
+
end
|
|
130
|
+
begin
|
|
131
|
+
self.run
|
|
132
|
+
self.lastrun = Time.now.to_i
|
|
133
|
+
rescue => detail
|
|
134
|
+
if Puppet[:trace]
|
|
135
|
+
puts detail.backtrace
|
|
136
|
+
end
|
|
137
|
+
Puppet.err "Could not run %s: %s" % [self.class, detail]
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def run
|
|
142
|
+
raise Puppet::DevError, "Client type %s did not override run" %
|
|
143
|
+
self.class
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def scheduled?
|
|
147
|
+
if sched = self.schedule
|
|
148
|
+
return sched.match?(self.lastrun)
|
|
149
|
+
else
|
|
150
|
+
return true
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def shutdown
|
|
155
|
+
if self.stopping
|
|
156
|
+
Puppet.notice "Already in shutdown"
|
|
157
|
+
else
|
|
158
|
+
self.stopping = true
|
|
159
|
+
if self.respond_to? :running? and self.running?
|
|
160
|
+
Puppet::Util::Storage.store
|
|
161
|
+
end
|
|
162
|
+
rmpidfile()
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Start listening for events. We're pretty much just listening for
|
|
167
|
+
# timer events here.
|
|
168
|
+
def start
|
|
169
|
+
# Create our timer. Puppet will handle observing it and such.
|
|
170
|
+
timer = Puppet.newtimer(
|
|
171
|
+
:interval => Puppet[:runinterval],
|
|
172
|
+
:tolerance => 1,
|
|
173
|
+
:start? => true
|
|
174
|
+
) do
|
|
175
|
+
if self.scheduled?
|
|
176
|
+
self.runnow
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Run once before we start following the timer
|
|
181
|
+
self.runnow
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
require 'puppet/network/client/proxy'
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# $Id: client.rb 2375 2007-03-30 23:17:40Z luke $
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require 'puppet/network/client'
|
|
2
|
+
|
|
3
|
+
# Request a certificate from the remote system.
|
|
4
|
+
class Puppet::Network::Client::CA < Puppet::Network::Client
|
|
5
|
+
class InvalidCertificate < Puppet::Error; end
|
|
6
|
+
|
|
7
|
+
def initialize(options = {})
|
|
8
|
+
options = symbolize_options(options)
|
|
9
|
+
unless options.include?(:Server) or options.include?(:CA)
|
|
10
|
+
options[:Server] = Puppet[:ca_server]
|
|
11
|
+
options[:Port] = Puppet[:ca_port]
|
|
12
|
+
end
|
|
13
|
+
super(options)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# This client is really only able to request certificates for the
|
|
17
|
+
# current host. It uses the Puppet.config settings to figure everything out.
|
|
18
|
+
def request_cert
|
|
19
|
+
Puppet.config.use(:puppet, :certificates)
|
|
20
|
+
|
|
21
|
+
if cert = read_cert
|
|
22
|
+
return cert
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
begin
|
|
26
|
+
cert, cacert = @driver.getcert(csr.to_pem)
|
|
27
|
+
rescue => detail
|
|
28
|
+
if Puppet[:trace]
|
|
29
|
+
puts detail.backtrace
|
|
30
|
+
end
|
|
31
|
+
raise Puppet::Error.new("Certificate retrieval failed: %s" % detail)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
if cert.nil? or cert == ""
|
|
35
|
+
return nil
|
|
36
|
+
end
|
|
37
|
+
Puppet.config.write(:hostcert) do |f| f.print cert end
|
|
38
|
+
Puppet.config.write(:localcacert) do |f| f.print cacert end
|
|
39
|
+
|
|
40
|
+
begin
|
|
41
|
+
@cert = OpenSSL::X509::Certificate.new(cert)
|
|
42
|
+
@cacert = OpenSSL::X509::Certificate.new(cacert)
|
|
43
|
+
rescue => detail
|
|
44
|
+
raise InvalidCertificate.new(
|
|
45
|
+
"Invalid certificate: %s" % detail
|
|
46
|
+
)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
unless @cert.check_private_key(key)
|
|
50
|
+
raise InvalidCertificate, "Certificate does not match private key"
|
|
51
|
+
end
|
|
52
|
+
return @cert
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# $Id: ca.rb 2259 2007-03-06 19:03:05Z luke $
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# The client class for filebuckets.
|
|
2
|
+
class Puppet::Network::Client::Dipper < Puppet::Network::Client
|
|
3
|
+
@handler = Puppet::Network::Handler.handler(:filebucket)
|
|
4
|
+
@drivername = :Bucket
|
|
5
|
+
|
|
6
|
+
attr_accessor :name
|
|
7
|
+
|
|
8
|
+
# Create our bucket client
|
|
9
|
+
def initialize(hash = {})
|
|
10
|
+
if hash.include?(:Path)
|
|
11
|
+
bucket = self.class.handler.new(:Path => hash[:Path])
|
|
12
|
+
hash.delete(:Path)
|
|
13
|
+
hash[:Bucket] = bucket
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
super(hash)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Back up a file to our bucket
|
|
20
|
+
def backup(file)
|
|
21
|
+
unless FileTest.exists?(file)
|
|
22
|
+
raise(BucketError, "File %s does not exist" % file)
|
|
23
|
+
end
|
|
24
|
+
contents = ::File.read(file)
|
|
25
|
+
unless local?
|
|
26
|
+
contents = Base64.encode64(contents)
|
|
27
|
+
end
|
|
28
|
+
return @driver.addfile(contents,file)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Retrieve a file by sum.
|
|
32
|
+
def getfile(sum)
|
|
33
|
+
if newcontents = @driver.getfile(sum)
|
|
34
|
+
unless local?
|
|
35
|
+
newcontents = Base64.decode64(newcontents)
|
|
36
|
+
end
|
|
37
|
+
return newcontents
|
|
38
|
+
end
|
|
39
|
+
return nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Restore the file
|
|
43
|
+
def restore(file,sum)
|
|
44
|
+
restore = true
|
|
45
|
+
if FileTest.exists?(file)
|
|
46
|
+
cursum = Digest::MD5.hexdigest(::File.read(file))
|
|
47
|
+
|
|
48
|
+
# if the checksum has changed...
|
|
49
|
+
# this might be extra effort
|
|
50
|
+
if cursum == sum
|
|
51
|
+
restore = false
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
if restore
|
|
56
|
+
if newcontents = getfile(sum)
|
|
57
|
+
tmp = ""
|
|
58
|
+
newsum = Digest::MD5.hexdigest(newcontents)
|
|
59
|
+
changed = nil
|
|
60
|
+
if FileTest.exists?(file) and ! FileTest.writable?(file)
|
|
61
|
+
changed = ::File.stat(file).mode
|
|
62
|
+
::File.chmod(changed | 0200, file)
|
|
63
|
+
end
|
|
64
|
+
::File.open(file, ::File::WRONLY|::File::TRUNC|::File::CREAT) { |of|
|
|
65
|
+
of.print(newcontents)
|
|
66
|
+
}
|
|
67
|
+
if changed
|
|
68
|
+
::File.chmod(changed, file)
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
Puppet.err "Could not find file with checksum %s" % sum
|
|
72
|
+
return nil
|
|
73
|
+
end
|
|
74
|
+
return newsum
|
|
75
|
+
else
|
|
76
|
+
return nil
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# $Id: dipper.rb 2348 2007-03-24 21:16:20Z luke $
|
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
# The client for interacting with the puppetmaster config server.
|
|
2
|
+
require 'sync'
|
|
3
|
+
require 'timeout'
|
|
4
|
+
|
|
5
|
+
class Puppet::Network::Client::Master < Puppet::Network::Client
|
|
6
|
+
unless defined? @@sync
|
|
7
|
+
@@sync = Sync.new
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
attr_accessor :objects
|
|
11
|
+
attr_reader :compile_time
|
|
12
|
+
|
|
13
|
+
class << self
|
|
14
|
+
# Puppetd should only have one instance running, and we need a way
|
|
15
|
+
# to retrieve it.
|
|
16
|
+
attr_accessor :instance
|
|
17
|
+
include Puppet::Util
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.facts
|
|
21
|
+
# Retrieve the facts from the central server.
|
|
22
|
+
if Puppet[:factsync]
|
|
23
|
+
self.getfacts()
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
down = Puppet[:downcasefacts]
|
|
27
|
+
|
|
28
|
+
facts = {}
|
|
29
|
+
Facter.each { |name,fact|
|
|
30
|
+
if down
|
|
31
|
+
facts[name] = fact.to_s.downcase
|
|
32
|
+
else
|
|
33
|
+
facts[name] = fact.to_s
|
|
34
|
+
end
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# Add our client version to the list of facts, so people can use it
|
|
38
|
+
# in their manifests
|
|
39
|
+
facts["clientversion"] = Puppet.version.to_s
|
|
40
|
+
|
|
41
|
+
facts
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# This method actually applies the configuration.
|
|
45
|
+
def apply(tags = nil, ignoreschedules = false)
|
|
46
|
+
unless defined? @objects
|
|
47
|
+
raise Puppet::Error, "Cannot apply; objects not defined"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
transaction = @objects.evaluate
|
|
51
|
+
|
|
52
|
+
if tags
|
|
53
|
+
transaction.tags = tags
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
if ignoreschedules
|
|
57
|
+
transaction.ignoreschedules = true
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
transaction.addtimes :config_retrieval => @configtime
|
|
61
|
+
|
|
62
|
+
begin
|
|
63
|
+
transaction.evaluate
|
|
64
|
+
rescue Puppet::Error => detail
|
|
65
|
+
Puppet.err "Could not apply complete configuration: %s" %
|
|
66
|
+
detail
|
|
67
|
+
rescue => detail
|
|
68
|
+
Puppet.err "Got an uncaught exception of type %s: %s" %
|
|
69
|
+
[detail.class, detail]
|
|
70
|
+
if Puppet[:trace]
|
|
71
|
+
puts detail.backtrace
|
|
72
|
+
end
|
|
73
|
+
ensure
|
|
74
|
+
Puppet::Util::Storage.store
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
if Puppet[:report]
|
|
78
|
+
report(transaction)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
return transaction
|
|
82
|
+
ensure
|
|
83
|
+
if defined? transaction and transaction
|
|
84
|
+
transaction.cleanup
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Cache the config
|
|
89
|
+
def cache(text)
|
|
90
|
+
Puppet.info "Caching configuration at %s" % self.cachefile
|
|
91
|
+
confdir = ::File.dirname(Puppet[:localconfig])
|
|
92
|
+
::File.open(self.cachefile + ".tmp", "w", 0660) { |f|
|
|
93
|
+
f.print text
|
|
94
|
+
}
|
|
95
|
+
::File.rename(self.cachefile + ".tmp", self.cachefile)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def cachefile
|
|
99
|
+
unless defined? @cachefile
|
|
100
|
+
@cachefile = Puppet[:localconfig] + ".yaml"
|
|
101
|
+
end
|
|
102
|
+
@cachefile
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def clear
|
|
106
|
+
@objects.remove(true)
|
|
107
|
+
Puppet::Type.allclear
|
|
108
|
+
mkdefault_objects
|
|
109
|
+
@objects = nil
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Initialize and load storage
|
|
113
|
+
def dostorage
|
|
114
|
+
begin
|
|
115
|
+
Puppet::Util::Storage.load
|
|
116
|
+
@compile_time ||= Puppet::Util::Storage.cache(:configuration)[:compile_time]
|
|
117
|
+
rescue => detail
|
|
118
|
+
if Puppet[:trace]
|
|
119
|
+
puts detail.backtrace
|
|
120
|
+
end
|
|
121
|
+
Puppet.err "Corrupt state file %s: %s" % [Puppet[:statefile], detail]
|
|
122
|
+
begin
|
|
123
|
+
::File.unlink(Puppet[:statefile])
|
|
124
|
+
retry
|
|
125
|
+
rescue => detail
|
|
126
|
+
raise Puppet::Error.new("Cannot remove %s: %s" %
|
|
127
|
+
[Puppet[:statefile], detail])
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Check whether our configuration is up to date
|
|
133
|
+
def fresh?(facts)
|
|
134
|
+
if Puppet[:ignorecache]
|
|
135
|
+
Puppet.notice "Ignoring cache"
|
|
136
|
+
return false
|
|
137
|
+
end
|
|
138
|
+
unless self.compile_time
|
|
139
|
+
Puppet.debug "No cached compile time"
|
|
140
|
+
return false
|
|
141
|
+
end
|
|
142
|
+
if facts_changed?(facts)
|
|
143
|
+
Puppet.info "Facts have changed; recompiling" unless local?
|
|
144
|
+
return false
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# We're willing to give a 2 second drift
|
|
148
|
+
newcompile = @driver.freshness
|
|
149
|
+
if newcompile - @compile_time.to_i < 1
|
|
150
|
+
return true
|
|
151
|
+
else
|
|
152
|
+
Puppet.debug "Server compile time is %s vs %s" % [newcompile, @compile_time]
|
|
153
|
+
return false
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Let the daemon run again, freely in the filesystem. Frolick, little
|
|
158
|
+
# daemon!
|
|
159
|
+
def enable
|
|
160
|
+
lockfile.unlock(:anonymous => true)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Stop the daemon from making any configuration runs.
|
|
164
|
+
def disable
|
|
165
|
+
lockfile.lock(:anonymous => true)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Retrieve the config from a remote server. If this fails, then
|
|
169
|
+
# use the cached copy.
|
|
170
|
+
def getconfig
|
|
171
|
+
dostorage()
|
|
172
|
+
|
|
173
|
+
facts = self.class.facts
|
|
174
|
+
|
|
175
|
+
if self.objects or FileTest.exists?(self.cachefile)
|
|
176
|
+
if self.fresh?(facts)
|
|
177
|
+
Puppet.info "Config is up to date"
|
|
178
|
+
if self.objects
|
|
179
|
+
return
|
|
180
|
+
end
|
|
181
|
+
if oldtext = self.retrievecache
|
|
182
|
+
begin
|
|
183
|
+
@objects = YAML.load(oldtext).to_type
|
|
184
|
+
rescue => detail
|
|
185
|
+
Puppet.warning "Could not load cached configuration: %s" % detail
|
|
186
|
+
end
|
|
187
|
+
return
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
Puppet.debug("getting config")
|
|
192
|
+
|
|
193
|
+
# Retrieve the plugins.
|
|
194
|
+
if Puppet[:pluginsync]
|
|
195
|
+
getplugins()
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
unless facts.length > 0
|
|
199
|
+
raise Puppet::Network::ClientError.new(
|
|
200
|
+
"Could not retrieve any facts"
|
|
201
|
+
)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
unless objects = get_actual_config(facts)
|
|
205
|
+
@objects = nil
|
|
206
|
+
return
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
unless objects.is_a?(Puppet::TransBucket)
|
|
210
|
+
raise NetworkClientError,
|
|
211
|
+
"Invalid returned objects of type %s" % objects.class
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
self.setclasses(objects.classes)
|
|
215
|
+
|
|
216
|
+
# Clear all existing objects, so we can recreate our stack.
|
|
217
|
+
if self.objects
|
|
218
|
+
clear()
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# Now convert the objects to real Puppet objects
|
|
222
|
+
@objects = objects.to_type
|
|
223
|
+
|
|
224
|
+
if @objects.nil?
|
|
225
|
+
raise Puppet::Error, "Configuration could not be processed"
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# and perform any necessary final actions before we evaluate.
|
|
229
|
+
@objects.finalize
|
|
230
|
+
|
|
231
|
+
return @objects
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# A simple proxy method, so it's easy to test.
|
|
235
|
+
def getplugins
|
|
236
|
+
self.class.getplugins
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
# Just so we can specify that we are "the" instance.
|
|
240
|
+
def initialize(*args)
|
|
241
|
+
Puppet.config.use(:puppet, :sslcertificates, :puppetd)
|
|
242
|
+
super
|
|
243
|
+
|
|
244
|
+
# This might be nil
|
|
245
|
+
@configtime = 0
|
|
246
|
+
|
|
247
|
+
self.class.instance = self
|
|
248
|
+
@running = false
|
|
249
|
+
|
|
250
|
+
mkdefault_objects
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# Make the default objects necessary for function.
|
|
254
|
+
def mkdefault_objects
|
|
255
|
+
# First create the default scheduling objects
|
|
256
|
+
Puppet::Type.type(:schedule).mkdefaultschedules
|
|
257
|
+
|
|
258
|
+
# And filebuckets
|
|
259
|
+
Puppet::Type.type(:filebucket).mkdefaultbucket
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
# Mark that we should restart. The Puppet module checks whether we're running,
|
|
263
|
+
# so this only gets called if we're in the middle of a run.
|
|
264
|
+
def restart
|
|
265
|
+
# If we're currently running, then just mark for later
|
|
266
|
+
Puppet.notice "Received signal to restart; waiting until run is complete"
|
|
267
|
+
@restart = true
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
# Should we restart?
|
|
271
|
+
def restart?
|
|
272
|
+
if defined? @restart
|
|
273
|
+
@restart
|
|
274
|
+
else
|
|
275
|
+
false
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
# Retrieve the cached config
|
|
280
|
+
def retrievecache
|
|
281
|
+
if FileTest.exists?(self.cachefile)
|
|
282
|
+
return ::File.read(self.cachefile)
|
|
283
|
+
else
|
|
284
|
+
return nil
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
# The code that actually runs the configuration.
|
|
289
|
+
def run(tags = nil, ignoreschedules = false)
|
|
290
|
+
got_lock = false
|
|
291
|
+
Puppet::Util.sync(:puppetrun).synchronize(Sync::EX) do
|
|
292
|
+
if !lockfile.lock
|
|
293
|
+
Puppet.notice "Lock file %s exists; skipping configuration run" %
|
|
294
|
+
lockfile.lockfile
|
|
295
|
+
else
|
|
296
|
+
got_lock = true
|
|
297
|
+
@configtime = thinmark do
|
|
298
|
+
self.getconfig
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
if defined? @objects and @objects
|
|
302
|
+
unless @local
|
|
303
|
+
Puppet.notice "Starting configuration run"
|
|
304
|
+
end
|
|
305
|
+
benchmark(:notice, "Finished configuration run") do
|
|
306
|
+
self.apply(tags, ignoreschedules)
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
lockfile.unlock
|
|
312
|
+
|
|
313
|
+
# Did we get HUPped during the run? If so, then restart now that we're
|
|
314
|
+
# done with the run.
|
|
315
|
+
if self.restart?
|
|
316
|
+
Process.kill(:HUP, $$)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
ensure
|
|
320
|
+
# Just make sure we remove the lock file if we set it.
|
|
321
|
+
lockfile.unlock if got_lock and lockfile.locked?
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def running?
|
|
325
|
+
lockfile.locked?
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
# Store the classes in the classfile, but only if we're not local.
|
|
329
|
+
def setclasses(ary)
|
|
330
|
+
if @local
|
|
331
|
+
return
|
|
332
|
+
end
|
|
333
|
+
unless ary and ary.length > 0
|
|
334
|
+
Puppet.info "No classes to store"
|
|
335
|
+
return
|
|
336
|
+
end
|
|
337
|
+
begin
|
|
338
|
+
::File.open(Puppet[:classfile], "w") { |f|
|
|
339
|
+
f.puts ary.join("\n")
|
|
340
|
+
}
|
|
341
|
+
rescue => detail
|
|
342
|
+
Puppet.err "Could not create class file %s: %s" %
|
|
343
|
+
[Puppet[:classfile], detail]
|
|
344
|
+
end
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
private
|
|
348
|
+
|
|
349
|
+
# Download files from the remote server, returning a list of all
|
|
350
|
+
# changed files.
|
|
351
|
+
def self.download(args)
|
|
352
|
+
objects = Puppet::Type.type(:component).create(
|
|
353
|
+
:name => "#{args[:name]}_collector"
|
|
354
|
+
)
|
|
355
|
+
hash = {
|
|
356
|
+
:path => args[:dest],
|
|
357
|
+
:recurse => true,
|
|
358
|
+
:source => args[:source],
|
|
359
|
+
:tag => "#{args[:name]}s",
|
|
360
|
+
:owner => Process.uid,
|
|
361
|
+
:group => Process.gid,
|
|
362
|
+
:purge => true,
|
|
363
|
+
:backup => false
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
if args[:ignore]
|
|
367
|
+
hash[:ignore] = args[:ignore].split(/\s+/)
|
|
368
|
+
end
|
|
369
|
+
objects.push Puppet::Type.type(:file).create(hash)
|
|
370
|
+
|
|
371
|
+
Puppet.info "Retrieving #{args[:name]}s"
|
|
372
|
+
|
|
373
|
+
noop = Puppet[:noop]
|
|
374
|
+
Puppet[:noop] = false
|
|
375
|
+
|
|
376
|
+
begin
|
|
377
|
+
trans = objects.evaluate
|
|
378
|
+
trans.ignoretags = true
|
|
379
|
+
Timeout::timeout(self.timeout) do
|
|
380
|
+
trans.evaluate
|
|
381
|
+
end
|
|
382
|
+
rescue Puppet::Error, Timeout::Error => detail
|
|
383
|
+
if Puppet[:debug]
|
|
384
|
+
puts detail.backtrace
|
|
385
|
+
end
|
|
386
|
+
Puppet.err "Could not retrieve #{args[:name]}s: %s" % detail
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
# Now source all of the changed objects, but only source those
|
|
390
|
+
# that are top-level.
|
|
391
|
+
files = []
|
|
392
|
+
trans.changed?.find_all do |object|
|
|
393
|
+
yield object if block_given?
|
|
394
|
+
files << object[:path]
|
|
395
|
+
end
|
|
396
|
+
trans.cleanup
|
|
397
|
+
|
|
398
|
+
# Now clean up after ourselves
|
|
399
|
+
objects.remove
|
|
400
|
+
files
|
|
401
|
+
ensure
|
|
402
|
+
# I can't imagine why this is necessary, but apparently at last one person has had problems with noop
|
|
403
|
+
# being nil here.
|
|
404
|
+
if noop.nil?
|
|
405
|
+
Puppet[:noop] = false
|
|
406
|
+
else
|
|
407
|
+
Puppet[:noop] = noop
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
# Retrieve facts from the central server.
|
|
412
|
+
def self.getfacts
|
|
413
|
+
# Clear all existing definitions.
|
|
414
|
+
Facter.clear
|
|
415
|
+
|
|
416
|
+
# Download the new facts
|
|
417
|
+
path = Puppet[:factpath].split(":")
|
|
418
|
+
files = []
|
|
419
|
+
download(:dest => Puppet[:factdest], :source => Puppet[:factsource],
|
|
420
|
+
:ignore => Puppet[:factsignore], :name => "fact") do |object|
|
|
421
|
+
|
|
422
|
+
next unless path.include?(::File.dirname(object[:path]))
|
|
423
|
+
|
|
424
|
+
files << object[:path]
|
|
425
|
+
|
|
426
|
+
end
|
|
427
|
+
ensure
|
|
428
|
+
# Reload everything.
|
|
429
|
+
if Facter.respond_to? :loadfacts
|
|
430
|
+
Facter.loadfacts
|
|
431
|
+
elsif Facter.respond_to? :load
|
|
432
|
+
Facter.load
|
|
433
|
+
else
|
|
434
|
+
raise Puppet::Error,
|
|
435
|
+
"You must upgrade your version of Facter to use centralized facts"
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
# This loads all existing facts and any new ones. We have to remove and
|
|
439
|
+
# reload because there's no way to unload specific facts.
|
|
440
|
+
loadfacts()
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
# Retrieve the plugins from the central server. We only have to load the
|
|
444
|
+
# changed plugins, because Puppet::Type loads plugins on demand.
|
|
445
|
+
def self.getplugins
|
|
446
|
+
path = Puppet[:pluginpath].split(":")
|
|
447
|
+
download(:dest => Puppet[:plugindest], :source => Puppet[:pluginsource],
|
|
448
|
+
:ignore => Puppet[:pluginsignore], :name => "plugin") do |object|
|
|
449
|
+
|
|
450
|
+
next unless path.include?(::File.dirname(object[:path]))
|
|
451
|
+
|
|
452
|
+
begin
|
|
453
|
+
Puppet.info "Reloading plugin %s" %
|
|
454
|
+
::File.basename(::File.basename(object[:path])).sub(".rb",'')
|
|
455
|
+
load object[:path]
|
|
456
|
+
rescue => detail
|
|
457
|
+
Puppet.warning "Could not reload plugin %s: %s" %
|
|
458
|
+
[object[:path], detail]
|
|
459
|
+
end
|
|
460
|
+
end
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
def self.loaddir(dir, type)
|
|
464
|
+
return unless FileTest.directory?(dir)
|
|
465
|
+
|
|
466
|
+
Dir.entries(dir).find_all { |e| e =~ /\.rb$/ }.each do |file|
|
|
467
|
+
fqfile = ::File.join(dir, file)
|
|
468
|
+
begin
|
|
469
|
+
Puppet.info "Loading #{type} %s" % ::File.basename(file.sub(".rb",''))
|
|
470
|
+
Timeout::timeout(self.timeout) do
|
|
471
|
+
load fqfile
|
|
472
|
+
end
|
|
473
|
+
rescue => detail
|
|
474
|
+
Puppet.warning "Could not load #{type} %s: %s" % [fqfile, detail]
|
|
475
|
+
end
|
|
476
|
+
end
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
def self.loadfacts
|
|
480
|
+
Puppet[:factpath].split(":").each do |dir|
|
|
481
|
+
loaddir(dir, "fact")
|
|
482
|
+
end
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
def self.timeout
|
|
486
|
+
@timeout = Puppet[:configtimeout]
|
|
487
|
+
case @timeout
|
|
488
|
+
when String:
|
|
489
|
+
if @timeout =~ /^\d+$/
|
|
490
|
+
@timeout = Integer(@timeout)
|
|
491
|
+
else
|
|
492
|
+
raise ArgumentError, "Configuration timeout must be an integer"
|
|
493
|
+
end
|
|
494
|
+
when Integer: # nothing
|
|
495
|
+
else
|
|
496
|
+
raise ArgumentError, "Configuration timeout must be an integer"
|
|
497
|
+
end
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
# Send off the transaction report.
|
|
501
|
+
def report(transaction)
|
|
502
|
+
begin
|
|
503
|
+
report = transaction.generate_report()
|
|
504
|
+
if Puppet[:rrdgraph] == true
|
|
505
|
+
report.graph()
|
|
506
|
+
end
|
|
507
|
+
reportclient().report(report)
|
|
508
|
+
rescue => detail
|
|
509
|
+
Puppet.err "Reporting failed: %s" % detail
|
|
510
|
+
end
|
|
511
|
+
end
|
|
512
|
+
|
|
513
|
+
def reportclient
|
|
514
|
+
unless defined? @reportclient
|
|
515
|
+
@reportclient = Puppet::Network::Client.report.new(
|
|
516
|
+
:Server => Puppet[:reportserver]
|
|
517
|
+
)
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
@reportclient
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
loadfacts()
|
|
524
|
+
|
|
525
|
+
private
|
|
526
|
+
|
|
527
|
+
# Have the facts changed since we last compiled?
|
|
528
|
+
def facts_changed?(facts)
|
|
529
|
+
oldfacts = Puppet::Util::Storage.cache(:configuration)[:facts]
|
|
530
|
+
newfacts = facts
|
|
531
|
+
if oldfacts == newfacts
|
|
532
|
+
return false
|
|
533
|
+
else
|
|
534
|
+
# unless oldfacts
|
|
535
|
+
# puts "no old facts"
|
|
536
|
+
# return true
|
|
537
|
+
# end
|
|
538
|
+
# newfacts.keys.each do |k|
|
|
539
|
+
# unless newfacts[k] == oldfacts[k]
|
|
540
|
+
# puts "%s: %s vs %s" % [k, newfacts[k], oldfacts[k]]
|
|
541
|
+
# end
|
|
542
|
+
# end
|
|
543
|
+
return true
|
|
544
|
+
end
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
# Actually retrieve the configuration, either from the server or from a
|
|
548
|
+
# local master.
|
|
549
|
+
def get_actual_config(facts)
|
|
550
|
+
if @local
|
|
551
|
+
return get_local_config(facts)
|
|
552
|
+
else
|
|
553
|
+
begin
|
|
554
|
+
Timeout::timeout(self.class.timeout) do
|
|
555
|
+
return get_remote_config(facts)
|
|
556
|
+
end
|
|
557
|
+
rescue Timeout::Error
|
|
558
|
+
Puppet.err "Configuration retrieval timed out"
|
|
559
|
+
return nil
|
|
560
|
+
end
|
|
561
|
+
end
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
# Retrieve a configuration from a local master.
|
|
565
|
+
def get_local_config(facts)
|
|
566
|
+
# If we're local, we don't have to do any of the conversion
|
|
567
|
+
# stuff.
|
|
568
|
+
objects = @driver.getconfig(facts, "yaml")
|
|
569
|
+
@compile_time = Time.now
|
|
570
|
+
|
|
571
|
+
if objects == ""
|
|
572
|
+
raise Puppet::Error, "Could not retrieve configuration"
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
return objects
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
# Retrieve a config from a remote master.
|
|
579
|
+
def get_remote_config(facts)
|
|
580
|
+
textobjects = ""
|
|
581
|
+
|
|
582
|
+
textfacts = CGI.escape(YAML.dump(facts))
|
|
583
|
+
|
|
584
|
+
benchmark(:debug, "Retrieved configuration") do
|
|
585
|
+
# error handling for this is done in the network client
|
|
586
|
+
begin
|
|
587
|
+
textobjects = @driver.getconfig(textfacts, "yaml")
|
|
588
|
+
begin
|
|
589
|
+
textobjects = CGI.unescape(textobjects)
|
|
590
|
+
rescue => detail
|
|
591
|
+
raise Puppet::Error, "Could not CGI.unescape configuration"
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
rescue => detail
|
|
595
|
+
Puppet.err "Could not retrieve configuration: %s" % detail
|
|
596
|
+
|
|
597
|
+
unless Puppet[:usecacheonfailure]
|
|
598
|
+
@objects = nil
|
|
599
|
+
Puppet.warning "Not using cache on failed configuration"
|
|
600
|
+
return
|
|
601
|
+
end
|
|
602
|
+
end
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
fromcache = false
|
|
606
|
+
if textobjects == ""
|
|
607
|
+
unless textobjects = self.retrievecache
|
|
608
|
+
raise Puppet::Error.new(
|
|
609
|
+
"Cannot connect to server and there is no cached configuration"
|
|
610
|
+
)
|
|
611
|
+
end
|
|
612
|
+
Puppet.warning "Could not get config; using cached copy"
|
|
613
|
+
fromcache = true
|
|
614
|
+
else
|
|
615
|
+
@compile_time = Time.now
|
|
616
|
+
Puppet::Util::Storage.cache(:configuration)[:facts] = facts
|
|
617
|
+
Puppet::Util::Storage.cache(:configuration)[:compile_time] = @compile_time
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
begin
|
|
621
|
+
objects = YAML.load(textobjects)
|
|
622
|
+
rescue => detail
|
|
623
|
+
raise Puppet::Error,
|
|
624
|
+
"Could not understand configuration: %s" %
|
|
625
|
+
detail.to_s
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
if @cache and ! fromcache
|
|
629
|
+
self.cache(textobjects)
|
|
630
|
+
end
|
|
631
|
+
|
|
632
|
+
return objects
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
def lockfile
|
|
636
|
+
unless defined?(@lockfile)
|
|
637
|
+
@lockfile = Puppet::Util::Pidlock.new(Puppet[:puppetdlockfile])
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
@lockfile
|
|
641
|
+
end
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
# $Id: master.rb 2435 2007-04-30 16:19:37Z luke $
|