puppet 3.1.1 → 3.2.0.rc1
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/CONTRIBUTING.md +2 -2
- data/Gemfile +32 -19
- data/README_DEVELOPER.md +332 -14
- data/Rakefile +9 -5
- data/ext/build_defaults.yaml +2 -3
- data/ext/debian/changelog.erb +6 -0
- data/ext/debian/control +6 -6
- data/ext/envpuppet +4 -4
- data/ext/project_data.yaml +1 -0
- data/ext/puppet-nm-dispatcher +13 -0
- data/ext/redhat/puppet.spec.erb +17 -0
- data/ext/suse/client.init +1 -1
- data/ext/systemd/puppetagent.service +2 -2
- data/ext/systemd/puppetmaster.service +2 -2
- data/lib/hiera/scope.rb +29 -11
- data/lib/hiera_puppet.rb +1 -3
- data/lib/puppet/agent.rb +3 -3
- data/lib/puppet/application.rb +2 -2
- data/lib/puppet/application/agent.rb +27 -12
- data/lib/puppet/application/apply.rb +11 -1
- data/lib/puppet/application/describe.rb +1 -1
- data/lib/puppet/application/doc.rb +13 -9
- data/lib/puppet/application/filebucket.rb +0 -1
- data/lib/puppet/application/kick.rb +1 -0
- data/lib/puppet/application/master.rb +16 -8
- data/lib/puppet/daemon.rb +19 -64
- data/lib/puppet/defaults.rb +61 -5
- data/lib/puppet/error.rb +15 -4
- data/lib/puppet/external/nagios/grammar.ry +1 -1
- data/lib/puppet/external/nagios/makefile +1 -1
- data/lib/puppet/external/nagios/parser.rb +185 -618
- data/lib/puppet/external/pson/pure/parser.rb +47 -1
- data/lib/puppet/face/certificate.rb +3 -3
- data/lib/puppet/face/module.rb +1 -1
- data/lib/puppet/face/module/changes.rb +3 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/node/clean.rb +5 -5
- data/lib/puppet/feature/base.rb +3 -1
- data/lib/puppet/feature/libuser.rb +8 -0
- data/lib/puppet/file_serving/fileset.rb +9 -1
- data/lib/puppet/forge.rb +28 -5
- data/lib/puppet/forge/errors.rb +34 -0
- data/lib/puppet/forge/repository.rb +1 -1
- data/lib/puppet/indirector.rb +4 -1
- data/lib/puppet/indirector/catalog/compiler.rb +37 -30
- data/lib/puppet/indirector/facts/inventory_active_record.rb +1 -0
- data/lib/puppet/indirector/indirection.rb +28 -15
- data/lib/puppet/indirector/rest.rb +18 -10
- data/lib/puppet/interface.rb +11 -4
- data/lib/puppet/interface/action.rb +1 -3
- data/lib/puppet/interface/action_builder.rb +0 -3
- data/lib/puppet/interface/action_manager.rb +0 -3
- data/lib/puppet/interface/face_collection.rb +0 -2
- data/lib/puppet/interface/option.rb +0 -2
- data/lib/puppet/interface/option_builder.rb +0 -2
- data/lib/puppet/interface/option_manager.rb +0 -2
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module_tool.rb +1 -0
- data/lib/puppet/module_tool/applications/application.rb +0 -3
- data/lib/puppet/module_tool/applications/builder.rb +8 -20
- data/lib/puppet/module_tool/applications/checksummer.rb +1 -1
- data/lib/puppet/module_tool/applications/installer.rb +1 -0
- data/lib/puppet/module_tool/applications/unpacker.rb +3 -11
- data/lib/puppet/module_tool/checksums.rb +1 -1
- data/lib/puppet/module_tool/errors/installer.rb +18 -1
- data/lib/puppet/module_tool/modulefile.rb +2 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +1 -1
- data/lib/puppet/module_tool/tar.rb +17 -0
- data/lib/puppet/module_tool/tar/gnu.rb +9 -0
- data/lib/puppet/module_tool/tar/mini.rb +39 -0
- data/lib/puppet/module_tool/tar/solaris.rb +5 -0
- data/lib/puppet/network/http.rb +1 -0
- data/lib/puppet/network/http/connection.rb +9 -23
- data/lib/puppet/network/http/handler.rb +38 -7
- data/lib/puppet/network/http/rack/rest.rb +14 -3
- data/lib/puppet/network/http/webrick.rb +3 -1
- data/lib/puppet/network/http/webrick/rest.rb +11 -2
- data/lib/puppet/node/environment.rb +3 -1
- data/lib/puppet/parameter.rb +32 -29
- data/lib/puppet/parameter/package_options.rb +1 -1
- data/lib/puppet/parameter/path.rb +1 -1
- data/lib/puppet/parameter/value.rb +1 -1
- data/lib/puppet/parameter/value_collection.rb +7 -3
- data/lib/puppet/parser/ast.rb +3 -1
- data/lib/puppet/parser/ast/arithmetic_operator.rb +56 -12
- data/lib/puppet/parser/ast/astarray.rb +1 -1
- data/lib/puppet/parser/ast/block_expression.rb +41 -0
- data/lib/puppet/parser/ast/function.rb +13 -2
- data/lib/puppet/parser/ast/lambda.rb +107 -0
- data/lib/puppet/parser/ast/leaf.rb +1 -2
- data/lib/puppet/parser/ast/method_call.rb +77 -0
- data/lib/puppet/parser/ast/vardef.rb +7 -0
- data/lib/puppet/parser/compiler.rb +27 -16
- data/lib/puppet/parser/e_parser_adapter.rb +120 -0
- data/lib/puppet/parser/files.rb +7 -6
- data/lib/puppet/parser/functions.rb +10 -8
- data/lib/puppet/parser/functions/collect.rb +43 -0
- data/lib/puppet/parser/functions/each.rb +96 -0
- data/lib/puppet/parser/functions/foreach.rb +96 -0
- data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
- data/lib/puppet/parser/functions/hiera.rb +20 -2
- data/lib/puppet/parser/functions/hiera_array.rb +21 -2
- data/lib/puppet/parser/functions/hiera_hash.rb +23 -2
- data/lib/puppet/parser/functions/hiera_include.rb +33 -2
- data/lib/puppet/parser/functions/inline_template.rb +4 -4
- data/lib/puppet/parser/functions/reduce.rb +74 -0
- data/lib/puppet/parser/functions/reject.rb +46 -0
- data/lib/puppet/parser/functions/select.rb +46 -0
- data/lib/puppet/parser/functions/slice.rb +96 -0
- data/lib/puppet/parser/functions/template.rb +2 -2
- data/lib/puppet/parser/grammar.ra +7 -4
- data/lib/puppet/parser/lexer.rb +10 -0
- data/lib/puppet/parser/methods.rb +69 -0
- data/lib/puppet/parser/parser.rb +855 -808
- data/lib/puppet/parser/parser_factory.rb +62 -0
- data/lib/puppet/parser/parser_support.rb +8 -2
- data/lib/puppet/parser/scope.rb +153 -47
- data/lib/puppet/parser/templatewrapper.rb +28 -21
- data/lib/puppet/parser/type_loader.rb +3 -1
- data/lib/puppet/pops.rb +40 -0
- data/lib/puppet/pops/adaptable.rb +190 -0
- data/lib/puppet/pops/adapters.rb +65 -0
- data/lib/puppet/pops/containment.rb +37 -0
- data/lib/puppet/pops/issues.rb +258 -0
- data/lib/puppet/pops/label_provider.rb +71 -0
- data/lib/puppet/pops/model/ast_transformer.rb +636 -0
- data/lib/puppet/pops/model/ast_tree_dumper.rb +378 -0
- data/lib/puppet/pops/model/factory.rb +804 -0
- data/lib/puppet/pops/model/model.rb +567 -0
- data/lib/puppet/pops/model/model_label_provider.rb +75 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +352 -0
- data/lib/puppet/pops/model/tree_dumper.rb +59 -0
- data/lib/puppet/pops/parser/egrammar.ra +723 -0
- data/lib/puppet/pops/parser/eparser.rb +2300 -0
- data/lib/puppet/pops/parser/grammar.ra +746 -0
- data/lib/puppet/pops/parser/lexer.rb +842 -0
- data/lib/puppet/pops/parser/makefile +13 -0
- data/lib/puppet/pops/parser/parser_support.rb +203 -0
- data/lib/puppet/pops/patterns.rb +35 -0
- data/lib/puppet/pops/utils.rb +104 -0
- data/lib/puppet/pops/validation.rb +297 -0
- data/lib/puppet/pops/validation/checker3_1.rb +551 -0
- data/lib/puppet/pops/validation/validator_factory_3_1.rb +41 -0
- data/lib/puppet/pops/visitable.rb +6 -0
- data/lib/puppet/pops/visitor.rb +50 -0
- data/lib/puppet/property.rb +37 -28
- data/lib/puppet/property/ensure.rb +2 -2
- data/lib/puppet/property/ordered_list.rb +1 -1
- data/lib/puppet/provider.rb +26 -30
- data/lib/puppet/provider/aixobject.rb +45 -44
- data/lib/puppet/provider/augeas/augeas.rb +0 -1
- data/lib/puppet/provider/confiner.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +107 -67
- data/lib/puppet/provider/group/groupadd.rb +59 -3
- data/lib/puppet/provider/interface/cisco.rb +4 -4
- data/lib/puppet/provider/mount/parsed.rb +1 -1
- data/lib/puppet/provider/nameservice.rb +22 -6
- data/lib/puppet/provider/nameservice/pw.rb +1 -1
- data/lib/puppet/provider/package/aix.rb +28 -4
- data/lib/puppet/provider/package/gem.rb +0 -2
- data/lib/puppet/provider/package/macports.rb +1 -1
- data/lib/puppet/provider/package/nim.rb +249 -4
- data/lib/puppet/provider/package/opkg.rb +77 -0
- data/lib/puppet/provider/package/pacman.rb +2 -2
- data/lib/puppet/provider/package/rpm.rb +30 -16
- data/lib/puppet/provider/package/yum.rb +3 -3
- data/lib/puppet/provider/parsedfile.rb +80 -3
- data/lib/puppet/provider/selmodule/semodule.rb +2 -2
- data/lib/puppet/provider/service/debian.rb +0 -4
- data/lib/puppet/provider/service/freebsd.rb +2 -2
- data/lib/puppet/provider/service/gentoo.rb +0 -9
- data/lib/puppet/provider/service/init.rb +27 -2
- data/lib/puppet/provider/service/launchd.rb +1 -1
- data/lib/puppet/provider/service/openwrt.rb +36 -0
- data/lib/puppet/provider/service/redhat.rb +0 -9
- data/lib/puppet/provider/service/src.rb +38 -4
- data/lib/puppet/provider/service/systemd.rb +2 -2
- data/lib/puppet/provider/service/upstart.rb +1 -8
- data/lib/puppet/provider/user/aix.rb +4 -10
- data/lib/puppet/provider/user/pw.rb +6 -10
- data/lib/puppet/provider/user/useradd.rb +129 -31
- data/lib/puppet/provider/vlan/cisco.rb +4 -4
- data/lib/puppet/reference/function.rb +2 -2
- data/lib/puppet/reference/indirection.rb +46 -5
- data/lib/puppet/reference/metaparameter.rb +2 -2
- data/lib/puppet/reports.rb +5 -5
- data/lib/puppet/reports/rrdgraph.rb +4 -4
- data/lib/puppet/reports/tagmail.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/type.rb +13 -11
- data/lib/puppet/scheduler.rb +16 -0
- data/lib/puppet/scheduler/job.rb +53 -0
- data/lib/puppet/scheduler/scheduler.rb +45 -0
- data/lib/puppet/scheduler/splay_job.rb +32 -0
- data/lib/puppet/scheduler/timer.rb +13 -0
- data/lib/puppet/settings/base_setting.rb +1 -1
- data/lib/puppet/simple_graph.rb +4 -4
- data/lib/puppet/ssl/base.rb +12 -2
- data/lib/puppet/ssl/certificate.rb +4 -1
- data/lib/puppet/ssl/certificate_request.rb +4 -1
- data/lib/puppet/ssl/certificate_revocation_list.rb +4 -1
- data/lib/puppet/ssl/configuration.rb +32 -0
- data/lib/puppet/ssl/host.rb +18 -21
- data/lib/puppet/ssl/key.rb +4 -1
- data/lib/puppet/ssl/validator.rb +116 -0
- data/lib/puppet/transaction.rb +1 -1
- data/lib/puppet/transaction/event.rb +3 -10
- data/lib/puppet/transaction/event_manager.rb +8 -1
- data/lib/puppet/transaction/report.rb +17 -16
- data/lib/puppet/type.rb +77 -69
- data/lib/puppet/type/cron.rb +20 -8
- data/lib/puppet/type/exec.rb +9 -3
- data/lib/puppet/type/file.rb +95 -21
- data/lib/puppet/type/file/content.rb +1 -1
- data/lib/puppet/type/file/mode.rb +7 -1
- data/lib/puppet/type/file/source.rb +2 -2
- data/lib/puppet/type/group.rb +11 -0
- data/lib/puppet/type/scheduled_task.rb +5 -1
- data/lib/puppet/type/service.rb +1 -1
- data/lib/puppet/type/ssh_authorized_key.rb +2 -2
- data/lib/puppet/type/user.rb +24 -6
- data/lib/puppet/util.rb +12 -2
- data/lib/puppet/util/classgen.rb +4 -4
- data/lib/puppet/util/colors.rb +55 -0
- data/lib/puppet/util/command_line/trollop.rb +4 -4
- data/lib/puppet/util/errors.rb +39 -3
- data/lib/puppet/util/fileparsing.rb +5 -0
- data/lib/puppet/util/filetype.rb +11 -9
- data/lib/puppet/util/instrumentation/instrumentable.rb +2 -2
- data/lib/puppet/util/libuser.conf +15 -0
- data/lib/puppet/util/libuser.rb +12 -0
- data/lib/puppet/util/monkey_patches.rb +48 -0
- data/lib/puppet/util/network_device.rb +1 -1
- data/lib/puppet/util/network_device/base.rb +2 -2
- data/lib/puppet/util/network_device/cisco/device.rb +29 -19
- data/lib/puppet/util/network_device/config.rb +5 -2
- data/lib/puppet/util/network_device/ipcalc.rb +1 -1
- data/lib/puppet/util/network_device/transport/ssh.rb +4 -3
- data/lib/puppet/util/network_device/transport/telnet.rb +4 -2
- data/lib/puppet/util/plugins.rb +4 -4
- data/lib/puppet/util/posix.rb +1 -1
- data/lib/puppet/util/profiler.rb +28 -0
- data/lib/puppet/util/profiler/logging.rb +47 -0
- data/lib/puppet/util/profiler/none.rb +8 -0
- data/lib/puppet/util/profiler/object_counts.rb +17 -0
- data/lib/puppet/util/profiler/wall_clock.rb +34 -0
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/rdoc/parser.rb +5 -5
- data/lib/puppet/util/ssl.rb +38 -0
- data/lib/puppet/util/subclass_loader.rb +1 -5
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/process.rb +3 -0
- data/lib/puppet/util/windows/root_certs.rb +86 -0
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +19 -0
- data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +18 -0
- data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +15 -0
- data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +4 -0
- data/spec/fixtures/integration/provider/cron/crontab/modify_entry +13 -0
- data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +15 -0
- data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +6 -0
- data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +12 -0
- data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +14 -0
- data/spec/fixtures/unit/pops/parser/lexer/aliastest.pp +16 -0
- data/spec/fixtures/unit/pops/parser/lexer/append.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +14 -0
- data/spec/fixtures/unit/pops/parser/lexer/arithmetic_expression.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/arraytrailingcomma.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +65 -0
- data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +15 -0
- data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +17 -0
- data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection.pp +10 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection_within_virtual_definitions.pp +20 -0
- data/spec/fixtures/unit/pops/parser/lexer/componentmetaparams.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +23 -0
- data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +17 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyclass.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyexec.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyifelse.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/falsevalues.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/fqdefinition.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/fqparents.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/funccomma.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/hash.pp +33 -0
- data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +12 -0
- data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +15 -0
- data/spec/fixtures/unit/pops/parser/lexer/multilinecomments.pp +10 -0
- data/spec/fixtures/unit/pops/parser/lexer/multipleclass.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +7 -0
- data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +13 -0
- data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/scopetest.pp +13 -0
- data/spec/fixtures/unit/pops/parser/lexer/selectorvalues.pp +49 -0
- data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/simpleselector.pp +38 -0
- data/spec/fixtures/unit/pops/parser/lexer/singleary.pp +19 -0
- data/spec/fixtures/unit/pops/parser/lexer/singlequote.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/singleselector.pp +22 -0
- data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/tag.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/tagged.pp +35 -0
- data/spec/fixtures/unit/pops/parser/lexer/virtualresources.pp +14 -0
- data/spec/fixtures/unit/provider/cron/crontab/single_line.yaml +4 -4
- data/spec/fixtures/unit/provider/cron/crontab/vixie_header.txt +3 -0
- data/spec/fixtures/unit/provider/cron/parsed/managed +6 -0
- data/spec/fixtures/unit/provider/cron/parsed/simple +9 -0
- data/spec/fixtures/unit/provider/parsedfile/simple.txt +4 -0
- data/spec/fixtures/unit/provider/service/systemd/list_units +18 -0
- data/spec/integration/parser/collector_spec.rb +1 -1
- data/spec/integration/parser/compiler_spec.rb +252 -227
- data/spec/integration/parser/parser_spec.rb +171 -53
- data/spec/integration/parser/scope_spec.rb +1 -1
- data/spec/integration/provider/cron/crontab_spec.rb +187 -0
- data/spec/integration/provider/service/systemd_spec.rb +20 -0
- data/spec/integration/type/file_spec.rb +21 -21
- data/spec/integration/type/package_spec.rb +1 -1
- data/spec/lib/puppet_spec/database.rb +2 -5
- data/spec/spec_helper.rb +6 -1
- data/spec/unit/application/apply_spec.rb +16 -1
- data/spec/unit/application/describe_spec.rb +1 -1
- data/spec/unit/application/doc_spec.rb +55 -32
- data/spec/unit/application/kick_spec.rb +8 -6
- data/spec/unit/application/master_spec.rb +4 -4
- data/spec/unit/daemon_spec.rb +1 -1
- data/spec/unit/forge/errors_spec.rb +40 -0
- data/spec/unit/forge/repository_spec.rb +11 -1
- data/spec/unit/forge_spec.rb +13 -3
- data/spec/unit/hiera/backend/puppet_backend_spec.rb +1 -0
- data/spec/unit/hiera/scope_spec.rb +48 -25
- data/spec/unit/indirector/catalog/active_record_spec.rb +6 -3
- data/spec/unit/indirector/catalog/compiler_spec.rb +3 -28
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +1 -1
- data/spec/unit/indirector/facts/inventory_active_record_spec.rb +154 -150
- data/spec/unit/indirector/indirection_spec.rb +5 -0
- data/spec/unit/indirector/resource/active_record_spec.rb +5 -22
- data/spec/unit/indirector_spec.rb +7 -1
- data/spec/unit/interface/action_builder_spec.rb +1 -1
- data/spec/unit/interface/action_manager_spec.rb +0 -2
- data/spec/unit/interface/action_spec.rb +1 -1
- data/spec/unit/interface/documentation_spec.rb +0 -2
- data/spec/unit/interface/face_collection_spec.rb +1 -1
- data/spec/unit/interface/option_builder_spec.rb +1 -1
- data/spec/unit/interface/option_spec.rb +0 -1
- data/spec/unit/module_spec.rb +17 -19
- data/spec/unit/module_tool/application_spec.rb +1 -3
- data/spec/unit/module_tool/applications/builder_spec.rb +38 -0
- data/spec/unit/module_tool/applications/checksummer_spec.rb +134 -0
- data/spec/unit/module_tool/applications/installer_spec.rb +71 -91
- data/spec/unit/module_tool/applications/searcher_spec.rb +1 -3
- data/spec/unit/module_tool/applications/uninstaller_spec.rb +18 -26
- data/spec/unit/module_tool/applications/unpacker_spec.rb +19 -52
- data/spec/unit/module_tool/tar/gnu_spec.rb +19 -0
- data/spec/unit/module_tool/tar/mini_spec.rb +59 -0
- data/spec/unit/module_tool/tar/solaris_spec.rb +19 -0
- data/spec/unit/network/http/connection_spec.rb +17 -2
- data/spec/unit/network/http/handler_spec.rb +195 -167
- data/spec/unit/network/http/rack/rest_spec.rb +26 -4
- data/spec/unit/network/http/webrick/rest_spec.rb +28 -1
- data/spec/unit/network/http/webrick_spec.rb +12 -3
- data/spec/unit/node/environment_spec.rb +421 -404
- data/spec/unit/parser/ast/arithmetic_operator_spec.rb +98 -2
- data/spec/unit/parser/collector_spec.rb +4 -4
- data/spec/unit/parser/compiler_spec.rb +13 -13
- data/spec/unit/parser/eparser_adapter_spec.rb +407 -0
- data/spec/unit/parser/functions/extlookup_spec.rb +20 -17
- data/spec/unit/parser/functions/fqdn_rand_spec.rb +5 -0
- data/spec/unit/parser/functions/hiera_include_spec.rb +0 -2
- data/spec/unit/parser/functions/hiera_spec.rb +0 -2
- data/spec/unit/parser/functions_spec.rb +27 -15
- data/spec/unit/parser/methods/collect_spec.rb +110 -0
- data/spec/unit/parser/methods/each_spec.rb +91 -0
- data/spec/unit/parser/methods/foreach_spec.rb +91 -0
- data/spec/unit/parser/methods/reduce_spec.rb +67 -0
- data/spec/unit/parser/methods/reject_spec.rb +73 -0
- data/spec/unit/parser/methods/select_spec.rb +79 -0
- data/spec/unit/parser/methods/shared.rb +61 -0
- data/spec/unit/parser/methods/slice_spec.rb +97 -0
- data/spec/unit/parser/parser_spec.rb +2 -2
- data/spec/unit/parser/scope_spec.rb +39 -16
- data/spec/unit/parser/templatewrapper_spec.rb +6 -5
- data/spec/unit/parser/type_loader_spec.rb +191 -165
- data/spec/unit/pops/adaptable_spec.rb +143 -0
- data/spec/unit/pops/containment_spec.rb +25 -0
- data/spec/unit/pops/factory_rspec_helper.rb +77 -0
- data/spec/unit/pops/factory_spec.rb +329 -0
- data/spec/unit/pops/issues_spec.rb +26 -0
- data/spec/unit/pops/label_provider_spec.rb +42 -0
- data/spec/unit/pops/model/ast_transformer_spec.rb +65 -0
- data/spec/unit/pops/model/model_spec.rb +37 -0
- data/spec/unit/pops/parser/lexer_spec.rb +884 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +248 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +93 -0
- data/spec/unit/pops/parser/parse_conditionals_spec.rb +159 -0
- data/spec/unit/pops/parser/parse_containers_spec.rb +175 -0
- data/spec/unit/pops/parser/parse_resource_spec.rb +228 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +11 -0
- data/spec/unit/pops/parser/parser_spec.rb +15 -0
- data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +16 -0
- data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +243 -0
- data/spec/unit/pops/transformer/transform_calls_spec.rb +80 -0
- data/spec/unit/pops/transformer/transform_conditionals_spec.rb +132 -0
- data/spec/unit/pops/transformer/transform_containers_spec.rb +182 -0
- data/spec/unit/pops/transformer/transform_resource_spec.rb +185 -0
- data/spec/unit/pops/transformer/transformer_rspec_helper.rb +27 -0
- data/spec/unit/pops/visitor_spec.rb +94 -0
- data/spec/unit/property_spec.rb +11 -0
- data/spec/unit/provider/augeas/augeas_spec.rb +3 -0
- data/spec/unit/provider/cron/crontab_spec.rb +97 -7
- data/spec/unit/provider/cron/parsed_spec.rb +325 -0
- data/spec/unit/provider/exec/posix_spec.rb +1 -1
- data/spec/unit/provider/group/groupadd_spec.rb +33 -3
- data/spec/unit/provider/group/pw_spec.rb +5 -5
- data/spec/unit/provider/nameservice_spec.rb +304 -0
- data/spec/unit/provider/package/aix_spec.rb +53 -11
- data/spec/unit/provider/package/aptrpm_spec.rb +6 -0
- data/spec/unit/provider/package/gem_spec.rb +6 -11
- data/spec/unit/provider/package/nim_spec.rb +216 -7
- data/spec/unit/provider/package/opkg_spec.rb +180 -0
- data/spec/unit/provider/package/rpm_spec.rb +149 -3
- data/spec/unit/provider/package/yum_spec.rb +6 -5
- data/spec/unit/provider/parsedfile_spec.rb +122 -28
- data/spec/unit/provider/service/freebsd_spec.rb +18 -0
- data/spec/unit/provider/service/init_spec.rb +108 -87
- data/spec/unit/provider/service/launchd_spec.rb +2 -2
- data/spec/unit/provider/service/openwrt_spec.rb +109 -0
- data/spec/unit/provider/service/src_spec.rb +117 -41
- data/spec/unit/provider/service/systemd_spec.rb +125 -17
- data/spec/unit/provider/service/upstart_spec.rb +1 -1
- data/spec/unit/provider/user/aix_spec.rb +42 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +1 -0
- data/spec/unit/provider/user/pw_spec.rb +24 -12
- data/spec/unit/provider/user/user_role_add_spec.rb +1 -1
- data/spec/unit/provider/user/useradd_spec.rb +179 -15
- data/spec/unit/resource/type_spec.rb +3 -3
- data/spec/unit/scheduler/job_spec.rb +79 -0
- data/spec/unit/scheduler/scheduler_spec.rb +129 -0
- data/spec/unit/scheduler/splay_job_spec.rb +35 -0
- data/spec/unit/ssl/base_spec.rb +3 -9
- data/spec/unit/ssl/certificate_authority_spec.rb +1 -0
- data/spec/unit/ssl/certificate_request_spec.rb +3 -1
- data/spec/unit/ssl/certificate_spec.rb +3 -1
- data/spec/unit/ssl/configuration_spec.rb +74 -0
- data/spec/unit/ssl/host_spec.rb +28 -7
- data/spec/unit/ssl/validator_spec.rb +311 -0
- data/spec/unit/transaction/event_manager_spec.rb +49 -0
- data/spec/unit/transaction/event_spec.rb +20 -5
- data/spec/unit/transaction/report_spec.rb +8 -0
- data/spec/unit/type/cron_spec.rb +9 -0
- data/spec/unit/type/exec_spec.rb +11 -0
- data/spec/unit/type/file/content_spec.rb +20 -20
- data/spec/unit/type/file/mode_spec.rb +6 -0
- data/spec/unit/type/file/source_spec.rb +9 -7
- data/spec/unit/type/file_spec.rb +22 -3
- data/spec/unit/type/service_spec.rb +34 -21
- data/spec/unit/type_spec.rb +46 -1
- data/spec/unit/util/backups_spec.rb +2 -2
- data/spec/unit/util/execution_spec.rb +4 -1
- data/spec/unit/util/filetype_spec.rb +6 -0
- data/spec/unit/util/monkey_patches_spec.rb +18 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +37 -0
- data/spec/unit/util/network_device/config_spec.rb +14 -0
- data/spec/unit/util/network_device_spec.rb +3 -3
- data/spec/unit/util/profiler/logging_spec.rb +81 -0
- data/spec/unit/util/profiler/none_spec.rb +12 -0
- data/spec/unit/util/profiler/object_counts_spec.rb +14 -0
- data/spec/unit/util/profiler/wall_clock_spec.rb +13 -0
- data/spec/unit/util/pson_spec.rb +5 -0
- data/spec/unit/util/ssl_spec.rb +51 -0
- data/spec/unit/util/windows/root_certs_spec.rb +15 -0
- data/spec/unit/util_spec.rb +28 -0
- metadata +2593 -2307
- data/spec/unit/module_tool/applications/application_spec.rb +0 -19
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# Common code for AIX providers. This class implements basic structure for
|
3
|
-
# AIX resources.
|
3
|
+
# AIX resources.
|
4
4
|
# Author:: Hector Rivas Gandara <keymon@gmail.com>
|
5
5
|
#
|
6
6
|
class Puppet::Provider::AixObject < Puppet::Provider
|
@@ -31,9 +31,9 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
31
31
|
# It is a list of hashes
|
32
32
|
# :aix_attr AIX command attribute name
|
33
33
|
# :puppet_prop Puppet propertie name
|
34
|
-
# :to Optional. Method name that adapts puppet property to aix command value.
|
34
|
+
# :to Optional. Method name that adapts puppet property to aix command value.
|
35
35
|
# :from Optional. Method to adapt aix command line value to puppet property. Optional
|
36
|
-
class << self
|
36
|
+
class << self
|
37
37
|
attr_accessor :attribute_mapping
|
38
38
|
end
|
39
39
|
|
@@ -49,7 +49,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
49
49
|
}
|
50
50
|
end
|
51
51
|
@attribute_mapping_to
|
52
|
-
end
|
52
|
+
end
|
53
53
|
|
54
54
|
# Mapping from AIX attribute to Puppet property.
|
55
55
|
def self.attribute_mapping_from
|
@@ -64,7 +64,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
64
64
|
end
|
65
65
|
@attribute_mapping_from
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
# This functions translates a key and value using the given mapping.
|
69
69
|
# Mapping can be nil (no translation) or a hash with this format
|
70
70
|
# {:key => new_key, :method => translate_method}
|
@@ -72,7 +72,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
72
72
|
def translate_attr(key, value, mapping)
|
73
73
|
return [key, value] unless mapping
|
74
74
|
return nil unless mapping[key]
|
75
|
-
|
75
|
+
|
76
76
|
if mapping[key][:method]
|
77
77
|
new_value = method(mapping[key][:method]).call(value)
|
78
78
|
else
|
@@ -80,7 +80,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
80
80
|
end
|
81
81
|
[mapping[key][:key], new_value]
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
# Loads an AIX attribute (key=value) and stores it in the given hash with
|
85
85
|
# puppet semantics. It translates the pair using the given mapping.
|
86
86
|
#
|
@@ -94,13 +94,13 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
94
94
|
true
|
95
95
|
elsif mapping[key][:method].nil?
|
96
96
|
objectinfo[mapping[key][:key]] = value
|
97
|
-
elsif
|
97
|
+
elsif
|
98
98
|
objectinfo[mapping[key][:key]] = method(mapping[key][:method]).call(value)
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
return objectinfo
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
# Gets the given command line argument for the given key and value,
|
105
105
|
# using the given mapping to translate key and value.
|
106
106
|
# All the objectinfo hash (@resource or @property_hash) is passed.
|
@@ -109,7 +109,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
109
109
|
# and default behaviour is return the arguments as key=value pairs.
|
110
110
|
# Subclasses must reimplement this if more complex operations/arguments
|
111
111
|
# are needed
|
112
|
-
#
|
112
|
+
#
|
113
113
|
def get_arguments(key, value, mapping, objectinfo)
|
114
114
|
if mapping.nil?
|
115
115
|
new_key = key
|
@@ -121,7 +121,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
121
121
|
elsif mapping[key][:method].nil?
|
122
122
|
new_key = mapping[key][:key]
|
123
123
|
new_value = value
|
124
|
-
elsif
|
124
|
+
elsif
|
125
125
|
new_key = mapping[key][:key]
|
126
126
|
new_value = method(mapping[key][:method]).call(value)
|
127
127
|
end
|
@@ -130,18 +130,18 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
130
130
|
new_value = Array(new_value).join(',')
|
131
131
|
|
132
132
|
if new_key
|
133
|
-
return [ "#{new_key}=#{new_value}" ]
|
133
|
+
return [ "#{new_key}=#{new_value}" ]
|
134
134
|
else
|
135
135
|
return []
|
136
136
|
end
|
137
137
|
end
|
138
|
-
|
138
|
+
|
139
139
|
# Convert the provider properties (hash) to AIX command arguments
|
140
140
|
# (list of strings)
|
141
141
|
# This function will translate each value/key and generate the argument using
|
142
142
|
# the get_arguments function.
|
143
143
|
def hash2args(hash, mapping=self.class.attribute_mapping_to)
|
144
|
-
return "" unless hash
|
144
|
+
return "" unless hash
|
145
145
|
arg_list = []
|
146
146
|
hash.each {|key, val|
|
147
147
|
arg_list += self.get_arguments(key, val, mapping, hash)
|
@@ -151,8 +151,8 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
151
151
|
|
152
152
|
# Parse AIX command attributes from the output of an AIX command, that
|
153
153
|
# which format is a list of space separated of key=value pairs:
|
154
|
-
# "uid=100 groups=a,b,c".
|
155
|
-
# It returns an hash.
|
154
|
+
# "uid=100 groups=a,b,c".
|
155
|
+
# It returns an hash.
|
156
156
|
#
|
157
157
|
# If a mapping is provided, the keys are translated as defined in the
|
158
158
|
# mapping hash. And only values included in mapping will be added
|
@@ -163,7 +163,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
163
163
|
attrs = []
|
164
164
|
if !str or (attrs = str.split()).empty?
|
165
165
|
return nil
|
166
|
-
end
|
166
|
+
end
|
167
167
|
|
168
168
|
attrs.each { |i|
|
169
169
|
if i.include? "=" # Ignore if it does not include '='
|
@@ -174,7 +174,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
174
174
|
continue
|
175
175
|
end
|
176
176
|
key = key_str.to_sym
|
177
|
-
|
177
|
+
|
178
178
|
properties = self.load_attribute(key, val, mapping, properties)
|
179
179
|
end
|
180
180
|
}
|
@@ -195,16 +195,15 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
195
195
|
attrs = []
|
196
196
|
if !str or (attrs = str.split(':')).empty?
|
197
197
|
return nil
|
198
|
-
end
|
198
|
+
end
|
199
199
|
|
200
200
|
attrs.each { |val|
|
201
201
|
key = key_list.shift.downcase.to_sym
|
202
202
|
properties = self.load_attribute(key, val, mapping, properties)
|
203
203
|
}
|
204
204
|
properties.empty? ? nil : properties
|
205
|
-
|
206
205
|
end
|
207
|
-
|
206
|
+
|
208
207
|
# Default parsing function for AIX commands.
|
209
208
|
# It will choose the method depending of the first line.
|
210
209
|
# For the colon separated list it will:
|
@@ -213,7 +212,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
213
212
|
def parse_command_output(output, mapping=self.class.attribute_mapping_from)
|
214
213
|
lines = output.split("\n")
|
215
214
|
# if it begins with #something:... is a colon separated list.
|
216
|
-
if lines[0] =~ /^#.*:/
|
215
|
+
if lines[0] =~ /^#.*:/
|
217
216
|
self.parse_colon_list(lines[1], lines[0][1..-1].split(':'), mapping)
|
218
217
|
else
|
219
218
|
self.parse_attr_list(lines[0], mapping)
|
@@ -233,7 +232,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
233
232
|
@objectosinfo = self.parse_command_output(execute(self.lscmd), nil)
|
234
233
|
rescue Puppet::ExecutionFailure => detail
|
235
234
|
# Print error if needed. FIXME: Do not check the user here.
|
236
|
-
Puppet.debug "aix.getinfo(): Could not find #{@resource.class.name} #{@resource.name}: #{detail}"
|
235
|
+
Puppet.debug "aix.getinfo(): Could not find #{@resource.class.name} #{@resource.name}: #{detail}"
|
237
236
|
end
|
238
237
|
end
|
239
238
|
@objectinfo
|
@@ -252,17 +251,20 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
252
251
|
# List all elements of given type. It works for colon separated commands and
|
253
252
|
# list commands.
|
254
253
|
# It returns a list of names.
|
255
|
-
def list_all
|
254
|
+
def self.list_all
|
256
255
|
names = []
|
257
256
|
begin
|
258
|
-
output = execute(self.
|
259
|
-
|
260
|
-
|
257
|
+
output = execute([self.command(:list), 'ALL'])
|
258
|
+
|
259
|
+
output = output.split("\n").select{ |line| line != /^#/ }
|
260
|
+
|
261
|
+
output.each do |line|
|
262
|
+
name = line.split(/[ :]/)[0]
|
261
263
|
names << name if not name.empty?
|
262
|
-
|
264
|
+
end
|
263
265
|
rescue Puppet::ExecutionFailure => detail
|
264
266
|
# Print error if needed
|
265
|
-
Puppet.debug "aix.list_all(): Could not get all resources of type #{@resource.class.name}: #{detail}"
|
267
|
+
Puppet.debug "aix.list_all(): Could not get all resources of type #{@resource.class.name}: #{detail}"
|
266
268
|
end
|
267
269
|
names
|
268
270
|
end
|
@@ -271,7 +273,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
271
273
|
#-------------
|
272
274
|
# Provider API
|
273
275
|
# ------------
|
274
|
-
|
276
|
+
|
275
277
|
# Clear out the cached values.
|
276
278
|
def flush
|
277
279
|
@property_hash.clear if @property_hash
|
@@ -283,12 +285,12 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
283
285
|
!!getinfo(true) # !! => converts to bool
|
284
286
|
end
|
285
287
|
|
286
|
-
# Return all existing instances
|
288
|
+
# Return all existing instances
|
287
289
|
# The method for returning a list of provider instances. Note that it returns
|
288
290
|
# providers, preferably with values already filled in, not resources.
|
289
291
|
def self.instances
|
290
292
|
objects=[]
|
291
|
-
self.list_all
|
293
|
+
self.list_all.each { |entry|
|
292
294
|
objects << new(:name => entry, :ensure => :present)
|
293
295
|
}
|
294
296
|
objects
|
@@ -319,7 +321,7 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
319
321
|
rescue Puppet::ExecutionFailure => detail
|
320
322
|
raise Puppet::Error, "Could not create #{@resource.class.name} #{@resource.name}: #{detail}"
|
321
323
|
end
|
322
|
-
end
|
324
|
+
end
|
323
325
|
|
324
326
|
# Delete this instance of the resource
|
325
327
|
def delete
|
@@ -347,13 +349,13 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
347
349
|
define_method(prop.to_s + "=") { |*vals| set(prop, *vals) } unless public_method_defined?(prop.to_s + "=")
|
348
350
|
end
|
349
351
|
end
|
350
|
-
|
352
|
+
|
351
353
|
# Define the needed getters and setters as soon as we know the resource type
|
352
354
|
def self.resource_type=(resource_type)
|
353
355
|
super
|
354
356
|
mk_resource_methods
|
355
357
|
end
|
356
|
-
|
358
|
+
|
357
359
|
# Retrieve a specific value by name.
|
358
360
|
def get(param)
|
359
361
|
(hash = getinfo(false)) ? hash[param] : nil
|
@@ -362,15 +364,15 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
362
364
|
# Set a property.
|
363
365
|
def set(param, value)
|
364
366
|
@property_hash[param.intern] = value
|
365
|
-
|
367
|
+
|
366
368
|
if getinfo().nil?
|
367
|
-
# This is weird...
|
369
|
+
# This is weird...
|
368
370
|
raise Puppet::Error, "Trying to update parameter '#{param}' to '#{value}' for a resource that does not exists #{@resource.class.name} #{@resource.name}: #{detail}"
|
369
371
|
end
|
370
372
|
if value == getinfo()[param.to_sym]
|
371
373
|
return
|
372
374
|
end
|
373
|
-
|
375
|
+
|
374
376
|
#self.class.validate(param, value)
|
375
377
|
if cmd = modifycmd({param =>value})
|
376
378
|
begin
|
@@ -379,15 +381,14 @@ class Puppet::Provider::AixObject < Puppet::Provider
|
|
379
381
|
raise Puppet::Error, "Could not set #{param} on #{@resource.class.name}[#{@resource.name}]: #{detail}"
|
380
382
|
end
|
381
383
|
end
|
382
|
-
|
383
|
-
# Refresh de info.
|
384
|
+
|
385
|
+
# Refresh de info.
|
384
386
|
hash = getinfo(true)
|
385
387
|
end
|
386
|
-
|
388
|
+
|
387
389
|
def initialize(resource)
|
388
390
|
super
|
389
391
|
@objectinfo = nil
|
390
392
|
@objectosinfo = nil
|
391
|
-
end
|
392
|
-
|
393
|
+
end
|
393
394
|
end
|
@@ -171,7 +171,6 @@ Puppet::Type.type(:augeas).provide(:augeas) do
|
|
171
171
|
aug.set("/augeas/load/Xfm/incl", resource[:incl])
|
172
172
|
restricted = true
|
173
173
|
elsif glob_avail and opt_ctx
|
174
|
-
restricted = true
|
175
174
|
# Optimize loading if the context is given, requires the glob function
|
176
175
|
# from Augeas 0.8.2 or up
|
177
176
|
ctx_path = resource[:context].sub(/^\/files(.*?)\/?$/, '\1/')
|
@@ -36,7 +36,7 @@ module Puppet::Provider::Confiner
|
|
36
36
|
# Checks whether this implementation is suitable for the current platform (or returns a summary
|
37
37
|
# of all confines if short == false).
|
38
38
|
# @return [Boolean. Hash] Returns whether the confines are all valid (if short == true), or a hash of all confines
|
39
|
-
# if short == false.
|
39
|
+
# if short == false.
|
40
40
|
# @api public
|
41
41
|
#
|
42
42
|
def suitable?(short = true)
|
@@ -1,17 +1,6 @@
|
|
1
1
|
require 'puppet/provider/parsedfile'
|
2
2
|
|
3
|
-
|
4
|
-
when "Solaris"
|
5
|
-
:suntab
|
6
|
-
when "AIX"
|
7
|
-
:aixtab
|
8
|
-
else
|
9
|
-
:crontab
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFile, :default_target => ENV["USER"] || "root", :filetype => tab) do
|
3
|
+
Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFile, :default_target => ENV["USER"] || "root") do
|
15
4
|
commands :crontab => "crontab"
|
16
5
|
|
17
6
|
text_line :comment, :match => %r{^\s*#}, :post_parse => proc { |record|
|
@@ -22,58 +11,103 @@ Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFi
|
|
22
11
|
|
23
12
|
text_line :environment, :match => %r{^\s*\w+=}
|
24
13
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
14
|
+
def self.filetype
|
15
|
+
tabname = case Facter.value(:osfamily)
|
16
|
+
when "Solaris"
|
17
|
+
:suntab
|
18
|
+
when "AIX"
|
19
|
+
:aixtab
|
20
|
+
else
|
21
|
+
:crontab
|
22
|
+
end
|
23
|
+
|
24
|
+
Puppet::Util::FileType.filetype(tabname)
|
25
|
+
end
|
29
26
|
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
self::TIME_FIELDS = [:minute, :hour, :monthday, :month, :weekday]
|
28
|
+
|
29
|
+
record_line :crontab,
|
30
|
+
:fields => %w{time command},
|
31
|
+
:match => %r{^\s*(@\w+|\S+\s+\S+\s+\S+\s+\S+\s+\S+)\s+(.+)$},
|
32
|
+
:absent => '*',
|
33
|
+
:block_eval => :instance do
|
33
34
|
|
34
|
-
class << crontab
|
35
|
-
def numeric_fields
|
36
|
-
fields - [:command]
|
37
|
-
end
|
38
|
-
# Do some post-processing of the parsed record. Basically just
|
39
|
-
# split the numeric fields on ','.
|
40
35
|
def post_parse(record)
|
41
|
-
|
42
|
-
|
43
|
-
|
36
|
+
time = record.delete(:time)
|
37
|
+
if match = /@(\S+)/.match(time)
|
38
|
+
# is there another way to access the constant?
|
39
|
+
Puppet::Type::Cron::ProviderCrontab::TIME_FIELDS.each { |f| record[f] = :absent }
|
40
|
+
record[:special] = match.captures[0]
|
41
|
+
elsif match = /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/.match(time)
|
42
|
+
record[:special] = :absent
|
43
|
+
Puppet::Type::Cron::ProviderCrontab::TIME_FIELDS.zip(match.captures).each do |field,value|
|
44
|
+
if value == self.absent
|
45
|
+
record[field] = :absent
|
46
|
+
else
|
47
|
+
record[field] = value.split(",")
|
48
|
+
end
|
44
49
|
end
|
50
|
+
else
|
51
|
+
raise Puppet::Error, "Line got parsed as a crontab entry but cannot be handled. Please file a bug with the contents of your crontab"
|
45
52
|
end
|
53
|
+
record
|
46
54
|
end
|
47
55
|
|
48
|
-
# Join the fields back up based on ','.
|
49
56
|
def pre_gen(record)
|
50
|
-
|
57
|
+
if record[:special] and record[:special] != :absent
|
58
|
+
record[:special] = "@#{record[:special]}"
|
59
|
+
end
|
60
|
+
|
61
|
+
Puppet::Type::Cron::ProviderCrontab::TIME_FIELDS.each do |field|
|
51
62
|
if vals = record[field] and vals.is_a?(Array)
|
52
63
|
record[field] = vals.join(",")
|
53
64
|
end
|
54
65
|
end
|
66
|
+
record
|
55
67
|
end
|
56
68
|
|
57
|
-
|
58
|
-
# Add name and environments as necessary.
|
59
69
|
def to_line(record)
|
60
70
|
str = ""
|
61
71
|
str = "# Puppet Name: #{record[:name]}\n" if record[:name]
|
62
|
-
if record[:environment] and record[:environment] != :absent
|
63
|
-
record[:environment].
|
64
|
-
str += env + "\n"
|
65
|
-
end
|
72
|
+
if record[:environment] and record[:environment] != :absent
|
73
|
+
str += record[:environment].map {|line| "#{line}\n"}.join('')
|
66
74
|
end
|
67
|
-
|
68
|
-
|
69
|
-
str += "@#{record[:special]} #{record[:command]}"
|
75
|
+
if record[:special] and record[:special] != :absent
|
76
|
+
fields = [:special, :command]
|
70
77
|
else
|
71
|
-
|
78
|
+
fields = Puppet::Type::Cron::ProviderCrontab::TIME_FIELDS + [:command]
|
72
79
|
end
|
80
|
+
str += record.values_at(*fields).map do |field|
|
81
|
+
if field.nil? or field == :absent
|
82
|
+
self.absent
|
83
|
+
else
|
84
|
+
field
|
85
|
+
end
|
86
|
+
end.join(self.joiner)
|
73
87
|
str
|
74
88
|
end
|
75
89
|
end
|
76
90
|
|
91
|
+
# Look up a resource with a given name whose user matches a record target
|
92
|
+
#
|
93
|
+
# @api private
|
94
|
+
#
|
95
|
+
# @note This overrides the ParsedFile method for finding resources by name,
|
96
|
+
# so that only records for a given user are matched to resources of the
|
97
|
+
# same user so that orphaned records in other crontabs don't get falsely
|
98
|
+
# matched (#2251)
|
99
|
+
#
|
100
|
+
# @param [Hash<Symbol, Object>] record
|
101
|
+
# @param [Array<Puppet::Resource>] resources
|
102
|
+
#
|
103
|
+
# @return [Puppet::Resource, nil] The resource if found, else nil
|
104
|
+
def self.resource_for_record(record, resources)
|
105
|
+
resource = super
|
106
|
+
|
107
|
+
if resource and record[:target] == resource[:user]
|
108
|
+
resource
|
109
|
+
end
|
110
|
+
end
|
77
111
|
|
78
112
|
# Return the header placed at the top of each generated file, warning
|
79
113
|
# users that modifying this file manually is probably a bad idea.
|
@@ -84,50 +118,52 @@ Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFi
|
|
84
118
|
# HEADER: not be deleted, as doing so could cause duplicate cron jobs.\n}
|
85
119
|
end
|
86
120
|
|
121
|
+
# Regex for finding one vixie cron header.
|
122
|
+
def self.native_header_regex
|
123
|
+
/# DO NOT EDIT THIS FILE.*?Cron version.*?vixie.*?\n/m
|
124
|
+
end
|
125
|
+
|
126
|
+
# If a vixie cron header is found, it should be dropped, cron will insert
|
127
|
+
# a new one in any case, so we need to avoid duplicates.
|
128
|
+
def self.drop_native_header
|
129
|
+
true
|
130
|
+
end
|
131
|
+
|
87
132
|
# See if we can match the record against an existing cron job.
|
88
133
|
def self.match(record, resources)
|
134
|
+
# if the record is named, do not even bother (#19876)
|
135
|
+
return false if record[:name]
|
89
136
|
resources.each do |name, resource|
|
90
137
|
# Match the command first, since it's the most important one.
|
91
|
-
next unless record[:target] == resource
|
138
|
+
next unless record[:target] == resource[:target]
|
92
139
|
next unless record[:command] == resource.value(:command)
|
93
140
|
|
94
|
-
#
|
95
|
-
|
96
|
-
next unless resource.value(:special) == record[:special]
|
97
|
-
end
|
141
|
+
# Now check the time fields
|
142
|
+
compare_fields = self::TIME_FIELDS + [:special]
|
98
143
|
|
99
|
-
# Then the normal fields.
|
100
144
|
matched = true
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
145
|
+
compare_fields.each do |field|
|
146
|
+
# If the resource does not manage a property (say monthday) it should
|
147
|
+
# always match. If it is the other way around (e.g. resource defines
|
148
|
+
# a should value for :special but the record does not have it, we do
|
149
|
+
# not match
|
150
|
+
next unless resource[field]
|
151
|
+
unless record.include?(field)
|
107
152
|
matched = false
|
108
153
|
break
|
109
154
|
end
|
110
155
|
|
111
|
-
if
|
112
|
-
#
|
113
|
-
#
|
114
|
-
|
115
|
-
|
156
|
+
if record_value = record[field] and resource_value = resource.value(field)
|
157
|
+
# The record translates '*' into absent in the post_parse hook and
|
158
|
+
# the resource type does exactly the opposite (alias :absent to *)
|
159
|
+
next if resource_value == '*' and record_value == :absent
|
160
|
+
next if resource_value == record_value
|
116
161
|
end
|
117
|
-
|
118
|
-
# Yay differing definitions of absent.
|
119
|
-
next if (record[field] == :absent and resource.value(field) == "*")
|
120
|
-
|
121
|
-
# Everything should be in the form of arrays, not the normal text.
|
122
|
-
next if (record[field] == resource.value(field))
|
123
|
-
#Puppet.info "Did not match %s: %s vs %s" %
|
124
|
-
# [field, resource.value(field).inspect, record[field].inspect]
|
125
|
-
matched = false
|
162
|
+
matched =false
|
126
163
|
break
|
127
164
|
end
|
128
165
|
return resource if matched
|
129
166
|
end
|
130
|
-
|
131
167
|
false
|
132
168
|
end
|
133
169
|
|
@@ -189,6 +225,10 @@ Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFi
|
|
189
225
|
end
|
190
226
|
|
191
227
|
def user=(user)
|
228
|
+
# we have to mark the target as modified first, to make sure that if
|
229
|
+
# we move a cronjob from userA to userB, userA's crontab will also
|
230
|
+
# be rewritten
|
231
|
+
mark_target_modified
|
192
232
|
@property_hash[:user] = user
|
193
233
|
@property_hash[:target] = user
|
194
234
|
end
|