puppet 0.18.4 → 0.22.4
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/CHANGELOG +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,129 @@
|
|
1
|
+
require 'puppet/sslcertificates'
|
2
|
+
require 'openssl'
|
3
|
+
require 'puppet/external/base64'
|
4
|
+
|
5
|
+
require 'xmlrpc/client'
|
6
|
+
require 'yaml'
|
7
|
+
|
8
|
+
module Puppet::Network
|
9
|
+
class ClientError < Puppet::Error; end
|
10
|
+
class XMLRPCClientError < Puppet::Error; end
|
11
|
+
class XMLRPCClient < ::XMLRPC::Client
|
12
|
+
attr_accessor :puppet_server, :puppet_port
|
13
|
+
@clients = {}
|
14
|
+
|
15
|
+
class << self
|
16
|
+
include Puppet::Util
|
17
|
+
include Puppet::Util::ClassGen
|
18
|
+
end
|
19
|
+
|
20
|
+
# Create a netclient for each handler
|
21
|
+
def self.mkclient(handler)
|
22
|
+
interface = handler.interface
|
23
|
+
namespace = interface.prefix
|
24
|
+
|
25
|
+
# Create a subclass for every client type. This is
|
26
|
+
# so that all of the methods are on their own class,
|
27
|
+
# so that they namespaces can define the same methods if
|
28
|
+
# they want.
|
29
|
+
constant = handler.name.to_s.capitalize
|
30
|
+
name = namespace.downcase
|
31
|
+
newclient = genclass(name, :hash => @clients,
|
32
|
+
:constant => constant)
|
33
|
+
|
34
|
+
interface.methods.each { |ary|
|
35
|
+
method = ary[0]
|
36
|
+
if public_method_defined?(method)
|
37
|
+
raise Puppet::DevError, "Method %s is already defined" %
|
38
|
+
method
|
39
|
+
end
|
40
|
+
newclient.send(:define_method,method) { |*args|
|
41
|
+
Puppet.debug "Calling %s.%s" % [namespace, method]
|
42
|
+
begin
|
43
|
+
call("%s.%s" % [namespace, method.to_s],*args)
|
44
|
+
rescue OpenSSL::SSL::SSLError => detail
|
45
|
+
raise XMLRPCClientError,
|
46
|
+
"Certificates were not trusted: %s" % detail
|
47
|
+
rescue ::XMLRPC::FaultException => detail
|
48
|
+
#Puppet.err "Could not call %s.%s: %s" %
|
49
|
+
# [namespace, method, detail.faultString]
|
50
|
+
#raise XMLRPCClientError,
|
51
|
+
# "XMLRPC Error: %s" % detail.faultString
|
52
|
+
raise XMLRPCClientError, detail.faultString
|
53
|
+
rescue Errno::ECONNREFUSED => detail
|
54
|
+
msg = "Could not connect to %s on port %s" %
|
55
|
+
[@host, @port]
|
56
|
+
raise XMLRPCClientError, msg
|
57
|
+
rescue SocketError => detail
|
58
|
+
Puppet.err "Could not find server %s: %s" %
|
59
|
+
[@puppet_server, detail.to_s]
|
60
|
+
error = XMLRPCClientError.new(
|
61
|
+
"Could not find server %s" % @puppet_server
|
62
|
+
)
|
63
|
+
error.set_backtrace detail.backtrace
|
64
|
+
raise error
|
65
|
+
rescue => detail
|
66
|
+
Puppet.err "Could not call %s.%s: %s" %
|
67
|
+
[namespace, method, detail.inspect]
|
68
|
+
error = XMLRPCClientError.new(detail.to_s)
|
69
|
+
error.set_backtrace detail.backtrace
|
70
|
+
raise error
|
71
|
+
end
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
return newclient
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.handler_class(handler)
|
79
|
+
@clients[handler] || self.mkclient(handler)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Use cert information from a Puppet client to set up the http object.
|
83
|
+
def cert_setup(client)
|
84
|
+
unless FileTest.exists?(Puppet[:localcacert])
|
85
|
+
raise Puppet::SSLCertificates::Support::MissingCertificate,
|
86
|
+
"Could not find ca certificate %s" % Puppet[:localcacert]
|
87
|
+
end
|
88
|
+
@http.ca_file = Puppet[:localcacert]
|
89
|
+
store = OpenSSL::X509::Store.new
|
90
|
+
store.add_file Puppet[:localcacert]
|
91
|
+
store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
|
92
|
+
@http.cert_store = store
|
93
|
+
@http.cert = client.cert
|
94
|
+
@http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
95
|
+
@http.key = client.key
|
96
|
+
end
|
97
|
+
|
98
|
+
def initialize(hash = {})
|
99
|
+
hash[:Path] ||= "/RPC2"
|
100
|
+
hash[:Server] ||= Puppet[:server]
|
101
|
+
hash[:Port] ||= Puppet[:masterport]
|
102
|
+
|
103
|
+
@puppet_server = hash[:Server]
|
104
|
+
@puppet_port = hash[:Port]
|
105
|
+
|
106
|
+
super(
|
107
|
+
hash[:Server],
|
108
|
+
hash[:Path],
|
109
|
+
hash[:Port],
|
110
|
+
nil, # proxy_host
|
111
|
+
nil, # proxy_port
|
112
|
+
nil, # user
|
113
|
+
nil, # password
|
114
|
+
true, # use_ssl
|
115
|
+
120 # a two minute timeout, instead of 30 seconds
|
116
|
+
)
|
117
|
+
end
|
118
|
+
|
119
|
+
def local
|
120
|
+
false
|
121
|
+
end
|
122
|
+
|
123
|
+
def local?
|
124
|
+
false
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# $Id: client.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'puppet/network/authorization'
|
2
|
+
require 'xmlrpc/server'
|
3
|
+
|
4
|
+
# Just silly.
|
5
|
+
class ::XMLRPC::FaultException
|
6
|
+
def to_s
|
7
|
+
self.message
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module Puppet::Network
|
12
|
+
# Most of our subclassing is just so that we can get
|
13
|
+
# access to information from the request object, like
|
14
|
+
# the client name and IP address.
|
15
|
+
module XMLRPCProcessor
|
16
|
+
include Puppet::Network::Authorization
|
17
|
+
|
18
|
+
ERR_UNAUTHORIZED = 30
|
19
|
+
|
20
|
+
def add_handler(interface, handler)
|
21
|
+
@loadedhandlers << interface.prefix
|
22
|
+
super(interface, handler)
|
23
|
+
end
|
24
|
+
|
25
|
+
def handler_loaded?(handler)
|
26
|
+
@loadedhandlers.include?(handler.to_s)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Convert our data and client request into xmlrpc calls, and verify
|
30
|
+
# they're authorized and such-like. This method differs from the
|
31
|
+
# default in that it expects a ClientRequest object in addition to the
|
32
|
+
# data.
|
33
|
+
def process(data, request)
|
34
|
+
call, params = parser().parseMethodCall(data)
|
35
|
+
params << request.name << request.ip
|
36
|
+
handler, method = call.split(".")
|
37
|
+
request.handler = handler
|
38
|
+
request.method = method
|
39
|
+
begin
|
40
|
+
verify(request)
|
41
|
+
rescue InvalidClientRequest => detail
|
42
|
+
raise ::XMLRPC::FaultException.new(ERR_UNAUTHORIZED, detail.to_s)
|
43
|
+
end
|
44
|
+
handle(request.call, *params)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
# Provide error handling for method calls.
|
50
|
+
def protect_service(obj, *args)
|
51
|
+
begin
|
52
|
+
obj.call(*args)
|
53
|
+
rescue ::XMLRPC::FaultException
|
54
|
+
raise
|
55
|
+
rescue Puppet::AuthorizationError => detail
|
56
|
+
Puppet.err "Permission denied: %s" % detail.to_s
|
57
|
+
raise ::XMLRPC::FaultException.new(
|
58
|
+
1, detail.to_s
|
59
|
+
)
|
60
|
+
rescue Puppet::Error => detail
|
61
|
+
if Puppet[:trace]
|
62
|
+
puts detail.backtrace
|
63
|
+
end
|
64
|
+
Puppet.err detail.to_s
|
65
|
+
error = ::XMLRPC::FaultException.new(
|
66
|
+
1, detail.to_s
|
67
|
+
)
|
68
|
+
error.set_backtrace detail.backtrace
|
69
|
+
raise error
|
70
|
+
rescue => detail
|
71
|
+
if Puppet[:trace]
|
72
|
+
puts detail.backtrace
|
73
|
+
end
|
74
|
+
Puppet.err "Could not call: %s" % detail.to_s
|
75
|
+
error = ::XMLRPC::FaultException.new(1, detail.to_s)
|
76
|
+
error.set_backtrace detail.backtrace
|
77
|
+
raise error
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Set up our service hook and init our handler list.
|
82
|
+
def setup_processor
|
83
|
+
@loadedhandlers = []
|
84
|
+
self.set_service_hook do |obj, *args|
|
85
|
+
protect_service(obj, *args)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# $Id: processor.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'xmlrpc/server'
|
2
|
+
require 'puppet/network/authorization'
|
3
|
+
require 'puppet/network/xmlrpc/processor'
|
4
|
+
|
5
|
+
module Puppet::Network
|
6
|
+
# Most of our subclassing is just so that we can get
|
7
|
+
# access to information from the request object, like
|
8
|
+
# the client name and IP address.
|
9
|
+
class XMLRPCServer < ::XMLRPC::BasicServer
|
10
|
+
include Puppet::Util
|
11
|
+
include Puppet::Network::XMLRPCProcessor
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
super()
|
15
|
+
setup_processor()
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# $Id: server.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'xmlrpc/server'
|
2
|
+
require 'puppet/network/authorization'
|
3
|
+
require 'puppet/network/xmlrpc/processor'
|
4
|
+
|
5
|
+
module Puppet::Network::XMLRPC
|
6
|
+
class ServletError < RuntimeError; end
|
7
|
+
class WEBrickServlet < ::XMLRPC::WEBrickServlet
|
8
|
+
include Puppet::Network::XMLRPCProcessor
|
9
|
+
|
10
|
+
# This is a hackish way to avoid an auth message every time we have a
|
11
|
+
# normal operation
|
12
|
+
def self.log(msg)
|
13
|
+
unless defined? @logs
|
14
|
+
@logs = {}
|
15
|
+
end
|
16
|
+
if @logs.include?(msg)
|
17
|
+
@logs[msg] += 1
|
18
|
+
else
|
19
|
+
Puppet.info msg
|
20
|
+
@logs[msg] = 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Accept a list of handlers and register them all.
|
25
|
+
def initialize(handlers)
|
26
|
+
# the servlet base class does not consume any arguments
|
27
|
+
# and its BasicServer base class only accepts a 'class_delim'
|
28
|
+
# option which won't change in Puppet at all
|
29
|
+
# thus, we don't need to pass any args to our base class,
|
30
|
+
# and we can consume them all ourselves
|
31
|
+
super()
|
32
|
+
|
33
|
+
setup_processor()
|
34
|
+
|
35
|
+
# Set up each of the passed handlers.
|
36
|
+
handlers.each do |handler|
|
37
|
+
add_handler(handler.class.interface, handler)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Handle the actual request. We can't use the super() method, because
|
42
|
+
# we need to pass a ClientRequest object to process() so we can do
|
43
|
+
# authorization. It's the only way to stay thread-safe.
|
44
|
+
def service(request, response)
|
45
|
+
if @valid_ip
|
46
|
+
raise WEBrick::HTTPStatus::Forbidden unless @valid_ip.any? { |ip| request.peeraddr[3] =~ ip }
|
47
|
+
end
|
48
|
+
|
49
|
+
if request.request_method != "POST"
|
50
|
+
raise WEBrick::HTTPStatus::MethodNotAllowed,
|
51
|
+
"unsupported method `#{request.request_method}'."
|
52
|
+
end
|
53
|
+
|
54
|
+
if parse_content_type(request['Content-type']).first != "text/xml"
|
55
|
+
raise WEBrick::HTTPStatus::BadRequest
|
56
|
+
end
|
57
|
+
|
58
|
+
length = (request['Content-length'] || 0).to_i
|
59
|
+
|
60
|
+
raise WEBrick::HTTPStatus::LengthRequired unless length > 0
|
61
|
+
|
62
|
+
data = request.body
|
63
|
+
|
64
|
+
if data.nil? or data.size != length
|
65
|
+
raise WEBrick::HTTPStatus::BadRequest
|
66
|
+
end
|
67
|
+
|
68
|
+
resp = process(data, client_request(request))
|
69
|
+
if resp.nil? or resp.size <= 0
|
70
|
+
raise WEBrick::HTTPStatus::InternalServerError
|
71
|
+
end
|
72
|
+
|
73
|
+
response.status = 200
|
74
|
+
response['Content-Length'] = resp.size
|
75
|
+
response['Content-Type'] = "text/xml; charset=utf-8"
|
76
|
+
response.body = resp
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
# Generate a ClientRequest object for later validation.
|
82
|
+
def client_request(request)
|
83
|
+
if peer = request.peeraddr
|
84
|
+
client = peer[2]
|
85
|
+
clientip = peer[3]
|
86
|
+
else
|
87
|
+
raise ::XMLRPC::FaultException.new(
|
88
|
+
ERR_UNCAUGHT_EXCEPTION,
|
89
|
+
"Could not retrieve client information"
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
# If they have a certificate (which will almost always be true)
|
94
|
+
# then we get the hostname from the cert, instead of via IP
|
95
|
+
# info
|
96
|
+
valid = false
|
97
|
+
if cert = request.client_cert
|
98
|
+
nameary = cert.subject.to_a.find { |ary|
|
99
|
+
ary[0] == "CN"
|
100
|
+
}
|
101
|
+
|
102
|
+
if nameary.nil?
|
103
|
+
Puppet.warning "Could not retrieve server name from cert"
|
104
|
+
else
|
105
|
+
unless client == nameary[1]
|
106
|
+
Puppet.debug "Overriding %s with cert name %s" %
|
107
|
+
[client, nameary[1]]
|
108
|
+
client = nameary[1]
|
109
|
+
end
|
110
|
+
valid = true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
info = Puppet::Network::ClientRequest.new(client, clientip, valid)
|
115
|
+
|
116
|
+
return info
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# $Id: webrick_servlet.rb 2259 2007-03-06 19:03:05Z luke $
|
data/lib/puppet/parameter.rb
CHANGED
@@ -1,431 +1,475 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
1
|
+
require 'puppet/util/methodhelper'
|
2
|
+
|
3
|
+
class Puppet::Parameter < Puppet::Element
|
4
|
+
include Puppet::Util::MethodHelper
|
5
|
+
class << self
|
6
|
+
attr_reader :validater, :munger, :name, :default, :required_features
|
7
|
+
attr_accessor :metaparam, :element
|
8
|
+
|
9
|
+
# Define the default value for a given parameter or parameter. This
|
10
|
+
# means that 'nil' is an invalid default value. This defines
|
11
|
+
# the 'default' instance method.
|
12
|
+
def defaultto(value = nil, &block)
|
13
|
+
if block
|
14
|
+
define_method(:default, &block)
|
15
|
+
else
|
16
|
+
if value.nil?
|
17
|
+
raise Puppet::DevError,
|
18
|
+
"Either a default value or block must be provided"
|
19
19
|
end
|
20
|
+
define_method(:default) do value end
|
20
21
|
end
|
22
|
+
end
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
unless defined? @addeddocvals
|
28
|
-
unless values.empty?
|
29
|
-
if @aliasvalues.empty?
|
30
|
-
@doc += " Valid values are ``" +
|
31
|
-
values.join("``, ``") + "``."
|
32
|
-
else
|
33
|
-
@doc += " Valid values are "
|
34
|
-
|
35
|
-
@doc += values.collect do |value|
|
36
|
-
ary = @aliasvalues.find do |name, val|
|
37
|
-
val == value
|
38
|
-
end
|
39
|
-
if ary
|
40
|
-
"``%s`` (also called ``%s``)" % [value, ary[0]]
|
41
|
-
else
|
42
|
-
"``#{value}``"
|
43
|
-
end
|
44
|
-
end.join(", ") + "."
|
45
|
-
end
|
46
|
-
end
|
24
|
+
# Return a documentation string. If there are valid values,
|
25
|
+
# then tack them onto the string.
|
26
|
+
def doc
|
27
|
+
@doc ||= ""
|
47
28
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
29
|
+
unless defined? @addeddocvals
|
30
|
+
unless values.empty?
|
31
|
+
if @aliasvalues.empty?
|
32
|
+
@doc += " Valid values are ``" +
|
33
|
+
values.join("``, ``") + "``."
|
34
|
+
else
|
35
|
+
@doc += " Valid values are "
|
36
|
+
|
37
|
+
@doc += values.collect do |value|
|
38
|
+
ary = @aliasvalues.find do |name, val|
|
39
|
+
val == value
|
40
|
+
end
|
41
|
+
if ary
|
42
|
+
"``%s`` (also called ``%s``)" % [value, ary[0]]
|
43
|
+
else
|
44
|
+
"``#{value}``"
|
45
|
+
end
|
46
|
+
end.join(", ") + "."
|
57
47
|
end
|
58
|
-
@addeddocvals = true
|
59
48
|
end
|
60
49
|
|
61
|
-
@
|
62
|
-
|
50
|
+
if defined? @parameterregexes and ! @parameterregexes.empty?
|
51
|
+
regs = @parameterregexes
|
52
|
+
if @parameterregexes.is_a? Hash
|
53
|
+
regs = @parameterregexes.keys
|
54
|
+
end
|
55
|
+
unless regs.empty?
|
56
|
+
@doc += " Values can also match ``" +
|
57
|
+
regs.join("``, ``") + "``."
|
58
|
+
end
|
59
|
+
end
|
63
60
|
|
64
|
-
|
65
|
-
|
66
|
-
undef_method :default
|
61
|
+
if f = self.required_features
|
62
|
+
@doc += " Requires features %s." % f.flatten.collect { |f| f.to_s }.join(" ")
|
67
63
|
end
|
64
|
+
@addeddocvals = true
|
68
65
|
end
|
69
66
|
|
70
|
-
|
71
|
-
|
72
|
-
@doc = str
|
73
|
-
end
|
67
|
+
@doc
|
68
|
+
end
|
74
69
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
@parameterregexes = []
|
70
|
+
def nodefault
|
71
|
+
if public_method_defined? :default
|
72
|
+
undef_method :default
|
79
73
|
end
|
74
|
+
end
|
80
75
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
# but if I directly call the block then it gets bound to the
|
86
|
-
# class's context, not the instance's, thus the two methods,
|
87
|
-
# instead of just one.
|
88
|
-
define_method(:unsafe_munge, &block)
|
89
|
-
|
90
|
-
define_method(:munge) do |*args|
|
91
|
-
begin
|
92
|
-
unsafe_munge(*args)
|
93
|
-
rescue Puppet::Error => detail
|
94
|
-
Puppet.debug "Reraising %s" % detail
|
95
|
-
raise
|
96
|
-
rescue => detail
|
97
|
-
if Puppet[:debug]
|
98
|
-
puts detail.backtrace
|
99
|
-
end
|
100
|
-
raise Puppet::DevError, "Munging failed for class %s: %s" %
|
101
|
-
[self.name, detail]
|
102
|
-
end
|
103
|
-
end
|
104
|
-
#@munger = block
|
105
|
-
end
|
76
|
+
# Store documentation for this parameter.
|
77
|
+
def desc(str)
|
78
|
+
@doc = str
|
79
|
+
end
|
106
80
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
81
|
+
def initvars
|
82
|
+
@parametervalues = []
|
83
|
+
@aliasvalues = {}
|
84
|
+
@parameterregexes = []
|
85
|
+
end
|
112
86
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
87
|
+
# This is how we munge the value. Basically, this is our
|
88
|
+
# opportunity to convert the value from one form into another.
|
89
|
+
def munge(&block)
|
90
|
+
# I need to wrap the unsafe version in begin/rescue parameterments,
|
91
|
+
# but if I directly call the block then it gets bound to the
|
92
|
+
# class's context, not the instance's, thus the two methods,
|
93
|
+
# instead of just one.
|
94
|
+
define_method(:unsafe_munge, &block)
|
95
|
+
|
96
|
+
define_method(:munge) do |*args|
|
97
|
+
begin
|
98
|
+
ret = unsafe_munge(*args)
|
99
|
+
rescue Puppet::Error => detail
|
100
|
+
Puppet.debug "Reraising %s" % detail
|
101
|
+
raise
|
102
|
+
rescue => detail
|
103
|
+
raise Puppet::DevError, "Munging failed for value %s in class %s: %s" %
|
104
|
+
[args.inspect, self.name, detail], detail.backtrace
|
119
105
|
end
|
120
|
-
end
|
121
106
|
|
122
|
-
|
123
|
-
|
124
|
-
@required = true
|
125
|
-
end
|
126
|
-
|
127
|
-
# Is this parameter required? Defaults to false.
|
128
|
-
def required?
|
129
|
-
if defined? @required
|
130
|
-
return @required
|
131
|
-
else
|
132
|
-
return false
|
107
|
+
if self.shadow
|
108
|
+
self.shadow.munge(*args)
|
133
109
|
end
|
110
|
+
ret
|
134
111
|
end
|
112
|
+
end
|
135
113
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
end
|
142
|
-
end
|
114
|
+
# Mark whether we're the namevar.
|
115
|
+
def isnamevar
|
116
|
+
@isnamevar = true
|
117
|
+
@required = true
|
118
|
+
end
|
143
119
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
begin
|
151
|
-
unsafe_validate(*args)
|
152
|
-
rescue ArgumentError, Puppet::Error, TypeError
|
153
|
-
raise
|
154
|
-
rescue => detail
|
155
|
-
if Puppet[:debug]
|
156
|
-
puts detail.backtrace
|
157
|
-
end
|
158
|
-
raise Puppet::DevError,
|
159
|
-
"Validate method failed for class %s: %s" %
|
160
|
-
[self.name, detail]
|
161
|
-
end
|
162
|
-
end
|
120
|
+
# Is this parameter the namevar? Defaults to false.
|
121
|
+
def isnamevar?
|
122
|
+
if defined? @isnamevar
|
123
|
+
return @isnamevar
|
124
|
+
else
|
125
|
+
return false
|
163
126
|
end
|
127
|
+
end
|
164
128
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
r = r[0] if r.is_a? Array # States use a hash here
|
170
|
-
r =~ value
|
171
|
-
}
|
172
|
-
end
|
129
|
+
# This parameter is required.
|
130
|
+
def isrequired
|
131
|
+
@required = true
|
132
|
+
end
|
173
133
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
when Symbol
|
181
|
-
if @parametervalues.include?(name)
|
182
|
-
Puppet.warning "%s already has a value for %s" %
|
183
|
-
[name, name]
|
184
|
-
end
|
185
|
-
@parametervalues << name
|
186
|
-
when Regexp
|
187
|
-
if @parameterregexes.include?(name)
|
188
|
-
Puppet.warning "%s already has a value for %s" %
|
189
|
-
[name, name]
|
190
|
-
end
|
191
|
-
@parameterregexes << name
|
192
|
-
else
|
193
|
-
raise ArgumentError, "Invalid value %s of type %s" %
|
194
|
-
[name, name.class]
|
195
|
-
end
|
196
|
-
}
|
134
|
+
# Is this parameter required? Defaults to false.
|
135
|
+
def required?
|
136
|
+
if defined? @required
|
137
|
+
return @required
|
138
|
+
else
|
139
|
+
return false
|
197
140
|
end
|
141
|
+
end
|
198
142
|
|
199
|
-
|
200
|
-
|
143
|
+
# Verify that we got a good value
|
144
|
+
def validate(&block)
|
145
|
+
#@validater = block
|
146
|
+
define_method(:unsafe_validate, &block)
|
147
|
+
|
148
|
+
define_method(:validate) do |*args|
|
149
|
+
begin
|
150
|
+
unsafe_validate(*args)
|
151
|
+
rescue ArgumentError, Puppet::Error, TypeError
|
152
|
+
raise
|
153
|
+
rescue => detail
|
201
154
|
raise Puppet::DevError,
|
202
|
-
"
|
155
|
+
"Validate method failed for class %s: %s" %
|
156
|
+
[self.name, detail], detail.backtrace
|
203
157
|
end
|
204
|
-
|
205
|
-
@aliasvalues[name] = other
|
206
158
|
end
|
159
|
+
end
|
207
160
|
|
208
|
-
|
209
|
-
|
210
|
-
|
161
|
+
# Does the value match any of our regexes?
|
162
|
+
def match?(value)
|
163
|
+
value = value.to_s unless value.is_a? String
|
164
|
+
@parameterregexes.find { |r|
|
165
|
+
r = r[0] if r.is_a? Array # Properties use a hash here
|
166
|
+
r =~ value
|
167
|
+
}
|
168
|
+
end
|
211
169
|
|
212
|
-
|
213
|
-
|
214
|
-
|
170
|
+
# Define a new value for our parameter.
|
171
|
+
def newvalues(*names)
|
172
|
+
names.each { |name|
|
173
|
+
name = name.intern if name.is_a? String
|
215
174
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
175
|
+
case name
|
176
|
+
when Symbol
|
177
|
+
if @parametervalues.include?(name)
|
178
|
+
Puppet.warning "%s already has a value for %s" %
|
179
|
+
[name, name]
|
180
|
+
end
|
181
|
+
@parametervalues << name
|
182
|
+
when Regexp
|
183
|
+
if @parameterregexes.include?(name)
|
184
|
+
Puppet.warning "%s already has a value for %s" %
|
185
|
+
[name, name]
|
186
|
+
end
|
187
|
+
@parameterregexes << name
|
223
188
|
else
|
224
|
-
|
189
|
+
raise ArgumentError, "Invalid value %s of type %s" %
|
190
|
+
[name, name.class]
|
225
191
|
end
|
226
|
-
|
192
|
+
}
|
227
193
|
end
|
228
194
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
195
|
+
def aliasvalue(name, other)
|
196
|
+
other = symbolize(other)
|
197
|
+
unless @parametervalues.include?(other)
|
198
|
+
raise Puppet::DevError,
|
199
|
+
"Cannot alias nonexistent value %s" % other
|
200
|
+
end
|
201
|
+
|
202
|
+
@aliasvalues[name] = other
|
236
203
|
end
|
237
204
|
|
238
|
-
|
239
|
-
|
240
|
-
|
205
|
+
def alias(name)
|
206
|
+
@aliasvalues[name]
|
207
|
+
end
|
241
208
|
|
242
|
-
|
209
|
+
def regexes
|
210
|
+
return @parameterregexes.dup
|
211
|
+
end
|
243
212
|
|
244
|
-
def
|
245
|
-
|
213
|
+
def required_features=(*args)
|
214
|
+
@required_features = args.flatten.collect { |a| a.to_s.downcase.intern }
|
246
215
|
end
|
247
216
|
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
217
|
+
# Return the list of valid values.
|
218
|
+
def values
|
219
|
+
#[@aliasvalues.keys, @parametervalues.keys].flatten
|
220
|
+
if @parametervalues.is_a? Array
|
221
|
+
return @parametervalues.dup
|
222
|
+
elsif @parametervalues.is_a? Hash
|
223
|
+
return @parametervalues.keys
|
252
224
|
else
|
253
|
-
|
225
|
+
return []
|
254
226
|
end
|
227
|
+
end
|
228
|
+
end
|
255
229
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
230
|
+
# Just a simple method to proxy instance methods to class methods
|
231
|
+
def self.proxymethods(*values)
|
232
|
+
values.each { |val|
|
233
|
+
define_method(val) do
|
234
|
+
self.class.send(val)
|
260
235
|
end
|
236
|
+
}
|
237
|
+
end
|
261
238
|
|
262
|
-
|
263
|
-
|
264
|
-
|
239
|
+
# And then define one of these proxies for each method in our
|
240
|
+
# ParamHandler class.
|
241
|
+
proxymethods("required?", "isnamevar?")
|
265
242
|
|
266
|
-
|
267
|
-
|
243
|
+
attr_accessor :parent
|
244
|
+
attr_reader :shadow
|
268
245
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
:source => self
|
280
|
-
)
|
246
|
+
def devfail(msg)
|
247
|
+
self.fail(Puppet::DevError, msg)
|
248
|
+
end
|
249
|
+
|
250
|
+
def fail(*args)
|
251
|
+
type = nil
|
252
|
+
if args[0].is_a?(Class)
|
253
|
+
type = args.shift
|
254
|
+
else
|
255
|
+
type = Puppet::Error
|
281
256
|
end
|
282
257
|
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
def name
|
288
|
-
return self.class.name
|
258
|
+
error = type.new(args.join(" "))
|
259
|
+
|
260
|
+
if defined? @parent and @parent and @parent.line
|
261
|
+
error.line = @parent.line
|
289
262
|
end
|
290
263
|
|
291
|
-
|
292
|
-
|
293
|
-
unless defined? @noop
|
294
|
-
@noop = false
|
295
|
-
end
|
296
|
-
tmp = @noop || self.parent.noop || Puppet[:noop] || false
|
297
|
-
#debug "noop is %s" % tmp
|
298
|
-
return tmp
|
264
|
+
if defined? @parent and @parent and @parent.file
|
265
|
+
error.file = @parent.file
|
299
266
|
end
|
300
267
|
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
268
|
+
raise error
|
269
|
+
end
|
270
|
+
|
271
|
+
# Basic parameter initialization.
|
272
|
+
def initialize(options = {})
|
273
|
+
options = symbolize_options(options)
|
274
|
+
if parent = options[:parent]
|
275
|
+
self.parent = parent
|
276
|
+
options.delete(:parent)
|
277
|
+
else
|
278
|
+
raise Puppet::DevError, "No parent set for %s" % self.class.name
|
305
279
|
end
|
306
280
|
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
# This parameter isn't using defined values to do its work.
|
311
|
-
return value
|
312
|
-
end
|
281
|
+
if ! self.metaparam? and klass = Puppet::Type.metaparamclass(self.class.name)
|
282
|
+
setup_shadow(klass)
|
283
|
+
end
|
313
284
|
|
314
|
-
|
315
|
-
|
316
|
-
intern = value.to_s.intern
|
317
|
-
|
318
|
-
# If it's a valid value, always return it as a symbol.
|
319
|
-
if self.class.values.include?(intern)
|
320
|
-
retval = intern
|
321
|
-
elsif other = self.class.alias(intern)
|
322
|
-
retval = other
|
323
|
-
elsif ary = self.class.match?(value)
|
324
|
-
retval = value
|
325
|
-
else
|
326
|
-
# If it passed the validation but is not a registered value,
|
327
|
-
# we just return it as is.
|
328
|
-
retval = value
|
329
|
-
end
|
285
|
+
set_options(options)
|
286
|
+
end
|
330
287
|
|
331
|
-
|
288
|
+
# Log a message using the parent's log level.
|
289
|
+
def log(msg)
|
290
|
+
unless @parent[:loglevel]
|
291
|
+
p @parent
|
292
|
+
self.devfail "Parent %s has no loglevel" %
|
293
|
+
@parent.name
|
332
294
|
end
|
295
|
+
Puppet::Util::Log.create(
|
296
|
+
:level => @parent[:loglevel],
|
297
|
+
:message => msg,
|
298
|
+
:source => self
|
299
|
+
)
|
300
|
+
end
|
333
301
|
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
302
|
+
# Is this parameter a metaparam?
|
303
|
+
def metaparam?
|
304
|
+
self.class.metaparam
|
305
|
+
end
|
338
306
|
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
newval = value
|
347
|
-
unless value.is_a?(Symbol)
|
348
|
-
newval = value.to_s.intern
|
349
|
-
end
|
307
|
+
# each parameter class must define the name() method, and parameter
|
308
|
+
# instances do not change that name this implicitly means that a given
|
309
|
+
# object can only have one parameter instance of a given parameter
|
310
|
+
# class
|
311
|
+
def name
|
312
|
+
return self.class.name
|
313
|
+
end
|
350
314
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
315
|
+
# for testing whether we should actually do anything
|
316
|
+
def noop
|
317
|
+
unless defined? @noop
|
318
|
+
@noop = false
|
319
|
+
end
|
320
|
+
tmp = @noop || self.parent.noop || Puppet[:noop] || false
|
321
|
+
#debug "noop is %s" % tmp
|
322
|
+
return tmp
|
323
|
+
end
|
356
324
|
|
357
|
-
|
358
|
-
|
359
|
-
|
325
|
+
# return the full path to us, for logging and rollback; not currently
|
326
|
+
# used
|
327
|
+
def pathbuilder
|
328
|
+
if defined? @parent and @parent
|
329
|
+
return [@parent.pathbuilder, self.name]
|
330
|
+
else
|
331
|
+
return [self.name]
|
332
|
+
end
|
333
|
+
end
|
360
334
|
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
335
|
+
# If the specified value is allowed, then munge appropriately.
|
336
|
+
munge do |value|
|
337
|
+
if self.class.values.empty? and self.class.regexes.empty?
|
338
|
+
# This parameter isn't using defined values to do its work.
|
339
|
+
return value
|
340
|
+
end
|
366
341
|
|
367
|
-
|
368
|
-
|
342
|
+
# We convert to a string and then a symbol so that things like
|
343
|
+
# booleans work as we expect.
|
344
|
+
intern = value.to_s.intern
|
345
|
+
|
346
|
+
# If it's a valid value, always return it as a symbol.
|
347
|
+
if self.class.values.include?(intern)
|
348
|
+
retval = intern
|
349
|
+
elsif other = self.class.alias(intern)
|
350
|
+
retval = other
|
351
|
+
elsif ary = self.class.match?(value)
|
352
|
+
retval = value
|
353
|
+
else
|
354
|
+
# If it passed the validation but is not a registered value,
|
355
|
+
# we just return it as is.
|
356
|
+
retval = value
|
369
357
|
end
|
370
358
|
|
371
|
-
|
372
|
-
|
359
|
+
retval
|
360
|
+
end
|
361
|
+
|
362
|
+
# Verify that the passed value is valid.
|
363
|
+
validate do |value|
|
364
|
+
vals = self.class.values
|
365
|
+
regs = self.class.regexes
|
366
|
+
|
367
|
+
if regs.is_a? Hash # this is true on properties
|
368
|
+
regs = regs.keys
|
369
|
+
end
|
370
|
+
if vals.empty? and regs.empty?
|
371
|
+
# This parameter isn't using defined values to do its work.
|
372
|
+
return
|
373
|
+
end
|
374
|
+
newval = value
|
375
|
+
unless value.is_a?(Symbol)
|
376
|
+
newval = value.to_s.intern
|
373
377
|
end
|
374
378
|
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
# can't seem to create a test in which this is a problem, but
|
384
|
-
# that doesn't mean it's not one.
|
385
|
-
if self.should
|
386
|
-
return self.should
|
387
|
-
else
|
388
|
-
return self.is
|
379
|
+
unless vals.include?(newval) or
|
380
|
+
self.class.alias(newval) or
|
381
|
+
self.class.match?(value) # We match the string, not the symbol
|
382
|
+
str = "Invalid '%s' value %s. " %
|
383
|
+
[self.class.name, value.inspect]
|
384
|
+
|
385
|
+
unless vals.empty?
|
386
|
+
str += "Valid values are %s. " % vals.join(", ")
|
389
387
|
end
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
388
|
+
|
389
|
+
unless regs.empty?
|
390
|
+
str += "Valid values match %s." % regs.collect { |r|
|
391
|
+
r.to_s
|
392
|
+
}.join(", ")
|
395
393
|
end
|
396
|
-
|
394
|
+
|
395
|
+
raise ArgumentError, str
|
397
396
|
end
|
397
|
+
end
|
398
398
|
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
399
|
+
def remove
|
400
|
+
@parent = nil
|
401
|
+
@shadow = nil
|
402
|
+
end
|
403
|
+
|
404
|
+
# This should only be called for parameters, but go ahead and make
|
405
|
+
# it possible to call for properties, too.
|
406
|
+
def value
|
407
|
+
if self.is_a?(Puppet::Property)
|
408
|
+
# We should return the 'is' value if there's not 'should'
|
409
|
+
# value. This might be bad, though, because the 'should'
|
410
|
+
# method knows whether to return an array or not and that info
|
411
|
+
# is not exposed, and the 'is' value could be a symbol. I
|
412
|
+
# can't seem to create a test in which this is a problem, but
|
413
|
+
# that doesn't mean it's not one.
|
414
|
+
if self.should
|
415
|
+
return self.should
|
416
|
+
else
|
417
|
+
return self.is
|
407
418
|
end
|
408
|
-
|
409
|
-
|
419
|
+
else
|
420
|
+
if defined? @value
|
421
|
+
return @value
|
422
|
+
else
|
423
|
+
return nil
|
410
424
|
end
|
425
|
+
end
|
426
|
+
end
|
411
427
|
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
428
|
+
# Store the value provided. All of the checking should possibly be
|
429
|
+
# late-binding (e.g., users might not exist when the value is assigned
|
430
|
+
# but might when it is asked for).
|
431
|
+
def value=(value)
|
432
|
+
# If we're a parameter, just hand the processing off to the should
|
433
|
+
# method.
|
434
|
+
if self.is_a?(Puppet::Property)
|
435
|
+
return self.should = value
|
436
|
+
end
|
437
|
+
if respond_to?(:validate)
|
438
|
+
validate(value)
|
416
439
|
end
|
417
440
|
|
418
|
-
|
419
|
-
|
420
|
-
if defined? @parent
|
421
|
-
s += ", @parent = %s)" % @parent
|
422
|
-
else
|
423
|
-
s += ")"
|
424
|
-
end
|
441
|
+
if respond_to?(:munge)
|
442
|
+
value = munge(value)
|
425
443
|
end
|
444
|
+
@value = value
|
445
|
+
end
|
426
446
|
|
427
|
-
|
428
|
-
|
447
|
+
def inspect
|
448
|
+
s = "Parameter(%s = %s" % [self.name, self.value || "nil"]
|
449
|
+
if defined? @parent
|
450
|
+
s += ", @parent = %s)" % @parent
|
451
|
+
else
|
452
|
+
s += ")"
|
429
453
|
end
|
430
454
|
end
|
455
|
+
|
456
|
+
# Retrieve the parent's provider. Some types don't have providers, in which
|
457
|
+
# case we return the parent object itself.
|
458
|
+
def provider
|
459
|
+
@parent.provider || @parent
|
460
|
+
end
|
461
|
+
|
462
|
+
# If there's a shadowing metaparam, instantiate it now.
|
463
|
+
# This allows us to create a property or parameter with the
|
464
|
+
# same name as a metaparameter, and the metaparam will only be
|
465
|
+
# stored as a shadow.
|
466
|
+
def setup_shadow(klass)
|
467
|
+
@shadow = klass.new(:parent => self.parent)
|
468
|
+
end
|
469
|
+
|
470
|
+
def to_s
|
471
|
+
s = "Parameter(%s)" % self.name
|
472
|
+
end
|
431
473
|
end
|
474
|
+
|
475
|
+
# $Id: parameter.rb 2414 2007-04-25 20:59:00Z luke $
|