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,25 @@
1
+ ##Note: this is currently not used anymore, it seems no one is using it
2
+
3
+ module Veewee
4
+ class Transaction
5
+
6
+ def transaction(name,params, &block)
7
+ end
8
+
9
+ def transaction2(name,options= { :checksum => "nochecksum"}, &block)
10
+ if snapshot_exists(@vmname,name+"-"+options[:checksum])
11
+ load_snapshot_vmachine(@vmname,name+"-"+options[:checksum])
12
+ else
13
+ if snapshot_version_exists(@vmname,name)
14
+ rollback_snapshot(@vmname,name)
15
+ #rollback to snapshot prior to this one
16
+ end
17
+ yield
18
+ create_snapshot_vmachine(@vmname,name+"-"+options[:checksum])
19
+ end
20
+ #end
21
+ end
22
+
23
+
24
+ end
25
+ end
@@ -0,0 +1,46 @@
1
+ #require 'net/ssh/multi'
2
+
3
+ module Veewee
4
+ module Builder
5
+ module Core
6
+ module BuilderCommand
7
+
8
+
9
+ def ssh_tunnel_start(forwardings)
10
+ #ssh_options={ :keys => [ vm.private_key ], :paranoid => false, :keys_only => true}
11
+
12
+ ssh_options={ :paranoid => false}
13
+ host=@connection.uri.host
14
+ user=@connection.uri.user
15
+
16
+ env.ui.info "Enabling tunneling"
17
+ @forward_threads=Array.new
18
+ @forward_threads<< Thread.new {
19
+ Net::SSH.start(host, user, ssh_options) do |ssh_session|
20
+ forwardings.each do |forwarding|
21
+ begin
22
+ env.ui.info "Forwarding remote port #{forwarding[:remote_port]} from #{box_name} to local port #{forwarding[:local_port]}"
23
+ env.ui.info host
24
+ env.ui.info user
25
+ env.ui.info ""
26
+ ssh_session.forward.local(forwarding[:local_port], "127.0.0.1",forwarding[:remote_port])
27
+ rescue Errno::EACCES
28
+ env.ui.info " Error - Access denied to forward remote port #{forwarding[:remote_port]} from #{name} to local port #{forwarding[:local_port]}"
29
+ end
30
+ end
31
+ ssh_session.loop {true}
32
+ end
33
+ }
34
+ env.ui.info @forward_threads.first.status
35
+ @forward_threads.first.run
36
+ env.ui.info @forward_threads.first.status
37
+
38
+ end
39
+
40
+ def ssh_tunnel_stop
41
+ Thread.kill(@forward_threads.first)
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,130 @@
1
+ require 'veewee/builder/core/box'
2
+ require 'veewee/builder/core/box/vnc'
3
+
4
+ module Veewee
5
+ module Builder
6
+ module Kvm
7
+ class Box < Veewee::Builder::Core::Box
8
+
9
+ include ::Veewee::Builder::Core
10
+ include ::Veewee::Builder::Kvm
11
+
12
+ include ::Veewee::Builder::Core::BoxCommand
13
+
14
+ attr_accessor :connection
15
+
16
+ def initialize(name,env)
17
+
18
+ require 'libvirt'
19
+ require 'fog'
20
+
21
+ super(name,env)
22
+
23
+ @connection=::Fog::Compute.new(:provider => "Libvirt",
24
+ :libvirt_uri => "qemu:///system",
25
+ :libvirt_ip_command => "arp -an |grep $mac|cut -d '(' -f 2 | cut -d ')' -f 1")
26
+
27
+ end
28
+
29
+ # Type on the console
30
+ def console_type(sequence,type_options={})
31
+ vnc_port=@connection.servers.all(:name => name).first.vnc_port
32
+ display_port=vnc_port.to_i - 5900
33
+ env.ui.confirm "Sending keystrokes to VNC port :#{display_port} - TCP port: #{vnc_port}"
34
+ vnc_type(sequence,"localhost",display_port)
35
+ end
36
+
37
+
38
+ # Create a new vm
39
+ def create(definition)
40
+ # Assemble the Virtualmachine and set all the memory and other stuff"
41
+
42
+ #memory_size,cpu_count, volume_size
43
+
44
+ s=@connection.servers.create(
45
+ :name => name,
46
+ :memory_size => definition.memory_size.to_i*1024,
47
+ :cpus => definition.cpu_count.to_i,
48
+ :volume_capacity => "#{definition.disk_size}M",
49
+ :network_interface_type => "nat",
50
+ :iso_file => definition.iso_file,
51
+ :arch => definition.os_type_id.end_with?("_64") ? "x86_64" : "i686",
52
+ :iso_dir => env.config.veewee.iso_dir
53
+ )
54
+ end
55
+
56
+ # Create the volume of a new vm
57
+ def create_volume
58
+ # Creating the volume is part of the server creation
59
+ end
60
+
61
+ # Destroy a vm
62
+ def destroy
63
+ if @connection.servers.all(:name => name).nil?
64
+ env.ui.error "Error:: You tried to destroy a non-existing box '#{name}'"
65
+ exit -1
66
+ end
67
+
68
+ halt if running?
69
+ destroy_vm if exists_vm?
70
+
71
+ vol_exists=!@connection.volumes.all(:name => "#{name}.img").nil?
72
+ env.logger.info "Volume exists? : #{vol_exists}"
73
+ destroy_volume if exists_volume?
74
+ end
75
+
76
+ def destroy_vm
77
+ matched_servers=@connection.servers.all(:name => name)
78
+ matched_servers.first.destroy() unless matched_servers.nil?
79
+ end
80
+
81
+ def destroy_volume
82
+ vol=@connection.volumes.all(:name => "#{name}.img").first
83
+ vol.destroy
84
+ end
85
+
86
+ def start(mode)
87
+ matched_servers=@connection.servers.all(:name => name)
88
+ matched_servers.first.start unless matched_servers.nil?
89
+ end
90
+
91
+ def halt
92
+ matched_servers=@connection.servers.all(:name => name)
93
+ matched_servers.first.halt unless matched_servers.nil?
94
+ end
95
+
96
+ def stop
97
+ matched_servers=@connection.servers.all(:name => name)
98
+ matched_servers.first.stop unless matched_servers.nil?
99
+ end
100
+
101
+ def ip_address
102
+ ip=@connection.servers.all(:name => "#{name}").first.addresses[:public]
103
+ return ip.first unless ip.nil?
104
+ return ip
105
+ end
106
+
107
+ def running?
108
+ if exists_vm?
109
+ @connection.servers.all(:name => name).first.ready?
110
+ else
111
+ false
112
+ end
113
+ end
114
+
115
+ def exists?
116
+ exists_volume? || exists_vm?
117
+ end
118
+
119
+ def exists_volume?
120
+ !@connection.volumes.all(:name => "#{name}.img").nil?
121
+ end
122
+
123
+ def exists_vm?
124
+ !@connection.servers.all(:name => name).nil?
125
+ end
126
+
127
+ end # End Class
128
+ end # End Module
129
+ end # End Module
130
+ end # End Module
@@ -0,0 +1,38 @@
1
+ require 'veewee/builder/core/builder'
2
+
3
+ module Veewee
4
+ module Builder
5
+ module Kvm
6
+ class Builder < Veewee::Builder::Core::Builder
7
+
8
+ # Translate the definition ssh options to ssh options that can be passed to Net::Ssh calls
9
+ # We expect plain ssh for a connection
10
+
11
+ def check_requirements
12
+ ["ruby-libvirt","fog"].each do |gemname|
13
+ unless gem_available?(gemname)
14
+ raise Veewee::Error,"The kvm Builder requires the gem '#{gemname}' to be installed\n" + "gem install #{gemname}"
15
+ end
16
+ end
17
+ end
18
+
19
+ def ssh_options(definition)
20
+ ssh_options={
21
+ :user => definition.ssh_user,
22
+ :port => 22,
23
+ :password => definition.ssh_password,
24
+ :timeout => definition.ssh_login_timeout.to_i
25
+ }
26
+ return ssh_options
27
+ end
28
+
29
+ def build(definition_name,box_name,options)
30
+
31
+ super(definition_name,box_name,options)
32
+
33
+ end
34
+
35
+ end #End Class
36
+ end # End Module
37
+ end # End Module
38
+ end # End Module
@@ -0,0 +1,121 @@
1
+ require 'veewee/builder/core/box'
2
+
3
+ require 'veewee/builder/virtualbox/helper/create'
4
+ require 'veewee/builder/virtualbox/helper/console_type'
5
+ require 'veewee/builder/virtualbox/helper/destroy'
6
+
7
+ module Veewee
8
+ module Builder
9
+ module Virtualbox
10
+ class Box < Veewee::Builder::Core::Box
11
+
12
+ include ::Veewee::Builder::Virtualbox::BoxHelper
13
+
14
+ def initialize(name,env)
15
+
16
+ require 'virtualbox'
17
+ @vboxcmd=determine_vboxcmd
18
+ super(name,env)
19
+
20
+ end
21
+
22
+ def determine_vboxcmd
23
+ return "VBoxManage"
24
+ end
25
+
26
+ def exists?
27
+ vm=VirtualBox::VM.find(name)
28
+ env.logger.info ("Vm exists? #{!vm.nil?}")
29
+ return !vm.nil?
30
+ end
31
+
32
+ def running?
33
+ return
34
+ end
35
+
36
+ def create(definition)
37
+
38
+ guessed_port=guess_free_port(definition.ssh_host_port.to_i,definition.ssh_host_port.to_i+40).to_s
39
+ if guessed_port.to_s!=definition.ssh_host_port
40
+ env.ui.warn "Changing ssh port from #{definition.ssh_host_port} to #{guessed_port}"
41
+ definition.ssh_host_port=guessed_port.to_s
42
+ end
43
+
44
+ #Suppress those annoying virtualbox messages
45
+ suppress_messages
46
+
47
+ create_vm(definition)
48
+
49
+ # Adds a folder to the vm for testing purposes
50
+ add_shared_folder(definition)
51
+
52
+ #Create a disk with the same name as the box_name
53
+ create_disk(definition)
54
+
55
+ add_ide_controller(definition)
56
+ attach_isofile(definition)
57
+
58
+ add_sata_controller(definition)
59
+ attach_disk(definition)
60
+
61
+ create_floppy(definition)
62
+ add_floppy_controller(definition)
63
+ attach_floppy(definition)
64
+
65
+ add_ssh_nat_mapping(definition)
66
+
67
+ end
68
+
69
+ def start(gui_enabled=true)
70
+ # Once assembled we start the machine
71
+ env.logger.info "Started the VM with GUI Enabled? #{gui_enabled}"
72
+ if (gui_enabled)
73
+ raw.start("gui")
74
+ else
75
+ raw.start("vrdp")
76
+ end
77
+ end
78
+
79
+ def stop
80
+ # If the vm is not powered off, perform a shutdown
81
+ if (!raw.nil? && !(raw.powered_off?))
82
+ env.ui.info "Shutting down vm #{name}"
83
+ #We force it here, maybe vm.shutdown is cleaner
84
+ begin
85
+ raw.stop
86
+ sleep 3
87
+ rescue VirtualBox::Exceptions::InvalidVMStateException
88
+ env.ui.error "There was problem sending the stop command because the machine is in an Invalid state"
89
+ env.ui.error "Please verify leftovers from a previous build in your vm folder"
90
+ exit -1
91
+ end
92
+ end
93
+
94
+ end
95
+
96
+ def halt
97
+ if (!raw.nil? && !(raw.powered_off?))
98
+ env.ui.info "Halting vm #{name}"
99
+ #We force it here, maybe vm.shutdown is cleaner
100
+ # VBoxManage controlvm 'lucid64' poweroff
101
+ begin
102
+ raw.halt
103
+ rescue VirtualBox::Exceptions::InvalidVMStateException
104
+ env.ui.error "There was problem sending the stop command because the machine is in an Invalid state"
105
+ env.ui.error "Please verify leftovers from a previous build in your vm folder"
106
+ exit -1
107
+ end
108
+ sleep 3
109
+ end
110
+ end
111
+
112
+ # Get the IP address of the box
113
+ def ip_address
114
+ return "127.0.0.1"
115
+ end
116
+
117
+
118
+ end # End Class
119
+ end # End Module
120
+ end # End Module
121
+ end # End Module
@@ -0,0 +1,48 @@
1
+ require 'veewee/builder/core/builder'
2
+ require 'veewee/builder/virtualbox/helper/export_vagrant'
3
+ require 'veewee/builder/virtualbox/helper/validate_vagrant'
4
+
5
+ module Veewee
6
+ module Builder
7
+ module Virtualbox
8
+ class Builder < Veewee::Builder::Core::Builder
9
+
10
+ include ::Veewee::Builder::Virtualbox::BuilderHelper
11
+
12
+ def check_requirements
13
+ unless gem_available?("virtualbox")
14
+ raise Veewee::Error,"The Virtualbox Builder requires the gem 'virtualbox' to be installed"
15
+ end
16
+ end
17
+
18
+ def ssh_options(definition)
19
+
20
+ ssh_options={
21
+ :user => definition.ssh_user,
22
+ :port => definition.ssh_host_port,
23
+ :password => definition.ssh_password,
24
+ :timeout => definition.ssh_login_timeout.to_i
25
+ }
26
+ return ssh_options
27
+
28
+ end
29
+
30
+ def build_info
31
+ info=super
32
+ info << { :filename => ".vbox_version",
33
+ :content => "#{VirtualBox::Global.global.lib.virtualbox.version.split('_')[0]}" }
34
+ end
35
+
36
+ def build(definition_name,box_name,options)
37
+
38
+ super(definition_name,box_name,options)
39
+
40
+ # w00t, we have succesfully reach this point
41
+ # so we let user know , the vm is ready to be exported
42
+
43
+ end
44
+
45
+ end #End Class
46
+ end # End Module
47
+ end # End Module
48
+ end # End Module
@@ -0,0 +1,105 @@
1
+ ##Note: this is currently not used anymore, it seems no one is using it
2
+
3
+ require 'veewee/util/shell'
4
+ require 'veewee/util/tcp'
5
+
6
+ module Veewee
7
+ module Builder
8
+ module Virtualbox
9
+
10
+ def remove_snapshot_vmachine(vmname,snapname)
11
+ Veewee::Shell.execute("#{@vboxcmd} snapshot '#{vmname}' delete '#{snapname}'")
12
+ end
13
+
14
+ def create_snapshot_vmachine(vmname,snapname)
15
+ Veewee::Shell.execute("#{@vboxcmd} snapshot '#{vmname}' take '#{snapname}'")
16
+ end
17
+
18
+ def load_snapshot_vmachine(vmname,snapname)
19
+ #if it running , shutdown first
20
+ if (state_vmachine(vmname)=="running")
21
+ stop_vmachine(vmname)
22
+ end
23
+
24
+ Veewee::Shell.execute("#{@vboxcmd} snapshot '#{vmname}' restore '#{snapname}'")
25
+ #sometimes it takes some time to shutdown
26
+ sleep 2
27
+ Veewee::Shell.execute("#{@vboxcmd} startvm '#{vmname}'")
28
+ end
29
+
30
+ def snapshot_exists(vmname,snapname)
31
+ list_snapshots(vmname).each { |name|
32
+ if (name==snapname) then
33
+ return true
34
+ end
35
+ }
36
+ return false
37
+ end
38
+
39
+ def snapshot_version_exists(vmname,snapname)
40
+ list_snapshots(vmname).each { |name|
41
+ if name.match(/^#{snapname}-/) then
42
+ return true
43
+ end
44
+ }
45
+ return false
46
+ end
47
+
48
+ def self.rollback_snapshot(vmname,snapname)
49
+ delete_flag=false
50
+ @vboxcmd=Veewee::Environment.determine_vboxcmd
51
+
52
+ savestate_recover=false
53
+ if (state_vmachine(vmname)=="running")
54
+ Veewee::Shell.execute("#{@vboxcmd} controlvm '#{vmname}' savestate")
55
+ savestate_recover=true
56
+ end
57
+
58
+ list_snapshots(vmname).each { |name|
59
+ if name.match(/^#{snapname}-/) then
60
+ delete_flag=true
61
+ end
62
+ if (delete_flag) then
63
+ remove_snapshot_vmachine(vmname,name)
64
+ sleep 1
65
+ end
66
+ }
67
+
68
+
69
+ sleep 2
70
+
71
+ Veewee::Shell.execute("#{@vboxcmd} startvm '#{vmname}'")
72
+
73
+ if (savestate_recover)
74
+ #Recovering from savestate nukes the network! This trick seem to work
75
+ #Also within the vm /etc/init.d/networking restart , but that is OS specific
76
+ #http://www.virtualbox.org/ticket/5666
77
+ #http://www.virtualbox.org/ticket/5654
78
+ #This is supposed to be fixed: http://www.virtualbox.org/changeset/25205 but alas
79
+ Veewee::Shell.execute("#{@vboxcmd} controlvm '#{vmname}' nic1 nat")
80
+ Veewee::Shell.execute("#{@vboxcmd} controlvm '#{vmname}' setlinkstate1 off")
81
+ Veewee::Shell.execute("#{@vboxcmd} controlvm '#{vmname}' setlinkstate1 on")
82
+ sleep 2
83
+
84
+ #hmmm, virtualbox => when recovering from a restore , it looses the nat settings!!! So we need to do this again!!
85
+ #thebox.ssh_enable_vmachine({:hostport => host_port , :guestport => 22} )
86
+ #http://www.virtualbox.org/changeset/25402
87
+ #[25402]: NAT: re-establish port-forwarding after savestate / restore state
88
+
89
+ end
90
+
91
+ end
92
+
93
+
94
+ def self.list_snapshots(vmname)
95
+ @vboxcmd=Veewee::Environment.determine_vboxcmd
96
+
97
+ snapshotresult=Veewee::Shell.execute("#{@vboxcmd} showvminfo --machinereadable '#{vmname}' |grep ^SnapshotName| cut -d '=' -f 2").stdout
98
+ snapshotlist=snapshotresult.gsub(/\"/,'').split(/\n/)
99
+ return snapshotlist
100
+ end
101
+
102
+ end #Module
103
+ end #Module
104
+ end #Module
105
+