puppet 0.24.6 → 0.24.7
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 +115 -0
- data/Rakefile +43 -14
- data/bin/puppetca +6 -5
- data/bin/puppetdoc +109 -15
- data/bin/ralsh +3 -1
- data/conf/redhat/puppet.spec +74 -48
- data/examples/mcx_dock_absent.pp +4 -0
- data/examples/mcx_dock_default.pp +118 -0
- data/examples/mcx_dock_full.pp +125 -0
- data/examples/mcx_dock_invalid.pp +9 -0
- data/examples/mcx_nogroup.pp +118 -0
- data/examples/mcx_notexists_absent.pp +4 -0
- data/ext/emacs/puppet-mode.el +1 -1
- data/lib/puppet.rb +1 -1
- data/lib/puppet/external/nagios/base.rb +114 -71
- data/lib/puppet/feature/base.rb +6 -0
- data/lib/puppet/indirector/yaml.rb +12 -3
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/network/client/master.rb +1 -1
- data/lib/puppet/network/xmlrpc/client.rb +3 -1
- data/lib/puppet/parameter.rb +1 -1
- data/lib/puppet/parser/ast.rb +15 -0
- data/lib/puppet/parser/ast/astarray.rb +1 -2
- data/lib/puppet/parser/ast/casestatement.rb +2 -0
- data/lib/puppet/parser/ast/collection.rb +2 -0
- data/lib/puppet/parser/ast/comparison_operator.rb +4 -0
- data/lib/puppet/parser/ast/definition.rb +2 -0
- data/lib/puppet/parser/ast/else.rb +3 -0
- data/lib/puppet/parser/ast/function.rb +19 -12
- data/lib/puppet/parser/ast/hostclass.rb +9 -1
- data/lib/puppet/parser/ast/ifstatement.rb +3 -0
- data/lib/puppet/parser/ast/node.rb +3 -0
- data/lib/puppet/parser/ast/resource.rb +3 -0
- data/lib/puppet/parser/ast/resource_defaults.rb +2 -0
- data/lib/puppet/parser/ast/resource_override.rb +3 -0
- data/lib/puppet/parser/ast/vardef.rb +3 -0
- data/lib/puppet/parser/functions.rb +14 -0
- data/lib/puppet/parser/functions/inline_template.rb +21 -0
- data/lib/puppet/parser/functions/template.rb +3 -2
- data/lib/puppet/parser/lexer.rb +56 -7
- data/lib/puppet/parser/parser.rb +114 -98
- data/lib/puppet/parser/parser_support.rb +24 -4
- data/lib/puppet/parser/resource/reference.rb +4 -3
- data/lib/puppet/parser/templatewrapper.rb +30 -22
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/list.rb +7 -2
- data/lib/puppet/property/ordered_list.rb +22 -0
- data/lib/puppet/provider/augeas/augeas.rb +189 -0
- data/lib/puppet/provider/computer/computer.rb +22 -0
- data/lib/puppet/provider/confine.rb +4 -1
- data/lib/puppet/provider/confine/variable.rb +13 -2
- data/lib/puppet/provider/confine_collection.rb +4 -1
- data/lib/puppet/provider/confiner.rb +1 -1
- data/lib/puppet/provider/group/directoryservice.rb +6 -3
- data/lib/puppet/provider/group/groupadd.rb +5 -2
- data/lib/puppet/provider/group/ldap.rb +11 -9
- data/lib/puppet/provider/group/netinfo.rb +8 -4
- data/lib/puppet/provider/group/pw.rb +5 -1
- data/lib/puppet/provider/host/netinfo.rb +5 -2
- data/lib/puppet/provider/macauthorization/macauthorization.rb +315 -0
- data/lib/puppet/provider/mcx/mcxcontent.rb +201 -0
- data/lib/puppet/provider/nameservice/directoryservice.rb +210 -107
- data/lib/puppet/provider/nameservice/netinfo.rb +7 -2
- data/lib/puppet/provider/package/appdmg.rb +0 -3
- data/lib/puppet/provider/package/apt.rb +6 -0
- data/lib/puppet/provider/package/rpm.rb +2 -0
- data/lib/puppet/provider/package/yum.rb +5 -1
- data/lib/puppet/provider/package/yumhelper.py +9 -0
- data/lib/puppet/provider/service/base.rb +9 -6
- data/lib/puppet/provider/service/daemontools.rb +25 -15
- data/lib/puppet/provider/service/debian.rb +6 -2
- data/lib/puppet/provider/service/freebsd.rb +5 -2
- data/lib/puppet/provider/service/gentoo.rb +6 -3
- data/lib/puppet/provider/service/init.rb +31 -21
- data/lib/puppet/provider/service/launchd.rb +195 -0
- data/lib/puppet/provider/service/redhat.rb +5 -2
- data/lib/puppet/provider/service/runit.rb +30 -20
- data/lib/puppet/provider/service/smf.rb +7 -4
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +21 -1
- data/lib/puppet/provider/user/directoryservice.rb +1 -0
- data/lib/puppet/provider/user/netinfo.rb +9 -3
- data/lib/puppet/provider/user/user_role_add.rb +43 -6
- data/lib/puppet/provider/zfs/solaris.rb +45 -0
- data/lib/puppet/provider/zone/solaris.rb +8 -4
- data/lib/puppet/provider/zpool/solaris.rb +116 -0
- data/lib/puppet/rails/database/003_add_environment_to_host.rb +9 -0
- data/lib/puppet/rails/database/schema.rb +1 -0
- data/lib/puppet/rails/host.rb +4 -0
- data/lib/puppet/reference/configuration.rb +1 -1
- data/lib/puppet/reports/tagmail.rb +15 -6
- data/lib/puppet/transaction/change.rb +3 -5
- data/lib/puppet/transportable.rb +1 -0
- data/lib/puppet/type/augeas.rb +155 -0
- data/lib/puppet/type/computer.rb +62 -0
- data/lib/puppet/type/exec.rb +2 -1
- data/lib/puppet/type/file.rb +1 -1
- data/lib/puppet/type/file/ensure.rb +8 -5
- data/lib/puppet/type/file/mode.rb +0 -14
- data/lib/puppet/type/file/owner.rb +32 -64
- data/lib/puppet/type/file/selcontext.rb +3 -8
- data/lib/puppet/type/group.rb +27 -45
- data/lib/puppet/type/k5login.rb +1 -1
- data/lib/puppet/type/macauthorization.rb +141 -0
- data/lib/puppet/type/mcx.rb +115 -0
- data/lib/puppet/type/mount.rb +1 -1
- data/lib/puppet/type/nagios_hostdependency.rb +3 -0
- data/lib/puppet/type/ssh_authorized_key.rb +16 -0
- data/lib/puppet/type/tidy.rb +43 -14
- data/lib/puppet/type/user.rb +25 -1
- data/lib/puppet/type/zfs.rb +51 -0
- data/lib/puppet/type/zone.rb +8 -0
- data/lib/puppet/type/zpool.rb +93 -0
- data/lib/puppet/util.rb +17 -38
- data/lib/puppet/util/file_locking.rb +44 -0
- data/lib/puppet/util/filetype.rb +3 -3
- data/lib/puppet/util/log.rb +1 -16
- data/lib/puppet/util/metric.rb +0 -5
- data/lib/puppet/util/rdoc.rb +85 -0
- data/lib/puppet/util/rdoc/code_objects.rb +219 -0
- data/lib/puppet/util/rdoc/generators/puppet_generator.rb +829 -0
- data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +1051 -0
- data/lib/puppet/util/rdoc/parser.rb +437 -0
- data/lib/puppet/util/selinux.rb +135 -63
- data/lib/puppet/util/settings.rb +136 -126
- data/lib/puppet/util/storage.rb +4 -2
- data/spec/Rakefile +91 -0
- data/spec/integration/checksum.rb +47 -0
- data/spec/integration/defaults.rb +47 -0
- data/spec/integration/file_serving/configuration.rb +43 -0
- data/spec/integration/file_serving/content.rb +18 -0
- data/spec/integration/file_serving/metadata.rb +18 -0
- data/spec/integration/indirector/direct_file_server.rb +80 -0
- data/spec/integration/indirector/file_content/file_server.rb +18 -0
- data/spec/integration/indirector/file_metadata/file_server.rb +18 -0
- data/spec/integration/indirector/module_files.rb +57 -0
- data/spec/integration/indirector/node/ldap.rb +15 -0
- data/spec/integration/indirector/rest.rb +464 -0
- data/spec/integration/network/server/mongrel.rb +48 -0
- data/spec/integration/network/server/webrick.rb +48 -0
- data/spec/integration/node.rb +93 -0
- data/spec/integration/node/catalog.rb +54 -0
- data/spec/integration/node/facts.rb +45 -0
- data/spec/integration/provider/package.rb +26 -0
- data/spec/integration/provider/service/init.rb +32 -0
- data/spec/integration/reference/providers.rb +17 -0
- data/spec/integration/reports.rb +14 -0
- data/spec/integration/transaction/report.rb +26 -0
- data/spec/integration/type/package.rb +22 -0
- data/spec/integration/util/file_locking.rb +36 -0
- data/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb +46 -0
- data/spec/monkey_patches/alias_should_to_must.rb +5 -0
- data/spec/shared_behaviours/file_server_terminus.rb +42 -0
- data/spec/shared_behaviours/file_serving.rb +64 -0
- data/spec/shared_behaviours/memory_terminus.rb +32 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +36 -0
- data/spec/unit/executables/client/certhandler.rb +122 -0
- data/spec/unit/file_serving/configuration.rb +224 -0
- data/spec/unit/file_serving/configuration/parser.rb +135 -0
- data/spec/unit/file_serving/content.rb +71 -0
- data/spec/unit/file_serving/file_base.rb +124 -0
- data/spec/unit/file_serving/fileset.rb +239 -0
- data/spec/unit/file_serving/indirection_hooks.rb +124 -0
- data/spec/unit/file_serving/metadata.rb +187 -0
- data/spec/unit/file_serving/mount.rb +143 -0
- data/spec/unit/file_serving/terminus_helper.rb +76 -0
- data/spec/unit/indirector.rb +152 -0
- data/spec/unit/indirector/catalog/compiler.rb +156 -0
- data/spec/unit/indirector/catalog/yaml.rb +25 -0
- data/spec/unit/indirector/checksum/file.rb +139 -0
- data/spec/unit/indirector/code.rb +33 -0
- data/spec/unit/indirector/direct_file_server.rb +89 -0
- data/spec/unit/indirector/envelope.rb +47 -0
- data/spec/unit/indirector/exec.rb +51 -0
- data/spec/unit/indirector/facts/facter.rb +76 -0
- data/spec/unit/indirector/facts/yaml.rb +26 -0
- data/spec/unit/indirector/file.rb +154 -0
- data/spec/unit/indirector/file_content/file.rb +18 -0
- data/spec/unit/indirector/file_content/file_server.rb +18 -0
- data/spec/unit/indirector/file_content/modules.rb +18 -0
- data/spec/unit/indirector/file_content/rest.rb +11 -0
- data/spec/unit/indirector/file_metadata/file.rb +52 -0
- data/spec/unit/indirector/file_metadata/file_server.rb +18 -0
- data/spec/unit/indirector/file_metadata/modules.rb +42 -0
- data/spec/unit/indirector/file_metadata/rest.rb +9 -0
- data/spec/unit/indirector/file_server.rb +184 -0
- data/spec/unit/indirector/indirection.rb +731 -0
- data/spec/unit/indirector/ldap.rb +143 -0
- data/spec/unit/indirector/memory.rb +29 -0
- data/spec/unit/indirector/module_files.rb +259 -0
- data/spec/unit/indirector/node/exec.rb +69 -0
- data/spec/unit/indirector/node/ldap.rb +424 -0
- data/spec/unit/indirector/node/memory.rb +19 -0
- data/spec/unit/indirector/node/plain.rb +19 -0
- data/spec/unit/indirector/node/rest.rb +13 -0
- data/spec/unit/indirector/node/yaml.rb +25 -0
- data/spec/unit/indirector/plain.rb +29 -0
- data/spec/unit/indirector/report/processor.rb +81 -0
- data/spec/unit/indirector/request.rb +87 -0
- data/spec/unit/indirector/rest.rb +372 -0
- data/spec/unit/indirector/ssl_rsa/file.rb +116 -0
- data/spec/unit/indirector/terminus.rb +245 -0
- data/spec/unit/indirector/yaml.rb +145 -0
- data/spec/unit/module.rb +247 -0
- data/spec/unit/network/client.rb +45 -0
- data/spec/unit/network/client/master.rb +442 -0
- data/spec/unit/network/handler/fileserver.rb +179 -0
- data/spec/unit/network/http.rb +35 -0
- data/spec/unit/network/http/mongrel.rb +117 -0
- data/spec/unit/network/http/mongrel/rest.rb +377 -0
- data/spec/unit/network/http/mongrel/xmlrpc.rb +0 -0
- data/spec/unit/network/http/webrick.rb +127 -0
- data/spec/unit/network/http/webrick/rest.rb +323 -0
- data/spec/unit/network/http/webrick/xmlrpc.rb +0 -0
- data/spec/unit/network/http_pool.rb +238 -0
- data/spec/unit/network/server.rb +316 -0
- data/spec/unit/network/xmlrpc/client.rb +13 -0
- data/spec/unit/node.rb +167 -0
- data/spec/unit/node/catalog.rb +864 -0
- data/spec/unit/node/environment.rb +37 -0
- data/spec/unit/node/facts.rb +44 -0
- data/spec/unit/other/checksum.rb +92 -0
- data/spec/unit/other/pgraph.rb +210 -0
- data/spec/unit/other/transaction.rb +33 -0
- data/spec/unit/other/transbucket.rb +172 -0
- data/spec/unit/other/transobject.rb +92 -0
- data/spec/unit/parameter.rb +24 -0
- data/spec/unit/parser/ast.rb +37 -0
- data/spec/unit/parser/ast/arithmetic_operator.rb +73 -0
- data/spec/unit/parser/ast/astarray.rb +66 -0
- data/spec/unit/parser/ast/boolean_operator.rb +53 -0
- data/spec/unit/parser/ast/collexpr.rb +92 -0
- data/spec/unit/parser/ast/comparison_operator.rb +92 -0
- data/spec/unit/parser/ast/definition.rb +195 -0
- data/spec/unit/parser/ast/function.rb +77 -0
- data/spec/unit/parser/ast/hostclass.rb +148 -0
- data/spec/unit/parser/ast/minus.rb +36 -0
- data/spec/unit/parser/ast/node.rb +125 -0
- data/spec/unit/parser/ast/nop.rb +20 -0
- data/spec/unit/parser/ast/not.rb +30 -0
- data/spec/unit/parser/ast/resource_override.rb +51 -0
- data/spec/unit/parser/ast/resource_reference.rb +63 -0
- data/spec/unit/parser/ast/vardef.rb +47 -0
- data/spec/unit/parser/collector.rb +426 -0
- data/spec/unit/parser/compiler.rb +561 -0
- data/spec/unit/parser/functions.rb +83 -0
- data/spec/unit/parser/functions/inline_template.rb +59 -0
- data/spec/unit/parser/functions/template.rb +62 -0
- data/spec/unit/parser/interpreter.rb +138 -0
- data/spec/unit/parser/lexer.rb +646 -0
- data/spec/unit/parser/parser.rb +228 -0
- data/spec/unit/parser/resource.rb +336 -0
- data/spec/unit/parser/resource/reference.rb +95 -0
- data/spec/unit/parser/scope.rb +87 -0
- data/spec/unit/parser/templatewrapper.rb +129 -0
- data/spec/unit/property.rb +35 -0
- data/spec/unit/property/keyvalue.rb +168 -0
- data/spec/unit/property/list.rb +156 -0
- data/spec/unit/property/ordered_list.rb +64 -0
- data/spec/unit/provider/augeas/augeas.rb +238 -0
- data/spec/unit/provider/confine.rb +78 -0
- data/spec/unit/provider/confine/exists.rb +81 -0
- data/spec/unit/provider/confine/false.rb +53 -0
- data/spec/unit/provider/confine/feature.rb +60 -0
- data/spec/unit/provider/confine/true.rb +53 -0
- data/spec/unit/provider/confine/variable.rb +107 -0
- data/spec/unit/provider/confine_collection.rb +134 -0
- data/spec/unit/provider/confiner.rb +63 -0
- data/spec/unit/provider/group/groupadd.rb +31 -0
- data/spec/unit/provider/group/ldap.rb +105 -0
- data/spec/unit/provider/ldap.rb +248 -0
- data/spec/unit/provider/macauthorization.rb +147 -0
- data/spec/unit/provider/mcx/mcxcontent.rb +175 -0
- data/spec/unit/provider/mount.rb +130 -0
- data/spec/unit/provider/mount/parsed.rb +185 -0
- data/spec/unit/provider/package/apt.rb +138 -0
- data/spec/unit/provider/package/dpkg.rb +163 -0
- data/spec/unit/provider/package/gem.rb +87 -0
- data/spec/unit/provider/package/hpux.rb +52 -0
- data/spec/unit/provider/selboolean.rb +37 -0
- data/spec/unit/provider/selmodule-example.pp +0 -0
- data/spec/unit/provider/selmodule.rb +66 -0
- data/spec/unit/provider/service/daemontools.rb +124 -0
- data/spec/unit/provider/service/launchd.rb +134 -0
- data/spec/unit/provider/service/runit.rb +117 -0
- data/spec/unit/provider/ssh_authorized_key/parsed.rb +102 -0
- data/spec/unit/provider/user/hpux.rb +25 -0
- data/spec/unit/provider/user/ldap.rb +279 -0
- data/spec/unit/provider/user/user_role_add.rb +249 -0
- data/spec/unit/provider/user/useradd.rb +115 -0
- data/spec/unit/provider/zfs/solaris.rb +87 -0
- data/spec/unit/provider/zone/solaris.rb +42 -0
- data/spec/unit/provider/zpool/solaris.rb +179 -0
- data/spec/unit/rails.rb +125 -0
- data/spec/unit/relationship.rb +149 -0
- data/spec/unit/reports.rb +61 -0
- data/spec/unit/resource_reference.rb +73 -0
- data/spec/unit/simple_graph.rb +280 -0
- data/spec/unit/transaction/change.rb +187 -0
- data/spec/unit/transaction/event.rb +25 -0
- data/spec/unit/transaction/report.rb +40 -0
- data/spec/unit/type.rb +64 -0
- data/spec/unit/type/augeas.rb +113 -0
- data/spec/unit/type/computer.rb +82 -0
- data/spec/unit/type/exec.rb +91 -0
- data/spec/unit/type/file.rb +155 -0
- data/spec/unit/type/file/ensure.rb +21 -0
- data/spec/unit/type/file/group.rb +118 -0
- data/spec/unit/type/file/owner.rb +132 -0
- data/spec/unit/type/file/selinux.rb +82 -0
- data/spec/unit/type/group.rb +40 -0
- data/spec/unit/type/macauthorization.rb +78 -0
- data/spec/unit/type/mcx.rb +108 -0
- data/spec/unit/type/mount.rb +219 -0
- data/spec/unit/type/nagios.rb +63 -0
- data/spec/unit/type/noop_metaparam.rb +38 -0
- data/spec/unit/type/package.rb +246 -0
- data/spec/unit/type/resources.rb +27 -0
- data/spec/unit/type/schedule.rb +339 -0
- data/spec/unit/type/selboolean.rb +47 -0
- data/spec/unit/type/selmodule.rb +18 -0
- data/spec/unit/type/service.rb +254 -0
- data/spec/unit/type/ssh_authorized_key.rb +106 -0
- data/spec/unit/type/tidy.rb +68 -0
- data/spec/unit/type/user.rb +260 -0
- data/spec/unit/type/zfs.rb +45 -0
- data/spec/unit/type/zone.rb +20 -0
- data/spec/unit/type/zpool.rb +110 -0
- data/spec/unit/util/checksums.rb +99 -0
- data/spec/unit/util/constant_inflector.rb +70 -0
- data/spec/unit/util/file_locking.rb +115 -0
- data/spec/unit/util/ldap/connection.rb +169 -0
- data/spec/unit/util/ldap/generator.rb +54 -0
- data/spec/unit/util/ldap/manager.rb +654 -0
- data/spec/unit/util/loadedfile.rb +65 -0
- data/spec/unit/util/log.rb +107 -0
- data/spec/unit/util/metric.rb +95 -0
- data/spec/unit/util/nagios_maker.rb +128 -0
- data/spec/unit/util/posix.rb +256 -0
- data/spec/unit/util/resource_template.rb +58 -0
- data/spec/unit/util/selinux.rb +219 -0
- data/spec/unit/util/settings.rb +847 -0
- data/spec/unit/util/storage.rb +248 -0
- data/spec/unit/util/tagging.rb +92 -0
- data/spec/unit/util/uri_helper.rb +41 -0
- data/spec/unit/util/user_attr.rb +47 -0
- data/spec/unit/util/warnings.rb +35 -0
- data/test/certmgr/support.rb +0 -6
- data/test/data/providers/ssh_authorized_key/parsed/authorized_keys +1 -0
- data/test/data/snippets/multilinecomments.pp +6 -0
- data/test/data/snippets/multipleclass.pp +9 -0
- data/test/language/functions.rb +11 -1
- data/test/language/snippets.rb +16 -0
- data/test/lib/puppettest/runnable_test.rb +1 -1
- data/test/network/handler/fileserver.rb +5 -0
- data/test/other/report.rb +0 -4
- data/test/ral/type/resources.rb +2 -19
- data/test/util/settings.rb +4 -4
- data/test/util/storage.rb +0 -24
- data/test/util/utiltest.rb +0 -33
- metadata +319 -26
- data/conf/debian/README.source +0 -2
- data/conf/debian/TODO.Debian +0 -1
- data/conf/debian/changelog +0 -257
- data/conf/debian/compat +0 -1
- data/conf/debian/control +0 -45
- data/conf/debian/copyright +0 -17
- data/conf/debian/docs +0 -1
- data/conf/debian/fileserver.conf +0 -12
- data/conf/debian/puppet.NEWS +0 -63
- data/conf/debian/puppet.conf +0 -8
- data/conf/debian/puppet.dirs +0 -7
- data/conf/debian/puppet.files +0 -6
- data/conf/debian/puppet.init +0 -64
- data/conf/debian/puppet.logrotate +0 -11
- data/conf/debian/puppet.postinst +0 -9
- data/conf/debian/puppet.postrm +0 -21
- data/conf/debian/puppet.preinst +0 -25
- data/conf/debian/puppetmaster.files +0 -4
- data/conf/debian/puppetmaster.init +0 -58
- data/conf/debian/rules +0 -115
- data/conf/debian/watch +0 -2
- data/lib/puppet/type/nagios_hostgroupescalation.rb +0 -3
@@ -0,0 +1,437 @@
|
|
1
|
+
# Puppet "parser" for the rdoc system
|
2
|
+
# The parser uses puppet parser and traverse the AST to instruct RDoc about
|
3
|
+
# our current structures. It also parses ruby files that could contain
|
4
|
+
# either custom facts or puppet plugins (functions, types...)
|
5
|
+
|
6
|
+
# rdoc mandatory includes
|
7
|
+
require "rdoc/code_objects"
|
8
|
+
require "puppet/util/rdoc/code_objects"
|
9
|
+
require "rdoc/tokenstream"
|
10
|
+
require "rdoc/markup/simple_markup/preprocess"
|
11
|
+
require "rdoc/parsers/parserfactory"
|
12
|
+
|
13
|
+
module RDoc
|
14
|
+
|
15
|
+
class Parser
|
16
|
+
extend ParserFactory
|
17
|
+
|
18
|
+
# parser registration into RDoc
|
19
|
+
parse_files_matching(/\.(rb|pp)$/)
|
20
|
+
|
21
|
+
# called with the top level file
|
22
|
+
def initialize(top_level, file_name, content, options, stats)
|
23
|
+
@options = options
|
24
|
+
@stats = stats
|
25
|
+
@input_file_name = file_name
|
26
|
+
@top_level = PuppetTopLevel.new(top_level)
|
27
|
+
@progress = $stderr unless options.quiet
|
28
|
+
end
|
29
|
+
|
30
|
+
# main entry point
|
31
|
+
def scan
|
32
|
+
Puppet.info "rdoc: scanning %s" % @input_file_name
|
33
|
+
if @input_file_name =~ /\.pp$/
|
34
|
+
@parser = Puppet::Parser::Parser.new(:environment => Puppet[:environment])
|
35
|
+
@parser.file = @input_file_name
|
36
|
+
@ast = @parser.parse
|
37
|
+
end
|
38
|
+
scan_top_level(@top_level)
|
39
|
+
@top_level
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
# walk down the namespace and lookup/create container as needed
|
45
|
+
def get_class_or_module(container, name)
|
46
|
+
|
47
|
+
# class ::A -> A is in the top level
|
48
|
+
if name =~ /^::/
|
49
|
+
container = @top_level
|
50
|
+
end
|
51
|
+
|
52
|
+
names = name.split('::')
|
53
|
+
|
54
|
+
final_name = names.pop
|
55
|
+
names.each do |name|
|
56
|
+
prev_container = container
|
57
|
+
container = container.find_module_named(name)
|
58
|
+
unless container
|
59
|
+
container = prev_container.add_module(PuppetClass, name)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
return [container, final_name]
|
63
|
+
end
|
64
|
+
|
65
|
+
# split_module tries to find if +path+ belongs to the module path
|
66
|
+
# if it does, it returns the module name, otherwise if we are sure
|
67
|
+
# it is part of the global manifest path, "<site>" is returned.
|
68
|
+
# And finally if this path couldn't be mapped anywhere, nil is returned.
|
69
|
+
def split_module(path)
|
70
|
+
# find a module
|
71
|
+
fullpath = File.expand_path(path)
|
72
|
+
Puppet.debug "rdoc: testing %s" % fullpath
|
73
|
+
if fullpath =~ /(.*)\/([^\/]+)\/(?:manifests|plugins)\/.+\.(pp|rb)$/
|
74
|
+
modpath = $1
|
75
|
+
name = $2
|
76
|
+
Puppet.debug "rdoc: module %s into %s ?" % [name, modpath]
|
77
|
+
Puppet::Module.modulepath().each do |mp|
|
78
|
+
if File.identical?(modpath,mp)
|
79
|
+
Puppet.debug "rdoc: found module %s" % name
|
80
|
+
return name
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
if fullpath =~ /\.(pp|rb)$/
|
85
|
+
# there can be paths we don't want to scan under modules
|
86
|
+
# imagine a ruby or manifest that would be distributed as part as a module
|
87
|
+
# but we don't want those to be hosted under <site>
|
88
|
+
Puppet::Module.modulepath().each do |mp|
|
89
|
+
# check that fullpath is a descendant of mp
|
90
|
+
dirname = fullpath
|
91
|
+
while (dirname = File.dirname(dirname)) != '/'
|
92
|
+
return nil if File.identical?(dirname,mp)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
# we are under a global manifests
|
97
|
+
Puppet.debug "rdoc: global manifests"
|
98
|
+
return "<site>"
|
99
|
+
end
|
100
|
+
|
101
|
+
# create documentation for the top level +container+
|
102
|
+
def scan_top_level(container)
|
103
|
+
# use the module README as documentation for the module
|
104
|
+
comment = ""
|
105
|
+
readme = File.join(File.dirname(File.dirname(@input_file_name)), "README")
|
106
|
+
comment = File.open(readme,"r") { |f| f.read } if FileTest.readable?(readme)
|
107
|
+
look_for_directives_in(container, comment) unless comment.empty?
|
108
|
+
|
109
|
+
# infer module name from directory
|
110
|
+
name = split_module(@input_file_name)
|
111
|
+
if name.nil?
|
112
|
+
# skip .pp files that are not in manifests directories as we can't guarantee they're part
|
113
|
+
# of a module or the global configuration.
|
114
|
+
container.document_self = false
|
115
|
+
return
|
116
|
+
end
|
117
|
+
|
118
|
+
Puppet.debug "rdoc: scanning for %s" % name
|
119
|
+
|
120
|
+
container.module_name = name
|
121
|
+
container.global=true if name == "<site>"
|
122
|
+
|
123
|
+
@stats.num_modules += 1
|
124
|
+
container, name = get_class_or_module(container,name)
|
125
|
+
mod = container.add_module(PuppetModule, name)
|
126
|
+
mod.record_location(@top_level)
|
127
|
+
mod.comment = comment
|
128
|
+
|
129
|
+
if @input_file_name =~ /\.pp$/
|
130
|
+
parse_elements(mod)
|
131
|
+
elsif @input_file_name =~ /\.rb$/
|
132
|
+
parse_plugins(mod)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# create documentation for include statements we can find in +code+
|
137
|
+
# and associate it with +container+
|
138
|
+
def scan_for_include(container, code)
|
139
|
+
code.each do |stmt|
|
140
|
+
scan_for_include(container,stmt.children) if stmt.is_a?(Puppet::Parser::AST::ASTArray)
|
141
|
+
|
142
|
+
if stmt.is_a?(Puppet::Parser::AST::Function) and stmt.name == "include"
|
143
|
+
stmt.arguments.each do |included|
|
144
|
+
Puppet.debug "found include: %s" % included.value
|
145
|
+
container.add_include(Include.new(included.value, stmt.doc))
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
# create documentation for global variables assignements we can find in +code+
|
152
|
+
# and associate it with +container+
|
153
|
+
def scan_for_vardef(container, code)
|
154
|
+
code.each do |stmt|
|
155
|
+
scan_for_vardef(container,stmt.children) if stmt.is_a?(Puppet::Parser::AST::ASTArray)
|
156
|
+
|
157
|
+
if stmt.is_a?(Puppet::Parser::AST::VarDef)
|
158
|
+
Puppet.debug "rdoc: found constant: %s = %s" % [stmt.name.to_s, value_to_s(stmt.value)]
|
159
|
+
container.add_constant(Constant.new(stmt.name.to_s, value_to_s(stmt.value), stmt.doc))
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# create documentation for resources we can find in +code+
|
165
|
+
# and associate it with +container+
|
166
|
+
def scan_for_resource(container, code)
|
167
|
+
code.each do |stmt|
|
168
|
+
scan_for_resource(container,stmt.children) if stmt.is_a?(Puppet::Parser::AST::ASTArray)
|
169
|
+
|
170
|
+
if stmt.is_a?(Puppet::Parser::AST::Resource) and !stmt.type.nil?
|
171
|
+
type = stmt.type.split("::").collect { |s| s.capitalize }.join("::")
|
172
|
+
title = value_to_s(stmt.title)
|
173
|
+
Puppet.debug "rdoc: found resource: %s[%s]" % [type,title]
|
174
|
+
|
175
|
+
param = []
|
176
|
+
stmt.params.children.each do |p|
|
177
|
+
res = {}
|
178
|
+
res["name"] = p.param
|
179
|
+
if !p.value.nil?
|
180
|
+
if !p.value.is_a?(Puppet::Parser::AST::ASTArray)
|
181
|
+
res["value"] = "'#{p.value}'"
|
182
|
+
else
|
183
|
+
res["value"] = "[%s]" % p.value.children.collect { |v| "'#{v}'" }.join(", ")
|
184
|
+
end
|
185
|
+
end
|
186
|
+
param << res
|
187
|
+
end
|
188
|
+
|
189
|
+
container.add_resource(PuppetResource.new(type, title, stmt.doc, param))
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# create documentation for a class named +name+
|
195
|
+
def document_class(name, klass, container)
|
196
|
+
Puppet.debug "rdoc: found new class %s" % name
|
197
|
+
container, name = get_class_or_module(container, name)
|
198
|
+
|
199
|
+
superclass = klass.parentclass
|
200
|
+
superclass = "" if superclass.nil? or superclass.empty?
|
201
|
+
|
202
|
+
@stats.num_classes += 1
|
203
|
+
comment = klass.doc
|
204
|
+
look_for_directives_in(container, comment) unless comment.empty?
|
205
|
+
cls = container.add_class(PuppetClass, name, superclass)
|
206
|
+
cls.record_location(@top_level)
|
207
|
+
|
208
|
+
# scan class code for include
|
209
|
+
code = klass.code.children if klass.code.is_a?(Puppet::Parser::AST::ASTArray)
|
210
|
+
code ||= klass.code
|
211
|
+
unless code.nil?
|
212
|
+
scan_for_include(cls, code)
|
213
|
+
scan_for_resource(cls, code) if Puppet.settings[:document_all]
|
214
|
+
end
|
215
|
+
|
216
|
+
cls.comment = comment
|
217
|
+
end
|
218
|
+
|
219
|
+
# create documentation for a node
|
220
|
+
def document_node(name, node, container)
|
221
|
+
Puppet.debug "rdoc: found new node %s" % name
|
222
|
+
superclass = node.parentclass
|
223
|
+
superclass = "" if superclass.nil? or superclass.empty?
|
224
|
+
|
225
|
+
comment = node.doc
|
226
|
+
look_for_directives_in(container, comment) unless comment.empty?
|
227
|
+
n = container.add_node(name, superclass)
|
228
|
+
n.record_location(@top_level)
|
229
|
+
|
230
|
+
code = node.code.children if node.code.is_a?(Puppet::Parser::AST::ASTArray)
|
231
|
+
code ||= node.code
|
232
|
+
unless code.nil?
|
233
|
+
scan_for_include(n, code)
|
234
|
+
scan_for_vardef(n, code)
|
235
|
+
scan_for_resource(n, code) if Puppet.settings[:document_all]
|
236
|
+
end
|
237
|
+
|
238
|
+
n.comment = comment
|
239
|
+
end
|
240
|
+
|
241
|
+
# create documentation for a define
|
242
|
+
def document_define(name, define, container)
|
243
|
+
Puppet.debug "rdoc: found new definition %s" % name
|
244
|
+
# find superclas if any
|
245
|
+
@stats.num_methods += 1
|
246
|
+
|
247
|
+
# find the parentclass
|
248
|
+
# split define name by :: to find the complete module hierarchy
|
249
|
+
container, name = get_class_or_module(container,name)
|
250
|
+
|
251
|
+
return if container.find_local_symbol(name)
|
252
|
+
|
253
|
+
# build up declaration
|
254
|
+
declaration = ""
|
255
|
+
define.arguments.each do |arg,value|
|
256
|
+
declaration << "\$#{arg}"
|
257
|
+
if !value.nil?
|
258
|
+
declaration << " => "
|
259
|
+
if !value.is_a?(Puppet::Parser::AST::ASTArray)
|
260
|
+
declaration << "'#{value.value}'"
|
261
|
+
else
|
262
|
+
declaration << "[%s]" % value.children.collect { |v| "'#{v}'" }.join(", ")
|
263
|
+
end
|
264
|
+
end
|
265
|
+
declaration << ", "
|
266
|
+
end
|
267
|
+
declaration.chop!.chop! if declaration.size > 1
|
268
|
+
|
269
|
+
# register method into the container
|
270
|
+
meth = AnyMethod.new(declaration, name)
|
271
|
+
container.add_method(meth)
|
272
|
+
meth.comment = define.doc
|
273
|
+
look_for_directives_in(container, meth.comment) unless meth.comment.empty?
|
274
|
+
meth.params = "( " + declaration + " )"
|
275
|
+
meth.visibility = :public
|
276
|
+
meth.document_self = true
|
277
|
+
meth.singleton = false
|
278
|
+
end
|
279
|
+
|
280
|
+
# Traverse the AST tree and produce code-objects node
|
281
|
+
# that contains the documentation
|
282
|
+
def parse_elements(container)
|
283
|
+
Puppet.debug "rdoc: scanning manifest"
|
284
|
+
@ast[:classes].each do |name, klass|
|
285
|
+
if klass.file == @input_file_name
|
286
|
+
unless name.empty?
|
287
|
+
document_class(name,klass,container)
|
288
|
+
else # on main class document vardefs
|
289
|
+
code = klass.code.children unless klass.code.is_a?(Puppet::Parser::AST::ASTArray)
|
290
|
+
code ||= klass.code
|
291
|
+
scan_for_vardef(container, code) unless code.nil?
|
292
|
+
end
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
@ast[:definitions].each do |name, define|
|
297
|
+
if define.file == @input_file_name
|
298
|
+
document_define(name,define,container)
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
@ast[:nodes].each do |name, node|
|
303
|
+
if node.file == @input_file_name
|
304
|
+
document_node(name,node,container)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
# create documentation for plugins
|
310
|
+
def parse_plugins(container)
|
311
|
+
Puppet.debug "rdoc: scanning plugin or fact"
|
312
|
+
if @input_file_name =~ /\/facter\/[^\/]+\.rb$/
|
313
|
+
parse_fact(container)
|
314
|
+
else
|
315
|
+
parse_puppet_plugin(container)
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
# this is a poor man custom fact parser :-)
|
320
|
+
def parse_fact(container)
|
321
|
+
comments = ""
|
322
|
+
current_fact = nil
|
323
|
+
File.open(@input_file_name) do |of|
|
324
|
+
of.each do |line|
|
325
|
+
# fetch comments
|
326
|
+
if line =~ /^[ \t]*# ?(.*)$/
|
327
|
+
comments += $1 + "\n"
|
328
|
+
elsif line =~ /^[ \t]*Facter.add\(['"](.*?)['"]\)/
|
329
|
+
current_fact = Fact.new($1,{})
|
330
|
+
container.add_fact(current_fact)
|
331
|
+
look_for_directives_in(container, comments) unless comments.empty?
|
332
|
+
current_fact.comment = comments
|
333
|
+
current_fact.record_location(@top_level)
|
334
|
+
comments = ""
|
335
|
+
Puppet.debug "rdoc: found custom fact %s" % current_fact.name
|
336
|
+
elsif line =~ /^[ \t]*confine[ \t]*:(.*?)[ \t]*=>[ \t]*(.*)$/
|
337
|
+
current_fact.confine = { :type => $1, :value => $2 } unless current_fact.nil?
|
338
|
+
else # unknown line type
|
339
|
+
comments =""
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
# this is a poor man puppet plugin parser :-)
|
346
|
+
# it doesn't extract doc nor desc :-(
|
347
|
+
def parse_puppet_plugin(container)
|
348
|
+
comments = ""
|
349
|
+
current_plugin = nil
|
350
|
+
|
351
|
+
File.open(@input_file_name) do |of|
|
352
|
+
of.each do |line|
|
353
|
+
# fetch comments
|
354
|
+
if line =~ /^[ \t]*# ?(.*)$/
|
355
|
+
comments += $1 + "\n"
|
356
|
+
elsif line =~ /^[ \t]*newfunction[ \t]*\([ \t]*:(.*?)[ \t]*,[ \t]*:type[ \t]*=>[ \t]*(:rvalue|:lvalue)\)/
|
357
|
+
current_plugin = Plugin.new($1, "function")
|
358
|
+
container.add_plugin(current_plugin)
|
359
|
+
look_for_directives_in(container, comments) unless comments.empty?
|
360
|
+
current_plugin.comment = comments
|
361
|
+
current_plugin.record_location(@top_level)
|
362
|
+
comments = ""
|
363
|
+
Puppet.debug "rdoc: found new function plugins %s" % current_plugin.name
|
364
|
+
elsif line =~ /^[ \t]*Puppet::Type.newtype[ \t]*\([ \t]*:(.*?)\)/
|
365
|
+
current_plugin = Plugin.new($1, "type")
|
366
|
+
container.add_plugin(current_plugin)
|
367
|
+
look_for_directives_in(container, comments) unless comments.empty?
|
368
|
+
current_plugin.comment = comments
|
369
|
+
current_plugin.record_location(@top_level)
|
370
|
+
comments = ""
|
371
|
+
Puppet.debug "rdoc: found new type plugins %s" % current_plugin.name
|
372
|
+
elsif line =~ /module Puppet::Parser::Functions/
|
373
|
+
# skip
|
374
|
+
else # unknown line type
|
375
|
+
comments =""
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
# look_for_directives_in scans the current +comment+ for RDoc directives
|
382
|
+
def look_for_directives_in(context, comment)
|
383
|
+
preprocess = SM::PreProcess.new(@input_file_name, @options.rdoc_include)
|
384
|
+
|
385
|
+
preprocess.handle(comment) do |directive, param|
|
386
|
+
case directive
|
387
|
+
when "stopdoc"
|
388
|
+
context.stop_doc
|
389
|
+
""
|
390
|
+
when "startdoc"
|
391
|
+
context.start_doc
|
392
|
+
context.force_documentation = true
|
393
|
+
""
|
394
|
+
when "enddoc"
|
395
|
+
#context.done_documenting = true
|
396
|
+
#""
|
397
|
+
throw :enddoc
|
398
|
+
when "main"
|
399
|
+
options = Options.instance
|
400
|
+
options.main_page = param
|
401
|
+
""
|
402
|
+
when "title"
|
403
|
+
options = Options.instance
|
404
|
+
options.title = param
|
405
|
+
""
|
406
|
+
when "section"
|
407
|
+
context.set_current_section(param, comment)
|
408
|
+
comment.replace("") # 1.8 doesn't support #clear
|
409
|
+
break
|
410
|
+
else
|
411
|
+
warn "Unrecognized directive '#{directive}'"
|
412
|
+
break
|
413
|
+
end
|
414
|
+
end
|
415
|
+
remove_private_comments(comment)
|
416
|
+
end
|
417
|
+
|
418
|
+
def remove_private_comments(comment)
|
419
|
+
comment.gsub!(/^#--.*?^#\+\+/m, '')
|
420
|
+
comment.sub!(/^#--.*/m, '')
|
421
|
+
end
|
422
|
+
|
423
|
+
# convert an AST value to a string
|
424
|
+
def value_to_s(value)
|
425
|
+
value = value.children if value.is_a?(Puppet::Parser::AST::ASTArray)
|
426
|
+
if value.is_a?(Array)
|
427
|
+
"['#{value.join(", ")}']"
|
428
|
+
elsif [:true, true, "true"].include?(value)
|
429
|
+
"true"
|
430
|
+
elsif [:false, false, "false"].include?(value)
|
431
|
+
"false"
|
432
|
+
else
|
433
|
+
value.to_s
|
434
|
+
end
|
435
|
+
end
|
436
|
+
end
|
437
|
+
end
|
data/lib/puppet/util/selinux.rb
CHANGED
@@ -1,74 +1,67 @@
|
|
1
1
|
# Provides utility functions to help interfaces Puppet to SELinux.
|
2
2
|
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
3
|
+
# This requires the very new SELinux Ruby bindings. These bindings closely
|
4
|
+
# mirror the SELinux C library interface.
|
5
|
+
#
|
6
|
+
# Support for the command line tools is not provided because the performance
|
7
|
+
# was abysmal. At this time (2008-11-02) the only distribution providing
|
8
|
+
# these Ruby SELinux bindings which I am aware of is Fedora (in libselinux-ruby).
|
8
9
|
|
9
|
-
|
10
|
+
begin
|
11
|
+
require 'selinux'
|
12
|
+
rescue LoadError
|
13
|
+
# Nothing
|
14
|
+
end
|
10
15
|
|
11
16
|
module Puppet::Util::SELinux
|
12
17
|
|
13
|
-
include Puppet::Util
|
14
|
-
|
15
18
|
def selinux_support?
|
16
|
-
|
19
|
+
unless defined? Selinux
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
if Selinux.is_selinux_enabled == 1
|
23
|
+
return true
|
24
|
+
end
|
25
|
+
return false
|
17
26
|
end
|
18
27
|
|
19
28
|
# Retrieve and return the full context of the file. If we don't have
|
20
|
-
# SELinux support or if the
|
29
|
+
# SELinux support or if the SELinux call fails then return nil.
|
21
30
|
def get_selinux_current_context(file)
|
22
31
|
unless selinux_support?
|
23
32
|
return nil
|
24
33
|
end
|
25
|
-
|
26
|
-
|
27
|
-
execpipe("/usr/bin/stat -c %C #{file}") do |out|
|
28
|
-
out.each do |line|
|
29
|
-
context << line
|
30
|
-
end
|
31
|
-
end
|
32
|
-
rescue Puppet::ExecutionFailure
|
33
|
-
return nil
|
34
|
-
end
|
35
|
-
context.chomp!
|
36
|
-
# Handle the case that the system seems to have SELinux support but
|
37
|
-
# stat finds unlabled files.
|
38
|
-
if context == "(null)"
|
34
|
+
retval = Selinux.lgetfilecon(file)
|
35
|
+
if retval == -1
|
39
36
|
return nil
|
40
37
|
end
|
41
|
-
return
|
38
|
+
return retval[1]
|
42
39
|
end
|
43
40
|
|
44
|
-
#
|
45
|
-
#
|
46
|
-
# use this to obtain a good default context. If the command does not
|
47
|
-
# exist or the call fails return nil.
|
48
|
-
#
|
49
|
-
# Note: For this command to work a full, non-relative, filesystem path
|
50
|
-
# should be given.
|
41
|
+
# Retrieve and return the default context of the file. If we don't have
|
42
|
+
# SELinux support or if the SELinux call fails to file a default then return nil.
|
51
43
|
def get_selinux_default_context(file)
|
52
44
|
unless selinux_support?
|
53
45
|
return nil
|
54
46
|
end
|
55
|
-
|
47
|
+
# If the filesystem has no support for SELinux labels, return a default of nil
|
48
|
+
# instead of what matchpathcon would return
|
49
|
+
unless selinux_label_support?(file)
|
56
50
|
return nil
|
57
51
|
end
|
58
|
-
|
52
|
+
# If the file exists we should pass the mode to matchpathcon for the most specific
|
53
|
+
# matching. If not, we can pass a mode of 0.
|
59
54
|
begin
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
55
|
+
filestat = File.lstat(file)
|
56
|
+
mode = filestat.mode
|
57
|
+
rescue Errno::ENOENT
|
58
|
+
mode = 0
|
59
|
+
end
|
60
|
+
retval = Selinux.matchpathcon(file, mode)
|
61
|
+
if retval == -1
|
66
62
|
return nil
|
67
63
|
end
|
68
|
-
|
69
|
-
# a variable amount of whitespace. The second field is the full context.
|
70
|
-
context = context.split(/\s/)[1]
|
71
|
-
return context
|
64
|
+
return retval[1]
|
72
65
|
end
|
73
66
|
|
74
67
|
# Take the full SELinux context returned from the tools and parse it
|
@@ -91,32 +84,52 @@ module Puppet::Util::SELinux
|
|
91
84
|
end
|
92
85
|
|
93
86
|
# This updates the actual SELinux label on the file. You can update
|
94
|
-
# only a single component or update the entire context.
|
95
|
-
#
|
87
|
+
# only a single component or update the entire context.
|
88
|
+
# The caveat is that since setting a partial context makes no sense the
|
89
|
+
# file has to already exist. Puppet (via the File resource) will always
|
90
|
+
# just try to set components, even if all values are specified by the manifest.
|
91
|
+
# I believe that the OS should always provide at least a fall-through context
|
92
|
+
# though on any well-running system.
|
96
93
|
def set_selinux_context(file, value, component = false)
|
97
94
|
unless selinux_support?
|
98
95
|
return nil
|
99
96
|
end
|
100
|
-
case component
|
101
|
-
when :seluser
|
102
|
-
flag = "-u"
|
103
|
-
when :selrole
|
104
|
-
flag = "-r"
|
105
|
-
when :seltype
|
106
|
-
flag = "-t"
|
107
|
-
when :selrange
|
108
|
-
flag = "-l"
|
109
|
-
else
|
110
|
-
flag = nil
|
111
|
-
end
|
112
97
|
|
113
|
-
if
|
114
|
-
|
98
|
+
if component
|
99
|
+
# Must first get existing context to replace a single component
|
100
|
+
context = Selinux.lgetfilecon(file)[1]
|
101
|
+
if context == -1
|
102
|
+
# We can't set partial context components when no context exists
|
103
|
+
# unless/until we can find a way to make Puppet call this method
|
104
|
+
# once for all selinux file label attributes.
|
105
|
+
Puppet.warning "Can't set SELinux context on file unless the file already has some kind of context"
|
106
|
+
return nil
|
107
|
+
end
|
108
|
+
context = context.split(':')
|
109
|
+
case component
|
110
|
+
when :seluser
|
111
|
+
context[0] = value
|
112
|
+
when :selrole
|
113
|
+
context[1] = value
|
114
|
+
when :seltype
|
115
|
+
context[2] = value
|
116
|
+
when :selrange
|
117
|
+
context[3] = value
|
118
|
+
else
|
119
|
+
raise ArguementError, "set_selinux_context component must be one of :seluser, :selrole, :seltype, or :selrange"
|
120
|
+
end
|
121
|
+
context = context.join(':')
|
122
|
+
else
|
123
|
+
context = value
|
124
|
+
end
|
125
|
+
|
126
|
+
retval = Selinux.lsetfilecon(file, context)
|
127
|
+
if retval == 0
|
128
|
+
return true
|
115
129
|
else
|
116
|
-
|
130
|
+
Puppet.warning "Failed to set SELinux context %s on %s" % [context, file]
|
131
|
+
return false
|
117
132
|
end
|
118
|
-
execute(cmd)
|
119
|
-
return true
|
120
133
|
end
|
121
134
|
|
122
135
|
# Since this call relies on get_selinux_default_context it also needs a
|
@@ -136,4 +149,63 @@ module Puppet::Util::SELinux
|
|
136
149
|
end
|
137
150
|
return nil
|
138
151
|
end
|
152
|
+
|
153
|
+
# Internal helper function to read and parse /proc/mounts
|
154
|
+
def read_mounts
|
155
|
+
begin
|
156
|
+
mounts = File.read("/proc/mounts")
|
157
|
+
rescue
|
158
|
+
return nil
|
159
|
+
end
|
160
|
+
|
161
|
+
mntpoint = {}
|
162
|
+
|
163
|
+
# Read all entries in /proc/mounts. The second column is the
|
164
|
+
# mountpoint and the third column is the filesystem type.
|
165
|
+
# We skip rootfs because it is always mounted at /
|
166
|
+
mounts.collect do |line|
|
167
|
+
params = line.split(' ')
|
168
|
+
next if params[2] == 'rootfs'
|
169
|
+
mntpoint[params[1]] = params[2]
|
170
|
+
end
|
171
|
+
return mntpoint
|
172
|
+
end
|
173
|
+
|
174
|
+
# Internal helper function to return which type of filesystem a
|
175
|
+
# given file path resides on
|
176
|
+
def find_fs(file)
|
177
|
+
unless mnts = read_mounts()
|
178
|
+
return nil
|
179
|
+
end
|
180
|
+
|
181
|
+
# For a given file:
|
182
|
+
# Check if the filename is in the data structure;
|
183
|
+
# return the fstype if it is.
|
184
|
+
# Just in case: return something if you're down to "/" or ""
|
185
|
+
# Remove the last slash and everything after it,
|
186
|
+
# and repeat with that as the file for the next loop through.
|
187
|
+
ary = file.split('/')
|
188
|
+
while not ary.empty? do
|
189
|
+
path = ary.join('/')
|
190
|
+
if mnts.has_key?(path)
|
191
|
+
return mnts[path]
|
192
|
+
end
|
193
|
+
ary.pop
|
194
|
+
end
|
195
|
+
return mnts['/']
|
196
|
+
end
|
197
|
+
|
198
|
+
# Check filesystem a path resides on for SELinux support against
|
199
|
+
# whitelist of known-good filesystems.
|
200
|
+
# Returns true if the filesystem can support SELinux labels and
|
201
|
+
# false if not.
|
202
|
+
def selinux_label_support?(file)
|
203
|
+
fstype = find_fs(file)
|
204
|
+
if fstype.nil?
|
205
|
+
return false
|
206
|
+
end
|
207
|
+
filesystems = ['ext2', 'ext3', 'ext4', 'gfs', 'gfs2', 'xfs', 'jfs']
|
208
|
+
return filesystems.include?(fstype)
|
209
|
+
end
|
210
|
+
|
139
211
|
end
|