puppet 0.24.7 → 0.24.8

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 (489) hide show
  1. data/CHANGELOG +72 -0
  2. data/README.rst +38 -0
  3. data/Rakefile +3 -1
  4. data/bin/filebucket +0 -0
  5. data/bin/puppet +0 -0
  6. data/bin/puppetca +0 -0
  7. data/bin/puppetd +0 -0
  8. data/bin/puppetdoc +0 -0
  9. data/bin/puppetmasterd +0 -0
  10. data/bin/puppetrun +0 -0
  11. data/bin/ralsh +4 -0
  12. data/conf/gentoo/init.d/puppetmaster +0 -0
  13. data/conf/osx/createpackage.sh +0 -0
  14. data/conf/osx/preflight +0 -0
  15. data/conf/redhat/puppet.spec +20 -3
  16. data/conf/solaris/smf/svc-puppetd +0 -0
  17. data/conf/solaris/smf/svc-puppetmasterd +0 -0
  18. data/examples/etc/init.d/sleeper +0 -0
  19. data/examples/mac_dscl.pp +0 -0
  20. data/examples/mac_dscl_revert.pp +0 -0
  21. data/examples/mac_netinfo.pp +0 -0
  22. data/examples/mac_pkgdmg.pp +0 -0
  23. data/ext/bin/sleeper +0 -0
  24. data/ext/dbfix.sql +132 -0
  25. data/ext/logcheck/puppet +2 -1
  26. data/ext/module_puppet +0 -0
  27. data/ext/nagios/check_puppet.rb +0 -0
  28. data/ext/puppet-test +0 -0
  29. data/ext/puppetlast +0 -0
  30. data/ext/vim/syntax/puppet.vim +2 -1
  31. data/install.rb +2 -2
  32. data/lib/puppet.rb +1 -1
  33. data/lib/puppet/daemon.rb +0 -0
  34. data/lib/puppet/defaults.rb +9 -0
  35. data/lib/puppet/executables/client/certhandler.rb +6 -1
  36. data/lib/puppet/external/base64.rb +0 -0
  37. data/lib/puppet/external/nagios.rb +0 -0
  38. data/lib/puppet/external/nagios/base.rb +0 -0
  39. data/lib/puppet/external/nagios/parser.rb +39 -57
  40. data/lib/puppet/file_collection.rb +30 -0
  41. data/lib/puppet/file_collection/lookup.rb +20 -0
  42. data/lib/puppet/indirector/facts/facter.rb +6 -2
  43. data/lib/puppet/indirector/node/ldap.rb +75 -39
  44. data/lib/puppet/network/authstore.rb +0 -0
  45. data/lib/puppet/network/handler/filebucket.rb +0 -0
  46. data/lib/puppet/network/handler/fileserver.rb +0 -0
  47. data/lib/puppet/network/handler/report.rb +0 -0
  48. data/lib/puppet/network/handler/resource.rb +0 -0
  49. data/lib/puppet/network/handler/runner.rb +0 -0
  50. data/lib/puppet/network/rights.rb +0 -0
  51. data/lib/puppet/network/xmlrpc/client.rb +113 -53
  52. data/lib/puppet/node/facts.rb +0 -0
  53. data/lib/puppet/parser/ast.rb +4 -3
  54. data/lib/puppet/parser/ast/astarray.rb +2 -1
  55. data/lib/puppet/parser/ast/leaf.rb +1 -1
  56. data/lib/puppet/parser/ast/resource.rb +20 -20
  57. data/lib/puppet/parser/ast/resource_override.rb +2 -2
  58. data/lib/puppet/parser/collector.rb +1 -2
  59. data/lib/puppet/parser/functions/realize.rb +1 -1
  60. data/lib/puppet/parser/functions/regsubst.rb +93 -0
  61. data/lib/puppet/parser/functions/sprintf.rb +17 -0
  62. data/lib/puppet/parser/functions/versioncmp.rb +10 -0
  63. data/lib/puppet/parser/resource.rb +10 -6
  64. data/lib/puppet/parser/resource/param.rb +17 -14
  65. data/lib/puppet/parser/resource/reference.rb +2 -0
  66. data/lib/puppet/parser/scope.rb +3 -3
  67. data/lib/puppet/property/list.rb +5 -1
  68. data/lib/puppet/provider/augeas/augeas.rb +146 -44
  69. data/lib/puppet/provider/cron/crontab.rb +0 -0
  70. data/lib/puppet/provider/mailalias/aliases.rb +0 -0
  71. data/lib/puppet/provider/maillist/mailman.rb +0 -0
  72. data/lib/puppet/provider/mount/parsed.rb +0 -0
  73. data/lib/puppet/provider/naginator.rb +7 -2
  74. data/lib/puppet/provider/nameservice/directoryservice.rb +128 -44
  75. data/lib/puppet/provider/package/apple.rb +0 -0
  76. data/lib/puppet/provider/package/apt.rb +0 -0
  77. data/lib/puppet/provider/package/aptitude.rb +0 -0
  78. data/lib/puppet/provider/package/blastwave.rb +0 -0
  79. data/lib/puppet/provider/package/darwinport.rb +0 -0
  80. data/lib/puppet/provider/package/dpkg.rb +0 -0
  81. data/lib/puppet/provider/package/fink.rb +0 -0
  82. data/lib/puppet/provider/package/freebsd.rb +0 -0
  83. data/lib/puppet/provider/package/gem.rb +0 -0
  84. data/lib/puppet/provider/package/openbsd.rb +0 -0
  85. data/lib/puppet/provider/package/ports.rb +0 -0
  86. data/lib/puppet/provider/package/rpm.rb +0 -0
  87. data/lib/puppet/provider/package/sun.rb +0 -0
  88. data/lib/puppet/provider/package/sunfreeware.rb +0 -0
  89. data/lib/puppet/provider/package/up2date.rb +4 -2
  90. data/lib/puppet/provider/package/yum.rb +0 -0
  91. data/lib/puppet/provider/parsedfile.rb +47 -22
  92. data/lib/puppet/provider/port/parsed.rb +0 -0
  93. data/lib/puppet/provider/service/base.rb +0 -0
  94. data/lib/puppet/provider/service/debian.rb +0 -0
  95. data/lib/puppet/provider/service/gentoo.rb +1 -1
  96. data/lib/puppet/provider/service/init.rb +0 -0
  97. data/lib/puppet/provider/service/launchd.rb +13 -4
  98. data/lib/puppet/provider/service/redhat.rb +5 -5
  99. data/lib/puppet/provider/service/smf.rb +0 -0
  100. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +43 -16
  101. data/lib/puppet/provider/sshkey/parsed.rb +0 -0
  102. data/lib/puppet/provider/user/useradd.rb +1 -1
  103. data/lib/puppet/rails/database/003_add_environment_to_host.rb +6 -2
  104. data/lib/puppet/rails/host.rb +70 -19
  105. data/lib/puppet/rails/param_value.rb +31 -12
  106. data/lib/puppet/rails/resource.rb +36 -9
  107. data/lib/puppet/rails/resource_tag.rb +18 -0
  108. data/lib/puppet/reference/report.rb +1 -0
  109. data/lib/puppet/reports.rb +0 -0
  110. data/lib/puppet/sslcertificates.rb +0 -0
  111. data/lib/puppet/transaction.rb +1 -1
  112. data/lib/puppet/type.rb +2 -6
  113. data/lib/puppet/type/augeas.rb +23 -15
  114. data/lib/puppet/type/cron.rb +0 -0
  115. data/lib/puppet/type/exec.rb +0 -0
  116. data/lib/puppet/type/file/checksum.rb +7 -35
  117. data/lib/puppet/type/file/content.rb +11 -8
  118. data/lib/puppet/type/file/ensure.rb +0 -0
  119. data/lib/puppet/type/file/group.rb +0 -0
  120. data/lib/puppet/type/file/mode.rb +0 -0
  121. data/lib/puppet/type/file/owner.rb +0 -0
  122. data/lib/puppet/type/file/selcontext.rb +8 -0
  123. data/lib/puppet/type/file/source.rb +0 -0
  124. data/lib/puppet/type/file/type.rb +0 -0
  125. data/lib/puppet/type/filebucket.rb +0 -0
  126. data/lib/puppet/type/group.rb +0 -0
  127. data/lib/puppet/type/host.rb +0 -0
  128. data/lib/puppet/type/mailalias.rb +0 -0
  129. data/lib/puppet/type/maillist.rb +0 -0
  130. data/lib/puppet/type/mount.rb +0 -0
  131. data/lib/puppet/type/port.rb +0 -0
  132. data/lib/puppet/type/schedule.rb +0 -0
  133. data/lib/puppet/type/ssh_authorized_key.rb +14 -0
  134. data/lib/puppet/type/sshkey.rb +0 -0
  135. data/lib/puppet/type/tidy.rb +0 -0
  136. data/lib/puppet/type/user.rb +6 -0
  137. data/lib/puppet/type/yumrepo.rb +4 -1
  138. data/lib/puppet/type/zfs.rb +0 -0
  139. data/lib/puppet/type/zpool.rb +0 -0
  140. data/lib/puppet/util/autoload.rb +2 -2
  141. data/lib/puppet/util/filetype.rb +7 -96
  142. data/lib/puppet/util/inifile.rb +1 -0
  143. data/lib/puppet/util/instance_loader.rb +0 -0
  144. data/lib/puppet/util/loadedfile.rb +0 -0
  145. data/lib/puppet/util/nagios_maker.rb +4 -0
  146. data/lib/puppet/util/package.rb +2 -0
  147. data/lib/puppet/util/posix.rb +0 -0
  148. data/lib/puppet/util/rails/reference_serializer.rb +18 -0
  149. data/lib/puppet/util/selinux.rb +3 -1
  150. data/spec/integration/checksum.rb +1 -0
  151. data/spec/integration/defaults.rb +9 -0
  152. data/spec/integration/file_serving/configuration.rb +0 -0
  153. data/spec/integration/file_serving/content.rb +0 -0
  154. data/spec/integration/file_serving/metadata.rb +0 -0
  155. data/spec/integration/indirector/direct_file_server.rb +0 -0
  156. data/spec/integration/indirector/file_content/file_server.rb +0 -0
  157. data/spec/integration/indirector/file_metadata/file_server.rb +0 -0
  158. data/spec/integration/indirector/module_files.rb +0 -0
  159. data/spec/integration/indirector/node/ldap.rb +0 -0
  160. data/spec/integration/indirector/rest.rb +0 -0
  161. data/spec/integration/network/server/mongrel.rb +0 -0
  162. data/spec/integration/network/server/webrick.rb +0 -0
  163. data/spec/integration/node.rb +0 -0
  164. data/spec/integration/node/catalog.rb +0 -0
  165. data/spec/integration/node/facts.rb +0 -0
  166. data/spec/integration/provider/package.rb +0 -0
  167. data/spec/integration/provider/service/init.rb +0 -0
  168. data/spec/integration/reference/providers.rb +0 -0
  169. data/spec/integration/reports.rb +4 -0
  170. data/spec/integration/transaction/report.rb +7 -1
  171. data/spec/integration/type/package.rb +5 -2
  172. data/spec/integration/util/file_locking.rb +0 -0
  173. data/spec/unit/executables/client/certhandler.rb +13 -0
  174. data/spec/unit/file_collection.rb +53 -0
  175. data/spec/unit/file_collection/lookup.rb +46 -0
  176. data/spec/unit/file_serving/configuration.rb +0 -0
  177. data/spec/unit/file_serving/configuration/parser.rb +0 -0
  178. data/spec/unit/file_serving/content.rb +0 -0
  179. data/spec/unit/file_serving/file_base.rb +0 -0
  180. data/spec/unit/file_serving/fileset.rb +0 -0
  181. data/spec/unit/file_serving/indirection_hooks.rb +0 -0
  182. data/spec/unit/file_serving/metadata.rb +0 -0
  183. data/spec/unit/file_serving/mount.rb +0 -0
  184. data/spec/unit/file_serving/terminus_helper.rb +0 -0
  185. data/spec/unit/indirector.rb +0 -0
  186. data/spec/unit/indirector/catalog/compiler.rb +0 -0
  187. data/spec/unit/indirector/catalog/yaml.rb +0 -0
  188. data/spec/unit/indirector/checksum/file.rb +0 -0
  189. data/spec/unit/indirector/code.rb +0 -0
  190. data/spec/unit/indirector/direct_file_server.rb +0 -0
  191. data/spec/unit/indirector/envelope.rb +0 -0
  192. data/spec/unit/indirector/exec.rb +0 -0
  193. data/spec/unit/indirector/facts/facter.rb +27 -2
  194. data/spec/unit/indirector/facts/yaml.rb +0 -0
  195. data/spec/unit/indirector/file.rb +0 -0
  196. data/spec/unit/indirector/file_content/file.rb +0 -0
  197. data/spec/unit/indirector/file_content/file_server.rb +0 -0
  198. data/spec/unit/indirector/file_content/modules.rb +0 -0
  199. data/spec/unit/indirector/file_content/rest.rb +0 -0
  200. data/spec/unit/indirector/file_metadata/file.rb +0 -0
  201. data/spec/unit/indirector/file_metadata/file_server.rb +0 -0
  202. data/spec/unit/indirector/file_metadata/modules.rb +0 -0
  203. data/spec/unit/indirector/file_metadata/rest.rb +0 -0
  204. data/spec/unit/indirector/file_server.rb +0 -0
  205. data/spec/unit/indirector/indirection.rb +0 -0
  206. data/spec/unit/indirector/ldap.rb +0 -0
  207. data/spec/unit/indirector/memory.rb +0 -0
  208. data/spec/unit/indirector/module_files.rb +0 -0
  209. data/spec/unit/indirector/node/exec.rb +0 -0
  210. data/spec/unit/indirector/node/ldap.rb +20 -0
  211. data/spec/unit/indirector/node/memory.rb +0 -0
  212. data/spec/unit/indirector/node/plain.rb +0 -0
  213. data/spec/unit/indirector/node/rest.rb +0 -0
  214. data/spec/unit/indirector/node/yaml.rb +0 -0
  215. data/spec/unit/indirector/plain.rb +0 -0
  216. data/spec/unit/indirector/report/processor.rb +0 -0
  217. data/spec/unit/indirector/request.rb +0 -0
  218. data/spec/unit/indirector/rest.rb +0 -0
  219. data/spec/unit/indirector/ssl_rsa/file.rb +5 -0
  220. data/spec/unit/indirector/terminus.rb +0 -0
  221. data/spec/unit/indirector/yaml.rb +0 -0
  222. data/spec/unit/module.rb +0 -0
  223. data/spec/unit/network/client.rb +0 -0
  224. data/spec/unit/network/client/master.rb +0 -0
  225. data/spec/unit/network/http.rb +0 -0
  226. data/spec/unit/network/http/mongrel.rb +0 -0
  227. data/spec/unit/network/http/mongrel/rest.rb +0 -0
  228. data/spec/unit/network/http/mongrel/xmlrpc.rb +0 -0
  229. data/spec/unit/network/http/webrick.rb +0 -0
  230. data/spec/unit/network/http/webrick/rest.rb +0 -0
  231. data/spec/unit/network/http/webrick/xmlrpc.rb +0 -0
  232. data/spec/unit/network/http_pool.rb +0 -0
  233. data/spec/unit/network/server.rb +0 -0
  234. data/spec/unit/network/xmlrpc/client.rb +165 -7
  235. data/spec/unit/node.rb +0 -0
  236. data/spec/unit/node/catalog.rb +1 -0
  237. data/spec/unit/node/environment.rb +0 -0
  238. data/spec/unit/node/facts.rb +0 -0
  239. data/spec/unit/other/checksum.rb +0 -0
  240. data/spec/unit/other/pgraph.rb +0 -0
  241. data/spec/unit/other/transbucket.rb +4 -4
  242. data/spec/unit/other/transobject.rb +0 -0
  243. data/spec/unit/parameter.rb +0 -0
  244. data/spec/unit/parser/ast.rb +5 -1
  245. data/spec/unit/parser/ast/arithmetic_operator.rb +0 -0
  246. data/spec/unit/parser/ast/astarray.rb +2 -2
  247. data/spec/unit/parser/ast/boolean_operator.rb +0 -0
  248. data/spec/unit/parser/ast/collexpr.rb +0 -0
  249. data/spec/unit/parser/ast/comparison_operator.rb +0 -0
  250. data/spec/unit/parser/ast/definition.rb +0 -0
  251. data/spec/unit/parser/ast/hostclass.rb +0 -0
  252. data/spec/unit/parser/ast/minus.rb +0 -0
  253. data/spec/unit/parser/ast/node.rb +0 -0
  254. data/spec/unit/parser/ast/nop.rb +0 -0
  255. data/spec/unit/parser/ast/not.rb +0 -0
  256. data/spec/unit/parser/ast/resource.rb +103 -0
  257. data/spec/unit/parser/ast/resource_override.rb +0 -0
  258. data/spec/unit/parser/ast/resource_reference.rb +0 -0
  259. data/spec/unit/parser/ast/vardef.rb +0 -0
  260. data/spec/unit/parser/collector.rb +4 -4
  261. data/spec/unit/parser/compiler.rb +0 -0
  262. data/spec/unit/parser/functions/realize.rb +51 -0
  263. data/spec/unit/parser/functions/regsubst.rb +88 -0
  264. data/spec/unit/parser/functions/sprintf.rb +42 -0
  265. data/spec/unit/parser/functions/versioncmp.rb +29 -0
  266. data/spec/unit/parser/interpreter.rb +0 -0
  267. data/spec/unit/parser/lexer.rb +0 -0
  268. data/spec/unit/parser/parser.rb +0 -0
  269. data/spec/unit/parser/resource.rb +4 -0
  270. data/spec/unit/parser/resource/reference.rb +4 -0
  271. data/spec/unit/parser/scope.rb +14 -0
  272. data/spec/unit/parser/templatewrapper.rb +0 -0
  273. data/spec/unit/property.rb +0 -0
  274. data/spec/unit/property/list.rb +4 -0
  275. data/spec/unit/provider/augeas/augeas.rb +219 -92
  276. data/spec/unit/provider/confine.rb +0 -0
  277. data/spec/unit/provider/confine/exists.rb +0 -0
  278. data/spec/unit/provider/confine/false.rb +0 -0
  279. data/spec/unit/provider/confine/feature.rb +0 -0
  280. data/spec/unit/provider/confine/true.rb +0 -0
  281. data/spec/unit/provider/confine/variable.rb +0 -0
  282. data/spec/unit/provider/confine_collection.rb +0 -0
  283. data/spec/unit/provider/confiner.rb +0 -0
  284. data/spec/unit/provider/group/groupadd.rb +0 -0
  285. data/spec/unit/provider/group/ldap.rb +0 -0
  286. data/spec/unit/provider/ldap.rb +0 -0
  287. data/spec/unit/provider/macauthorization.rb +0 -0
  288. data/spec/unit/provider/mcx/mcxcontent.rb +0 -0
  289. data/spec/unit/provider/mount.rb +0 -0
  290. data/spec/unit/provider/mount/parsed.rb +1 -0
  291. data/spec/unit/provider/naginator.rb +58 -0
  292. data/spec/unit/provider/package/apt.rb +0 -0
  293. data/spec/unit/provider/package/dpkg.rb +0 -0
  294. data/spec/unit/provider/parsedfile.rb +95 -0
  295. data/spec/unit/provider/selboolean.rb +0 -0
  296. data/spec/unit/provider/selmodule.rb +0 -0
  297. data/spec/unit/provider/service/launchd.rb +9 -1
  298. data/spec/unit/provider/ssh_authorized_key/parsed.rb +63 -19
  299. data/spec/unit/provider/user/hpux.rb +0 -0
  300. data/spec/unit/provider/user/ldap.rb +0 -0
  301. data/spec/unit/provider/user/useradd.rb +0 -0
  302. data/spec/unit/provider/zfs/solaris.rb +0 -0
  303. data/spec/unit/provider/zone/solaris.rb +0 -0
  304. data/spec/unit/provider/zpool/solaris.rb +0 -0
  305. data/spec/unit/rails.rb +1 -0
  306. data/spec/unit/relationship.rb +0 -0
  307. data/spec/unit/reports.rb +0 -0
  308. data/spec/unit/resource_reference.rb +0 -0
  309. data/spec/unit/simple_graph.rb +0 -0
  310. data/spec/unit/{other/transaction.rb → transaction.rb} +16 -1
  311. data/spec/unit/transaction/change.rb +0 -0
  312. data/spec/unit/transaction/event.rb +0 -0
  313. data/spec/unit/transaction/report.rb +0 -0
  314. data/spec/unit/type.rb +0 -0
  315. data/spec/unit/type/computer.rb +0 -0
  316. data/spec/unit/type/exec.rb +0 -0
  317. data/spec/unit/type/file.rb +2 -0
  318. data/spec/unit/type/file/content.rb +30 -0
  319. data/spec/unit/type/file/ensure.rb +0 -0
  320. data/spec/unit/type/file/group.rb +0 -0
  321. data/spec/unit/type/file/owner.rb +0 -0
  322. data/spec/unit/type/file/selinux.rb +6 -0
  323. data/spec/unit/type/group.rb +3 -0
  324. data/spec/unit/type/macauthorization.rb +0 -0
  325. data/spec/unit/type/mcx.rb +0 -0
  326. data/spec/unit/type/mount.rb +0 -0
  327. data/spec/unit/type/nagios.rb +0 -0
  328. data/spec/unit/type/noop_metaparam.rb +1 -0
  329. data/spec/unit/type/package.rb +0 -0
  330. data/spec/unit/type/schedule.rb +0 -0
  331. data/spec/unit/type/selboolean.rb +0 -0
  332. data/spec/unit/type/selmodule.rb +0 -0
  333. data/spec/unit/type/service.rb +0 -0
  334. data/spec/unit/type/ssh_authorized_key.rb +31 -8
  335. data/spec/unit/type/tidy.rb +4 -0
  336. data/spec/unit/type/user.rb +17 -0
  337. data/spec/unit/type/zfs.rb +0 -0
  338. data/spec/unit/type/zone.rb +0 -0
  339. data/spec/unit/type/zpool.rb +0 -0
  340. data/spec/unit/util/autoload.rb +39 -0
  341. data/spec/unit/util/checksums.rb +0 -0
  342. data/spec/unit/util/constant_inflector.rb +0 -0
  343. data/spec/unit/util/file_locking.rb +0 -0
  344. data/spec/unit/util/filetype.rb +110 -0
  345. data/spec/unit/util/ldap/connection.rb +0 -0
  346. data/spec/unit/util/ldap/generator.rb +0 -0
  347. data/spec/unit/util/ldap/manager.rb +0 -0
  348. data/spec/unit/util/loadedfile.rb +0 -0
  349. data/spec/unit/util/log.rb +0 -0
  350. data/spec/unit/util/metric.rb +0 -0
  351. data/spec/unit/util/nagios_maker.rb +32 -34
  352. data/spec/unit/util/package.rb +21 -0
  353. data/spec/unit/util/posix.rb +0 -0
  354. data/spec/unit/util/resource_template.rb +0 -0
  355. data/spec/unit/util/settings.rb +0 -0
  356. data/spec/unit/util/storage.rb +0 -0
  357. data/spec/unit/util/tagging.rb +0 -0
  358. data/spec/unit/util/uri_helper.rb +0 -0
  359. data/spec/unit/util/warnings.rb +0 -0
  360. data/test/certmgr/ca.rb +0 -0
  361. data/test/certmgr/certmgr.rb +0 -0
  362. data/test/certmgr/inventory.rb +0 -0
  363. data/test/certmgr/support.rb +0 -0
  364. data/test/data/snippets/subclass_name_duplication.pp +0 -0
  365. data/test/executables/filebucket.rb +6 -3
  366. data/test/executables/puppetbin.rb +1 -1
  367. data/test/executables/puppetca.rb +0 -0
  368. data/test/executables/puppetd.rb +0 -0
  369. data/test/executables/puppetmasterd.rb +0 -0
  370. data/test/executables/puppetmodule.rb +0 -0
  371. data/test/language/ast.rb +0 -0
  372. data/test/language/ast/casestatement.rb +0 -0
  373. data/test/language/ast/resource.rb +0 -0
  374. data/test/language/ast/resource_reference.rb +0 -0
  375. data/test/language/ast/selector.rb +0 -0
  376. data/test/language/ast/variable.rb +0 -0
  377. data/test/language/functions.rb +0 -0
  378. data/test/language/parser.rb +0 -0
  379. data/test/language/resource.rb +0 -40
  380. data/test/language/scope.rb +0 -0
  381. data/test/language/snippets.rb +0 -0
  382. data/test/language/transportable.rb +0 -0
  383. data/test/lib/puppettest.rb +3 -0
  384. data/test/lib/puppettest/support/resources.rb +0 -0
  385. data/test/network/authconfig.rb +0 -0
  386. data/test/network/authorization.rb +0 -0
  387. data/test/network/authstore.rb +0 -0
  388. data/test/network/client/ca.rb +0 -0
  389. data/test/network/client/client.rb +0 -0
  390. data/test/network/client/dipper.rb +0 -0
  391. data/test/network/client/master.rb +0 -0
  392. data/test/network/client/resource.rb +0 -0
  393. data/test/network/client_request.rb +0 -0
  394. data/test/network/daemon.rb +0 -0
  395. data/test/network/handler/bucket.rb +0 -0
  396. data/test/network/handler/ca.rb +0 -0
  397. data/test/network/handler/fileserver.rb +0 -0
  398. data/test/network/handler/handler.rb +0 -0
  399. data/test/network/handler/master.rb +0 -0
  400. data/test/network/handler/report.rb +0 -0
  401. data/test/network/handler/resource.rb +0 -0
  402. data/test/network/handler/runner.rb +0 -0
  403. data/test/network/rights.rb +0 -0
  404. data/test/network/server/mongrel_test.rb +0 -0
  405. data/test/network/server/webrick.rb +0 -0
  406. data/test/network/xmlrpc/client.rb +0 -0
  407. data/test/network/xmlrpc/processor.rb +0 -0
  408. data/test/network/xmlrpc/server.rb +0 -0
  409. data/test/network/xmlrpc/webrick_servlet.rb +0 -0
  410. data/test/other/dsl.rb +0 -0
  411. data/test/other/events.rb +0 -0
  412. data/test/other/overrides.rb +0 -0
  413. data/test/other/provider.rb +0 -0
  414. data/test/other/puppet.rb +0 -0
  415. data/test/other/relationships.rb +0 -0
  416. data/test/other/report.rb +0 -0
  417. data/test/other/transactions.rb +0 -0
  418. data/test/puppet/conffiles.rb +0 -0
  419. data/test/puppet/defaults.rb +0 -0
  420. data/test/puppet/errortest.rb +0 -0
  421. data/test/puppet/tc_suidmanager.rb +0 -0
  422. data/test/rails/ast.rb +0 -0
  423. data/test/rails/configuration.rb +0 -0
  424. data/test/rails/host.rb +0 -0
  425. data/test/rails/rails.rb +0 -0
  426. data/test/rails/railsparameter.rb +0 -0
  427. data/test/rails/railsresource.rb +0 -0
  428. data/test/ral/manager/attributes.rb +0 -0
  429. data/test/ral/manager/instances.rb +0 -0
  430. data/test/ral/manager/manager.rb +0 -0
  431. data/test/ral/manager/provider.rb +0 -0
  432. data/test/ral/manager/type.rb +0 -3
  433. data/test/ral/providers/cron/crontab.rb +0 -0
  434. data/test/ral/providers/group.rb +0 -0
  435. data/test/ral/providers/host/netinfo.rb +0 -0
  436. data/test/ral/providers/host/parsed.rb +0 -0
  437. data/test/ral/providers/mailalias/aliases.rb +0 -0
  438. data/test/ral/providers/mount/netinfo.rb +0 -0
  439. data/test/ral/providers/nameservice.rb +0 -0
  440. data/test/ral/providers/package.rb +0 -0
  441. data/test/ral/providers/package/aptitude.rb +0 -0
  442. data/test/ral/providers/package/aptrpm.rb +0 -0
  443. data/test/ral/providers/parsedfile.rb +0 -0
  444. data/test/ral/providers/port/parsed.rb +0 -0
  445. data/test/ral/providers/provider.rb +0 -0
  446. data/test/ral/providers/service/base.rb +0 -0
  447. data/test/ral/providers/service/debian.rb +0 -0
  448. data/test/ral/providers/sshkey/parsed.rb +0 -0
  449. data/test/ral/providers/user.rb +0 -0
  450. data/test/ral/providers/user/useradd.rb +0 -0
  451. data/test/ral/type/basic.rb +0 -0
  452. data/test/ral/type/cron.rb +0 -0
  453. data/test/ral/type/exec.rb +0 -0
  454. data/test/ral/type/file.rb +0 -0
  455. data/test/ral/type/file/target.rb +0 -0
  456. data/test/ral/type/filebucket.rb +0 -0
  457. data/test/ral/type/fileignoresource.rb +0 -0
  458. data/test/ral/type/filesources.rb +0 -0
  459. data/test/ral/type/group.rb +0 -0
  460. data/test/ral/type/host.rb +0 -0
  461. data/test/ral/type/mailalias.rb +0 -0
  462. data/test/ral/type/parameter.rb +0 -0
  463. data/test/ral/type/port.rb +0 -0
  464. data/test/ral/type/property.rb +0 -0
  465. data/test/ral/type/resources.rb +0 -0
  466. data/test/ral/type/service.rb +0 -0
  467. data/test/ral/type/sshkey.rb +0 -0
  468. data/test/ral/type/tidy.rb +0 -0
  469. data/test/ral/type/user.rb +0 -0
  470. data/test/ral/type/yumrepo.rb +0 -0
  471. data/test/ral/type/zone.rb +0 -0
  472. data/test/test +0 -0
  473. data/test/util/autoload.rb +0 -0
  474. data/test/util/classgen.rb +0 -0
  475. data/test/util/execution.rb +0 -0
  476. data/test/util/features.rb +0 -0
  477. data/test/util/fileparsing.rb +0 -0
  478. data/test/util/inifile.rb +0 -0
  479. data/test/util/instance_loader.rb +0 -0
  480. data/test/util/log.rb +0 -0
  481. data/test/util/metrics.rb +0 -0
  482. data/test/util/package.rb +0 -0
  483. data/test/util/pidlock.rb +0 -0
  484. data/test/util/settings.rb +0 -0
  485. data/test/util/storage.rb +0 -0
  486. data/test/util/subclass_loader.rb +0 -0
  487. data/test/util/utiltest.rb +0 -0
  488. metadata +981 -968
  489. data/test/util/filetype.rb +0 -137
@@ -0,0 +1,17 @@
1
+ module Puppet::Parser::Functions
2
+ newfunction(:sprintf, :type => :rvalue,
3
+ :doc => "\
4
+ Perform printf-style formatting of text.
5
+
6
+ The first parameter is format string describing how the rest of the
7
+ parameters should be formatted. See the documentation for the
8
+ ``Kernel::sprintf()`` function in Ruby for all the details.
9
+ ") \
10
+ do |args|
11
+ if args.length < 1
12
+ raise Puppet::ParseError, 'sprintf() needs at least one argument'
13
+ end
14
+ fmt = args.shift()
15
+ return sprintf(fmt, *args)
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ require 'puppet/util/package'
2
+
3
+ Puppet::Parser::Functions::newfunction(:versioncmp, :doc => "Compares two versions.") do |args|
4
+
5
+ unless args.length == 2
6
+ raise Puppet::ParseError, "versioncmp should have 2 arguments"
7
+ end
8
+
9
+ return Puppet::Util::Package.versioncmp(args[0], args[1])
10
+ end
@@ -4,13 +4,17 @@ class Puppet::Parser::Resource
4
4
  require 'puppet/parser/resource/param'
5
5
  require 'puppet/parser/resource/reference'
6
6
  require 'puppet/util/tagging'
7
+ require 'puppet/file_collection/lookup'
8
+
9
+ include Puppet::FileCollection::Lookup
10
+
7
11
  include Puppet::Util
8
12
  include Puppet::Util::MethodHelper
9
13
  include Puppet::Util::Errors
10
14
  include Puppet::Util::Logging
11
15
  include Puppet::Util::Tagging
12
16
 
13
- attr_accessor :source, :line, :file, :scope, :rails_id
17
+ attr_accessor :source, :scope, :rails_id
14
18
  attr_accessor :virtual, :override, :translated
15
19
 
16
20
  attr_reader :exported, :evaluated, :params
@@ -181,11 +185,11 @@ class Puppet::Parser::Resource
181
185
  hash
182
186
  end
183
187
 
184
- db_resource.ar_hash_merge(db_resource.get_params_hash(db_resource.param_values), updated_params,
188
+ db_resource.ar_hash_merge(db_resource.get_params_hash(), updated_params,
185
189
  :create => Proc.new { |name, parameter|
186
190
  parameter.to_rails(db_resource)
187
191
  }, :delete => Proc.new { |values|
188
- values.each { |value| db_resource.param_values.delete(value) }
192
+ values.each { |value| Puppet::Rails::ParamValue.delete(value['id']) }
189
193
  }, :modify => Proc.new { |db, mem|
190
194
  mem.modify_rails_values(db)
191
195
  })
@@ -194,13 +198,13 @@ class Puppet::Parser::Resource
194
198
  hash[tag] = tag
195
199
  hash
196
200
  }
197
-
201
+
198
202
  db_resource.ar_hash_merge(db_resource.get_tag_hash(),
199
203
  updated_tags,
200
204
  :create => Proc.new { |name, tag|
201
205
  db_resource.add_resource_tag(name)
202
206
  }, :delete => Proc.new { |tag|
203
- db_resource.resource_tags.delete(tag)
207
+ Puppet::Rails::ResourceTag.delete(tag['id'])
204
208
  }, :modify => Proc.new { |db, mem|
205
209
  # nothing here
206
210
  })
@@ -437,7 +441,7 @@ class Puppet::Parser::Resource
437
441
  # 'type' isn't a valid column name, so we have to use another name.
438
442
  to = (param == :type) ? :restype : param
439
443
  if value = self.send(param)
440
- hash[to] = value
444
+ hash[to] = value
441
445
  end
442
446
  hash
443
447
  end
@@ -1,10 +1,14 @@
1
+ require 'puppet/file_collection/lookup'
2
+
1
3
  # The parameters we stick in Resources.
2
4
  class Puppet::Parser::Resource::Param
3
- attr_accessor :name, :value, :source, :line, :file, :add
5
+ attr_accessor :name, :value, :source, :add
4
6
  include Puppet::Util
5
7
  include Puppet::Util::Errors
6
8
  include Puppet::Util::MethodHelper
7
9
 
10
+ include Puppet::FileCollection::Lookup
11
+
8
12
  def initialize(hash)
9
13
  set_options(hash)
10
14
  requiredopts(:name, :value, :source)
@@ -12,7 +16,7 @@ class Puppet::Parser::Resource::Param
12
16
  end
13
17
 
14
18
  def inspect
15
- "#<#{self.class} @name => #{name}, @value => #{value}, @source => #{source.name}>"
19
+ "#<#{self.class} @name => #{name}, @value => #{value}, @source => #{source.name}, @line => #{line}>"
16
20
  end
17
21
 
18
22
  def line_to_i
@@ -39,7 +43,6 @@ class Puppet::Parser::Resource::Param
39
43
 
40
44
  param_name = Puppet::Rails::ParamName.find_or_create_by_name(self.name.to_s)
41
45
  line_number = line_to_i()
42
-
43
46
  return values.collect do |v|
44
47
  db_resource.param_values.create(:value => v,
45
48
  :line => line_number,
@@ -48,18 +51,18 @@ class Puppet::Parser::Resource::Param
48
51
  end
49
52
 
50
53
  def modify_rails_values(db_values)
51
- #dev_warn if db_values.nil? || db_values.empty?
54
+ #dev_warn if db_values.nil? || db_values.empty?
52
55
 
53
56
  values_to_remove(db_values).each { |remove_me|
54
- Puppet::Rails::ParamValue.delete(remove_me.id)
57
+ Puppet::Rails::ParamValue.delete(remove_me['id'])
55
58
  }
56
59
  line_number = line_to_i()
57
- values_to_add(db_values).each { |add_me|
58
- db_resource = db_values[0].resource
59
- db_param_name = db_values[0].param_name
60
- db_resource.param_values.create(:value => add_me,
60
+ db_param_name = db_values[0]['param_name_id']
61
+ values_to_add(db_values).each { |add_me|
62
+ Puppet::Rails::ParamValue.create(:value => add_me,
61
63
  :line => line_number,
62
- :param_name => db_param_name)
64
+ :param_name_id => db_param_name,
65
+ :resource_id => db_values[0]['resource_id'] )
63
66
  }
64
67
  end
65
68
 
@@ -79,9 +82,9 @@ class Puppet::Parser::Resource::Param
79
82
  values = munge_for_rails(value)
80
83
  line_number = line_to_i()
81
84
  db_values.collect do |db|
82
- db unless (db.line == line_number &&
85
+ db unless (db['line'] == line_number &&
83
86
  values.find { |v|
84
- compare(v,db.value)
87
+ compare(v,db['value'])
85
88
  } )
86
89
  end.compact
87
90
  end
@@ -90,8 +93,8 @@ class Puppet::Parser::Resource::Param
90
93
  values = munge_for_rails(value)
91
94
  line_number = line_to_i()
92
95
  values.collect do |v|
93
- v unless db_values.find { |db| (compare(v,db.value) &&
94
- line_number == db.line) }
96
+ v unless db_values.find { |db| (compare(v,db['value']) &&
97
+ line_number == db['line']) }
95
98
  end.compact
96
99
  end
97
100
  end
@@ -1,7 +1,9 @@
1
1
  require 'puppet/resource_reference'
2
+ require 'puppet/file_collection/lookup'
2
3
 
3
4
  # A reference to a resource. Mostly just the type and title.
4
5
  class Puppet::Parser::Resource::Reference < Puppet::ResourceReference
6
+ include Puppet::FileCollection::Lookup
5
7
  include Puppet::Util::MethodHelper
6
8
  include Puppet::Util::Errors
7
9
 
@@ -52,11 +52,11 @@ class Puppet::Parser::Scope
52
52
  if value.is_a?(String)
53
53
  if value =~ /^-?\d+(:?\.\d+|(:?\.\d+)?e\d+)$/
54
54
  return value.to_f
55
- elsif value =~ /^0x\d+/i
55
+ elsif value =~ /^0x[0-9a-f]+$/i
56
56
  return value.to_i(16)
57
- elsif value =~ /^0\d+/i
57
+ elsif value =~ /^0[0-7]+$/
58
58
  return value.to_i(8)
59
- elsif value =~ /^-?\d+/
59
+ elsif value =~ /^-?\d+$/
60
60
  return value.to_i
61
61
  else
62
62
  return nil
@@ -10,7 +10,11 @@ module Puppet
10
10
  end
11
11
 
12
12
  def is_to_s(currentvalue)
13
- currentvalue.join(delimiter)
13
+ if currentvalue == :absent
14
+ return "absent"
15
+ else
16
+ return currentvalue.join(delimiter)
17
+ end
14
18
  end
15
19
 
16
20
  def membership
@@ -20,13 +20,17 @@
20
20
  require 'augeas' if Puppet.features.augeas?
21
21
 
22
22
  Puppet::Type.type(:augeas).provide(:augeas) do
23
- #class Puppet::Provider::Augeas < Puppet::Provider
24
23
  include Puppet::Util
25
-
26
- confine :true => Puppet.features.augeas?
27
-
24
+
25
+ confine :true => Puppet.features.augeas?
26
+
28
27
  has_features :parse_commands, :need_to_run?,:execute_changes
29
28
 
29
+ SAVE_NOOP = "noop"
30
+ SAVE_OVERWRITE = "overwrite"
31
+
32
+ attr_accessor :aug
33
+
30
34
  # Extracts an 2 dimensional array of commands which are in the
31
35
  # form of command path value.
32
36
  # The input can be
@@ -38,10 +42,27 @@ Puppet::Type.type(:augeas).provide(:augeas) do
38
42
  if data.is_a?(String)
39
43
  data.each_line do |line|
40
44
  cmd_array = Array.new()
41
- tokens = line.split(" ")
42
- cmd = tokens.shift()
43
- file = tokens.shift()
44
- other = tokens.join(" ")
45
+ single = line.index("'")
46
+ double = line.index('"')
47
+ tokens = nil
48
+ delim = " "
49
+ if ((single != nil) or (double != nil))
50
+ single = 99999 if single == nil
51
+ double = 99999 if double == nil
52
+ delim = '"' if double < single
53
+ delim = "'" if single < double
54
+ end
55
+ tokens = line.split(delim)
56
+ # If the length of tokens is 2, thn that means the pattern was
57
+ # command file "some text", therefore we need to re-split
58
+ # the first line
59
+ if tokens.length == 2
60
+ tokens = (tokens[0].split(" ")) << tokens[1]
61
+ end
62
+ cmd = tokens.shift().strip()
63
+ delim = "" if delim == " "
64
+ file = tokens.shift().strip()
65
+ other = tokens.join(" ").strip()
45
66
  cmd_array << cmd if !cmd.nil?
46
67
  cmd_array << file if !file.nil?
47
68
  cmd_array << other if other != ""
@@ -52,19 +73,34 @@ Puppet::Type.type(:augeas).provide(:augeas) do
52
73
  commands.concat(parse_commands(datum))
53
74
  end
54
75
  end
55
-
56
76
  return commands
57
77
  end
58
78
 
79
+
59
80
  def open_augeas
60
- flags = 0
61
- (flags = 1 << 2 ) if self.resource[:type_check] == :true
62
- root = self.resource[:root]
63
- load_path = self.resource[:load_path]
64
- debug("Opening augeas with root #{root}, lens path #{load_path}, flags #{flags}")
65
- Augeas.open(root, load_path,flags)
81
+ if (@aug.nil?)
82
+ flags = 0
83
+ (flags = 1 << 2 ) if self.resource[:type_check] == :true
84
+ root = self.resource[:root]
85
+ load_path = self.resource[:load_path]
86
+ debug("Opening augeas with root #{root}, lens path #{load_path}, flags #{flags}")
87
+ @aug = Augeas.open(root, load_path,flags)
88
+
89
+ if (self.get_augeas_version() >= "0.3.6")
90
+ debug("Augeas version #{self.get_augeas_version()} is installed")
91
+ end
92
+ end
93
+ @aug
94
+ end
95
+
96
+ def close_augeas
97
+ if (!@aug.nil?)
98
+ @aug.close()
99
+ debug("Closed the augeas connection")
100
+ @aug = nil;
101
+ end
66
102
  end
67
-
103
+
68
104
  # Used by the need_to_run? method to process get filters. Returns
69
105
  # true if there is a match, false if otherwise
70
106
  # Assumes a syntax of get /files/path [COMPARATOR] value
@@ -79,8 +115,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
79
115
  arg = cmd_array.join(" ")
80
116
 
81
117
  #check the value in augeas
82
- aug = open_augeas()
83
- result = aug.get(path) || ''
118
+ result = @aug.get(path) || ''
84
119
  unless result.nil?
85
120
  case comparator
86
121
  when "!=":
@@ -94,8 +129,8 @@ Puppet::Type.type(:augeas).provide(:augeas) do
94
129
  end
95
130
  end
96
131
  return_value
97
- end
98
-
132
+ end
133
+
99
134
  # Used by the need_to_run? method to process match filters. Returns
100
135
  # true if there is a match, false if otherwise
101
136
  def process_match(cmd_array)
@@ -108,10 +143,9 @@ Puppet::Type.type(:augeas).provide(:augeas) do
108
143
  verb = cmd_array.shift()
109
144
 
110
145
  #Get the values from augeas
111
- aug = open_augeas()
112
- result = aug.match(path) || ''
146
+ result = @aug.match(path) || ''
113
147
  # Now do the work
114
- if (!result.nil?)
148
+ unless (result.nil?)
115
149
  case verb
116
150
  when "size":
117
151
  fail("Invalid command: #{cmd_array.join(" ")}") if cmd_array.length != 2
@@ -132,11 +166,26 @@ Puppet::Type.type(:augeas).provide(:augeas) do
132
166
  end
133
167
  end
134
168
  return_value
135
- end
136
-
169
+ end
170
+
171
+ def get_augeas_version
172
+ return @aug.get("/augeas/version") || ""
173
+ end
174
+
175
+ def set_augeas_save_mode(mode)
176
+ return @aug.set("/augeas/save", mode)
177
+ end
178
+
179
+ def files_changed?
180
+ saved_files = @aug.match("/augeas/events/saved")
181
+ return saved_files.size() > 0
182
+ end
183
+
137
184
  # Determines if augeas acutally needs to run.
138
185
  def need_to_run?
186
+ force = resource[:force]
139
187
  return_value = true
188
+ self.open_augeas()
140
189
  filter = resource[:onlyif]
141
190
  unless (filter == "")
142
191
  cmd_array = filter.split
@@ -152,38 +201,91 @@ Puppet::Type.type(:augeas).provide(:augeas) do
152
201
  fail("Error sending command '#{command}' with params #{cmd_array[1..-1].inspect}/#{e.message}")
153
202
  end
154
203
  end
155
- return_value
156
- end
157
-
158
- # Actually execute the augeas changes.
204
+
205
+ unless (force)
206
+ # If we have a verison of augeas which is at least 0.3.6 then we
207
+ # can make the changes now, see if changes were made, and
208
+ # actually do the save.
209
+ if ((return_value) and (self.get_augeas_version() >= "0.3.6"))
210
+ debug("Will attempt to save and only run if files changed")
211
+ self.set_augeas_save_mode(SAVE_NOOP)
212
+ self.do_execute_changes()
213
+ save_result = @aug.save()
214
+ saved_files = @aug.match("/augeas/events/saved")
215
+ if ((save_result) and (not files_changed?))
216
+ debug("Skipping becuase no files were changed")
217
+ return_value = false
218
+ else
219
+ debug("Files changed, should execute")
220
+ end
221
+ end
222
+ end
223
+ self.close_augeas()
224
+ return return_value
225
+ end
226
+
159
227
  def execute_changes
160
- aug = open_augeas
161
- commands = resource[:changes]
228
+ # Re-connect to augeas, and re-execute the changes
229
+ self.open_augeas()
230
+ if (self.get_augeas_version() >= "0.3.6")
231
+ self.set_augeas_save_mode(SAVE_OVERWRITE)
232
+ end
233
+
234
+ self.do_execute_changes()
235
+
236
+ success = @aug.save()
237
+ if (success != true)
238
+ fail("Save failed with return code #{success}")
239
+ end
240
+ self.close_augeas()
241
+
242
+ return :executed
243
+ end
244
+
245
+ # Actually execute the augeas changes.
246
+ def do_execute_changes
247
+ commands = resource[:changes].clone()
162
248
  context = resource[:context]
163
249
  commands.each do |cmd_array|
250
+ cmd_array = cmd_array.clone()
164
251
  fail("invalid command #{cmd_array.join[" "]}") if cmd_array.length < 2
165
252
  command = cmd_array[0]
166
253
  cmd_array.shift()
167
- cmd_array[0]=File.join(context, cmd_array[0])
168
- debug("sending command '#{command}' with params #{cmd_array.inspect}")
169
254
  begin
170
255
  case command
171
- when "set": aug.set(cmd_array[0], cmd_array[1])
172
- when "rm", "remove": aug.rm(cmd_array[0])
173
- when "clear": aug.clear(cmd_array[0])
174
- when "insert", "ins": aug.insert(cmd_array[0])
256
+ when "set":
257
+ cmd_array[0]=File.join(context, cmd_array[0])
258
+ debug("sending command '#{command}' with params #{cmd_array.inspect}")
259
+ @aug.set(cmd_array[0], cmd_array[1])
260
+ when "rm", "remove":
261
+ cmd_array[0]=File.join(context, cmd_array[0])
262
+ debug("sending command '#{command}' with params #{cmd_array.inspect}")
263
+ @aug.rm(cmd_array[0])
264
+ when "clear":
265
+ cmd_array[0]=File.join(context, cmd_array[0])
266
+ debug("sending command '#{command}' with params #{cmd_array.inspect}")
267
+ @aug.clear(cmd_array[0])
268
+ when "insert", "ins"
269
+ ext_array = cmd_array[1].split(" ") ;
270
+ if cmd_array.size < 2 or ext_array.size < 2
271
+ fail("ins requires 3 parameters")
272
+ end
273
+ label = cmd_array[0]
274
+ where = ext_array[0]
275
+ path = File.join(context, ext_array[1])
276
+ case where
277
+ when "before": before = true
278
+ when "after": before = false
279
+ else fail("Invalid value '#{where}' for where param")
280
+ end
281
+ debug("sending command '#{command}' with params #{[label, where, path].inspect()}")
282
+ aug.insert(path, label, before)
175
283
  else fail("Command '#{command}' is not supported")
176
284
  end
177
285
  rescue Exception => e
178
286
  fail("Error sending command '#{command}' with params #{cmd_array.inspect}/#{e.message}")
179
287
  end
180
288
  end
181
- success = aug.save()
182
- if (success != true)
183
- fail("Save failed with return code #{success}")
184
- end
289
+ end
185
290
 
186
- return :executed
187
- end
188
-
189
291
  end