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
@@ -1,9 +1,9 @@
|
|
1
1
|
# unlike the other client classes (again, this design sucks) this class
|
2
2
|
# is basically just a proxy class -- it calls its methods on the driver
|
3
3
|
# and that's about it
|
4
|
-
class Puppet::Client::ProxyClient < Puppet::Client
|
4
|
+
class Puppet::Network::Client::ProxyClient < Puppet::Network::Client
|
5
5
|
def self.mkmethods
|
6
|
-
interface =
|
6
|
+
interface = self.handler.interface
|
7
7
|
namespace = interface.prefix
|
8
8
|
|
9
9
|
|
@@ -25,4 +25,4 @@ class Puppet::Client::ProxyClient < Puppet::Client
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
# $Id: proxy.rb
|
28
|
+
# $Id: proxy.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -1,12 +1,9 @@
|
|
1
|
-
class Puppet::Client::
|
2
|
-
@
|
3
|
-
|
4
|
-
# set up the appropriate interface methods
|
5
|
-
@handler = Puppet::Server::Report
|
1
|
+
class Puppet::Network::Client::Report < Puppet::Network::Client
|
2
|
+
@handler = Puppet::Network::Handler.handler(:report)
|
6
3
|
|
7
4
|
def initialize(hash = {})
|
8
5
|
if hash.include?(:Report)
|
9
|
-
hash[:Report] =
|
6
|
+
hash[:Report] = self.class.handler.new
|
10
7
|
end
|
11
8
|
|
12
9
|
super(hash)
|
@@ -31,4 +28,4 @@ class Puppet::Client::Reporter < Puppet::Client
|
|
31
28
|
end
|
32
29
|
end
|
33
30
|
|
34
|
-
# $Id:
|
31
|
+
# $Id: report.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -1,17 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
@handler = Puppet::Server::PElement
|
5
|
-
|
1
|
+
# The client for interacting with remote Puppet agents to query and modify
|
2
|
+
# remote system state.
|
3
|
+
class Puppet::Network::Client::Resource < Puppet::Network::Client
|
6
4
|
def apply(bucket)
|
7
|
-
|
8
5
|
case bucket
|
9
6
|
when Puppet::TransObject
|
10
7
|
tmp = Puppet::TransBucket.new
|
11
8
|
tmp.push bucket
|
12
9
|
bucket = tmp
|
13
10
|
bucket.name = Facter["hostname"].value
|
14
|
-
bucket.type = "
|
11
|
+
bucket.type = "resource"
|
15
12
|
when Puppet::TransBucket
|
16
13
|
# nothing
|
17
14
|
else
|
@@ -28,7 +25,7 @@ class Puppet::Client::PElement < Puppet::Client
|
|
28
25
|
end
|
29
26
|
|
30
27
|
def describe(type, name, retrieve = false, ignore = false)
|
31
|
-
Puppet.info "Describing %s[%s]" % [type, name]
|
28
|
+
Puppet.info "Describing %s[%s]" % [type.to_s.capitalize, name]
|
32
29
|
text = @driver.describe(type, name, retrieve, ignore, "yaml")
|
33
30
|
|
34
31
|
object = nil
|
@@ -41,16 +38,6 @@ class Puppet::Client::PElement < Puppet::Client
|
|
41
38
|
return object
|
42
39
|
end
|
43
40
|
|
44
|
-
def initialize(hash = {})
|
45
|
-
if hash.include?(:PElementServer)
|
46
|
-
unless hash[:PElementServer].is_a?(Puppet::Server::PElement)
|
47
|
-
raise Puppet::DevError, "Must pass an actual PElement server object"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
super(hash)
|
52
|
-
end
|
53
|
-
|
54
41
|
def list(type, ignore = false, base = false)
|
55
42
|
bucket = @driver.list(type, ignore, base, "yaml")
|
56
43
|
|
@@ -62,4 +49,4 @@ class Puppet::Client::PElement < Puppet::Client
|
|
62
49
|
end
|
63
50
|
end
|
64
51
|
|
65
|
-
# $Id:
|
52
|
+
# $Id: resource.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Puppet::Network::Client::Runner < Puppet::Network::Client::ProxyClient
|
2
|
+
self.mkmethods
|
3
|
+
|
4
|
+
def initialize(hash = {})
|
5
|
+
if hash.include?(:Runner)
|
6
|
+
hash[:Runner] = self.class.handler.new()
|
7
|
+
end
|
8
|
+
|
9
|
+
super(hash)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
# $Id: runner.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Puppet::Network # :nodoc:
|
2
|
+
# A struct-like class for passing around a client request. It's mostly
|
3
|
+
# just used for validation and authorization.
|
4
|
+
class ClientRequest
|
5
|
+
attr_accessor :name, :ip, :authenticated, :handler, :method
|
6
|
+
|
7
|
+
def authenticated?
|
8
|
+
self.authenticated
|
9
|
+
end
|
10
|
+
|
11
|
+
# A common way of talking about the full call. Individual servers
|
12
|
+
# are responsible for setting the values correctly, but this common
|
13
|
+
# format makes it possible to check rights.
|
14
|
+
def call
|
15
|
+
unless handler and method
|
16
|
+
raise ArgumentError, "Request is not set up; cannot build call"
|
17
|
+
end
|
18
|
+
|
19
|
+
[handler, method].join(".")
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(name, ip, authenticated)
|
23
|
+
@name, @ip, @authenticated = name, ip, authenticated
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
"%s(%s)" % [self.name, self.ip]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# $Id: client_request.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'puppet/util/subclass_loader'
|
2
|
+
|
3
|
+
module Puppet::Network
|
4
|
+
# The base class for the different handlers. The handlers are each responsible
|
5
|
+
# for separate xmlrpc namespaces.
|
6
|
+
class Handler
|
7
|
+
# This is so that the handlers can subclass just 'Handler', rather
|
8
|
+
# then having to specify the full class path.
|
9
|
+
Handler = self
|
10
|
+
attr_accessor :server
|
11
|
+
|
12
|
+
extend Puppet::Util::SubclassLoader
|
13
|
+
extend Puppet::Util
|
14
|
+
|
15
|
+
handle_subclasses :handler, "puppet/network/handler"
|
16
|
+
|
17
|
+
# Return the xmlrpc interface.
|
18
|
+
def self.interface
|
19
|
+
if defined? @interface
|
20
|
+
return @interface
|
21
|
+
else
|
22
|
+
raise Puppet::DevError, "Handler %s has no defined interface" %
|
23
|
+
self
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Create an empty init method with the same signature.
|
28
|
+
def initialize(hash = {})
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# $Id: handler.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -6,9 +6,7 @@ require 'xmlrpc/server'
|
|
6
6
|
# Much of this was taken from QuickCert:
|
7
7
|
# http://segment7.net/projects/ruby/QuickCert/
|
8
8
|
|
9
|
-
|
10
|
-
class Server
|
11
|
-
class CAError < Puppet::Error; end
|
9
|
+
class Puppet::Network::Handler
|
12
10
|
class CA < Handler
|
13
11
|
attr_reader :ca
|
14
12
|
|
@@ -44,9 +42,11 @@ class Server
|
|
44
42
|
end
|
45
43
|
return false
|
46
44
|
end
|
47
|
-
auth = Puppet::
|
45
|
+
auth = Puppet::Network::AuthStore.new
|
48
46
|
File.open(autosign) { |f|
|
49
47
|
f.each { |line|
|
48
|
+
next if line =~ /^\s*#/
|
49
|
+
next if line =~ /^\s*$/
|
50
50
|
auth.allow(line.chomp)
|
51
51
|
}
|
52
52
|
}
|
@@ -148,6 +148,5 @@ class Server
|
|
148
148
|
end
|
149
149
|
end
|
150
150
|
end
|
151
|
-
end
|
152
151
|
|
153
|
-
# $Id: ca.rb
|
152
|
+
# $Id: ca.rb 2259 2007-03-06 19:03:05Z luke $
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'digest/md5'
|
3
|
+
require 'puppet/external/base64'
|
4
|
+
|
5
|
+
class Puppet::Network::Handler # :nodoc:
|
6
|
+
class BucketError < RuntimeError; end
|
7
|
+
# Accept files and store them by md5 sum, returning the md5 sum back
|
8
|
+
# to the client. Alternatively, accept an md5 sum and return the
|
9
|
+
# associated content.
|
10
|
+
class FileBucket < Handler
|
11
|
+
@interface = XMLRPC::Service::Interface.new("puppetbucket") { |iface|
|
12
|
+
iface.add_method("string addfile(string, string)")
|
13
|
+
iface.add_method("string getfile(string)")
|
14
|
+
}
|
15
|
+
|
16
|
+
Puppet::Util.logmethods(self, true)
|
17
|
+
attr_reader :name, :path
|
18
|
+
|
19
|
+
# this doesn't work for relative paths
|
20
|
+
def self.oldpaths(base,md5)
|
21
|
+
return [
|
22
|
+
File.join(base, md5),
|
23
|
+
File.join(base, md5, "contents"),
|
24
|
+
File.join(base, md5, "paths")
|
25
|
+
]
|
26
|
+
end
|
27
|
+
|
28
|
+
# this doesn't work for relative paths
|
29
|
+
def self.paths(base,md5)
|
30
|
+
dir = File.join(md5[0..7].split(""))
|
31
|
+
basedir = File.join(base, dir, md5)
|
32
|
+
return [
|
33
|
+
basedir,
|
34
|
+
File.join(basedir, "contents"),
|
35
|
+
File.join(basedir, "paths")
|
36
|
+
]
|
37
|
+
end
|
38
|
+
|
39
|
+
# Should we check each file as it comes in to make sure the md5
|
40
|
+
# sums match? Defaults to false.
|
41
|
+
def conflict_check?
|
42
|
+
@confictchk
|
43
|
+
end
|
44
|
+
|
45
|
+
def initialize(hash)
|
46
|
+
if hash.include?(:ConflictCheck)
|
47
|
+
@conflictchk = hash[:ConflictCheck]
|
48
|
+
hash.delete(:ConflictCheck)
|
49
|
+
else
|
50
|
+
@conflictchk = false
|
51
|
+
end
|
52
|
+
|
53
|
+
if hash.include?(:Path)
|
54
|
+
@path = hash[:Path]
|
55
|
+
hash.delete(:Path)
|
56
|
+
else
|
57
|
+
if defined? Puppet
|
58
|
+
@path = Puppet[:bucketdir]
|
59
|
+
else
|
60
|
+
@path = File.expand_path("~/.filebucket")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
Puppet.config.use(:filebucket)
|
65
|
+
|
66
|
+
@name = "Filebucket[#{@path}]"
|
67
|
+
end
|
68
|
+
|
69
|
+
# Accept a file from a client and store it by md5 sum, returning
|
70
|
+
# the sum.
|
71
|
+
def addfile(contents, path, client = nil, clientip = nil)
|
72
|
+
if client
|
73
|
+
contents = Base64.decode64(contents)
|
74
|
+
end
|
75
|
+
md5 = Digest::MD5.hexdigest(contents)
|
76
|
+
|
77
|
+
bpath, bfile, pathpath = FileBucket.paths(@path,md5)
|
78
|
+
|
79
|
+
# If the file already exists, just return the md5 sum.
|
80
|
+
if FileTest.exists?(bfile)
|
81
|
+
# If verification is enabled, then make sure the text matches.
|
82
|
+
if conflict_check?
|
83
|
+
verify(contents, md5, bfile)
|
84
|
+
end
|
85
|
+
return md5
|
86
|
+
end
|
87
|
+
|
88
|
+
# Make the directories if necessary.
|
89
|
+
unless FileTest.directory?(bpath)
|
90
|
+
Puppet::Util.withumask(0007) do
|
91
|
+
FileUtils.mkdir_p(bpath)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Write the file to disk.
|
96
|
+
msg = "Adding %s(%s)" % [path, md5]
|
97
|
+
msg += " from #{client}" if client
|
98
|
+
self.info msg
|
99
|
+
|
100
|
+
# ...then just create the file
|
101
|
+
Puppet::Util.withumask(0007) do
|
102
|
+
File.open(bfile, File::WRONLY|File::CREAT, 0440) { |of|
|
103
|
+
of.print contents
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
# Write the path to the paths file.
|
108
|
+
add_path(path, pathpath)
|
109
|
+
|
110
|
+
return md5
|
111
|
+
end
|
112
|
+
|
113
|
+
# Return the contents associated with a given md5 sum.
|
114
|
+
def getfile(md5, client = nil, clientip = nil)
|
115
|
+
bpath, bfile, bpaths = FileBucket.paths(@path,md5)
|
116
|
+
|
117
|
+
unless FileTest.exists?(bfile)
|
118
|
+
# Try the old flat style.
|
119
|
+
bpath, bfile, bpaths = FileBucket.oldpaths(@path,md5)
|
120
|
+
unless FileTest.exists?(bfile)
|
121
|
+
return false
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
contents = nil
|
126
|
+
File.open(bfile) { |of|
|
127
|
+
contents = of.read
|
128
|
+
}
|
129
|
+
|
130
|
+
if client
|
131
|
+
return Base64.encode64(contents)
|
132
|
+
else
|
133
|
+
return contents
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def paths(md5)
|
138
|
+
self.class(@path, md5)
|
139
|
+
end
|
140
|
+
|
141
|
+
def to_s
|
142
|
+
self.name
|
143
|
+
end
|
144
|
+
|
145
|
+
private
|
146
|
+
|
147
|
+
# Add our path to the paths file if necessary.
|
148
|
+
def add_path(path, file)
|
149
|
+
if FileTest.exists?(file)
|
150
|
+
File.open(file) { |of|
|
151
|
+
return if of.readlines.collect { |l| l.chomp }.include?(path)
|
152
|
+
}
|
153
|
+
end
|
154
|
+
|
155
|
+
# if it's a new file, or if our path isn't in the file yet, add it
|
156
|
+
File.open(file, File::WRONLY|File::CREAT|File::APPEND) { |of|
|
157
|
+
of.puts path
|
158
|
+
}
|
159
|
+
end
|
160
|
+
|
161
|
+
# If conflict_check is enabled, verify that the passed text is
|
162
|
+
# the same as the text in our file.
|
163
|
+
def verify(content, md5, bfile)
|
164
|
+
curfile = File.read(bfile)
|
165
|
+
|
166
|
+
# If the contents don't match, then we've found a conflict.
|
167
|
+
# Unlikely, but quite bad.
|
168
|
+
if curfile != contents
|
169
|
+
raise(BucketError,
|
170
|
+
"Got passed new contents for sum %s" % md5, caller)
|
171
|
+
else
|
172
|
+
msg = "Got duplicate %s(%s)" % [path, md5]
|
173
|
+
msg += " from #{client}" if client
|
174
|
+
self.info msg
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# $Id: filebucket.rb 2348 2007-03-24 21:16:20Z luke $
|
@@ -1,75 +1,59 @@
|
|
1
1
|
require 'puppet'
|
2
|
+
require 'puppet/network/authstore'
|
2
3
|
require 'webrick/httpstatus'
|
3
4
|
require 'cgi'
|
5
|
+
require 'delegate'
|
4
6
|
|
5
|
-
|
6
|
-
class FileServerError < Puppet::Error; end
|
7
|
-
class Server
|
7
|
+
class Puppet::Network::Handler
|
8
|
+
class FileServerError < Puppet::Error; end
|
8
9
|
class FileServer < Handler
|
9
10
|
attr_accessor :local
|
10
11
|
|
11
|
-
Puppet.setdefaults("fileserver",
|
12
|
-
:fileserverconfig => ["$confdir/fileserver.conf",
|
13
|
-
"Where the fileserver configuration is stored."])
|
14
|
-
|
15
|
-
#CHECKPARAMS = %w{checksum type mode owner group}
|
16
12
|
CHECKPARAMS = [:mode, :type, :owner, :group, :checksum]
|
17
13
|
|
14
|
+
# Special filserver module for puppet's module system
|
15
|
+
MODULES = "modules"
|
16
|
+
|
18
17
|
@interface = XMLRPC::Service::Interface.new("fileserver") { |iface|
|
19
18
|
iface.add_method("string describe(string, string)")
|
20
19
|
iface.add_method("string list(string, string, boolean, array)")
|
21
20
|
iface.add_method("string retrieve(string, string)")
|
22
21
|
}
|
23
22
|
|
24
|
-
def
|
25
|
-
|
26
|
-
mount.warning "%s cannot access %s" %
|
27
|
-
[client, file]
|
28
|
-
raise Puppet::Server::AuthorizationError, "Cannot access %s" % mount
|
29
|
-
end
|
23
|
+
def self.params
|
24
|
+
CHECKPARAMS.dup
|
30
25
|
end
|
31
26
|
|
32
27
|
# Describe a given file. This returns all of the manageable aspects
|
33
28
|
# of that file.
|
34
|
-
def describe(
|
35
|
-
readconfig
|
36
|
-
|
29
|
+
def describe(url, links = :ignore, client = nil, clientip = nil)
|
37
30
|
links = links.intern if links.is_a? String
|
38
31
|
|
39
32
|
if links == :manage
|
40
|
-
raise Puppet::FileServerError, "Cannot currently copy links"
|
33
|
+
raise Puppet::Network::Handler::FileServerError, "Cannot currently copy links"
|
41
34
|
end
|
42
35
|
|
43
|
-
mount, path =
|
44
|
-
|
45
|
-
authcheck(file, mount, client, clientip)
|
36
|
+
mount, path = convert(url, client, clientip)
|
46
37
|
|
47
38
|
if client
|
48
|
-
mount.debug "Describing %s for %s" % [
|
49
|
-
end
|
50
|
-
|
51
|
-
sdir = nil
|
52
|
-
unless sdir = subdir(mount, path)
|
53
|
-
mount.notice "Could not find subdirectory %s" %
|
54
|
-
"//%s/%s" % [mount, path]
|
55
|
-
return ""
|
39
|
+
mount.debug "Describing %s for %s" % [url, client]
|
56
40
|
end
|
57
41
|
|
58
42
|
obj = nil
|
59
|
-
unless obj = mount.check(
|
43
|
+
unless obj = mount.check(path, links)
|
60
44
|
return ""
|
61
45
|
end
|
62
46
|
|
63
47
|
desc = []
|
64
48
|
CHECKPARAMS.each { |check|
|
65
|
-
if
|
66
|
-
unless
|
49
|
+
if property = obj.property(check)
|
50
|
+
unless property.is
|
67
51
|
mount.debug "Manually retrieving info for %s" % check
|
68
|
-
|
52
|
+
property.retrieve
|
69
53
|
end
|
70
|
-
desc <<
|
54
|
+
desc << property.is
|
71
55
|
else
|
72
|
-
if check == "checksum" and obj.
|
56
|
+
if check == "checksum" and obj.property(:type).is == "file"
|
73
57
|
mount.notice "File %s does not have data for %s" %
|
74
58
|
[obj.name, check]
|
75
59
|
end
|
@@ -80,16 +64,6 @@ class Server
|
|
80
64
|
return desc.join("\t")
|
81
65
|
end
|
82
66
|
|
83
|
-
# Deal with ignore parameters.
|
84
|
-
def handleignore(children, path, ignore)
|
85
|
-
ignore.each { |ignore|
|
86
|
-
Dir.glob(File.join(path,ignore), File::FNM_DOTMATCH) { |match|
|
87
|
-
children.delete(File.basename(match))
|
88
|
-
}
|
89
|
-
}
|
90
|
-
return children
|
91
|
-
end
|
92
|
-
|
93
67
|
# Create a new fileserving module.
|
94
68
|
def initialize(hash = {})
|
95
69
|
@mounts = {}
|
@@ -104,14 +78,12 @@ class Server
|
|
104
78
|
if hash[:Config] == false
|
105
79
|
@noreadconfig = true
|
106
80
|
else
|
107
|
-
@config =
|
81
|
+
@config = Puppet::Util::LoadedFile.new(
|
82
|
+
hash[:Config] || Puppet[:fileserverconfig]
|
83
|
+
)
|
108
84
|
@noreadconfig = false
|
109
85
|
end
|
110
86
|
|
111
|
-
@configtimeout = hash[:ConfigTimeout] || 60
|
112
|
-
@configstamp = nil
|
113
|
-
@congigstatted = nil
|
114
|
-
|
115
87
|
if hash.include?(:Mount)
|
116
88
|
@passedconfig = true
|
117
89
|
unless hash[:Mount].is_a?(Hash)
|
@@ -126,35 +98,26 @@ class Server
|
|
126
98
|
}
|
127
99
|
else
|
128
100
|
@passedconfig = false
|
129
|
-
readconfig
|
101
|
+
readconfig(false) # don't check the file the first time.
|
130
102
|
end
|
131
103
|
end
|
132
104
|
|
133
105
|
# List a specific directory's contents.
|
134
|
-
def list(
|
135
|
-
|
136
|
-
mount, path = splitpath(dir)
|
137
|
-
|
138
|
-
authcheck(dir, mount, client, clientip)
|
106
|
+
def list(url, links = :ignore, recurse = false, ignore = false, client = nil, clientip = nil)
|
107
|
+
mount, path = convert(url, client, clientip)
|
139
108
|
|
140
109
|
if client
|
141
|
-
mount.debug "Listing %s for %s" % [
|
142
|
-
end
|
143
|
-
|
144
|
-
subdir = nil
|
145
|
-
unless subdir = subdir(mount, path)
|
146
|
-
mount.notice "Could not find subdirectory %s" %
|
147
|
-
"%s:%s" % [mount, path]
|
148
|
-
return ""
|
110
|
+
mount.debug "Listing %s for %s" % [url, client]
|
149
111
|
end
|
150
112
|
|
151
113
|
obj = nil
|
152
|
-
unless FileTest.exists?(
|
114
|
+
unless FileTest.exists?(path)
|
153
115
|
return ""
|
154
116
|
end
|
155
117
|
|
156
|
-
|
157
|
-
|
118
|
+
# We pass two paths here, but reclist internally changes one
|
119
|
+
# of the arguments when called internally.
|
120
|
+
desc = reclist(mount, path, path, recurse, ignore)
|
158
121
|
|
159
122
|
if desc.length == 0
|
160
123
|
mount.notice "Got no information on //%s/%s" %
|
@@ -166,6 +129,10 @@ class Server
|
|
166
129
|
sub.join("\t")
|
167
130
|
}.join("\n")
|
168
131
|
end
|
132
|
+
|
133
|
+
def local?
|
134
|
+
self.local
|
135
|
+
end
|
169
136
|
|
170
137
|
# Mount a new directory with a name.
|
171
138
|
def mount(path, name)
|
@@ -179,51 +146,118 @@ class Server
|
|
179
146
|
end
|
180
147
|
end
|
181
148
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
149
|
+
# Let the mounts do their own error-checking.
|
150
|
+
@mounts[name] = Mount.new(name, path)
|
151
|
+
@mounts[name].info "Mounted %s" % path
|
152
|
+
|
153
|
+
return @mounts[name]
|
154
|
+
end
|
155
|
+
|
156
|
+
# Retrieve a file from the local disk and pass it to the remote
|
157
|
+
# client.
|
158
|
+
def retrieve(url, links = :ignore, client = nil, clientip = nil)
|
159
|
+
links = links.intern if links.is_a? String
|
160
|
+
|
161
|
+
mount, path = convert(url, client, clientip)
|
162
|
+
|
163
|
+
if client
|
164
|
+
mount.info "Sending %s to %s" % [url, client]
|
165
|
+
end
|
166
|
+
|
167
|
+
unless FileTest.exists?(path)
|
168
|
+
return ""
|
169
|
+
end
|
170
|
+
|
171
|
+
links = links.intern if links.is_a? String
|
172
|
+
|
173
|
+
if links == :ignore and FileTest.symlink?(path)
|
174
|
+
return ""
|
175
|
+
end
|
176
|
+
|
177
|
+
str = nil
|
178
|
+
if links == :manage
|
179
|
+
raise Puppet::Error, "Cannot copy links yet."
|
189
180
|
else
|
190
|
-
|
181
|
+
str = File.read(path)
|
182
|
+
end
|
183
|
+
|
184
|
+
if @local
|
185
|
+
return str
|
186
|
+
else
|
187
|
+
return CGI.escape(str)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def umount(name)
|
192
|
+
@mounts.delete(name) if @mounts.include? name
|
193
|
+
end
|
194
|
+
|
195
|
+
private
|
196
|
+
|
197
|
+
def authcheck(file, mount, client, clientip)
|
198
|
+
# If we're local, don't bother passing in information.
|
199
|
+
if local?
|
200
|
+
client = nil
|
201
|
+
clientip = nil
|
202
|
+
end
|
203
|
+
unless mount.allowed?(client, clientip)
|
204
|
+
mount.warning "%s cannot access %s" %
|
205
|
+
[client, file]
|
206
|
+
raise Puppet::AuthorizationError, "Cannot access %s" % mount
|
191
207
|
end
|
192
208
|
end
|
193
209
|
|
210
|
+
def convert(url, client, clientip)
|
211
|
+
readconfig
|
212
|
+
|
213
|
+
url = URI.unescape(url)
|
214
|
+
|
215
|
+
mount, stub = splitpath(url, client)
|
216
|
+
|
217
|
+
authcheck(url, mount, client, clientip)
|
218
|
+
|
219
|
+
path = nil
|
220
|
+
unless path = mount.subdir(stub, client)
|
221
|
+
mount.notice "Could not find subdirectory %s" %
|
222
|
+
"//%s/%s" % [mount, stub]
|
223
|
+
return ""
|
224
|
+
end
|
225
|
+
|
226
|
+
return mount, path
|
227
|
+
end
|
228
|
+
|
229
|
+
# Deal with ignore parameters.
|
230
|
+
def handleignore(children, path, ignore)
|
231
|
+
ignore.each { |ignore|
|
232
|
+
Dir.glob(File.join(path,ignore), File::FNM_DOTMATCH) { |match|
|
233
|
+
children.delete(File.basename(match))
|
234
|
+
}
|
235
|
+
}
|
236
|
+
return children
|
237
|
+
end
|
238
|
+
|
194
239
|
# Read the configuration file.
|
195
|
-
def readconfig
|
240
|
+
def readconfig(check = true)
|
196
241
|
return if @noreadconfig
|
197
242
|
|
198
|
-
if
|
199
|
-
|
200
|
-
if Time.now - @configstatted > @configtimeout
|
201
|
-
@configstatted = Time.now
|
202
|
-
tmp = File.stat(@config).ctime
|
203
|
-
|
204
|
-
if tmp == @configstamp
|
205
|
-
return
|
206
|
-
end
|
207
|
-
else
|
208
|
-
return
|
209
|
-
end
|
210
|
-
end
|
243
|
+
if check and ! @config.changed?
|
244
|
+
return
|
211
245
|
end
|
212
246
|
|
213
247
|
newmounts = {}
|
214
248
|
begin
|
215
|
-
File.open(@config) { |f|
|
249
|
+
File.open(@config.file) { |f|
|
216
250
|
mount = nil
|
217
251
|
count = 1
|
218
252
|
f.each { |line|
|
219
253
|
case line
|
220
254
|
when /^\s*#/: next # skip comments
|
221
255
|
when /^\s*$/: next # skip blank lines
|
222
|
-
when /\[(
|
256
|
+
when /\[([-\w]+)\]/:
|
223
257
|
name = $1
|
224
258
|
if newmounts.include?(name)
|
225
259
|
raise FileServerError, "%s is already mounted at %s" %
|
226
|
-
[newmounts[name], name]
|
260
|
+
[newmounts[name], name], count, @config.file
|
227
261
|
end
|
228
262
|
mount = Mount.new(name)
|
229
263
|
newmounts[name] = mount
|
@@ -232,12 +266,16 @@ class Server
|
|
232
266
|
value = $2
|
233
267
|
case var
|
234
268
|
when "path":
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
269
|
+
if mount.name == MODULES
|
270
|
+
Puppet.warning "The '#{MODULES}' module can not have a path. Ignoring attempt to set it"
|
271
|
+
else
|
272
|
+
begin
|
273
|
+
mount.path = value
|
274
|
+
rescue FileServerError => detail
|
275
|
+
Puppet.err "Removing mount %s: %s" %
|
276
|
+
[mount.name, detail]
|
277
|
+
newmounts.delete(mount.name)
|
278
|
+
end
|
241
279
|
end
|
242
280
|
when "allow":
|
243
281
|
value.split(/\s*,\s*/).each { |val|
|
@@ -245,8 +283,8 @@ class Server
|
|
245
283
|
mount.info "allowing %s access" % val
|
246
284
|
mount.allow(val)
|
247
285
|
rescue AuthStoreError => detail
|
248
|
-
raise FileServerError,
|
249
|
-
|
286
|
+
raise FileServerError.new(detail.to_s,
|
287
|
+
count, @config.file)
|
250
288
|
end
|
251
289
|
}
|
252
290
|
when "deny":
|
@@ -255,16 +293,17 @@ class Server
|
|
255
293
|
mount.info "denying %s access" % val
|
256
294
|
mount.deny(val)
|
257
295
|
rescue AuthStoreError => detail
|
258
|
-
raise FileServerError,
|
259
|
-
|
296
|
+
raise FileServerError.new(detail.to_s,
|
297
|
+
count, @config.file)
|
260
298
|
end
|
261
299
|
}
|
262
300
|
else
|
263
|
-
raise FileServerError,
|
264
|
-
|
301
|
+
raise FileServerError.new("Invalid argument '%s'" % var,
|
302
|
+
count, @config.file)
|
265
303
|
end
|
266
304
|
else
|
267
|
-
raise FileServerError
|
305
|
+
raise FileServerError.new("Invalid line '%s'" % line.chomp,
|
306
|
+
count, @config.file)
|
268
307
|
end
|
269
308
|
count += 1
|
270
309
|
}
|
@@ -280,72 +319,22 @@ class Server
|
|
280
319
|
# Puppet.err "FileServer error: %s" % detail
|
281
320
|
end
|
282
321
|
|
322
|
+
unless newmounts[MODULES]
|
323
|
+
mount = Mount.new(MODULES)
|
324
|
+
mount.allow("*")
|
325
|
+
newmounts[MODULES] = mount
|
326
|
+
end
|
327
|
+
|
283
328
|
# Verify each of the mounts are valid.
|
284
329
|
# We let the check raise an error, so that it can raise an error
|
285
330
|
# pointing to the specific problem.
|
286
331
|
newmounts.each { |name, mount|
|
287
|
-
mount.valid?
|
332
|
+
unless mount.valid?
|
333
|
+
raise FileServerError, "No path specified for mount %s" %
|
334
|
+
name
|
335
|
+
end
|
288
336
|
}
|
289
337
|
@mounts = newmounts
|
290
|
-
|
291
|
-
@configstamp = File.stat(@config).ctime
|
292
|
-
@configstatted = Time.now
|
293
|
-
end
|
294
|
-
|
295
|
-
# Retrieve a file from the local disk and pass it to the remote
|
296
|
-
# client.
|
297
|
-
def retrieve(file, links = :ignore, client = nil, clientip = nil)
|
298
|
-
readconfig
|
299
|
-
links = links.intern if links.is_a? String
|
300
|
-
mount, path = splitpath(file)
|
301
|
-
|
302
|
-
authcheck(file, mount, client, clientip)
|
303
|
-
|
304
|
-
if client
|
305
|
-
mount.info "Sending %s to %s" % [file, client]
|
306
|
-
end
|
307
|
-
|
308
|
-
fpath = nil
|
309
|
-
if path
|
310
|
-
fpath = File.join(mount.path, path)
|
311
|
-
else
|
312
|
-
fpath = mount.path
|
313
|
-
end
|
314
|
-
|
315
|
-
unless FileTest.exists?(fpath)
|
316
|
-
return ""
|
317
|
-
end
|
318
|
-
|
319
|
-
links = links.intern if links.is_a? String
|
320
|
-
|
321
|
-
if links == :ignore and FileTest.symlink?(fpath)
|
322
|
-
return ""
|
323
|
-
end
|
324
|
-
|
325
|
-
str = nil
|
326
|
-
if links == :manage
|
327
|
-
raise Puppet::Error, "Cannot copy links yet."
|
328
|
-
else
|
329
|
-
str = File.read(fpath)
|
330
|
-
end
|
331
|
-
|
332
|
-
if @local
|
333
|
-
return str
|
334
|
-
else
|
335
|
-
return CGI.escape(str)
|
336
|
-
end
|
337
|
-
end
|
338
|
-
|
339
|
-
private
|
340
|
-
|
341
|
-
# Convert from the '/mount/path' form to the real path on disk.
|
342
|
-
def expand_mount(name, mount)
|
343
|
-
# Note that the user could have passed a path with multiple /'s
|
344
|
-
# in it, and we are likely to result in multiples, so we have to
|
345
|
-
# get rid of all of them.
|
346
|
-
name.sub(/\/#{mount.name}/, mount.path).gsub(%r{/+}, '/').sub(
|
347
|
-
%r{/$}, ''
|
348
|
-
)
|
349
338
|
end
|
350
339
|
|
351
340
|
# Recursively list the directory. FIXME This should be using
|
@@ -390,26 +379,23 @@ class Server
|
|
390
379
|
end
|
391
380
|
|
392
381
|
# Split the path into the separate mount point and path.
|
393
|
-
def splitpath(dir)
|
382
|
+
def splitpath(dir, client)
|
394
383
|
# the dir is based on one of the mounts
|
395
384
|
# so first retrieve the mount path
|
396
385
|
mount = nil
|
397
386
|
path = nil
|
398
|
-
if dir =~ %r{/(
|
399
|
-
|
400
|
-
path = dir.sub(%r{/#{
|
401
|
-
|
402
|
-
unless @mounts.include?(mount)
|
403
|
-
raise FileServerError, "Fileserver module '%s' not mounted" % mount
|
404
|
-
end
|
387
|
+
if dir =~ %r{/([-\w]+)/?}
|
388
|
+
tmp = $1
|
389
|
+
path = dir.sub(%r{/#{tmp}/?}, '')
|
405
390
|
|
406
|
-
|
407
|
-
|
408
|
-
|
391
|
+
mod = Puppet::Module::find(tmp)
|
392
|
+
if mod
|
393
|
+
mount = @mounts[MODULES].copy(mod, mod.files)
|
394
|
+
else
|
395
|
+
unless mount = @mounts[tmp]
|
396
|
+
raise FileServerError, "Fileserver module '%s' not mounted" % tmp
|
397
|
+
end
|
409
398
|
end
|
410
|
-
|
411
|
-
# And now replace the name with the actual object.
|
412
|
-
mount = @mounts[mount]
|
413
399
|
else
|
414
400
|
raise FileServerError, "Fileserver error: Invalid path '%s'" % dir
|
415
401
|
end
|
@@ -424,20 +410,6 @@ class Server
|
|
424
410
|
return mount, path
|
425
411
|
end
|
426
412
|
|
427
|
-
# Retrieve a specific directory relative to a mount point.
|
428
|
-
def subdir(mount, dir)
|
429
|
-
basedir = mount.path
|
430
|
-
|
431
|
-
dirname = nil
|
432
|
-
if dir
|
433
|
-
dirname = File.join(basedir, dir.split("/").join(File::SEPARATOR))
|
434
|
-
else
|
435
|
-
dirname = basedir
|
436
|
-
end
|
437
|
-
|
438
|
-
dirname
|
439
|
-
end
|
440
|
-
|
441
413
|
def to_s
|
442
414
|
"fileserver"
|
443
415
|
end
|
@@ -445,8 +417,8 @@ class Server
|
|
445
417
|
# A simple class for wrapping mount points. Instances of this class
|
446
418
|
# don't know about the enclosing object; they're mainly just used for
|
447
419
|
# authorization.
|
448
|
-
class Mount < AuthStore
|
449
|
-
attr_reader :
|
420
|
+
class Mount < Puppet::Network::AuthStore
|
421
|
+
attr_reader :name
|
450
422
|
|
451
423
|
Puppet::Util.logmethods(self, true)
|
452
424
|
|
@@ -475,9 +447,50 @@ class Server
|
|
475
447
|
return obj
|
476
448
|
end
|
477
449
|
|
478
|
-
# Create
|
450
|
+
# Create a map for a specific client.
|
451
|
+
def clientmap(client)
|
452
|
+
{
|
453
|
+
"h" => client.sub(/\..*$/, ""),
|
454
|
+
"H" => client,
|
455
|
+
"d" => client.sub(/[^.]+\./, "") # domain name
|
456
|
+
}
|
457
|
+
end
|
458
|
+
|
459
|
+
# Replace % patterns as appropriate.
|
460
|
+
def expand(path, client = nil)
|
461
|
+
# This map should probably be moved into a method.
|
462
|
+
map = nil
|
463
|
+
|
464
|
+
if client
|
465
|
+
map = clientmap(client)
|
466
|
+
else
|
467
|
+
Puppet.notice "No client; expanding '%s' with local host" %
|
468
|
+
path
|
469
|
+
# Else, use the local information
|
470
|
+
map = localmap()
|
471
|
+
end
|
472
|
+
path.gsub(/%(.)/) do |v|
|
473
|
+
key = $1
|
474
|
+
if key == "%"
|
475
|
+
"%"
|
476
|
+
else
|
477
|
+
map[key] || v
|
478
|
+
end
|
479
|
+
end
|
480
|
+
end
|
481
|
+
|
482
|
+
# Do we have any patterns in our path, yo?
|
483
|
+
def expandable?
|
484
|
+
if defined? @expandable
|
485
|
+
@expandable
|
486
|
+
else
|
487
|
+
false
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
491
|
+
# Create out object. It must have a name.
|
479
492
|
def initialize(name, path = nil)
|
480
|
-
unless name =~ %r{
|
493
|
+
unless name =~ %r{^[-\w]+$}
|
481
494
|
raise FileServerError, "Invalid name format '%s'" % name
|
482
495
|
end
|
483
496
|
@name = name
|
@@ -488,12 +501,6 @@ class Server
|
|
488
501
|
@path = nil
|
489
502
|
end
|
490
503
|
|
491
|
-
@comp = Puppet.type(:component).create(
|
492
|
-
:name => "mount[#{name}]"
|
493
|
-
)
|
494
|
-
#@comp.type = "mount"
|
495
|
-
#@comp.name = name
|
496
|
-
|
497
504
|
super()
|
498
505
|
end
|
499
506
|
|
@@ -510,8 +517,6 @@ class Server
|
|
510
517
|
:name => path,
|
511
518
|
:check => CHECKPARAMS
|
512
519
|
)
|
513
|
-
|
514
|
-
@comp.push(obj)
|
515
520
|
end
|
516
521
|
|
517
522
|
if links == :manage
|
@@ -526,36 +531,89 @@ class Server
|
|
526
531
|
return obj
|
527
532
|
end
|
528
533
|
|
534
|
+
# Cache this manufactured map, since if it's used it's likely
|
535
|
+
# to get used a lot.
|
536
|
+
def localmap
|
537
|
+
unless defined? @@localmap
|
538
|
+
@@localmap = {
|
539
|
+
"h" => Facter.value("hostname"),
|
540
|
+
"H" => [Facter.value("hostname"),
|
541
|
+
Facter.value("domain")].join("."),
|
542
|
+
"d" => Facter.value("domain")
|
543
|
+
}
|
544
|
+
end
|
545
|
+
@@localmap
|
546
|
+
end
|
547
|
+
|
548
|
+
# Return the path as appropriate, expanding as necessary.
|
549
|
+
def path(client = nil)
|
550
|
+
if expandable?
|
551
|
+
return expand(@path, client)
|
552
|
+
else
|
553
|
+
return @path
|
554
|
+
end
|
555
|
+
end
|
556
|
+
|
529
557
|
# Set the path.
|
530
558
|
def path=(path)
|
531
|
-
|
532
|
-
|
559
|
+
# FIXME: For now, just don't validate paths with replacement
|
560
|
+
# patterns in them.
|
561
|
+
if path =~ /%./
|
562
|
+
# Mark that we're expandable.
|
563
|
+
@expandable = true
|
564
|
+
else
|
565
|
+
unless FileTest.exists?(path)
|
566
|
+
raise FileServerError, "%s does not exist" % path
|
567
|
+
end
|
568
|
+
unless FileTest.directory?(path)
|
569
|
+
raise FileServerError, "%s is not a directory" % path
|
570
|
+
end
|
571
|
+
unless FileTest.readable?(path)
|
572
|
+
raise FileServerError, "%s is not readable" % path
|
573
|
+
end
|
574
|
+
@expandable = false
|
533
575
|
end
|
534
576
|
@path = path
|
535
577
|
end
|
536
578
|
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
579
|
+
# Retrieve a specific directory relative to a mount point.
|
580
|
+
# If they pass in a client, then expand as necessary.
|
581
|
+
def subdir(dir = nil, client = nil)
|
582
|
+
basedir = self.path(client)
|
583
|
+
|
584
|
+
dirname = if dir
|
585
|
+
File.join(basedir, dir.split("/").join(File::SEPARATOR))
|
586
|
+
else
|
587
|
+
basedir
|
588
|
+
end
|
589
|
+
|
590
|
+
dirname
|
544
591
|
end
|
545
592
|
|
546
|
-
def
|
593
|
+
def to_s
|
594
|
+
"mount[#{@name}]"
|
547
595
|
end
|
548
596
|
|
549
597
|
# Verify our configuration is valid. This should really check to
|
550
598
|
# make sure at least someone will be allowed, but, eh.
|
551
599
|
def valid?
|
552
|
-
|
553
|
-
|
600
|
+
if name == MODULES
|
601
|
+
return @path.nil?
|
602
|
+
else
|
603
|
+
return ! @path.nil?
|
554
604
|
end
|
555
605
|
end
|
606
|
+
|
607
|
+
# Return a new mount with the same properties as +self+, except
|
608
|
+
# with a different name and path.
|
609
|
+
def copy(name, path)
|
610
|
+
result = self.clone
|
611
|
+
result.path = path
|
612
|
+
result.instance_variable_set(:@name, name)
|
613
|
+
return result
|
614
|
+
end
|
556
615
|
end
|
557
616
|
end
|
558
617
|
end
|
559
|
-
end
|
560
618
|
|
561
|
-
# $Id: fileserver.rb
|
619
|
+
# $Id: fileserver.rb 2434 2007-04-30 15:57:57Z luke $
|