veewee 0.2.3 → 0.3.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (389) hide show
  1. data/.gitignore +3 -0
  2. data/Gemfile +1 -2
  3. data/Gemfile.lock +53 -30
  4. data/License +21 -0
  5. data/README-LIB.md +2 -0
  6. data/README.md +35 -62
  7. data/Rakefile +54 -88
  8. data/bin/veewee +13 -70
  9. data/bin/veewee-kvm-old +34 -0
  10. data/bin/veewee-vagrant +55 -0
  11. data/bin/veewee-vmfusion +34 -0
  12. data/lib/fission.rb +41 -0
  13. data/lib/fission/cli.rb +76 -0
  14. data/lib/fission/command.rb +15 -0
  15. data/lib/fission/command/clone.rb +68 -0
  16. data/lib/fission/command/delete.rb +71 -0
  17. data/lib/fission/command/snapshot_create.rb +52 -0
  18. data/lib/fission/command/snapshot_list.rb +45 -0
  19. data/lib/fission/command/snapshot_revert.rb +54 -0
  20. data/lib/fission/command/start.rb +69 -0
  21. data/lib/fission/command/status.rb +31 -0
  22. data/lib/fission/command/stop.rb +49 -0
  23. data/lib/fission/command/suspend.rb +67 -0
  24. data/lib/fission/config.rb +29 -0
  25. data/lib/fission/core_ext/class.rb +5 -0
  26. data/lib/fission/core_ext/file.rb +7 -0
  27. data/lib/fission/core_ext/object.rb +112 -0
  28. data/lib/fission/error.rb +9 -0
  29. data/lib/fission/fusion.rb +17 -0
  30. data/lib/fission/leasesfile.rb +74 -0
  31. data/lib/fission/metadata.rb +39 -0
  32. data/lib/fission/response.rb +16 -0
  33. data/lib/fission/ui.rb +22 -0
  34. data/lib/fission/version.rb +3 -0
  35. data/lib/fission/vm.rb +361 -0
  36. data/lib/net/vnc/vnc.rb +341 -0
  37. data/lib/vagrant_init.rb +5 -2
  38. data/lib/veewee.rb +20 -3
  39. data/lib/veewee/builder/core/box.rb +32 -0
  40. data/lib/veewee/builder/core/box/vnc.rb +122 -0
  41. data/lib/veewee/builder/core/builder.rb +90 -0
  42. data/lib/veewee/builder/core/builder/build.rb +250 -0
  43. data/lib/veewee/builder/core/builder/iso.rb +120 -0
  44. data/lib/veewee/builder/core/builder/transaction.rb +25 -0
  45. data/lib/veewee/builder/core/builder/tunnel.rb +46 -0
  46. data/lib/veewee/builder/kvm/box.rb +130 -0
  47. data/lib/veewee/builder/kvm/builder.rb +38 -0
  48. data/lib/veewee/builder/virtualbox/box.rb +121 -0
  49. data/lib/veewee/builder/virtualbox/builder.rb +48 -0
  50. data/lib/veewee/builder/virtualbox/helper/_snapshots.rb +105 -0
  51. data/lib/veewee/builder/virtualbox/helper/_transaction.rb +135 -0
  52. data/lib/veewee/builder/virtualbox/helper/console_type.rb +62 -0
  53. data/lib/veewee/builder/virtualbox/helper/create.rb +210 -0
  54. data/lib/veewee/builder/virtualbox/helper/destroy.rb +79 -0
  55. data/lib/veewee/builder/virtualbox/helper/export_vagrant.rb +87 -0
  56. data/lib/veewee/builder/virtualbox/helper/validate_vagrant.rb +35 -0
  57. data/lib/veewee/builder/vmfusion/box.rb +137 -0
  58. data/lib/veewee/builder/vmfusion/builder.rb +78 -0
  59. data/lib/veewee/builder/vmfusion/helper/create.rb +68 -0
  60. data/lib/veewee/builder/vmfusion/helper/export_ova.rb +26 -0
  61. data/lib/veewee/builder/vmfusion/helper/template.rb +39 -0
  62. data/lib/veewee/builder/vmfusion/helper/template.vmx.erb +81 -0
  63. data/lib/veewee/builder/vmfusion/helper/validate_vmfusion.rb +37 -0
  64. data/lib/veewee/builder/vmfusion/info/export_ovf.info +103 -0
  65. data/lib/veewee/cli.rb +55 -0
  66. data/lib/veewee/command.rb +10 -20
  67. data/lib/veewee/command/base.rb +106 -0
  68. data/lib/veewee/command/group_base.rb +107 -0
  69. data/lib/veewee/command/helpers.rb +13 -0
  70. data/lib/veewee/command/kvm.rb +85 -0
  71. data/lib/veewee/command/named_base.rb +14 -0
  72. data/lib/veewee/command/vagrant.rb +108 -0
  73. data/lib/veewee/command/version.rb +13 -0
  74. data/lib/veewee/command/virtualbox.rb +86 -0
  75. data/lib/veewee/command/vmfusion.rb +113 -0
  76. data/lib/veewee/config.rb +89 -3
  77. data/lib/veewee/config/builders.rb +36 -0
  78. data/lib/veewee/config/collection.rb +82 -0
  79. data/lib/veewee/config/component.rb +19 -0
  80. data/lib/veewee/config/definition.rb +44 -0
  81. data/lib/veewee/config/ostypes.yml +165 -0
  82. data/lib/veewee/config/veewee.rb +21 -0
  83. data/lib/veewee/definition.rb +130 -0
  84. data/lib/veewee/environment.rb +367 -0
  85. data/lib/veewee/error.rb +20 -0
  86. data/lib/veewee/templates/locales/en.yml +30 -0
  87. data/lib/veewee/ui.rb +83 -0
  88. data/lib/veewee/util/scancode.rb +112 -0
  89. data/lib/veewee/util/shell.rb +42 -0
  90. data/lib/veewee/util/ssh.rb +158 -0
  91. data/lib/veewee/util/tcp.rb +88 -0
  92. data/lib/veewee/util/web.rb +63 -0
  93. data/lib/veewee/vagrant/config.rb +7 -0
  94. data/lib/veewee/version.rb +6 -1
  95. data/templates/CentOS-4.8-i386/definition.rb +3 -3
  96. data/templates/CentOS-4.8-i386/postinstall.sh +2 -2
  97. data/templates/CentOS-5.5-x86_64-netboot/definition.rb +1 -1
  98. data/templates/CentOS-5.5-x86_64-netboot/postinstall.sh +1 -1
  99. data/templates/CentOS-5.6-i386-netboot/definition.rb +3 -3
  100. data/templates/CentOS-5.6-i386-netboot/ks.cfg +2 -2
  101. data/templates/CentOS-5.6-i386-netboot/postinstall.sh +2 -2
  102. data/templates/CentOS-5.6-i386/definition.rb +2 -2
  103. data/templates/CentOS-5.6-i386/postinstall.sh +2 -2
  104. data/templates/CentOS-5.6-x86_64-netboot/definition.rb +3 -3
  105. data/templates/CentOS-5.6-x86_64-netboot/ks.cfg +1 -1
  106. data/templates/CentOS-5.6-x86_64-netboot/postinstall.sh +1 -1
  107. data/templates/CentOS-5.7-i386-netboot/postinstall.sh +3 -3
  108. data/templates/CentOS-5.7-x86_64-netboot/postinstall.sh +1 -1
  109. data/templates/CentOS-6.0-i386-netboot/definition.rb +2 -2
  110. data/templates/CentOS-6.0-i386-netboot/postinstall.sh +2 -2
  111. data/templates/CentOS-6.0-i386/definition.rb +2 -2
  112. data/templates/CentOS-6.0-i386/postinstall.sh +2 -2
  113. data/templates/CentOS-6.0-x86_64-minimal/definition.rb +2 -2
  114. data/templates/CentOS-6.0-x86_64-minimal/postinstall.sh +4 -17
  115. data/templates/CentOS-6.0-x86_64-netboot/definition.rb +2 -2
  116. data/templates/CentOS-6.0-x86_64-netboot/postinstall.sh +2 -2
  117. data/templates/CentOS-6.0-x86_64/definition.rb +2 -2
  118. data/templates/CentOS-6.0-x86_64/postinstall.sh +2 -2
  119. data/templates/Debian-5.0.8-amd64-netboot/definition.rb +1 -1
  120. data/templates/Debian-5.0.8-amd64-netboot/postinstall.sh +1 -1
  121. data/templates/Debian-5.0.8-i386-netboot/definition.rb +1 -1
  122. data/templates/Debian-5.0.8-i386-netboot/postinstall.sh +1 -1
  123. data/templates/{Debian-6.0.3-amd64-netboot → Debian-6.0.2-amd64-netboot}/definition.rb +4 -4
  124. data/templates/{ubuntu-11.10-server-amd64-ishaya → Debian-6.0.2-amd64-netboot}/postinstall.sh +23 -42
  125. data/templates/{Debian-6.0.3-amd64-netboot → Debian-6.0.2-amd64-netboot}/preseed.cfg +0 -0
  126. data/templates/{Debian-6.0.3-i386-netboot → Debian-6.0.2-i386-netboot}/definition.rb +4 -4
  127. data/templates/{Debian-6.0.3-i386-netboot → Debian-6.0.2-i386-netboot}/postinstall.sh +1 -1
  128. data/templates/{Debian-6.0.3-i386-netboot → Debian-6.0.2-i386-netboot}/preseed.cfg +0 -0
  129. data/templates/Fedora-14-amd64-netboot/definition.rb +2 -2
  130. data/templates/Fedora-14-amd64-netboot/postinstall.sh +2 -2
  131. data/templates/Fedora-14-amd64/definition.rb +2 -2
  132. data/templates/Fedora-14-amd64/postinstall.sh +2 -2
  133. data/templates/Fedora-14-i386-netboot/definition.rb +2 -2
  134. data/templates/Fedora-14-i386-netboot/postinstall.sh +2 -2
  135. data/templates/Fedora-14-i386/definition.rb +2 -2
  136. data/templates/Fedora-14-i386/postinstall.sh +2 -2
  137. data/templates/Fedora-15-i386-netboot/definition.rb +2 -2
  138. data/templates/Fedora-15-i386/definition.rb +3 -3
  139. data/templates/Sysrescuecd-2.0.0-experimental/definition.rb +1 -1
  140. data/templates/archlinux-i386-netboot/aif.cfg +14 -8
  141. data/templates/archlinux-i386-netboot/definition.rb +7 -4
  142. data/templates/archlinux-i386-netboot/postinstall.sh +17 -5
  143. data/templates/archlinux-i386-netboot/postinstall2.sh +1 -3
  144. data/templates/archlinux-i386/definition.rb +4 -4
  145. data/templates/archlinux-i386/postinstall.sh +1 -1
  146. data/templates/archlinux-x86_64-netboot/aif.cfg +14 -8
  147. data/templates/archlinux-x86_64-netboot/definition.rb +7 -4
  148. data/templates/archlinux-x86_64-netboot/postinstall.sh +16 -1
  149. data/templates/archlinux-x86_64-netboot/postinstall2.sh +1 -3
  150. data/templates/archlinux-x86_64/definition.rb +2 -2
  151. data/templates/archlinux-x86_64/postinstall.sh +1 -1
  152. data/templates/freebsd-8.2-experimental/definition.rb +1 -1
  153. data/templates/freebsd-8.2-pcbsd-i386-netboot/definition.rb +2 -5
  154. data/templates/freebsd-8.2-pcbsd-i386-netboot/postinstall.sh +1 -1
  155. data/templates/freebsd-8.2-pcbsd-i386/definition.rb +3 -4
  156. data/templates/freebsd-8.2-pcbsd-i386/postinstall.sh +1 -1
  157. data/templates/gentoo-latest-i386-experimental/definition.rb +7 -7
  158. data/templates/gentoo-latest-i386-experimental/postinstall.sh +1 -1
  159. data/templates/openSUSE-11.4-DVD-i586/postinstall.sh +1 -1
  160. data/templates/openSUSE-11.4-DVD-x86_64/postinstall.sh +1 -1
  161. data/templates/openSUSE-11.4-NET-i586/postinstall.sh +1 -1
  162. data/templates/openSUSE-11.4-NET-x86_64/postinstall.sh +1 -1
  163. data/templates/openindiana-148-ai-x86/definition.rb +3 -3
  164. data/templates/openindiana-148-ai-x86/postinstall.sh +1 -1
  165. data/templates/opensuse-11.4-i386-experimental/definition.rb +1 -1
  166. data/templates/opensuse-11.4-i386-experimental/postinstall.sh +1 -1
  167. data/templates/solaris-11-express-i386/definition.rb +3 -3
  168. data/templates/solaris-11-express-i386/postinstall.sh +1 -1
  169. data/templates/ubuntu-10.04.2-amd64-netboot/definition.rb +1 -1
  170. data/templates/ubuntu-10.04.2-amd64-netboot/postinstall.sh +1 -1
  171. data/templates/ubuntu-10.04.2-server-i386-netboot/definition.rb +1 -1
  172. data/templates/ubuntu-10.04.2-server-i386-netboot/postinstall.sh +1 -1
  173. data/templates/ubuntu-10.04.3-server-amd64-alt/definition.rb +6 -6
  174. data/templates/ubuntu-10.04.3-server-amd64-alt/postinstall.sh +1 -1
  175. data/templates/ubuntu-10.04.3-server-amd64/base.sh +11 -0
  176. data/templates/ubuntu-10.04.3-server-amd64/chef.sh +2 -0
  177. data/templates/ubuntu-10.04.3-server-amd64/cleanup.sh +19 -0
  178. data/templates/ubuntu-10.04.3-server-amd64/definition.rb +19 -11
  179. data/templates/ubuntu-10.04.3-server-amd64/preseed.cfg +4 -4
  180. data/templates/ubuntu-10.04.3-server-amd64/puppet.sh +1 -0
  181. data/templates/ubuntu-10.04.3-server-amd64/ruby.sh +24 -0
  182. data/templates/ubuntu-10.04.3-server-amd64/vagrant.sh +27 -0
  183. data/templates/ubuntu-10.04.3-server-amd64/virtualbox.sh +12 -0
  184. data/templates/ubuntu-10.04.3-server-i386/postinstall.sh +1 -1
  185. data/templates/ubuntu-10.10-server-amd64-netboot/definition.rb +1 -1
  186. data/templates/ubuntu-10.10-server-amd64-netboot/postinstall.sh +1 -1
  187. data/templates/ubuntu-10.10-server-amd64/base.sh +11 -0
  188. data/templates/ubuntu-10.10-server-amd64/chef.sh +2 -0
  189. data/templates/ubuntu-10.10-server-amd64/cleanup.sh +19 -0
  190. data/templates/ubuntu-10.10-server-amd64/definition.rb +20 -8
  191. data/templates/ubuntu-10.10-server-amd64/postinstall.sh +1 -1
  192. data/templates/ubuntu-10.10-server-amd64/preseed.cfg +5 -5
  193. data/templates/ubuntu-10.10-server-amd64/puppet.sh +1 -0
  194. data/templates/ubuntu-10.10-server-amd64/ruby.sh +24 -0
  195. data/templates/ubuntu-10.10-server-amd64/vagrant.sh +27 -0
  196. data/templates/ubuntu-10.10-server-amd64/virtualbox.sh +12 -0
  197. data/templates/ubuntu-10.10-server-i386-netboot/definition.rb +1 -1
  198. data/templates/ubuntu-10.10-server-i386-netboot/postinstall.sh +1 -1
  199. data/templates/ubuntu-10.10-server-i386/definition.rb +1 -1
  200. data/templates/ubuntu-10.10-server-i386/postinstall.sh +1 -1
  201. data/templates/ubuntu-11.04-server-amd64/apt-upgrade.sh +4 -0
  202. data/templates/ubuntu-11.04-server-amd64/chef.sh +1 -0
  203. data/templates/ubuntu-11.04-server-amd64/definition.rb +32 -9
  204. data/templates/ubuntu-11.04-server-amd64/network-cleanup.sh +14 -0
  205. data/templates/ubuntu-11.04-server-amd64/nfs-client.sh +3 -0
  206. data/templates/ubuntu-11.04-server-amd64/puppet.sh +1 -0
  207. data/templates/ubuntu-11.04-server-amd64/remove-build-essentials.sh +3 -0
  208. data/templates/ubuntu-11.04-server-amd64/ruby.sh +29 -0
  209. data/templates/ubuntu-11.04-server-amd64/ssh-keys.sh +7 -0
  210. data/templates/ubuntu-11.04-server-amd64/sudo.sh +4 -0
  211. data/templates/ubuntu-11.04-server-amd64/timestamp.sh +1 -0
  212. data/templates/ubuntu-11.04-server-amd64/vbox_additions.sh +11 -0
  213. data/templates/ubuntu-11.04-server-amd64/zero-disk.sh +3 -0
  214. data/templates/ubuntu-11.04-server-i386/definition.rb +2 -2
  215. data/templates/ubuntu-11.04-server-i386/postinstall.sh +1 -1
  216. data/templates/ubuntu-8.04.4-server-amd64/definition.rb +1 -2
  217. data/templates/ubuntu-8.04.4-server-amd64/postinstall.sh +7 -8
  218. data/templates/ubuntu-8.04.4-server-amd64/preseed.cfg +1 -0
  219. data/templates/ubuntu-8.04.4-server-i386/definition.rb +2 -2
  220. data/templates/ubuntu-8.04.4-server-i386/postinstall.sh +3 -25
  221. data/templates/windows-2008R2-amd64/cygwin-setup.exe +0 -0
  222. data/templates/windows-2008R2-amd64/definition.rb +1 -1
  223. data/templates/windows-2008R2-amd64/install-winrm.bat +0 -2
  224. data/templates/windows-2008R2-amd64/postinstall.sh +1 -1
  225. data/templates/windows-2008R2-amd64/win7/Autounattend.xml +180 -0
  226. data/test/build_test.rb +50 -0
  227. data/test/definition_test.rb +11 -0
  228. data/test/definitions/test_definition/_test_me.sh +1 -0
  229. data/test/definitions/test_definition/autorun0 +3 -0
  230. data/test/definitions/test_definition/definition.rb +27 -0
  231. data/test/environment_test.rb +67 -0
  232. data/validation/features/steps/ssh_steps.rb +52 -52
  233. data/validation/vagrant.feature +64 -48
  234. data/veewee.gemspec +14 -9
  235. metadata +243 -213
  236. data/lib/veewee/command/basebox.rb +0 -63
  237. data/lib/veewee/command/basebox_build.rb +0 -32
  238. data/lib/veewee/command/basebox_define.rb +0 -28
  239. data/lib/veewee/command/basebox_destroy.rb +0 -22
  240. data/lib/veewee/command/basebox_export.rb +0 -22
  241. data/lib/veewee/command/basebox_list.rb +0 -23
  242. data/lib/veewee/command/basebox_ostypes.rb +0 -23
  243. data/lib/veewee/command/basebox_templates.rb +0 -23
  244. data/lib/veewee/command/basebox_undefine.rb +0 -22
  245. data/lib/veewee/command/basebox_validate.rb +0 -26
  246. data/lib/veewee/export.rb +0 -81
  247. data/lib/veewee/scancode.rb +0 -151
  248. data/lib/veewee/session.rb +0 -907
  249. data/lib/veewee/shell.rb +0 -54
  250. data/lib/veewee/ssh.rb +0 -193
  251. data/lib/veewee/transaction.rb +0 -122
  252. data/lib/veewee/utils.rb +0 -26
  253. data/lib/veewee/web.rb +0 -48
  254. data/templates/CentOS-6.1-x86_64-minimal/definition.rb +0 -15
  255. data/templates/CentOS-6.1-x86_64-minimal/ks.cfg +0 -37
  256. data/templates/CentOS-6.1-x86_64-minimal/postinstall.sh +0 -50
  257. data/templates/CentOS-6.2-x86_64-minimal/definition.rb +0 -15
  258. data/templates/CentOS-6.2-x86_64-minimal/ks.cfg +0 -37
  259. data/templates/CentOS-6.2-x86_64-minimal/postinstall.sh +0 -50
  260. data/templates/Debian-6.0.3-amd64-netboot/postinstall.sh +0 -80
  261. data/templates/Fedora-15-x86_64-netboot/definition.rb +0 -29
  262. data/templates/Fedora-15-x86_64-netboot/ks.cfg +0 -64
  263. data/templates/Fedora-15-x86_64-netboot/postinstall.sh +0 -33
  264. data/templates/Fedora-16-i386/definition.rb +0 -17
  265. data/templates/Fedora-16-i386/ks.cfg +0 -72
  266. data/templates/Fedora-16-i386/postinstall.sh +0 -35
  267. data/templates/Fedora-16-x86_64/definition.rb +0 -17
  268. data/templates/Fedora-16-x86_64/ks.cfg +0 -72
  269. data/templates/Fedora-16-x86_64/postinstall.sh +0 -35
  270. data/templates/SLES-11-SP1-DVD-i586-GM/autoinst_de.xml +0 -1127
  271. data/templates/SLES-11-SP1-DVD-i586-GM/autoinst_en.xml +0 -1127
  272. data/templates/SLES-11-SP1-DVD-i586-GM/definition.rb +0 -37
  273. data/templates/SLES-11-SP1-DVD-i586-GM/postinstall.sh +0 -43
  274. data/templates/SLES-11-SP1-DVD-x86_64-GM/autoinst_de.xml +0 -1171
  275. data/templates/SLES-11-SP1-DVD-x86_64-GM/autoinst_en.xml +0 -1171
  276. data/templates/SLES-11-SP1-DVD-x86_64-GM/definition.rb +0 -37
  277. data/templates/SLES-11-SP1-DVD-x86_64-GM/postinstall.sh +0 -43
  278. data/templates/funtoo-latest-generic_64-stable/definition.rb +0 -34
  279. data/templates/funtoo-latest-generic_64-stable/postinstall.sh +0 -177
  280. data/templates/funtoo-latest-generic_64-stable/postinstall2.sh +0 -83
  281. data/templates/gentoo-latest-x86_64-experimental/definition.rb +0 -34
  282. data/templates/gentoo-latest-x86_64-experimental/postinstall.sh +0 -214
  283. data/templates/openSUSE-12.1-DVD+NET-i586/autoinst_de.xml +0 -1483
  284. data/templates/openSUSE-12.1-DVD+NET-i586/autoinst_en.xml +0 -1483
  285. data/templates/openSUSE-12.1-DVD+NET-i586/definition.rb +0 -44
  286. data/templates/openSUSE-12.1-DVD+NET-i586/postinstall.sh +0 -43
  287. data/templates/openSUSE-12.1-DVD+NET-x86_64/autoinst_de.xml +0 -1727
  288. data/templates/openSUSE-12.1-DVD+NET-x86_64/autoinst_en.xml +0 -1727
  289. data/templates/openSUSE-12.1-DVD+NET-x86_64/definition.rb +0 -44
  290. data/templates/openSUSE-12.1-DVD+NET-x86_64/postinstall.sh +0 -43
  291. data/templates/openbsd50_amd64/README +0 -28
  292. data/templates/openbsd50_amd64/definition.rb +0 -84
  293. data/templates/openbsd50_amd64/postinstall.sh +0 -81
  294. data/templates/openbsd50_i386/.definition.rb.swp +0 -0
  295. data/templates/openbsd50_i386/README +0 -28
  296. data/templates/openbsd50_i386/definition.rb +0 -84
  297. data/templates/openbsd50_i386/postinstall.sh +0 -80
  298. data/templates/scientificlinux-6.1-i386-netboot/definition.rb +0 -16
  299. data/templates/scientificlinux-6.1-i386-netboot/ks.cfg +0 -53
  300. data/templates/scientificlinux-6.1-i386-netboot/postinstall.sh +0 -30
  301. data/templates/scientificlinux-6.1-x86_64-netboot/definition.rb +0 -16
  302. data/templates/scientificlinux-6.1-x86_64-netboot/ks.cfg +0 -53
  303. data/templates/scientificlinux-6.1-x86_64-netboot/postinstall.sh +0 -30
  304. data/templates/ubuntu-10.04.3-server-amd64/postinstall.sh +0 -90
  305. data/templates/ubuntu-11.04-server-amd64/postinstall.sh +0 -96
  306. data/templates/ubuntu-11.10-server-amd64-ishaya/definition.rb +0 -24
  307. data/templates/ubuntu-11.10-server-amd64-ishaya/preseed.cfg +0 -87
  308. data/templates/ubuntu-11.10-server-amd64-ruby192/definition.rb +0 -24
  309. data/templates/ubuntu-11.10-server-amd64-ruby192/postinstall.sh +0 -90
  310. data/templates/ubuntu-11.10-server-amd64-ruby192/preseed.cfg +0 -87
  311. data/templates/ubuntu-11.10-server-amd64/definition.rb +0 -35
  312. data/templates/ubuntu-11.10-server-amd64/postinstall.sh +0 -88
  313. data/templates/ubuntu-11.10-server-amd64/preseed.cfg +0 -87
  314. data/templates/ubuntu-11.10-server-i386/definition.rb +0 -35
  315. data/templates/ubuntu-11.10-server-i386/postinstall.sh +0 -88
  316. data/templates/ubuntu-11.10-server-i386/preseed.cfg +0 -87
  317. data/templates/windows-2008R1-serverstandard-amd64/Autounattend.xml +0 -146
  318. data/templates/windows-2008R1-serverstandard-amd64/README.md +0 -134
  319. data/templates/windows-2008R1-serverstandard-amd64/cygwin-setup.exe +0 -0
  320. data/templates/windows-2008R1-serverstandard-amd64/definition.rb +0 -114
  321. data/templates/windows-2008R1-serverstandard-amd64/install-cygwin-sshd.bat +0 -40
  322. data/templates/windows-2008R1-serverstandard-amd64/install-guest-additions.bat +0 -5
  323. data/templates/windows-2008R1-serverstandard-amd64/install-winrm.bat +0 -14
  324. data/templates/windows-2008R1-serverstandard-amd64/oracle-cert.cer +0 -0
  325. data/templates/windows-2008R1-serverstandard-amd64/postinstall.sh +0 -74
  326. data/templates/windows-2008R1-serverstandard-amd64/sudo +0 -2
  327. data/templates/windows-2008R1-serverstandard-amd64/winrm.rb +0 -8
  328. data/templates/windows-2008R2-serverstandard-amd64/Autounattend.xml +0 -147
  329. data/templates/windows-2008R2-serverstandard-amd64/README.md +0 -142
  330. data/templates/windows-2008R2-serverstandard-amd64/definition.rb +0 -44
  331. data/templates/windows-2008R2-serverstandard-amd64/install-cygwin-sshd.bat +0 -41
  332. data/templates/windows-2008R2-serverstandard-amd64/install-winrm.bat +0 -11
  333. data/templates/windows-2008R2-serverstandard-amd64/oracle-cert.cer +0 -0
  334. data/templates/windows-2008R2-serverstandard-amd64/postinstall.sh +0 -74
  335. data/templates/windows-7-enterprise-amd64/Autounattend.xml +0 -149
  336. data/templates/windows-7-enterprise-amd64/README.md +0 -52
  337. data/templates/windows-7-enterprise-amd64/definition.rb +0 -39
  338. data/templates/windows-7-enterprise-amd64/install-cygwin-sshd.bat +0 -40
  339. data/templates/windows-7-enterprise-amd64/install-winrm.bat +0 -14
  340. data/templates/windows-7-enterprise-amd64/oracle-cert.cer +0 -0
  341. data/templates/windows-7-enterprise-amd64/postinstall.sh +0 -74
  342. data/templates/windows-7-enterprise-i386/Autounattend.xml +0 -151
  343. data/templates/windows-7-enterprise-i386/README.md +0 -169
  344. data/templates/windows-7-enterprise-i386/definition.rb +0 -40
  345. data/templates/windows-7-enterprise-i386/install-cygwin-sshd.bat +0 -40
  346. data/templates/windows-7-enterprise-i386/install-winrm.bat +0 -14
  347. data/templates/windows-7-enterprise-i386/oracle-cert.cer +0 -0
  348. data/templates/windows-7-enterprise-i386/postinstall.sh +0 -74
  349. data/templates/windows-7-premium-amd64/Autounattend.xml +0 -152
  350. data/templates/windows-7-premium-amd64/README.md +0 -171
  351. data/templates/windows-7-premium-amd64/definition.rb +0 -38
  352. data/templates/windows-7-premium-amd64/install-chefclient.bat +0 -44
  353. data/templates/windows-7-premium-amd64/install-winrm.bat +0 -11
  354. data/templates/windows-7-premium-amd64/oracle-cert.cer +0 -0
  355. data/templates/windows-7-premium-amd64/postinstall.sh +0 -124
  356. data/templates/windows-7-premium-amd64/winrm.rb +0 -8
  357. data/templates/windows-7-professional-amd64/Autounattend.xml +0 -152
  358. data/templates/windows-7-professional-amd64/README.md +0 -171
  359. data/templates/windows-7-professional-amd64/definition.rb +0 -41
  360. data/templates/windows-7-professional-amd64/install-cygwin-sshd.bat +0 -40
  361. data/templates/windows-7-professional-amd64/install-winrm.bat +0 -14
  362. data/templates/windows-7-professional-amd64/oracle-cert.cer +0 -0
  363. data/templates/windows-7-professional-amd64/postinstall.sh +0 -74
  364. data/templates/windows-7-ultimate-amd64/Autounattend.xml +0 -152
  365. data/templates/windows-7-ultimate-amd64/README.md +0 -89
  366. data/templates/windows-7-ultimate-amd64/definition.rb +0 -41
  367. data/templates/windows-7-ultimate-amd64/install-cygwin-sshd.bat +0 -40
  368. data/templates/windows-7-ultimate-amd64/install-winrm.bat +0 -14
  369. data/templates/windows-7-ultimate-amd64/oracle-cert.cer +0 -0
  370. data/templates/windows-7-ultimate-amd64/postinstall.sh +0 -74
  371. data/templates/windows-7sp1-ultimate-amd64/Autounattend.xml +0 -152
  372. data/templates/windows-7sp1-ultimate-amd64/README.md +0 -89
  373. data/templates/windows-7sp1-ultimate-amd64/definition.rb +0 -42
  374. data/templates/windows-7sp1-ultimate-amd64/install-cygwin-sshd.bat +0 -40
  375. data/templates/windows-7sp1-ultimate-amd64/install-winrm.bat +0 -14
  376. data/templates/windows-7sp1-ultimate-amd64/oracle-cert.cer +0 -0
  377. data/templates/windows-7sp1-ultimate-amd64/postinstall.sh +0 -74
  378. data/templates/windows-8-preview-dev-amd64/Autounattend.xml +0 -140
  379. data/templates/windows-8-preview-dev-amd64/README.md +0 -134
  380. data/templates/windows-8-preview-dev-amd64/cygwin-setup.exe +0 -0
  381. data/templates/windows-8-preview-dev-amd64/definition.rb +0 -114
  382. data/templates/windows-8-preview-dev-amd64/install-cygwin-sshd.bat +0 -38
  383. data/templates/windows-8-preview-dev-amd64/install-winrm.bat +0 -11
  384. data/templates/windows-8-preview-dev-amd64/oracle-cert.cer +0 -0
  385. data/templates/windows-8-preview-dev-amd64/postinstall.sh +0 -122
  386. data/templates/windows-8-preview-dev-amd64/winrm.rb +0 -8
  387. data/trials/docu-vbox.txt +0 -83
  388. data/trials/f.rb +0 -29
  389. data/trials/t.rb +0 -15
@@ -0,0 +1,367 @@
1
+ require 'veewee/config'
2
+
3
+ require 'logger'
4
+
5
+ module Veewee
6
+
7
+ # Represents a single Veewee environment. A "Veewee environment" is
8
+ # defined as basically a folder with a "Veeweefile". This class allows
9
+ # access to the VMs, CLI, etc. all in the scope of this environment
10
+ class Environment
11
+
12
+ # The `cwd` that this environment represents
13
+ attr_accessor :cwd
14
+
15
+ # The valid name for a Veeweefile for this environment
16
+ attr_accessor :veewee_filename
17
+
18
+ attr_accessor :loglevel
19
+
20
+ # This initializes a new Veewee Environment
21
+ # settings argument is a hash with the following options
22
+ # - :definition_path : paths to look for definitions
23
+ # - :definition_dir : where new definition will be created
24
+ # - :template_path : paths that contains the template definitions that come with the veewee gem, defaults to the path relative to the gemfiles
25
+ # - :iso_dir : directory to look for iso files, defaults to $environment_dir/iso
26
+ # - :validation_dir : directory that contains a list of validation tests, that can be run after building a box
27
+ # - :tmp_dir : directory that will be used for creating temporary files, needs to be rewritable, default to $environment_dir/tmp
28
+
29
+ attr_accessor :template_path,:definition_path, :definition_dir
30
+
31
+ attr_accessor :iso_dir,:tmp_dir
32
+
33
+ # The {UI} Object to communicate with the outside world
34
+ attr_writer :ui
35
+
36
+ # The configuration as loaded
37
+ attr_accessor :config
38
+
39
+ def initialize(options={})
40
+
41
+ cwd= options.has_key?(:cwd) ? options[:cwd] : Dir.pwd
42
+
43
+ defaults={
44
+ :cwd => cwd,
45
+ :veewee_filename => "Veeweefile",
46
+ :loglevel => :info,
47
+ :definition_path => [File.join(cwd,"definitions")],
48
+ :definition_dir => File.join(cwd,"definitions"),
49
+ :template_path => [File.expand_path(File.join(File.dirname(__FILE__),"..","..",'templates')),"templates"],
50
+ :iso_dir => File.join(cwd,"iso"),
51
+ :validation_dir => File.join(File.expand_path(File.join(File.dirname(__FILE__),"..","..")),"validation"),
52
+ :tmp_dir => File.join(cwd,"tmp")
53
+ }
54
+
55
+ options = defaults.merge(options)
56
+
57
+ # We need to set this variable before the first call to the logger object
58
+ if options.has_key?("debug")
59
+ ENV['VEEWEE_LOG']="STDOUT"
60
+ ui.info "Debugging enabled"
61
+ end
62
+
63
+
64
+ logger.info("environment") { "Environment initialized (#{self})" }
65
+
66
+ # Injecting all variables of the options and assign the variables
67
+ options.each do |key, value|
68
+ instance_variable_set("@#{key}".to_sym, options[key])
69
+ logger.info("environment") { " - #{key} : #{options[key]}" }
70
+
71
+ end
72
+
73
+ return self
74
+ end
75
+
76
+
77
+ #---------------------------------------------------------------
78
+ # Retrieval Methods
79
+ #---------------------------------------------------------------
80
+
81
+ # Traverses path to see which exist or not
82
+ # and checks if a definition.rb is available
83
+ def valid_paths(paths)
84
+ valid_paths=paths.collect { |path|
85
+ if File.exists?(path) && File.directory?(path)
86
+ logger.info "Definition path #{path} exists"
87
+ File.expand_path(path)
88
+ else
89
+ logger.info "Definition path #{path} does not exist, skipping"
90
+ nil
91
+ end
92
+ }
93
+ return valid_paths.compact
94
+ end
95
+
96
+ # This function retrieves all the templates given the @template_dir in the current Environment object
97
+ # A valid template has to contain the file definition.rb
98
+ # The name of the template is the name of the parent directory of the definition.rb file
99
+ #
100
+ # returns a hash of 'template name' => 'path'
101
+ def get_template_paths
102
+
103
+ templates=Hash.new
104
+
105
+ valid_paths(template_path).each do |template_dir|
106
+
107
+ logger.debug("[Template] Searching #{template_dir} for templates")
108
+
109
+ subdirs=Dir.glob("#{template_dir}/*")
110
+ subdirs.each do |sub|
111
+ if File.directory?("#{sub}")
112
+ definition=Dir.glob("#{sub}/definition.rb")
113
+ if definition.length!=0
114
+ name=sub.sub(/#{template_dir}\//,'')
115
+ logger.debug("[Template] template '#{name}' found")
116
+ templates[name]=File.join(template_dir,name)
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ return templates
123
+ end
124
+
125
+ def list_ostypes
126
+ @ui.info "The following are possible os_types you can use in your definition.rb files"
127
+
128
+ config.ostypes.each { |key,value|
129
+ @ui.info "#{key}"
130
+ }
131
+ end
132
+
133
+ # This function returns a hash of names of all the definitions that are in the @definition_dir,
134
+ # given the @definition_dir in the current Environment object
135
+ # The name of the definition is the name of a sub-directory in the @definition_dir
136
+ def get_definition_paths
137
+
138
+ definitions=Hash.new
139
+
140
+ valid_paths(definition_path).each do |definition_dir|
141
+
142
+ logger.debug("[Definition] Searching #{definition_dir} for definitions:")
143
+
144
+ subdirs=Dir.glob("#{definition_dir}/*")
145
+ subdirs.each do |sub|
146
+ name=File.basename(sub)
147
+ logger.debug("[Definition] definition '#{name}' found")
148
+ definitions[name]=File.join(definition_dir,name)
149
+ end
150
+ end
151
+ logger.debug("[Definition] no definitions found") if definitions.length==0
152
+
153
+ return definitions
154
+ end
155
+
156
+ # Based on the definition_dir set in the current Environment object
157
+ # it will load the definition based on the name
158
+ #
159
+ # returns a Veewee::Definition
160
+ def get_definition(name)
161
+ definition=Veewee::Definition.load(name,self)
162
+ return definition
163
+ end
164
+
165
+ # This function 'defines'/'clones'/'instantiates a template
166
+ # by copying the template directory to a directory with the definitionname under the @defintion_dir
167
+ # Options are : :force => true to overwrite an existing definition
168
+ #
169
+ # Returns nothing
170
+ def define(definition_name,template_name,define_options = {})
171
+ # Default is not to overwrite
172
+ define_options = {'force' => false}.merge(define_options)
173
+
174
+ logger.debug("Forceflag : #{define_options['force']}")
175
+
176
+ # Check if template exists
177
+ template_exists=get_template_paths.has_key?(template_name)
178
+ template_dir=get_template_paths[template_name]
179
+
180
+ unless template_exists
181
+ logger.fatal("Template '#{template_name}' does not exist")
182
+ exit -1
183
+ else
184
+ logger.debug("Template '#{template_name}' exists")
185
+ end
186
+
187
+ # Check if definition exists
188
+ definition_exists=get_definition_paths.has_key?(definition_name)
189
+ definition_dir=get_definition_paths[definition_name]
190
+
191
+ if definition_exists
192
+ logger.debug("Definition '#{definition_name}' already exists")
193
+
194
+ if !define_options['force']
195
+ logger.fatal("No force was specified, bailing out")
196
+ exit -1
197
+ else
198
+ logger.debug("Force option specified, cleaning existing directory")
199
+ undefine(definition_name)
200
+ end
201
+
202
+ else
203
+ logger.debug("Definition '#{definition_name}' does not yet exist")
204
+ end
205
+
206
+ unless File.exists?(@definition_dir)
207
+ logger.debug("Creating definition base directory '#{@definition_dir}' ")
208
+ FileUtils.mkdir(@definition_dir)
209
+ logger.debug("Definition base directory '#{@definition_dir}' succesfuly created")
210
+ end
211
+
212
+ if File.writable?(@definition_dir)
213
+ logger.debug("DefinitionDir '#{@definition_dir}' is writable")
214
+ if File.exists?("#{@definition_dir}")
215
+ logger.debug("DefinitionDir '#{@definition_dir}' already exists")
216
+ else
217
+ logger.debug("DefinitionDir '#{@definition_dir}' does not exist, creating it")
218
+ FileUtils.mkdir(definition_dir)
219
+ logger.debug("DefinitionDir '#{@definition_dir}' succesfuly created")
220
+ end
221
+ logger.debug("Creating definition #{definition_name} in directory '#{@definition_dir}' ")
222
+ FileUtils.mkdir(File.join(@definition_dir,definition_name))
223
+ logger.debug("Definition Directory '#{File.join(@definition_dir,definition_name)}' succesfuly created")
224
+
225
+ else
226
+ logger.fatal("DefinitionDir '#{definition_dir}' is not writable")
227
+ exit -1
228
+ end
229
+
230
+ # Start copying/cloning the directory of the template to the definition directory
231
+ begin
232
+ logger.debug("Starting copy '#{template_dir}' to '#{File.join(@definition_dir,definition_name)}'")
233
+ FileUtils.cp_r(template_dir+"/.","#{File.join(@definition_dir,definition_name)}")
234
+ logger.debug("Copy '#{template_dir}' to '#{File.join(@definition_dir,definition_name)}' succesfull")
235
+ rescue Exception => ex
236
+ logger.fatal("Copy '#{template_dir}' to #{File.join(@definition_dir,definition_name)}' failed: #{ex}")
237
+ exit -1
238
+ end
239
+ end
240
+
241
+
242
+ # This function undefines/removes the definition by removing the directoy with definition_name
243
+ # under @definition_dir
244
+ def undefine(definition_name,undefine_options = {})
245
+ definition_dir=get_definition_paths[definition_name]
246
+ unless definition_dir.nil?
247
+ #TODO: Needs to be more defensive!!
248
+ logger.debug("[Undefine] About to remove '#{definition_dir} for '#{definition_name}'")
249
+ begin
250
+ FileUtils.rm_rf(definition_dir)
251
+ rescue Exception => ex
252
+ logger.fatal("Removing '#{definition_dir} for '#{definition_name}' failed")
253
+ exit -1
254
+ end
255
+ logger.debug("Removing '#{definition_dir} for '#{definition_name}' succesful")
256
+ else
257
+ logger.fatal("Definition '#{definition_name}' does not exist")
258
+ exit -1
259
+ end
260
+ end
261
+
262
+
263
+ #---------------------------------------------------------------
264
+ # Config Methods
265
+ #---------------------------------------------------------------
266
+
267
+ # The configuration object represented by this environment. This
268
+ # will trigger the environment to load if it hasn't loaded yet (see
269
+ # {#load!}).
270
+ #
271
+ # @return [Config::Top]
272
+ def config
273
+ load! if !loaded?
274
+ @config
275
+ end
276
+
277
+ # Returns the {UI} for the environment, which is responsible
278
+ # for talking with the outside world.
279
+ #
280
+ # @return [UI]
281
+ def ui
282
+ @ui ||= UI.new(self)
283
+ end
284
+
285
+ #---------------------------------------------------------------
286
+ # Load Methods
287
+ #---------------------------------------------------------------
288
+
289
+ # Returns a boolean representing if the environment has been
290
+ # loaded or not.
291
+ #
292
+ # @return [Bool]
293
+ def loaded?
294
+ !!@loaded
295
+ end
296
+
297
+ # Loads this entire environment, setting up the instance variables
298
+ # such as `vm`, `config`, etc. on this environment. The order this
299
+ # method calls its other methods is very particular.
300
+ def load!
301
+ if !loaded?
302
+ @loaded = true
303
+
304
+ logger.info("environment") { "Loading configuration..." }
305
+ load_config!
306
+
307
+ self
308
+ end
309
+ end
310
+
311
+ def load_config!
312
+ @config=Config.new({:env => self}).load_veewee_config()
313
+
314
+ return self
315
+ end
316
+
317
+ # Reloads the configuration of this environment.
318
+ def reload_config!
319
+ @config = nil
320
+ load_config!
321
+ self
322
+ end
323
+
324
+ # Makes a call to the CLI with the given arguments as if they
325
+ # came from the real command line (sometimes they do!). An example:
326
+ #
327
+ # env.cli("package", "--veeweefile", "Veeweefie")
328
+ #
329
+ def cli(*args)
330
+ CLI.start(args.flatten, :env => self)
331
+ end
332
+
333
+ def resource
334
+ "veewee"
335
+ end
336
+
337
+ # Accesses the logger for Vagrant. This logger is a _detailed_
338
+ # logger which should be used to log internals only. For outward
339
+ # facing information, use {#ui}.
340
+ #
341
+ # @return [Logger]
342
+ def logger
343
+ return @logger if @logger
344
+
345
+ # Figure out where the output should go to.
346
+ output = nil
347
+ if ENV["VEEWEE_LOG"] == "STDOUT"
348
+ output = STDOUT
349
+ elsif ENV["VEEWEE_LOG"] == "NULL"
350
+ output = nil
351
+ elsif ENV["VEEWEE_LOG"]
352
+ output = ENV["VEEWEE_LOG"]
353
+ else
354
+ output = nil #log_path.join("#{Time.now.to_i}.log")
355
+ end
356
+
357
+ # Create the logger and custom formatter
358
+ @logger = ::Logger.new(output)
359
+ @logger.formatter = Proc.new do |severity, datetime, progname, msg|
360
+ "#{datetime} - #{progname} - [#{resource}] #{msg}\n"
361
+ end
362
+
363
+ @logger
364
+ end
365
+
366
+ end #Class
367
+ end #Module
@@ -0,0 +1,20 @@
1
+ module Veewee
2
+ class Error < StandardError
3
+ attr_reader :orginal
4
+ def initialize(msg, original=$!)
5
+ super(msg)
6
+ @original = original; end
7
+ end
8
+ end
9
+
10
+ #Usage (from the exceptional ruby book)
11
+ #begin
12
+ # begin
13
+ # raise "Error A"
14
+ # rescue => error
15
+ # raise MyError, "Error B"
16
+ # end
17
+ #rescue => error
18
+ # env.ui.info "Current failure: #{error.inspect}"
19
+ # env.ui.info "Original failure: #{error.original.inspect}"
20
+ #end
@@ -0,0 +1,30 @@
1
+ en:
2
+ veewee:
3
+ general:
4
+ creating_home_dir: "Creating home directory since it doesn't exist: %{directory}"
5
+ moving_home_dir: "Moving old Vagrant home directory to new location: %{directory}"
6
+ home_dir_migration_failed: |-
7
+ Both an old and new Vagrant home directory exist. Only the new one will
8
+ be used. Please merge the old directory into the new directory if you'd
9
+ like to use the old data as well.
10
+
11
+ Old: %{old}
12
+ New: %{new}
13
+
14
+ #-------------------------------------------------------------------------------
15
+ # Translations for exception classes
16
+ #-------------------------------------------------------------------------------
17
+ errors:
18
+ base_vm_not_found: The base VM with the name '%{name}' was not found.
19
+ box_not_found: Box '%{name}' could not be found.
20
+ chef_not_detected: |-
21
+ The chef (either `chef-solo` or `chef-client`) binary was not found on
22
+ the VM and is required for chef provisioning. Please verify that chef
23
+ is installed and that the binary is available on the PATH.
24
+
25
+
26
+ #-------------------------------------------------------------------------------
27
+ # Translations for config validation errors
28
+ #-------------------------------------------------------------------------------
29
+ config:
30
+
@@ -0,0 +1,83 @@
1
+ module Veewee
2
+
3
+ # Vagrant UIs handle communication with the outside world (typically
4
+ # through a shell). They must respond to the typically logger methods
5
+ # of `warn`, `error`, `info`, and `confirm`.
6
+ class UI
7
+ attr_accessor :env
8
+
9
+ def initialize(env)
10
+ @env = env
11
+ end
12
+
13
+ [:warn, :error, :info, :confirm].each do |method|
14
+ define_method(method) do |message|
15
+ # Log normal console messages
16
+ env.logger.info("ui") { message }
17
+ end
18
+ end
19
+
20
+ [:clear_line, :report_progress, :ask, :no?, :yes?].each do |method|
21
+ # By default do nothing, these aren't logged
22
+ define_method(method) { |*args| }
23
+ end
24
+
25
+ # A shell UI, which uses a `Thor::Shell` object to talk with
26
+ # a terminal.
27
+ class Shell < UI
28
+ def initialize(env, shell)
29
+ super(env)
30
+
31
+ @shell = shell
32
+ end
33
+
34
+ [[:warn, :yellow], [:error, :red], [:info, nil], [:confirm, :green]].each do |method, color|
35
+ class_eval <<-CODE
36
+ def #{method}(message, opts=nil)
37
+ super(message)
38
+ opts ||= {}
39
+ opts[:new_line] = true if !opts.has_key?(:new_line)
40
+ @shell.say("\#{format_message(message, opts)}", #{color.inspect}, opts[:new_line])
41
+ end
42
+ CODE
43
+ end
44
+
45
+ [:ask, :no?, :yes?].each do |method|
46
+ class_eval <<-CODE
47
+ def #{method}(message, opts=nil)
48
+ super(message)
49
+ opts ||= {}
50
+ @shell.send(#{method.inspect}, format_message(message, opts), opts[:color])
51
+ end
52
+ CODE
53
+ end
54
+
55
+ def report_progress(progress, total, show_parts=true)
56
+ percent = (progress.to_f / total.to_f) * 100
57
+ line = "Progress: #{percent.to_i}%"
58
+ line << " (#{progress} / #{total})" if show_parts
59
+
60
+ @shell.say(line, nil, false)
61
+ end
62
+
63
+ def clear_line
64
+ @shell.say(line_reset, nil, false)
65
+ end
66
+
67
+ protected
68
+
69
+ def format_message(message, opts=nil)
70
+ opts = { :prefix => true }.merge(opts || {})
71
+ opts[:prefix]=false if env.resource=="veewee"
72
+ message = "[#{env.resource}] #{message}" if opts[:prefix]
73
+ message
74
+ end
75
+
76
+ def line_reset
77
+ reset = "\r"
78
+ reset += "\e[0K" unless Util::Platform.windows?
79
+ reset
80
+ end
81
+ end
82
+ end
83
+ end