puppet 7.7.0-universal-darwin → 7.11.0-universal-darwin

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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +7 -7
  3. data/Gemfile +4 -3
  4. data/Gemfile.lock +18 -18
  5. data/README.md +4 -4
  6. data/{ext → examples/enc}/regexp_nodes/classes/databases +0 -0
  7. data/{ext → examples/enc}/regexp_nodes/classes/webservers +0 -0
  8. data/{ext → examples/enc}/regexp_nodes/environment/development +0 -0
  9. data/{ext → examples/enc}/regexp_nodes/parameters/service/prod +0 -0
  10. data/{ext → examples/enc}/regexp_nodes/parameters/service/qa +0 -0
  11. data/{ext → examples/enc}/regexp_nodes/parameters/service/sandbox +0 -0
  12. data/{ext → examples/enc}/regexp_nodes/regexp_nodes.rb +0 -0
  13. data/{ext → examples}/nagios/check_puppet.rb +2 -2
  14. data/ext/README.md +13 -0
  15. data/ext/osx/puppet.plist +2 -0
  16. data/ext/project_data.yaml +1 -0
  17. data/install.rb +0 -4
  18. data/lib/puppet/application/agent.rb +4 -0
  19. data/lib/puppet/application/apply.rb +20 -2
  20. data/lib/puppet/application/filebucket.rb +1 -0
  21. data/lib/puppet/application/resource.rb +30 -15
  22. data/lib/puppet/application/ssl.rb +1 -0
  23. data/lib/puppet/concurrent/thread_local_singleton.rb +1 -0
  24. data/lib/puppet/configurer.rb +169 -50
  25. data/lib/puppet/confine/variable.rb +1 -1
  26. data/lib/puppet/defaults.rb +70 -30
  27. data/lib/puppet/environments.rb +75 -25
  28. data/lib/puppet/face/help/action.erb +1 -0
  29. data/lib/puppet/face/help/face.erb +1 -0
  30. data/lib/puppet/face/node/clean.rb +1 -1
  31. data/lib/puppet/facter_impl.rb +96 -0
  32. data/lib/puppet/file_serving/configuration/parser.rb +2 -0
  33. data/lib/puppet/file_serving/configuration.rb +2 -0
  34. data/lib/puppet/file_serving/mount/file.rb +4 -4
  35. data/lib/puppet/file_serving/mount/scripts.rb +24 -0
  36. data/lib/puppet/file_system/file_impl.rb +3 -1
  37. data/lib/puppet/file_system/windows.rb +2 -2
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge.rb +4 -4
  40. data/lib/puppet/functions/empty.rb +8 -0
  41. data/lib/puppet/functions/find_template.rb +2 -2
  42. data/lib/puppet/functions/strftime.rb +1 -0
  43. data/lib/puppet/functions/unwrap.rb +17 -2
  44. data/lib/puppet/http/service/compiler.rb +6 -1
  45. data/lib/puppet/indirector/catalog/compiler.rb +24 -6
  46. data/lib/puppet/indirector/catalog/rest.rb +1 -0
  47. data/lib/puppet/indirector/facts/facter.rb +6 -6
  48. data/lib/puppet/indirector/indirection.rb +1 -1
  49. data/lib/puppet/indirector/resource/ral.rb +6 -1
  50. data/lib/puppet/indirector/terminus.rb +4 -0
  51. data/lib/puppet/interface/documentation.rb +1 -0
  52. data/lib/puppet/module/plan.rb +0 -1
  53. data/lib/puppet/module/task.rb +1 -1
  54. data/lib/puppet/module_tool/applications/installer.rb +12 -4
  55. data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
  56. data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
  57. data/lib/puppet/module_tool/errors/shared.rb +17 -0
  58. data/lib/puppet/module_tool/tar/mini.rb +1 -1
  59. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  60. data/lib/puppet/node/environment.rb +10 -11
  61. data/lib/puppet/pal/pal_impl.rb +1 -1
  62. data/lib/puppet/parser/scope.rb +8 -7
  63. data/lib/puppet/parser/templatewrapper.rb +1 -0
  64. data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
  65. data/lib/puppet/pops/model/ast.rb +1 -0
  66. data/lib/puppet/pops/model/factory.rb +14 -13
  67. data/lib/puppet/pops/parser/egrammar.ra +2 -2
  68. data/lib/puppet/pops/parser/eparser.rb +752 -753
  69. data/lib/puppet/pops/parser/lexer2.rb +69 -68
  70. data/lib/puppet/pops/parser/slurp_support.rb +1 -0
  71. data/lib/puppet/pops/serialization/to_data_converter.rb +18 -6
  72. data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
  73. data/lib/puppet/pops/types/p_sem_ver_type.rb +8 -2
  74. data/lib/puppet/pops/types/p_sensitive_type.rb +10 -0
  75. data/lib/puppet/pops/types/type_formatter.rb +7 -6
  76. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  77. data/lib/puppet/pops/types/types.rb +1 -1
  78. data/lib/puppet/provider/aix_object.rb +1 -1
  79. data/lib/puppet/provider/exec/posix.rb +16 -4
  80. data/lib/puppet/provider/group/groupadd.rb +5 -2
  81. data/lib/puppet/provider/package/apt.rb +3 -3
  82. data/lib/puppet/provider/package/nim.rb +11 -6
  83. data/lib/puppet/provider/package/pip.rb +15 -3
  84. data/lib/puppet/provider/package/pkg.rb +9 -2
  85. data/lib/puppet/provider/package/puppet_gem.rb +1 -1
  86. data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
  87. data/lib/puppet/provider/package/windows/exe_package.rb +30 -1
  88. data/lib/puppet/provider/package/windows/package.rb +2 -1
  89. data/lib/puppet/provider/package/windows.rb +14 -1
  90. data/lib/puppet/provider/package/yum.rb +4 -4
  91. data/lib/puppet/provider/package/zypper.rb +3 -3
  92. data/lib/puppet/provider/parsedfile.rb +3 -0
  93. data/lib/puppet/provider/service/base.rb +1 -1
  94. data/lib/puppet/provider/service/freebsd.rb +1 -1
  95. data/lib/puppet/provider/service/init.rb +5 -5
  96. data/lib/puppet/provider/service/launchd.rb +2 -2
  97. data/lib/puppet/provider/service/redhat.rb +1 -1
  98. data/lib/puppet/provider/service/smf.rb +3 -3
  99. data/lib/puppet/provider/service/systemd.rb +8 -3
  100. data/lib/puppet/provider/service/upstart.rb +5 -5
  101. data/lib/puppet/provider/user/aix.rb +44 -1
  102. data/lib/puppet/provider/user/directoryservice.rb +25 -12
  103. data/lib/puppet/provider/user/useradd.rb +52 -16
  104. data/lib/puppet/provider.rb +1 -1
  105. data/lib/puppet/reference/providers.rb +2 -2
  106. data/lib/puppet/resource/type_collection.rb +4 -1
  107. data/lib/puppet/runtime.rb +11 -1
  108. data/lib/puppet/settings/config_file.rb +1 -8
  109. data/lib/puppet/settings/file_setting.rb +3 -8
  110. data/lib/puppet/settings/value_translator.rb +0 -1
  111. data/lib/puppet/settings.rb +32 -9
  112. data/lib/puppet/test/test_helper.rb +4 -1
  113. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  114. data/lib/puppet/transaction/persistence.rb +11 -1
  115. data/lib/puppet/transaction/report.rb +15 -1
  116. data/lib/puppet/type/exec.rb +35 -5
  117. data/lib/puppet/type/file/mode.rb +6 -0
  118. data/lib/puppet/type/file.rb +6 -6
  119. data/lib/puppet/type/filebucket.rb +2 -2
  120. data/lib/puppet/type/group.rb +0 -1
  121. data/lib/puppet/type/resources.rb +1 -1
  122. data/lib/puppet/type/service.rb +8 -9
  123. data/lib/puppet/type/tidy.rb +1 -1
  124. data/lib/puppet/type/user.rb +39 -22
  125. data/lib/puppet/type.rb +1 -1
  126. data/lib/puppet/util/command_line.rb +1 -1
  127. data/lib/puppet/util/filetype.rb +2 -2
  128. data/lib/puppet/util/log.rb +1 -2
  129. data/lib/puppet/util/logging.rb +1 -25
  130. data/lib/puppet/util/monkey_patches.rb +2 -17
  131. data/lib/puppet/util/pidlock.rb +1 -1
  132. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  133. data/lib/puppet/util/suidmanager.rb +1 -2
  134. data/lib/puppet/util/symbolic_file_mode.rb +29 -17
  135. data/lib/puppet/util/tagging.rb +1 -0
  136. data/lib/puppet/util/windows/sid.rb +3 -1
  137. data/lib/puppet/util/windows/user.rb +0 -1
  138. data/lib/puppet/util.rb +4 -3
  139. data/lib/puppet/version.rb +1 -1
  140. data/lib/puppet/x509/cert_provider.rb +3 -21
  141. data/lib/puppet.rb +5 -9
  142. data/locales/puppet.pot +346 -274
  143. data/man/man5/puppet.conf.5 +76 -25
  144. data/man/man8/puppet-agent.8 +4 -1
  145. data/man/man8/puppet-apply.8 +1 -1
  146. data/man/man8/puppet-catalog.8 +9 -9
  147. data/man/man8/puppet-config.8 +1 -1
  148. data/man/man8/puppet-describe.8 +1 -1
  149. data/man/man8/puppet-device.8 +1 -1
  150. data/man/man8/puppet-doc.8 +1 -1
  151. data/man/man8/puppet-epp.8 +1 -1
  152. data/man/man8/puppet-facts.8 +7 -7
  153. data/man/man8/puppet-filebucket.8 +1 -1
  154. data/man/man8/puppet-generate.8 +1 -1
  155. data/man/man8/puppet-help.8 +1 -1
  156. data/man/man8/puppet-lookup.8 +1 -1
  157. data/man/man8/puppet-module.8 +3 -3
  158. data/man/man8/puppet-node.8 +5 -5
  159. data/man/man8/puppet-parser.8 +1 -1
  160. data/man/man8/puppet-plugin.8 +1 -1
  161. data/man/man8/puppet-report.8 +5 -5
  162. data/man/man8/puppet-resource.8 +1 -1
  163. data/man/man8/puppet-script.8 +1 -1
  164. data/man/man8/puppet-ssl.8 +1 -1
  165. data/man/man8/puppet.8 +2 -2
  166. data/spec/fixtures/integration/application/agent/lib/facter/agent_spec_role.rb +3 -0
  167. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Gemfile +4 -0
  168. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Rakefile +3 -0
  169. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/lib/puppet/functions/l10n.rb +8 -0
  170. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/config.yaml +25 -0
  171. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/ja/puppet-l10n.po +19 -0
  172. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/puppet-l10n.pot +20 -0
  173. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/metadata.json +8 -0
  174. data/spec/fixtures/ssl/127.0.0.1-key.pem +106 -106
  175. data/spec/fixtures/ssl/127.0.0.1.pem +48 -48
  176. data/spec/fixtures/ssl/bad-basic-constraints.pem +54 -54
  177. data/spec/fixtures/ssl/bad-int-basic-constraints.pem +51 -51
  178. data/spec/fixtures/ssl/ca.pem +52 -52
  179. data/spec/fixtures/ssl/crl.pem +25 -25
  180. data/spec/fixtures/ssl/ec-key-openssl.pem +8 -0
  181. data/spec/fixtures/ssl/ec-key-pk8.pem +5 -0
  182. data/spec/fixtures/ssl/ec-key.pem +11 -11
  183. data/spec/fixtures/ssl/ec.pem +32 -32
  184. data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
  185. data/spec/fixtures/ssl/encrypted-key.pem +107 -107
  186. data/spec/fixtures/ssl/intermediate-agent-crl.pem +25 -25
  187. data/spec/fixtures/ssl/intermediate-agent.pem +54 -54
  188. data/spec/fixtures/ssl/intermediate-crl.pem +28 -28
  189. data/spec/fixtures/ssl/intermediate.pem +51 -51
  190. data/spec/fixtures/ssl/oid-key.pem +117 -0
  191. data/spec/fixtures/ssl/oid.pem +69 -0
  192. data/spec/fixtures/ssl/pluto-key.pem +106 -106
  193. data/spec/fixtures/ssl/pluto.pem +50 -50
  194. data/spec/fixtures/ssl/request-key.pem +106 -106
  195. data/spec/fixtures/ssl/request.pem +45 -45
  196. data/spec/fixtures/ssl/revoked-key.pem +106 -106
  197. data/spec/fixtures/ssl/revoked.pem +49 -49
  198. data/spec/fixtures/ssl/signed-key.pem +106 -106
  199. data/spec/fixtures/ssl/signed.pem +47 -47
  200. data/spec/fixtures/ssl/tampered-cert.pem +49 -49
  201. data/spec/fixtures/ssl/tampered-csr.pem +45 -45
  202. data/spec/fixtures/ssl/trusted_oid_mapping.yaml +5 -0
  203. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +106 -106
  204. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -48
  205. data/spec/fixtures/ssl/unknown-ca-key.pem +106 -106
  206. data/spec/fixtures/ssl/unknown-ca.pem +52 -52
  207. data/spec/integration/application/agent_spec.rb +118 -52
  208. data/spec/integration/application/filebucket_spec.rb +16 -0
  209. data/spec/integration/application/module_spec.rb +21 -0
  210. data/spec/integration/application/resource_spec.rb +64 -0
  211. data/spec/integration/application/ssl_spec.rb +20 -0
  212. data/spec/integration/configurer_spec.rb +18 -2
  213. data/spec/integration/defaults_spec.rb +5 -0
  214. data/spec/integration/environments/settings_interpolation_spec.rb +0 -4
  215. data/spec/integration/indirector/facts/facter_spec.rb +93 -39
  216. data/spec/integration/l10n/compiler_spec.rb +37 -0
  217. data/spec/integration/transaction/report_spec.rb +1 -1
  218. data/spec/integration/type/exec_spec.rb +70 -45
  219. data/spec/integration/type/file_spec.rb +2 -2
  220. data/spec/integration/type/package_spec.rb +6 -6
  221. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  222. data/spec/integration/util/windows/process_spec.rb +1 -9
  223. data/spec/lib/puppet/test_ca.rb +5 -0
  224. data/spec/lib/puppet_spec/modules.rb +13 -2
  225. data/spec/lib/puppet_spec/puppetserver.rb +15 -0
  226. data/spec/lib/puppet_spec/settings.rb +1 -0
  227. data/spec/shared_behaviours/documentation_on_faces.rb +0 -2
  228. data/spec/shared_contexts/l10n.rb +27 -0
  229. data/spec/spec_helper.rb +1 -10
  230. data/spec/unit/application/apply_spec.rb +76 -56
  231. data/spec/unit/application/resource_spec.rb +29 -0
  232. data/spec/unit/configurer_spec.rb +277 -56
  233. data/spec/unit/environments_spec.rb +184 -0
  234. data/spec/unit/facter_impl_spec.rb +31 -0
  235. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  236. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -0
  237. data/spec/unit/file_serving/configuration_spec.rb +12 -4
  238. data/spec/unit/file_serving/mount/scripts_spec.rb +69 -0
  239. data/spec/unit/file_system_spec.rb +13 -0
  240. data/spec/unit/functions/assert_type_spec.rb +1 -1
  241. data/spec/unit/functions/empty_spec.rb +10 -0
  242. data/spec/unit/functions/logging_spec.rb +1 -0
  243. data/spec/unit/functions/lookup_spec.rb +87 -0
  244. data/spec/unit/functions/unwrap_spec.rb +8 -0
  245. data/spec/unit/functions4_spec.rb +19 -10
  246. data/spec/unit/http/service/compiler_spec.rb +8 -0
  247. data/spec/unit/indirector/catalog/compiler_spec.rb +87 -0
  248. data/spec/unit/indirector/catalog/rest_spec.rb +8 -0
  249. data/spec/unit/indirector/indirection_spec.rb +10 -3
  250. data/spec/unit/indirector/resource/ral_spec.rb +40 -75
  251. data/spec/unit/interface/action_spec.rb +0 -9
  252. data/spec/unit/module_spec.rb +14 -0
  253. data/spec/unit/module_tool/applications/installer_spec.rb +52 -14
  254. data/spec/unit/parser/compiler_spec.rb +29 -0
  255. data/spec/unit/parser/templatewrapper_spec.rb +12 -2
  256. data/spec/unit/pops/loaders/dependency_loader_spec.rb +0 -9
  257. data/spec/unit/pops/parser/lexer2_spec.rb +0 -4
  258. data/spec/unit/pops/parser/parse_containers_spec.rb +0 -11
  259. data/spec/unit/pops/serialization/to_from_hr_spec.rb +58 -0
  260. data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
  261. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +18 -0
  262. data/spec/unit/pops/types/p_sensitive_type_spec.rb +18 -0
  263. data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
  264. data/spec/unit/provider/package/gem_spec.rb +1 -1
  265. data/spec/unit/provider/package/nim_spec.rb +42 -0
  266. data/spec/unit/provider/package/pip2_spec.rb +1 -1
  267. data/spec/unit/provider/package/pip3_spec.rb +1 -1
  268. data/spec/unit/provider/package/pip_spec.rb +38 -1
  269. data/spec/unit/provider/package/pkg_spec.rb +19 -5
  270. data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
  271. data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
  272. data/spec/unit/provider/package/windows/exe_package_spec.rb +17 -0
  273. data/spec/unit/provider/parsedfile_spec.rb +10 -0
  274. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  275. data/spec/unit/provider/service/launchd_spec.rb +11 -0
  276. data/spec/unit/provider/service/systemd_spec.rb +13 -1
  277. data/spec/unit/provider/user/aix_spec.rb +100 -0
  278. data/spec/unit/provider/user/directoryservice_spec.rb +68 -36
  279. data/spec/unit/provider/user/useradd_spec.rb +3 -2
  280. data/spec/unit/provider_spec.rb +4 -4
  281. data/spec/unit/puppet_spec.rb +12 -4
  282. data/spec/unit/resource/type_collection_spec.rb +16 -0
  283. data/spec/unit/resource/type_spec.rb +2 -2
  284. data/spec/unit/settings/config_file_spec.rb +1 -11
  285. data/spec/unit/settings/file_setting_spec.rb +10 -7
  286. data/spec/unit/settings/value_translator_spec.rb +4 -5
  287. data/spec/unit/settings_spec.rb +120 -79
  288. data/spec/unit/ssl/ssl_provider_spec.rb +18 -16
  289. data/spec/unit/type/exec_spec.rb +76 -29
  290. data/spec/unit/type/file/source_spec.rb +4 -4
  291. data/spec/unit/type/service_spec.rb +49 -34
  292. data/spec/unit/type/tidy_spec.rb +7 -0
  293. data/spec/unit/type/user_spec.rb +45 -0
  294. data/spec/unit/type_spec.rb +2 -2
  295. data/spec/unit/util/ldap/connection_spec.rb +10 -10
  296. data/spec/unit/util/ldap/manager_spec.rb +2 -2
  297. data/spec/unit/util/logging_spec.rb +2 -0
  298. data/spec/unit/util/windows/sid_spec.rb +39 -4
  299. data/spec/unit/util_spec.rb +1 -3
  300. data/spec/unit/x509/cert_provider_spec.rb +9 -1
  301. data/tasks/generate_cert_fixtures.rake +10 -1
  302. data/tasks/parallel.rake +3 -3
  303. metadata +53 -95
  304. data/ext/README.environment +0 -8
  305. data/ext/dbfix.sql +0 -132
  306. data/ext/debian/README.Debian +0 -8
  307. data/ext/debian/README.source +0 -2
  308. data/ext/debian/TODO.Debian +0 -1
  309. data/ext/debian/changelog.erb +0 -1122
  310. data/ext/debian/compat +0 -1
  311. data/ext/debian/control +0 -144
  312. data/ext/debian/copyright +0 -339
  313. data/ext/debian/docs +0 -1
  314. data/ext/debian/fileserver.conf +0 -41
  315. data/ext/debian/puppet-common.dirs +0 -13
  316. data/ext/debian/puppet-common.install +0 -3
  317. data/ext/debian/puppet-common.lintian-overrides +0 -5
  318. data/ext/debian/puppet-common.manpages +0 -28
  319. data/ext/debian/puppet-common.postinst +0 -35
  320. data/ext/debian/puppet-common.postrm +0 -33
  321. data/ext/debian/puppet-el.dirs +0 -1
  322. data/ext/debian/puppet-el.emacsen-install +0 -25
  323. data/ext/debian/puppet-el.emacsen-remove +0 -11
  324. data/ext/debian/puppet-el.emacsen-startup +0 -9
  325. data/ext/debian/puppet-el.install +0 -1
  326. data/ext/debian/puppet-testsuite.install +0 -2
  327. data/ext/debian/puppet-testsuite.lintian-overrides +0 -4
  328. data/ext/debian/puppet.lintian-overrides +0 -3
  329. data/ext/debian/puppet.logrotate +0 -20
  330. data/ext/debian/puppet.postinst +0 -20
  331. data/ext/debian/puppet.postrm +0 -20
  332. data/ext/debian/puppet.preinst +0 -20
  333. data/ext/debian/puppetmaster-common.install +0 -2
  334. data/ext/debian/puppetmaster-common.manpages +0 -2
  335. data/ext/debian/puppetmaster-common.postinst +0 -6
  336. data/ext/debian/puppetmaster-passenger.dirs +0 -4
  337. data/ext/debian/puppetmaster-passenger.postinst +0 -162
  338. data/ext/debian/puppetmaster-passenger.postrm +0 -61
  339. data/ext/debian/puppetmaster.README.debian +0 -17
  340. data/ext/debian/puppetmaster.default +0 -14
  341. data/ext/debian/puppetmaster.init +0 -137
  342. data/ext/debian/puppetmaster.lintian-overrides +0 -3
  343. data/ext/debian/puppetmaster.postinst +0 -20
  344. data/ext/debian/puppetmaster.postrm +0 -5
  345. data/ext/debian/puppetmaster.preinst +0 -22
  346. data/ext/debian/rules +0 -132
  347. data/ext/debian/source/format +0 -1
  348. data/ext/debian/source/options +0 -1
  349. data/ext/debian/vim-puppet.README.Debian +0 -13
  350. data/ext/debian/vim-puppet.dirs +0 -5
  351. data/ext/debian/vim-puppet.yaml +0 -7
  352. data/ext/debian/watch +0 -2
  353. data/ext/freebsd/puppetd +0 -26
  354. data/ext/freebsd/puppetmasterd +0 -26
  355. data/ext/gentoo/conf.d/puppet +0 -5
  356. data/ext/gentoo/conf.d/puppetmaster +0 -12
  357. data/ext/gentoo/init.d/puppet +0 -38
  358. data/ext/gentoo/init.d/puppetmaster +0 -51
  359. data/ext/gentoo/puppet/fileserver.conf +0 -41
  360. data/ext/ips/puppet-agent +0 -44
  361. data/ext/ips/puppet-master +0 -44
  362. data/ext/ips/puppet.p5m.erb +0 -12
  363. data/ext/ips/puppetagent.xml +0 -42
  364. data/ext/ips/puppetmaster.xml +0 -42
  365. data/ext/ips/rules +0 -19
  366. data/ext/ips/transforms +0 -34
  367. data/ext/ldap/puppet.schema +0 -24
  368. data/ext/logcheck/puppet +0 -23
  369. data/ext/osx/file_mapping.yaml +0 -28
  370. data/ext/osx/postflight.erb +0 -109
  371. data/ext/osx/preflight.erb +0 -52
  372. data/ext/osx/prototype.plist.erb +0 -38
  373. data/ext/redhat/fileserver.conf +0 -41
  374. data/ext/redhat/logrotate +0 -21
  375. data/ext/redhat/puppet.spec.erb +0 -841
  376. data/ext/redhat/server.init +0 -128
  377. data/ext/redhat/server.sysconfig +0 -13
  378. data/ext/solaris/pkginfo +0 -6
  379. data/ext/solaris/smf/puppetd.xml +0 -77
  380. data/ext/solaris/smf/puppetmasterd.xml +0 -77
  381. data/ext/solaris/smf/svc-puppetd +0 -71
  382. data/ext/solaris/smf/svc-puppetmasterd +0 -67
  383. data/ext/suse/puppet.spec +0 -310
  384. data/ext/suse/server.init +0 -173
  385. data/ext/yaml_nodes.rb +0 -105
  386. data/spec/unit/indirector/store_configs_spec.rb +0 -7
@@ -129,6 +129,35 @@ describe Puppet::Application::Resource do
129
129
  end
130
130
 
131
131
  describe "when printing output" do
132
+ it "should not emit puppet class tags when printing yaml" do
133
+ Puppet::Type.newtype(:stringify) do
134
+ ensurable
135
+ newparam(:name, isnamevar: true)
136
+ newproperty(:string)
137
+ end
138
+
139
+ Puppet::Type.type(:stringify).provide(:stringify) do
140
+ def exists?
141
+ true
142
+ end
143
+
144
+ def string
145
+ Puppet::Util::Execution::ProcessOutput.new('test', 0)
146
+ end
147
+ end
148
+
149
+ @resource_app.options[:to_yaml] = true
150
+ allow(@resource_app.command_line).to receive(:args).and_return(['stringify', 'hello', 'ensure=present', 'string=asd'])
151
+ expect(@resource_app).to receive(:puts).with(<<~YAML)
152
+ ---
153
+ stringify:
154
+ hello:
155
+ ensure: present
156
+ string: test
157
+ YAML
158
+ expect { @resource_app.main }.not_to raise_error
159
+ end
160
+
132
161
  it "should ensure all values to be printed are in the external encoding" do
133
162
  resources = [
134
163
  Puppet::Type.type(:user).new(:name => "\u2603".force_encoding(Encoding::UTF_8)).to_resource,
@@ -7,6 +7,9 @@ describe Puppet::Configurer do
7
7
  Puppet[:report] = true
8
8
 
9
9
  catalog.add_resource(resource)
10
+ allow_any_instance_of(described_class).to(
11
+ receive(:valid_server_environment?).and_return(true)
12
+ )
10
13
  end
11
14
 
12
15
  let(:node_name) { Puppet[:node_name_value] }
@@ -78,10 +81,10 @@ describe Puppet::Configurer do
78
81
  configurer.run(:pluginsync => false)
79
82
  end
80
83
 
81
- it "should carry on when it can't fetch its node definition" do
82
- error = Net::HTTPError.new(400, 'dummy server communication error')
83
- expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
84
- expect(configurer.run).to eq(0)
84
+ it "does not download plugins when specified environment is not vaild on server" do
85
+ expect(configurer).to receive(:valid_server_environment?).and_return(false)
86
+ expect(configurer).not_to receive(:download_plugins)
87
+ configurer.run(:pluginsync => true)
85
88
  end
86
89
 
87
90
  it "fails the run if pluginsync fails when usecacheonfailure is false" do
@@ -125,7 +128,6 @@ describe Puppet::Configurer do
125
128
  it "applies a cached catalog when it can't connect to the master" do
126
129
  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
127
130
 
128
- expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
129
131
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_cache => true)).and_raise(error)
130
132
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_terminus => true)).and_return(catalog)
131
133
 
@@ -149,6 +151,126 @@ describe Puppet::Configurer do
149
151
  expect(report.host).to eq('node_name_from_fact')
150
152
  end
151
153
 
154
+ it "should warn the user when the fact value length limits are exceeded" do
155
+ Puppet[:fact_name_length_soft_limit] = 0
156
+ Puppet[:fact_value_length_soft_limit] = 1
157
+ Puppet[:top_level_facts_soft_limit] = 0
158
+ Puppet[:number_of_facts_soft_limit] = 0
159
+ Puppet[:payload_soft_limit] = 0
160
+
161
+ facts.values = { 'processors' => {
162
+ 'cores' => 1,
163
+ 'count' => 2,
164
+ 'isa' => "i386",
165
+ 'models' => [
166
+ "CPU1 @ 2.80GHz"
167
+ ],
168
+ 'physicalcount' => 4 }
169
+ }
170
+ Puppet::Node::Facts.indirection.save(facts)
171
+
172
+ expect(Puppet).to receive(:warning).with(/Fact value '.+' with the value length: '[1-9]*' exceeds the value length limit: [1-9]*/).twice
173
+ configurer.run
174
+ end
175
+
176
+ it "should warn the user when the payload limits are exceeded" do
177
+ Puppet[:fact_name_length_soft_limit] = 0
178
+ Puppet[:fact_value_length_soft_limit] = 0
179
+ Puppet[:top_level_facts_soft_limit] = 0
180
+ Puppet[:number_of_facts_soft_limit] = 0
181
+ Puppet[:payload_soft_limit] = 1
182
+
183
+ facts.values = { 'processors' => {
184
+ 'cores' => 1,
185
+ 'count' => 2,
186
+ 'isa' => "i386",
187
+ 'models' => [
188
+ "CPU1 @ 2.80GHz"
189
+ ],
190
+ 'physicalcount' => 4 }
191
+ }
192
+ Puppet::Node::Facts.indirection.save(facts)
193
+
194
+ expect(Puppet).to receive(:warning).with(/Payload with the current size of: '\d*' exceeds the payload size limit: \d*/)
195
+ configurer.run
196
+ end
197
+
198
+ it "should warn the user when the total number of facts limit is exceeded" do
199
+ Puppet[:fact_name_length_soft_limit] = 0
200
+ Puppet[:fact_value_length_soft_limit] = 0
201
+ Puppet[:top_level_facts_soft_limit] = 0
202
+ Puppet[:number_of_facts_soft_limit] = 1
203
+ Puppet[:payload_soft_limit] = 0
204
+
205
+ facts.values = {
206
+ 'processors' => {
207
+ 'cores' => 1,
208
+ 'count' => 2,
209
+ 'isa' => "i386",
210
+ 'models' => [
211
+ "CPU1 @ 2.80GHz",
212
+ "CPU1 @ 2.80GHz",
213
+ "CPU1 @ 2.80GHz",
214
+ "CPU1 @ 2.80GHz",
215
+ "CPU1 @ 2.80GHz",
216
+ {
217
+ 'processors' => {
218
+ 'cores' => [1,2]
219
+ }
220
+ }
221
+ ],
222
+ 'physicalcount' => 4
223
+ }
224
+ }
225
+ Puppet::Node::Facts.indirection.save(facts)
226
+
227
+ expect(Puppet).to receive(:warning).with(/The current total number of facts: [1-9]* exceeds the number of facts limit: [1-9]*/)
228
+ configurer.run
229
+ end
230
+
231
+ it "should warn the user when the top level facts size limits are exceeded" do
232
+ Puppet[:fact_name_length_soft_limit] = 0
233
+ Puppet[:fact_value_length_soft_limit] = 0
234
+ Puppet[:top_level_facts_soft_limit] = 1
235
+ Puppet[:number_of_facts_soft_limit] = 0
236
+ Puppet[:payload_soft_limit] = 0
237
+
238
+ facts.values = {'my_new_fact_name' => 'my_new_fact_value',
239
+ 'my_new_fact_name2' => 'my_new_fact_value2'}
240
+ Puppet::Node::Facts.indirection.save(facts)
241
+
242
+ expect(Puppet).to receive(:warning).with(/The current number of top level facts: [1-9]* exceeds the top facts limit: [1-9]*/)
243
+ configurer.run
244
+ end
245
+
246
+ it "should warn the user when the fact name length limits are exceeded" do
247
+ Puppet[:fact_name_length_soft_limit] = 1
248
+ Puppet[:fact_value_length_soft_limit] = 0
249
+ Puppet[:top_level_facts_soft_limit] = 0
250
+ Puppet[:number_of_facts_soft_limit] = 0
251
+ Puppet[:payload_soft_limit] = 0
252
+
253
+ facts.values = {'my_new_fact_name' => 'my_new_fact_value'}
254
+ Puppet::Node::Facts.indirection.save(facts)
255
+
256
+ expect(Puppet).to receive(:warning).with(/Fact .+ with length: '[1-9]*' exceeds the length limit: [1-9]*/)
257
+ configurer.run
258
+ end
259
+
260
+ it "shouldn't warn the user when the fact limit settings are set to 0" do
261
+ Puppet[:fact_name_length_soft_limit] = 0
262
+ Puppet[:fact_value_length_soft_limit] = 0
263
+ Puppet[:top_level_facts_soft_limit] = 0
264
+ Puppet[:number_of_facts_soft_limit] = 0
265
+ Puppet[:payload_soft_limit] = 0
266
+
267
+ facts.values = {'my_new_fact_name' => 'my_new_fact_value'}
268
+ Puppet::Node::Facts.indirection.save(facts)
269
+
270
+ expect(Puppet).not_to receive(:warning)
271
+ configurer.run
272
+ end
273
+
152
274
  it "creates a new report when applying the catalog" do
153
275
  options = {}
154
276
  configurer.run(options)
@@ -461,7 +583,7 @@ describe Puppet::Configurer do
461
583
  it "should save the report if reporting is enabled" do
462
584
  Puppet.settings[:report] = true
463
585
 
464
- expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash))
586
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash)).twice
465
587
  configurer.send_report(report)
466
588
  end
467
589
 
@@ -489,12 +611,22 @@ describe Puppet::Configurer do
489
611
  it "should log but not fail if saving the report fails" do
490
612
  Puppet.settings[:report] = true
491
613
 
492
- expect(Puppet::Transaction::Report.indirection).to receive(:save).and_raise("whatever")
614
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
615
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true))
493
616
 
494
617
  configurer.send_report(report)
495
618
 
496
619
  expect(@logs).to include(an_object_having_attributes(level: :err, message: 'Could not send report: whatever'))
497
620
  end
621
+
622
+ it "should save the cached report if fails to send the report" do
623
+ allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true)).and_call_original
624
+ allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
625
+
626
+ expect(File).to_not be_exist(Puppet[:lastrunfile])
627
+ configurer.send_report(report)
628
+ expect(File.read(Puppet[:lastrunfile])).to match(/puppet: #{Puppet::PUPPETVERSION}/)
629
+ end
498
630
  end
499
631
 
500
632
  describe "when saving the summary report file" do
@@ -553,24 +685,6 @@ describe Puppet::Configurer do
553
685
  end
554
686
  end
555
687
 
556
- describe "when requesting a node" do
557
- it "uses the transaction uuid in the request" do
558
- expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(transaction_uuid: anything)).twice
559
- configurer.run
560
- end
561
-
562
- it "sends an explicitly configured environment request" do
563
- expect(Puppet.settings).to receive(:set_by_config?).with(:environment).and_return(true)
564
- expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: Puppet[:environment])).twice
565
- configurer.run
566
- end
567
-
568
- it "does not send a configured_environment when using the default" do
569
- expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: nil)).twice
570
- configurer.run
571
- end
572
- end
573
-
574
688
  def expects_pluginsync
575
689
  metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
576
690
  stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
@@ -581,7 +695,7 @@ describe Puppet::Configurer do
581
695
  end
582
696
 
583
697
  def expects_new_catalog_only(catalog)
584
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
698
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, check_environment: true)).and_return(catalog)
585
699
  expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
586
700
  end
587
701
 
@@ -598,7 +712,7 @@ describe Puppet::Configurer do
598
712
  def expects_fallback_to_new_catalog(catalog)
599
713
  expects_pluginsync
600
714
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
601
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
715
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, check_environment: true)).and_return(catalog)
602
716
  end
603
717
 
604
718
  def expects_neither_new_or_cached_catalog
@@ -622,21 +736,13 @@ describe Puppet::Configurer do
622
736
  configurer.run
623
737
  end
624
738
 
625
- it "should not make a node request or pluginsync when a cached catalog is successfully retrieved" do
626
- expect(Puppet::Node.indirection).not_to receive(:find)
739
+ it "should not pluginsync when a cached catalog is successfully retrieved" do
627
740
  expects_cached_catalog_only(catalog)
628
741
  expect(configurer).not_to receive(:download_plugins)
629
742
 
630
743
  configurer.run
631
744
  end
632
745
 
633
- it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
634
- expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
635
- expects_fallback_to_new_catalog(catalog)
636
-
637
- configurer.run
638
- end
639
-
640
746
  it "should set its cached_catalog_status to 'explicitly_requested'" do
641
747
  expects_cached_catalog_only(catalog)
642
748
 
@@ -672,7 +778,6 @@ describe Puppet::Configurer do
672
778
  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
673
779
  Puppet[:ignore_plugin_errors] = true
674
780
 
675
- expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
676
781
  expects_neither_new_or_cached_catalog
677
782
  expects_pluginsync
678
783
 
@@ -728,16 +833,6 @@ describe Puppet::Configurer do
728
833
  Puppet.settings[:strict_environment_mode] = true
729
834
  end
730
835
 
731
- it "should not make a node request" do
732
- stub_request(:get, %r{/puppet/v3/file_metadatas?/plugins}).to_return(:status => 404)
733
- stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
734
- expects_new_catalog_only(catalog)
735
-
736
- expect(Puppet::Node.indirection).not_to receive(:find)
737
-
738
- configurer.run
739
- end
740
-
741
836
  it "should return nil when the catalog's environment doesn't match the agent specified environment" do
742
837
  Puppet[:environment] = 'second_env'
743
838
  configurer = Puppet::Configurer.new
@@ -951,9 +1046,23 @@ describe Puppet::Configurer do
951
1046
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, banana)
952
1047
 
953
1048
  allow(Puppet).to receive(:notice)
1049
+ allow(Puppet).to receive(:push_context)
954
1050
  expect(Puppet).to receive(:notice).with("Local environment: 'production' doesn't match server specified environment 'apple', restarting agent run with environment 'apple'")
955
1051
  expect(Puppet).to receive(:notice).with("Local environment: 'apple' doesn't match server specified environment 'banana', restarting agent run with environment 'banana'")
956
1052
 
1053
+ expect(Puppet).to receive(:push_context).with(
1054
+ hash_including(current_environment: an_object_having_attributes(name: :production)),
1055
+ 'Local node environment production for configurer transaction'
1056
+ )
1057
+ expect(Puppet).to receive(:push_context).with(
1058
+ hash_including(current_environment: an_object_having_attributes(name: :apple)),
1059
+ 'Local node environment apple for configurer transaction'
1060
+ )
1061
+ expect(Puppet).to receive(:push_context).with(
1062
+ hash_including(current_environment: an_object_having_attributes(name: :banana)),
1063
+ 'Local node environment banana for configurer transaction'
1064
+ )
1065
+
957
1066
  configurer.run
958
1067
  end
959
1068
 
@@ -1110,20 +1219,132 @@ describe Puppet::Configurer do
1110
1219
  expect(configurer.run(options)).to eq(0)
1111
1220
  expect(options[:report].server_used).to be_nil
1112
1221
  end
1222
+ end
1113
1223
 
1114
- it "should not make multiple node requests when the server is found" do
1115
- Puppet.settings[:server_list] = ["myserver:123"]
1224
+ describe "when selecting an environment" do
1225
+ include PuppetSpec::Files
1226
+ include PuppetSpec::Settings
1116
1227
 
1117
- Puppet::Node.indirection.terminus_class = :rest
1118
- Puppet::Resource::Catalog.indirection.terminus_class = :rest
1228
+ describe "when the last used environment is available" do
1229
+ let(:last_server_specified_environment) { 'development' }
1119
1230
 
1120
- stub_request(:get, 'https://myserver:123/status/v1/simple/server').to_return(status: 200)
1121
- stub_request(:post, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
1122
- node_request = stub_request(:get, %r{https://myserver:123/puppet/v3/node/}).to_return(status: 200)
1231
+ before do
1232
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1233
+ ---
1234
+ version:
1235
+ config: 1624882680
1236
+ puppet: 6.24.0
1237
+ application:
1238
+ initial_environment: #{Puppet[:environment]}
1239
+ converged_environment: #{last_server_specified_environment}
1240
+ run_mode: agent
1241
+ SUMMARY
1242
+ end
1123
1243
 
1124
- configurer.run
1244
+ it "prefers the environment set via cli" do
1245
+ Puppet.settings.handlearg('--environment', 'usethis')
1246
+ configurer.run
1247
+
1248
+ expect(configurer.environment).to eq('usethis')
1249
+ end
1250
+
1251
+ it "prefers the environment set via config" do
1252
+ FileUtils.mkdir_p(Puppet[:confdir])
1253
+ set_puppet_conf(Puppet[:confdir], <<~CONF)
1254
+ [main]
1255
+ environment = usethis
1256
+ CONF
1257
+
1258
+ Puppet.initialize_settings
1259
+ configurer.run
1260
+
1261
+ expect(configurer.environment).to eq('usethis')
1262
+ end
1125
1263
 
1126
- expect(node_request).to have_been_requested.once
1264
+ it "uses environment from Puppet[:environment] if given a catalog" do
1265
+ configurer.run(catalog: catalog)
1266
+
1267
+ expect(configurer.environment).to eq(Puppet[:environment])
1268
+ end
1269
+
1270
+ it "uses environment from Puppet[:environment] if use_cached_catalog = true" do
1271
+ Puppet[:use_cached_catalog] = true
1272
+ expects_cached_catalog_only(catalog)
1273
+ configurer.run
1274
+
1275
+ expect(configurer.environment).to eq(Puppet[:environment])
1276
+ end
1277
+
1278
+ describe "when the environment is not set via CLI" do
1279
+ it "uses the environment found in lastrunfile if the key exists" do
1280
+ configurer.run
1281
+
1282
+ expect(configurer.environment).to eq(last_server_specified_environment)
1283
+ end
1284
+
1285
+ it "uses environment from Puppet[:environment] if strict_environment_mode is set" do
1286
+ Puppet[:strict_environment_mode] = true
1287
+ configurer.run
1288
+
1289
+ expect(configurer.environment).to eq(Puppet[:environment])
1290
+ end
1291
+
1292
+ it "uses environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
1293
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1294
+ ---
1295
+ version:
1296
+ config: 1624882680
1297
+ puppet: 6.24.0
1298
+ application:
1299
+ initial_environment: development
1300
+ converged_environment: development
1301
+ run_mode: agent
1302
+ SUMMARY
1303
+ configurer.run
1304
+
1305
+ expect(configurer.environment).to eq(Puppet[:environment])
1306
+ end
1307
+
1308
+ it "uses environment from Puppet[:environment] if the run mode doesn't match" do
1309
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1310
+ ---
1311
+ version:
1312
+ config: 1624882680
1313
+ puppet: 6.24.0
1314
+ application:
1315
+ initial_environment: #{Puppet[:environment]}
1316
+ converged_environment: #{last_server_specified_environment}
1317
+ run_mode: user
1318
+ SUMMARY
1319
+ configurer.run
1320
+
1321
+ expect(configurer.environment).to eq(Puppet[:environment])
1322
+ end
1323
+
1324
+ it "uses environment from Puppet[:environment] if lastrunfile is invalid YAML" do
1325
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1326
+ Key: 'this is my very very very ' +
1327
+ 'long string'
1328
+ SUMMARY
1329
+ configurer.run
1330
+
1331
+ expect(configurer.environment).to eq(Puppet[:environment])
1332
+ end
1333
+
1334
+ it "uses environment from Puppet[:environment] if lastrunfile exists but is empty" do
1335
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', '')
1336
+ configurer.run
1337
+
1338
+ expect(configurer.environment).to eq(Puppet[:environment])
1339
+ end
1340
+
1341
+ it "uses environment from Puppet[:environment] if the last used one cannot be found" do
1342
+ Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
1343
+ configurer.run
1344
+
1345
+ expect(configurer.environment).to eq(Puppet[:environment])
1346
+ end
1347
+ end
1127
1348
  end
1128
1349
  end
1129
1350
  end