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.

Files changed (383) hide show
  1. data/CHANGELOG +115 -0
  2. data/Rakefile +43 -14
  3. data/bin/puppetca +6 -5
  4. data/bin/puppetdoc +109 -15
  5. data/bin/ralsh +3 -1
  6. data/conf/redhat/puppet.spec +74 -48
  7. data/examples/mcx_dock_absent.pp +4 -0
  8. data/examples/mcx_dock_default.pp +118 -0
  9. data/examples/mcx_dock_full.pp +125 -0
  10. data/examples/mcx_dock_invalid.pp +9 -0
  11. data/examples/mcx_nogroup.pp +118 -0
  12. data/examples/mcx_notexists_absent.pp +4 -0
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/lib/puppet.rb +1 -1
  15. data/lib/puppet/external/nagios/base.rb +114 -71
  16. data/lib/puppet/feature/base.rb +6 -0
  17. data/lib/puppet/indirector/yaml.rb +12 -3
  18. data/lib/puppet/module.rb +1 -1
  19. data/lib/puppet/network/client/master.rb +1 -1
  20. data/lib/puppet/network/xmlrpc/client.rb +3 -1
  21. data/lib/puppet/parameter.rb +1 -1
  22. data/lib/puppet/parser/ast.rb +15 -0
  23. data/lib/puppet/parser/ast/astarray.rb +1 -2
  24. data/lib/puppet/parser/ast/casestatement.rb +2 -0
  25. data/lib/puppet/parser/ast/collection.rb +2 -0
  26. data/lib/puppet/parser/ast/comparison_operator.rb +4 -0
  27. data/lib/puppet/parser/ast/definition.rb +2 -0
  28. data/lib/puppet/parser/ast/else.rb +3 -0
  29. data/lib/puppet/parser/ast/function.rb +19 -12
  30. data/lib/puppet/parser/ast/hostclass.rb +9 -1
  31. data/lib/puppet/parser/ast/ifstatement.rb +3 -0
  32. data/lib/puppet/parser/ast/node.rb +3 -0
  33. data/lib/puppet/parser/ast/resource.rb +3 -0
  34. data/lib/puppet/parser/ast/resource_defaults.rb +2 -0
  35. data/lib/puppet/parser/ast/resource_override.rb +3 -0
  36. data/lib/puppet/parser/ast/vardef.rb +3 -0
  37. data/lib/puppet/parser/functions.rb +14 -0
  38. data/lib/puppet/parser/functions/inline_template.rb +21 -0
  39. data/lib/puppet/parser/functions/template.rb +3 -2
  40. data/lib/puppet/parser/lexer.rb +56 -7
  41. data/lib/puppet/parser/parser.rb +114 -98
  42. data/lib/puppet/parser/parser_support.rb +24 -4
  43. data/lib/puppet/parser/resource/reference.rb +4 -3
  44. data/lib/puppet/parser/templatewrapper.rb +30 -22
  45. data/lib/puppet/property.rb +1 -1
  46. data/lib/puppet/property/list.rb +7 -2
  47. data/lib/puppet/property/ordered_list.rb +22 -0
  48. data/lib/puppet/provider/augeas/augeas.rb +189 -0
  49. data/lib/puppet/provider/computer/computer.rb +22 -0
  50. data/lib/puppet/provider/confine.rb +4 -1
  51. data/lib/puppet/provider/confine/variable.rb +13 -2
  52. data/lib/puppet/provider/confine_collection.rb +4 -1
  53. data/lib/puppet/provider/confiner.rb +1 -1
  54. data/lib/puppet/provider/group/directoryservice.rb +6 -3
  55. data/lib/puppet/provider/group/groupadd.rb +5 -2
  56. data/lib/puppet/provider/group/ldap.rb +11 -9
  57. data/lib/puppet/provider/group/netinfo.rb +8 -4
  58. data/lib/puppet/provider/group/pw.rb +5 -1
  59. data/lib/puppet/provider/host/netinfo.rb +5 -2
  60. data/lib/puppet/provider/macauthorization/macauthorization.rb +315 -0
  61. data/lib/puppet/provider/mcx/mcxcontent.rb +201 -0
  62. data/lib/puppet/provider/nameservice/directoryservice.rb +210 -107
  63. data/lib/puppet/provider/nameservice/netinfo.rb +7 -2
  64. data/lib/puppet/provider/package/appdmg.rb +0 -3
  65. data/lib/puppet/provider/package/apt.rb +6 -0
  66. data/lib/puppet/provider/package/rpm.rb +2 -0
  67. data/lib/puppet/provider/package/yum.rb +5 -1
  68. data/lib/puppet/provider/package/yumhelper.py +9 -0
  69. data/lib/puppet/provider/service/base.rb +9 -6
  70. data/lib/puppet/provider/service/daemontools.rb +25 -15
  71. data/lib/puppet/provider/service/debian.rb +6 -2
  72. data/lib/puppet/provider/service/freebsd.rb +5 -2
  73. data/lib/puppet/provider/service/gentoo.rb +6 -3
  74. data/lib/puppet/provider/service/init.rb +31 -21
  75. data/lib/puppet/provider/service/launchd.rb +195 -0
  76. data/lib/puppet/provider/service/redhat.rb +5 -2
  77. data/lib/puppet/provider/service/runit.rb +30 -20
  78. data/lib/puppet/provider/service/smf.rb +7 -4
  79. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +21 -1
  80. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  81. data/lib/puppet/provider/user/netinfo.rb +9 -3
  82. data/lib/puppet/provider/user/user_role_add.rb +43 -6
  83. data/lib/puppet/provider/zfs/solaris.rb +45 -0
  84. data/lib/puppet/provider/zone/solaris.rb +8 -4
  85. data/lib/puppet/provider/zpool/solaris.rb +116 -0
  86. data/lib/puppet/rails/database/003_add_environment_to_host.rb +9 -0
  87. data/lib/puppet/rails/database/schema.rb +1 -0
  88. data/lib/puppet/rails/host.rb +4 -0
  89. data/lib/puppet/reference/configuration.rb +1 -1
  90. data/lib/puppet/reports/tagmail.rb +15 -6
  91. data/lib/puppet/transaction/change.rb +3 -5
  92. data/lib/puppet/transportable.rb +1 -0
  93. data/lib/puppet/type/augeas.rb +155 -0
  94. data/lib/puppet/type/computer.rb +62 -0
  95. data/lib/puppet/type/exec.rb +2 -1
  96. data/lib/puppet/type/file.rb +1 -1
  97. data/lib/puppet/type/file/ensure.rb +8 -5
  98. data/lib/puppet/type/file/mode.rb +0 -14
  99. data/lib/puppet/type/file/owner.rb +32 -64
  100. data/lib/puppet/type/file/selcontext.rb +3 -8
  101. data/lib/puppet/type/group.rb +27 -45
  102. data/lib/puppet/type/k5login.rb +1 -1
  103. data/lib/puppet/type/macauthorization.rb +141 -0
  104. data/lib/puppet/type/mcx.rb +115 -0
  105. data/lib/puppet/type/mount.rb +1 -1
  106. data/lib/puppet/type/nagios_hostdependency.rb +3 -0
  107. data/lib/puppet/type/ssh_authorized_key.rb +16 -0
  108. data/lib/puppet/type/tidy.rb +43 -14
  109. data/lib/puppet/type/user.rb +25 -1
  110. data/lib/puppet/type/zfs.rb +51 -0
  111. data/lib/puppet/type/zone.rb +8 -0
  112. data/lib/puppet/type/zpool.rb +93 -0
  113. data/lib/puppet/util.rb +17 -38
  114. data/lib/puppet/util/file_locking.rb +44 -0
  115. data/lib/puppet/util/filetype.rb +3 -3
  116. data/lib/puppet/util/log.rb +1 -16
  117. data/lib/puppet/util/metric.rb +0 -5
  118. data/lib/puppet/util/rdoc.rb +85 -0
  119. data/lib/puppet/util/rdoc/code_objects.rb +219 -0
  120. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +829 -0
  121. data/lib/puppet/util/rdoc/generators/template/puppet/puppet.rb +1051 -0
  122. data/lib/puppet/util/rdoc/parser.rb +437 -0
  123. data/lib/puppet/util/selinux.rb +135 -63
  124. data/lib/puppet/util/settings.rb +136 -126
  125. data/lib/puppet/util/storage.rb +4 -2
  126. data/spec/Rakefile +91 -0
  127. data/spec/integration/checksum.rb +47 -0
  128. data/spec/integration/defaults.rb +47 -0
  129. data/spec/integration/file_serving/configuration.rb +43 -0
  130. data/spec/integration/file_serving/content.rb +18 -0
  131. data/spec/integration/file_serving/metadata.rb +18 -0
  132. data/spec/integration/indirector/direct_file_server.rb +80 -0
  133. data/spec/integration/indirector/file_content/file_server.rb +18 -0
  134. data/spec/integration/indirector/file_metadata/file_server.rb +18 -0
  135. data/spec/integration/indirector/module_files.rb +57 -0
  136. data/spec/integration/indirector/node/ldap.rb +15 -0
  137. data/spec/integration/indirector/rest.rb +464 -0
  138. data/spec/integration/network/server/mongrel.rb +48 -0
  139. data/spec/integration/network/server/webrick.rb +48 -0
  140. data/spec/integration/node.rb +93 -0
  141. data/spec/integration/node/catalog.rb +54 -0
  142. data/spec/integration/node/facts.rb +45 -0
  143. data/spec/integration/provider/package.rb +26 -0
  144. data/spec/integration/provider/service/init.rb +32 -0
  145. data/spec/integration/reference/providers.rb +17 -0
  146. data/spec/integration/reports.rb +14 -0
  147. data/spec/integration/transaction/report.rb +26 -0
  148. data/spec/integration/type/package.rb +22 -0
  149. data/spec/integration/util/file_locking.rb +36 -0
  150. data/spec/monkey_patches/add_confine_and_runnable_to_rspec_dsl.rb +46 -0
  151. data/spec/monkey_patches/alias_should_to_must.rb +5 -0
  152. data/spec/shared_behaviours/file_server_terminus.rb +42 -0
  153. data/spec/shared_behaviours/file_serving.rb +64 -0
  154. data/spec/shared_behaviours/memory_terminus.rb +32 -0
  155. data/spec/spec.opts +5 -0
  156. data/spec/spec_helper.rb +36 -0
  157. data/spec/unit/executables/client/certhandler.rb +122 -0
  158. data/spec/unit/file_serving/configuration.rb +224 -0
  159. data/spec/unit/file_serving/configuration/parser.rb +135 -0
  160. data/spec/unit/file_serving/content.rb +71 -0
  161. data/spec/unit/file_serving/file_base.rb +124 -0
  162. data/spec/unit/file_serving/fileset.rb +239 -0
  163. data/spec/unit/file_serving/indirection_hooks.rb +124 -0
  164. data/spec/unit/file_serving/metadata.rb +187 -0
  165. data/spec/unit/file_serving/mount.rb +143 -0
  166. data/spec/unit/file_serving/terminus_helper.rb +76 -0
  167. data/spec/unit/indirector.rb +152 -0
  168. data/spec/unit/indirector/catalog/compiler.rb +156 -0
  169. data/spec/unit/indirector/catalog/yaml.rb +25 -0
  170. data/spec/unit/indirector/checksum/file.rb +139 -0
  171. data/spec/unit/indirector/code.rb +33 -0
  172. data/spec/unit/indirector/direct_file_server.rb +89 -0
  173. data/spec/unit/indirector/envelope.rb +47 -0
  174. data/spec/unit/indirector/exec.rb +51 -0
  175. data/spec/unit/indirector/facts/facter.rb +76 -0
  176. data/spec/unit/indirector/facts/yaml.rb +26 -0
  177. data/spec/unit/indirector/file.rb +154 -0
  178. data/spec/unit/indirector/file_content/file.rb +18 -0
  179. data/spec/unit/indirector/file_content/file_server.rb +18 -0
  180. data/spec/unit/indirector/file_content/modules.rb +18 -0
  181. data/spec/unit/indirector/file_content/rest.rb +11 -0
  182. data/spec/unit/indirector/file_metadata/file.rb +52 -0
  183. data/spec/unit/indirector/file_metadata/file_server.rb +18 -0
  184. data/spec/unit/indirector/file_metadata/modules.rb +42 -0
  185. data/spec/unit/indirector/file_metadata/rest.rb +9 -0
  186. data/spec/unit/indirector/file_server.rb +184 -0
  187. data/spec/unit/indirector/indirection.rb +731 -0
  188. data/spec/unit/indirector/ldap.rb +143 -0
  189. data/spec/unit/indirector/memory.rb +29 -0
  190. data/spec/unit/indirector/module_files.rb +259 -0
  191. data/spec/unit/indirector/node/exec.rb +69 -0
  192. data/spec/unit/indirector/node/ldap.rb +424 -0
  193. data/spec/unit/indirector/node/memory.rb +19 -0
  194. data/spec/unit/indirector/node/plain.rb +19 -0
  195. data/spec/unit/indirector/node/rest.rb +13 -0
  196. data/spec/unit/indirector/node/yaml.rb +25 -0
  197. data/spec/unit/indirector/plain.rb +29 -0
  198. data/spec/unit/indirector/report/processor.rb +81 -0
  199. data/spec/unit/indirector/request.rb +87 -0
  200. data/spec/unit/indirector/rest.rb +372 -0
  201. data/spec/unit/indirector/ssl_rsa/file.rb +116 -0
  202. data/spec/unit/indirector/terminus.rb +245 -0
  203. data/spec/unit/indirector/yaml.rb +145 -0
  204. data/spec/unit/module.rb +247 -0
  205. data/spec/unit/network/client.rb +45 -0
  206. data/spec/unit/network/client/master.rb +442 -0
  207. data/spec/unit/network/handler/fileserver.rb +179 -0
  208. data/spec/unit/network/http.rb +35 -0
  209. data/spec/unit/network/http/mongrel.rb +117 -0
  210. data/spec/unit/network/http/mongrel/rest.rb +377 -0
  211. data/spec/unit/network/http/mongrel/xmlrpc.rb +0 -0
  212. data/spec/unit/network/http/webrick.rb +127 -0
  213. data/spec/unit/network/http/webrick/rest.rb +323 -0
  214. data/spec/unit/network/http/webrick/xmlrpc.rb +0 -0
  215. data/spec/unit/network/http_pool.rb +238 -0
  216. data/spec/unit/network/server.rb +316 -0
  217. data/spec/unit/network/xmlrpc/client.rb +13 -0
  218. data/spec/unit/node.rb +167 -0
  219. data/spec/unit/node/catalog.rb +864 -0
  220. data/spec/unit/node/environment.rb +37 -0
  221. data/spec/unit/node/facts.rb +44 -0
  222. data/spec/unit/other/checksum.rb +92 -0
  223. data/spec/unit/other/pgraph.rb +210 -0
  224. data/spec/unit/other/transaction.rb +33 -0
  225. data/spec/unit/other/transbucket.rb +172 -0
  226. data/spec/unit/other/transobject.rb +92 -0
  227. data/spec/unit/parameter.rb +24 -0
  228. data/spec/unit/parser/ast.rb +37 -0
  229. data/spec/unit/parser/ast/arithmetic_operator.rb +73 -0
  230. data/spec/unit/parser/ast/astarray.rb +66 -0
  231. data/spec/unit/parser/ast/boolean_operator.rb +53 -0
  232. data/spec/unit/parser/ast/collexpr.rb +92 -0
  233. data/spec/unit/parser/ast/comparison_operator.rb +92 -0
  234. data/spec/unit/parser/ast/definition.rb +195 -0
  235. data/spec/unit/parser/ast/function.rb +77 -0
  236. data/spec/unit/parser/ast/hostclass.rb +148 -0
  237. data/spec/unit/parser/ast/minus.rb +36 -0
  238. data/spec/unit/parser/ast/node.rb +125 -0
  239. data/spec/unit/parser/ast/nop.rb +20 -0
  240. data/spec/unit/parser/ast/not.rb +30 -0
  241. data/spec/unit/parser/ast/resource_override.rb +51 -0
  242. data/spec/unit/parser/ast/resource_reference.rb +63 -0
  243. data/spec/unit/parser/ast/vardef.rb +47 -0
  244. data/spec/unit/parser/collector.rb +426 -0
  245. data/spec/unit/parser/compiler.rb +561 -0
  246. data/spec/unit/parser/functions.rb +83 -0
  247. data/spec/unit/parser/functions/inline_template.rb +59 -0
  248. data/spec/unit/parser/functions/template.rb +62 -0
  249. data/spec/unit/parser/interpreter.rb +138 -0
  250. data/spec/unit/parser/lexer.rb +646 -0
  251. data/spec/unit/parser/parser.rb +228 -0
  252. data/spec/unit/parser/resource.rb +336 -0
  253. data/spec/unit/parser/resource/reference.rb +95 -0
  254. data/spec/unit/parser/scope.rb +87 -0
  255. data/spec/unit/parser/templatewrapper.rb +129 -0
  256. data/spec/unit/property.rb +35 -0
  257. data/spec/unit/property/keyvalue.rb +168 -0
  258. data/spec/unit/property/list.rb +156 -0
  259. data/spec/unit/property/ordered_list.rb +64 -0
  260. data/spec/unit/provider/augeas/augeas.rb +238 -0
  261. data/spec/unit/provider/confine.rb +78 -0
  262. data/spec/unit/provider/confine/exists.rb +81 -0
  263. data/spec/unit/provider/confine/false.rb +53 -0
  264. data/spec/unit/provider/confine/feature.rb +60 -0
  265. data/spec/unit/provider/confine/true.rb +53 -0
  266. data/spec/unit/provider/confine/variable.rb +107 -0
  267. data/spec/unit/provider/confine_collection.rb +134 -0
  268. data/spec/unit/provider/confiner.rb +63 -0
  269. data/spec/unit/provider/group/groupadd.rb +31 -0
  270. data/spec/unit/provider/group/ldap.rb +105 -0
  271. data/spec/unit/provider/ldap.rb +248 -0
  272. data/spec/unit/provider/macauthorization.rb +147 -0
  273. data/spec/unit/provider/mcx/mcxcontent.rb +175 -0
  274. data/spec/unit/provider/mount.rb +130 -0
  275. data/spec/unit/provider/mount/parsed.rb +185 -0
  276. data/spec/unit/provider/package/apt.rb +138 -0
  277. data/spec/unit/provider/package/dpkg.rb +163 -0
  278. data/spec/unit/provider/package/gem.rb +87 -0
  279. data/spec/unit/provider/package/hpux.rb +52 -0
  280. data/spec/unit/provider/selboolean.rb +37 -0
  281. data/spec/unit/provider/selmodule-example.pp +0 -0
  282. data/spec/unit/provider/selmodule.rb +66 -0
  283. data/spec/unit/provider/service/daemontools.rb +124 -0
  284. data/spec/unit/provider/service/launchd.rb +134 -0
  285. data/spec/unit/provider/service/runit.rb +117 -0
  286. data/spec/unit/provider/ssh_authorized_key/parsed.rb +102 -0
  287. data/spec/unit/provider/user/hpux.rb +25 -0
  288. data/spec/unit/provider/user/ldap.rb +279 -0
  289. data/spec/unit/provider/user/user_role_add.rb +249 -0
  290. data/spec/unit/provider/user/useradd.rb +115 -0
  291. data/spec/unit/provider/zfs/solaris.rb +87 -0
  292. data/spec/unit/provider/zone/solaris.rb +42 -0
  293. data/spec/unit/provider/zpool/solaris.rb +179 -0
  294. data/spec/unit/rails.rb +125 -0
  295. data/spec/unit/relationship.rb +149 -0
  296. data/spec/unit/reports.rb +61 -0
  297. data/spec/unit/resource_reference.rb +73 -0
  298. data/spec/unit/simple_graph.rb +280 -0
  299. data/spec/unit/transaction/change.rb +187 -0
  300. data/spec/unit/transaction/event.rb +25 -0
  301. data/spec/unit/transaction/report.rb +40 -0
  302. data/spec/unit/type.rb +64 -0
  303. data/spec/unit/type/augeas.rb +113 -0
  304. data/spec/unit/type/computer.rb +82 -0
  305. data/spec/unit/type/exec.rb +91 -0
  306. data/spec/unit/type/file.rb +155 -0
  307. data/spec/unit/type/file/ensure.rb +21 -0
  308. data/spec/unit/type/file/group.rb +118 -0
  309. data/spec/unit/type/file/owner.rb +132 -0
  310. data/spec/unit/type/file/selinux.rb +82 -0
  311. data/spec/unit/type/group.rb +40 -0
  312. data/spec/unit/type/macauthorization.rb +78 -0
  313. data/spec/unit/type/mcx.rb +108 -0
  314. data/spec/unit/type/mount.rb +219 -0
  315. data/spec/unit/type/nagios.rb +63 -0
  316. data/spec/unit/type/noop_metaparam.rb +38 -0
  317. data/spec/unit/type/package.rb +246 -0
  318. data/spec/unit/type/resources.rb +27 -0
  319. data/spec/unit/type/schedule.rb +339 -0
  320. data/spec/unit/type/selboolean.rb +47 -0
  321. data/spec/unit/type/selmodule.rb +18 -0
  322. data/spec/unit/type/service.rb +254 -0
  323. data/spec/unit/type/ssh_authorized_key.rb +106 -0
  324. data/spec/unit/type/tidy.rb +68 -0
  325. data/spec/unit/type/user.rb +260 -0
  326. data/spec/unit/type/zfs.rb +45 -0
  327. data/spec/unit/type/zone.rb +20 -0
  328. data/spec/unit/type/zpool.rb +110 -0
  329. data/spec/unit/util/checksums.rb +99 -0
  330. data/spec/unit/util/constant_inflector.rb +70 -0
  331. data/spec/unit/util/file_locking.rb +115 -0
  332. data/spec/unit/util/ldap/connection.rb +169 -0
  333. data/spec/unit/util/ldap/generator.rb +54 -0
  334. data/spec/unit/util/ldap/manager.rb +654 -0
  335. data/spec/unit/util/loadedfile.rb +65 -0
  336. data/spec/unit/util/log.rb +107 -0
  337. data/spec/unit/util/metric.rb +95 -0
  338. data/spec/unit/util/nagios_maker.rb +128 -0
  339. data/spec/unit/util/posix.rb +256 -0
  340. data/spec/unit/util/resource_template.rb +58 -0
  341. data/spec/unit/util/selinux.rb +219 -0
  342. data/spec/unit/util/settings.rb +847 -0
  343. data/spec/unit/util/storage.rb +248 -0
  344. data/spec/unit/util/tagging.rb +92 -0
  345. data/spec/unit/util/uri_helper.rb +41 -0
  346. data/spec/unit/util/user_attr.rb +47 -0
  347. data/spec/unit/util/warnings.rb +35 -0
  348. data/test/certmgr/support.rb +0 -6
  349. data/test/data/providers/ssh_authorized_key/parsed/authorized_keys +1 -0
  350. data/test/data/snippets/multilinecomments.pp +6 -0
  351. data/test/data/snippets/multipleclass.pp +9 -0
  352. data/test/language/functions.rb +11 -1
  353. data/test/language/snippets.rb +16 -0
  354. data/test/lib/puppettest/runnable_test.rb +1 -1
  355. data/test/network/handler/fileserver.rb +5 -0
  356. data/test/other/report.rb +0 -4
  357. data/test/ral/type/resources.rb +2 -19
  358. data/test/util/settings.rb +4 -4
  359. data/test/util/storage.rb +0 -24
  360. data/test/util/utiltest.rb +0 -33
  361. metadata +319 -26
  362. data/conf/debian/README.source +0 -2
  363. data/conf/debian/TODO.Debian +0 -1
  364. data/conf/debian/changelog +0 -257
  365. data/conf/debian/compat +0 -1
  366. data/conf/debian/control +0 -45
  367. data/conf/debian/copyright +0 -17
  368. data/conf/debian/docs +0 -1
  369. data/conf/debian/fileserver.conf +0 -12
  370. data/conf/debian/puppet.NEWS +0 -63
  371. data/conf/debian/puppet.conf +0 -8
  372. data/conf/debian/puppet.dirs +0 -7
  373. data/conf/debian/puppet.files +0 -6
  374. data/conf/debian/puppet.init +0 -64
  375. data/conf/debian/puppet.logrotate +0 -11
  376. data/conf/debian/puppet.postinst +0 -9
  377. data/conf/debian/puppet.postrm +0 -21
  378. data/conf/debian/puppet.preinst +0 -25
  379. data/conf/debian/puppetmaster.files +0 -4
  380. data/conf/debian/puppetmaster.init +0 -58
  381. data/conf/debian/rules +0 -115
  382. data/conf/debian/watch +0 -2
  383. 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
@@ -1,74 +1,67 @@
1
1
  # Provides utility functions to help interfaces Puppet to SELinux.
2
2
  #
3
- # Currently this is implemented via the command line tools. At some
4
- # point support should be added to use the new SELinux ruby bindings
5
- # as that will be faster and more reliable then shelling out when they
6
- # are available. At this time (2008-09-26) these bindings aren't bundled on
7
- # any SELinux-using distribution I know of.
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
- require 'puppet/util'
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
- FileTest.exists?("/selinux/enforce")
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 stat call fails then return nil.
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
- context = ""
26
- begin
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 context
38
+ return retval[1]
42
39
  end
43
40
 
44
- # Use the matchpathcon command, if present, to return the SELinux context
45
- # which the SELinux policy on the system expects the file to have. We can
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
- unless FileTest.executable?("/usr/sbin/matchpathcon")
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
- context = ""
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
- execpipe("/usr/sbin/matchpathcon #{file}") do |out|
61
- out.each do |line|
62
- context << line
63
- end
64
- end
65
- rescue Puppet::ExecutionFailure
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
- # For a successful match, matchpathcon returns two fields separated by
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. It is just a
95
- # wrapper around the chcon command.
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 flag.nil?
114
- cmd = ["/usr/bin/chcon","-h",value,file]
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
- cmd = ["/usr/bin/chcon","-h",flag,value,file]
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