bbrowning-virtualbox 0.7.6.dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. data/.gitignore +8 -0
  2. data/.yardopts +3 -0
  3. data/Gemfile +16 -0
  4. data/LICENSE +19 -0
  5. data/Rakefile +33 -0
  6. data/Readme.md +70 -0
  7. data/docs/GettingStarted.md +196 -0
  8. data/docs/WhatsNew.md +12 -0
  9. data/features/README.md +33 -0
  10. data/features/global.feature +19 -0
  11. data/features/global_extra_data.feature +27 -0
  12. data/features/step_definitions/abstract_model_steps.rb +39 -0
  13. data/features/step_definitions/extra_data_steps.rb +36 -0
  14. data/features/step_definitions/global_steps.rb +29 -0
  15. data/features/step_definitions/nat_engine_steps.rb +76 -0
  16. data/features/step_definitions/network_adapter_steps.rb +38 -0
  17. data/features/step_definitions/shared_folder_steps.rb +76 -0
  18. data/features/step_definitions/snapshot_steps.rb +74 -0
  19. data/features/step_definitions/storage_controller_steps.rb +16 -0
  20. data/features/step_definitions/virtualbox_steps.rb +17 -0
  21. data/features/step_definitions/vm_steps.rb +50 -0
  22. data/features/support/env.rb +61 -0
  23. data/features/support/helpers.rb +38 -0
  24. data/features/support/hooks.rb +30 -0
  25. data/features/support/ordered_hash.rb +49 -0
  26. data/features/support/vboxmanage.rb +191 -0
  27. data/features/version.feature +16 -0
  28. data/features/vm.feature +13 -0
  29. data/features/vm_bios.feature +29 -0
  30. data/features/vm_cpu.feature +29 -0
  31. data/features/vm_extra_data.feature +35 -0
  32. data/features/vm_hw_virt.feature +29 -0
  33. data/features/vm_nat_engine.feature +57 -0
  34. data/features/vm_network_adapters.feature +27 -0
  35. data/features/vm_shared_folders.feature +42 -0
  36. data/features/vm_snapshots.feature +29 -0
  37. data/features/vm_storage_controllers.feature +11 -0
  38. data/lib/virtualbox.rb +11 -0
  39. data/lib/virtualbox/abstract_model.rb +281 -0
  40. data/lib/virtualbox/abstract_model/attributable.rb +290 -0
  41. data/lib/virtualbox/abstract_model/dirty.rb +177 -0
  42. data/lib/virtualbox/abstract_model/interface_attributes.rb +98 -0
  43. data/lib/virtualbox/abstract_model/relatable.rb +332 -0
  44. data/lib/virtualbox/abstract_model/validatable.rb +167 -0
  45. data/lib/virtualbox/abstract_model/version_matcher.rb +35 -0
  46. data/lib/virtualbox/appliance.rb +62 -0
  47. data/lib/virtualbox/audio_adapter.rb +52 -0
  48. data/lib/virtualbox/bios.rb +50 -0
  49. data/lib/virtualbox/com.rb +23 -0
  50. data/lib/virtualbox/com/abstract_enum.rb +43 -0
  51. data/lib/virtualbox/com/abstract_implementer.rb +45 -0
  52. data/lib/virtualbox/com/abstract_interface.rb +167 -0
  53. data/lib/virtualbox/com/base_interface.rb +38 -0
  54. data/lib/virtualbox/com/ffi/interface.rb +150 -0
  55. data/lib/virtualbox/com/ffi/interfaces.rb +54 -0
  56. data/lib/virtualbox/com/ffi/util.rb +119 -0
  57. data/lib/virtualbox/com/ffi/vboxxpcomc.rb +31 -0
  58. data/lib/virtualbox/com/ffi_interface.rb +96 -0
  59. data/lib/virtualbox/com/implementer/base.rb +59 -0
  60. data/lib/virtualbox/com/implementer/ffi.rb +361 -0
  61. data/lib/virtualbox/com/implementer/mscom.rb +175 -0
  62. data/lib/virtualbox/com/implementer/nil.rb +10 -0
  63. data/lib/virtualbox/com/interface/3.1.x/access_mode.rb +11 -0
  64. data/lib/virtualbox/com/interface/3.1.x/appliance.rb +22 -0
  65. data/lib/virtualbox/com/interface/3.1.x/audio_adapter.rb +15 -0
  66. data/lib/virtualbox/com/interface/3.1.x/audio_controller_type.rb +11 -0
  67. data/lib/virtualbox/com/interface/3.1.x/audio_driver_type.rb +11 -0
  68. data/lib/virtualbox/com/interface/3.1.x/bios_boot_menu_mode.rb +11 -0
  69. data/lib/virtualbox/com/interface/3.1.x/bios_settings.rb +21 -0
  70. data/lib/virtualbox/com/interface/3.1.x/clipboard_mode.rb +11 -0
  71. data/lib/virtualbox/com/interface/3.1.x/console.rb +50 -0
  72. data/lib/virtualbox/com/interface/3.1.x/cpu_property_type.rb +11 -0
  73. data/lib/virtualbox/com/interface/3.1.x/device_type.rb +11 -0
  74. data/lib/virtualbox/com/interface/3.1.x/dhcp_server.rb +22 -0
  75. data/lib/virtualbox/com/interface/3.1.x/firmware_type.rb +11 -0
  76. data/lib/virtualbox/com/interface/3.1.x/guest_os_type.rb +23 -0
  77. data/lib/virtualbox/com/interface/3.1.x/host.rb +42 -0
  78. data/lib/virtualbox/com/interface/3.1.x/host_network_interface.rb +30 -0
  79. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_medium_type.rb +11 -0
  80. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_status.rb +11 -0
  81. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_type.rb +11 -0
  82. data/lib/virtualbox/com/interface/3.1.x/host_usb_device.rb +13 -0
  83. data/lib/virtualbox/com/interface/3.1.x/host_usb_device_filter.rb +13 -0
  84. data/lib/virtualbox/com/interface/3.1.x/hw_virt_ex_property_type.rb +11 -0
  85. data/lib/virtualbox/com/interface/3.1.x/machine.rb +105 -0
  86. data/lib/virtualbox/com/interface/3.1.x/machine_state.rb +14 -0
  87. data/lib/virtualbox/com/interface/3.1.x/medium.rb +50 -0
  88. data/lib/virtualbox/com/interface/3.1.x/medium_attachment.rb +18 -0
  89. data/lib/virtualbox/com/interface/3.1.x/medium_format.rb +18 -0
  90. data/lib/virtualbox/com/interface/3.1.x/medium_state.rb +11 -0
  91. data/lib/virtualbox/com/interface/3.1.x/medium_type.rb +11 -0
  92. data/lib/virtualbox/com/interface/3.1.x/medium_variant.rb +11 -0
  93. data/lib/virtualbox/com/interface/3.1.x/network_adapter.rb +30 -0
  94. data/lib/virtualbox/com/interface/3.1.x/network_adapter_type.rb +11 -0
  95. data/lib/virtualbox/com/interface/3.1.x/network_attachment_type.rb +11 -0
  96. data/lib/virtualbox/com/interface/3.1.x/nsiexception.rb +23 -0
  97. data/lib/virtualbox/com/interface/3.1.x/nsisupports.rb +15 -0
  98. data/lib/virtualbox/com/interface/3.1.x/parallel_port.rb +17 -0
  99. data/lib/virtualbox/com/interface/3.1.x/port_mode.rb +11 -0
  100. data/lib/virtualbox/com/interface/3.1.x/progress.rb +63 -0
  101. data/lib/virtualbox/com/interface/3.1.x/serial_port.rb +19 -0
  102. data/lib/virtualbox/com/interface/3.1.x/session.rb +18 -0
  103. data/lib/virtualbox/com/interface/3.1.x/session_state.rb +11 -0
  104. data/lib/virtualbox/com/interface/3.1.x/session_type.rb +11 -0
  105. data/lib/virtualbox/com/interface/3.1.x/shared_folder.rb +17 -0
  106. data/lib/virtualbox/com/interface/3.1.x/snapshot.rb +20 -0
  107. data/lib/virtualbox/com/interface/3.1.x/storage_bus.rb +11 -0
  108. data/lib/virtualbox/com/interface/3.1.x/storage_controller.rb +23 -0
  109. data/lib/virtualbox/com/interface/3.1.x/storage_controller_type.rb +11 -0
  110. data/lib/virtualbox/com/interface/3.1.x/system_properties.rb +37 -0
  111. data/lib/virtualbox/com/interface/3.1.x/usb_controller.rb +20 -0
  112. data/lib/virtualbox/com/interface/3.1.x/usb_device.rb +24 -0
  113. data/lib/virtualbox/com/interface/3.1.x/usb_device_filter.rb +23 -0
  114. data/lib/virtualbox/com/interface/3.1.x/usb_device_filter_action.rb +11 -0
  115. data/lib/virtualbox/com/interface/3.1.x/usb_device_state.rb +11 -0
  116. data/lib/virtualbox/com/interface/3.1.x/virtual_box_error_info.rb +17 -0
  117. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description.rb +19 -0
  118. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_type.rb +14 -0
  119. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_value_type.rb +11 -0
  120. data/lib/virtualbox/com/interface/3.1.x/virtualbox.rb +67 -0
  121. data/lib/virtualbox/com/interface/3.1.x/vrdp_auth_type.rb +11 -0
  122. data/lib/virtualbox/com/interface/3.1.x/vrdp_server.rb +19 -0
  123. data/lib/virtualbox/com/interface/3.2.x/access_mode.rb +11 -0
  124. data/lib/virtualbox/com/interface/3.2.x/appliance.rb +22 -0
  125. data/lib/virtualbox/com/interface/3.2.x/audio_adapter.rb +15 -0
  126. data/lib/virtualbox/com/interface/3.2.x/audio_controller_type.rb +11 -0
  127. data/lib/virtualbox/com/interface/3.2.x/audio_driver_type.rb +11 -0
  128. data/lib/virtualbox/com/interface/3.2.x/bios_boot_menu_mode.rb +11 -0
  129. data/lib/virtualbox/com/interface/3.2.x/bios_settings.rb +21 -0
  130. data/lib/virtualbox/com/interface/3.2.x/clipboard_mode.rb +11 -0
  131. data/lib/virtualbox/com/interface/3.2.x/console.rb +50 -0
  132. data/lib/virtualbox/com/interface/3.2.x/cpu_property_type.rb +11 -0
  133. data/lib/virtualbox/com/interface/3.2.x/device_type.rb +11 -0
  134. data/lib/virtualbox/com/interface/3.2.x/dhcp_server.rb +22 -0
  135. data/lib/virtualbox/com/interface/3.2.x/firmware_type.rb +11 -0
  136. data/lib/virtualbox/com/interface/3.2.x/guest.rb +13 -0
  137. data/lib/virtualbox/com/interface/3.2.x/guest_os_type.rb +33 -0
  138. data/lib/virtualbox/com/interface/3.2.x/host.rb +43 -0
  139. data/lib/virtualbox/com/interface/3.2.x/host_network_interface.rb +30 -0
  140. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_medium_type.rb +11 -0
  141. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_status.rb +11 -0
  142. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_type.rb +11 -0
  143. data/lib/virtualbox/com/interface/3.2.x/host_usb_device.rb +13 -0
  144. data/lib/virtualbox/com/interface/3.2.x/host_usb_device_filter.rb +13 -0
  145. data/lib/virtualbox/com/interface/3.2.x/hw_virt_ex_property_type.rb +11 -0
  146. data/lib/virtualbox/com/interface/3.2.x/keyboard_hid_type.rb +11 -0
  147. data/lib/virtualbox/com/interface/3.2.x/machine.rb +118 -0
  148. data/lib/virtualbox/com/interface/3.2.x/machine_state.rb +14 -0
  149. data/lib/virtualbox/com/interface/3.2.x/medium.rb +51 -0
  150. data/lib/virtualbox/com/interface/3.2.x/medium_attachment.rb +18 -0
  151. data/lib/virtualbox/com/interface/3.2.x/medium_format.rb +18 -0
  152. data/lib/virtualbox/com/interface/3.2.x/medium_state.rb +11 -0
  153. data/lib/virtualbox/com/interface/3.2.x/medium_type.rb +11 -0
  154. data/lib/virtualbox/com/interface/3.2.x/medium_variant.rb +11 -0
  155. data/lib/virtualbox/com/interface/3.2.x/nat_alias_mode.rb +11 -0
  156. data/lib/virtualbox/com/interface/3.2.x/nat_engine.rb +27 -0
  157. data/lib/virtualbox/com/interface/3.2.x/nat_protocol.rb +11 -0
  158. data/lib/virtualbox/com/interface/3.2.x/network_adapter.rb +34 -0
  159. data/lib/virtualbox/com/interface/3.2.x/network_adapter_type.rb +11 -0
  160. data/lib/virtualbox/com/interface/3.2.x/network_attachment_type.rb +11 -0
  161. data/lib/virtualbox/com/interface/3.2.x/nsiexception.rb +23 -0
  162. data/lib/virtualbox/com/interface/3.2.x/nsisupports.rb +15 -0
  163. data/lib/virtualbox/com/interface/3.2.x/parallel_port.rb +17 -0
  164. data/lib/virtualbox/com/interface/3.2.x/pointing_hid_type.rb +11 -0
  165. data/lib/virtualbox/com/interface/3.2.x/port_mode.rb +11 -0
  166. data/lib/virtualbox/com/interface/3.2.x/progress.rb +63 -0
  167. data/lib/virtualbox/com/interface/3.2.x/serial_port.rb +19 -0
  168. data/lib/virtualbox/com/interface/3.2.x/session.rb +18 -0
  169. data/lib/virtualbox/com/interface/3.2.x/session_state.rb +11 -0
  170. data/lib/virtualbox/com/interface/3.2.x/session_type.rb +11 -0
  171. data/lib/virtualbox/com/interface/3.2.x/shared_folder.rb +17 -0
  172. data/lib/virtualbox/com/interface/3.2.x/snapshot.rb +20 -0
  173. data/lib/virtualbox/com/interface/3.2.x/storage_bus.rb +11 -0
  174. data/lib/virtualbox/com/interface/3.2.x/storage_controller.rb +24 -0
  175. data/lib/virtualbox/com/interface/3.2.x/storage_controller_type.rb +11 -0
  176. data/lib/virtualbox/com/interface/3.2.x/system_properties.rb +42 -0
  177. data/lib/virtualbox/com/interface/3.2.x/usb_controller.rb +21 -0
  178. data/lib/virtualbox/com/interface/3.2.x/usb_device.rb +24 -0
  179. data/lib/virtualbox/com/interface/3.2.x/usb_device_filter.rb +23 -0
  180. data/lib/virtualbox/com/interface/3.2.x/usb_device_filter_action.rb +11 -0
  181. data/lib/virtualbox/com/interface/3.2.x/usb_device_state.rb +11 -0
  182. data/lib/virtualbox/com/interface/3.2.x/virtual_box_error_info.rb +17 -0
  183. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description.rb +19 -0
  184. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_type.rb +14 -0
  185. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_value_type.rb +11 -0
  186. data/lib/virtualbox/com/interface/3.2.x/virtualbox.rb +67 -0
  187. data/lib/virtualbox/com/interface/3.2.x/vrdp_auth_type.rb +11 -0
  188. data/lib/virtualbox/com/interface/3.2.x/vrdp_server.rb +21 -0
  189. data/lib/virtualbox/com/mscom_interface.rb +44 -0
  190. data/lib/virtualbox/com/nil_interface.rb +7 -0
  191. data/lib/virtualbox/com/util.rb +32 -0
  192. data/lib/virtualbox/cpu.rb +61 -0
  193. data/lib/virtualbox/dhcp_server.rb +89 -0
  194. data/lib/virtualbox/dvd.rb +27 -0
  195. data/lib/virtualbox/exceptions.rb +39 -0
  196. data/lib/virtualbox/ext/byte_normalizer.rb +17 -0
  197. data/lib/virtualbox/ext/glob_loader.rb +22 -0
  198. data/lib/virtualbox/ext/logger.rb +38 -0
  199. data/lib/virtualbox/ext/platform.rb +27 -0
  200. data/lib/virtualbox/ext/subclass_listing.rb +24 -0
  201. data/lib/virtualbox/extra_data.rb +127 -0
  202. data/lib/virtualbox/forwarded_port.rb +222 -0
  203. data/lib/virtualbox/global.rb +102 -0
  204. data/lib/virtualbox/guest_property.rb +116 -0
  205. data/lib/virtualbox/hard_drive.rb +246 -0
  206. data/lib/virtualbox/host.rb +71 -0
  207. data/lib/virtualbox/host_network_interface.rb +137 -0
  208. data/lib/virtualbox/hw_virtualization.rb +63 -0
  209. data/lib/virtualbox/lib.rb +84 -0
  210. data/lib/virtualbox/media.rb +20 -0
  211. data/lib/virtualbox/medium.rb +145 -0
  212. data/lib/virtualbox/medium_attachment.rb +61 -0
  213. data/lib/virtualbox/nat_engine.rb +71 -0
  214. data/lib/virtualbox/nat_forwarded_port.rb +171 -0
  215. data/lib/virtualbox/network_adapter.rb +166 -0
  216. data/lib/virtualbox/proxies/collection.rb +57 -0
  217. data/lib/virtualbox/shared_folder.rb +220 -0
  218. data/lib/virtualbox/snapshot.rb +185 -0
  219. data/lib/virtualbox/storage_controller.rb +160 -0
  220. data/lib/virtualbox/system_properties.rb +74 -0
  221. data/lib/virtualbox/usb_controller.rb +59 -0
  222. data/lib/virtualbox/usb_device_filter.rb +74 -0
  223. data/lib/virtualbox/version.rb +36 -0
  224. data/lib/virtualbox/virtual_system_description.rb +47 -0
  225. data/lib/virtualbox/vm.rb +684 -0
  226. data/lib/virtualbox/vrdp_server.rb +59 -0
  227. data/test/test_helper.rb +18 -0
  228. data/test/virtualbox/abstract_model/attributable_test.rb +269 -0
  229. data/test/virtualbox/abstract_model/dirty_test.rb +83 -0
  230. data/test/virtualbox/abstract_model/interface_attributes_test.rb +194 -0
  231. data/test/virtualbox/abstract_model/relatable_test.rb +348 -0
  232. data/test/virtualbox/abstract_model/validatable_test.rb +308 -0
  233. data/test/virtualbox/abstract_model/version_matcher_test.rb +41 -0
  234. data/test/virtualbox/abstract_model_test.rb +462 -0
  235. data/test/virtualbox/appliance_test.rb +159 -0
  236. data/test/virtualbox/audio_adapter_test.rb +83 -0
  237. data/test/virtualbox/bios_test.rb +83 -0
  238. data/test/virtualbox/com/abstract_enum_test.rb +49 -0
  239. data/test/virtualbox/com/abstract_implementer_test.rb +40 -0
  240. data/test/virtualbox/com/abstract_interface_test.rb +140 -0
  241. data/test/virtualbox/com/ffi/interface_test.rb +249 -0
  242. data/test/virtualbox/com/ffi/util_test.rb +108 -0
  243. data/test/virtualbox/com/ffi_interface_test.rb +42 -0
  244. data/test/virtualbox/com/implementer/base_test.rb +38 -0
  245. data/test/virtualbox/com/implementer/ffi_test.rb +527 -0
  246. data/test/virtualbox/com/implementer/mscom_test.rb +247 -0
  247. data/test/virtualbox/com/mscom_interface_test.rb +17 -0
  248. data/test/virtualbox/com/util_test.rb +17 -0
  249. data/test/virtualbox/cpu_test.rb +103 -0
  250. data/test/virtualbox/dhcp_server_test.rb +165 -0
  251. data/test/virtualbox/dvd_test.rb +28 -0
  252. data/test/virtualbox/ext/byte_normalizer_test.rb +34 -0
  253. data/test/virtualbox/ext/platform_test.rb +50 -0
  254. data/test/virtualbox/ext/subclass_listing_test.rb +25 -0
  255. data/test/virtualbox/extra_data_test.rb +155 -0
  256. data/test/virtualbox/forwarded_port_test.rb +286 -0
  257. data/test/virtualbox/global_test.rb +46 -0
  258. data/test/virtualbox/hard_drive_test.rb +141 -0
  259. data/test/virtualbox/host_network_interface_test.rb +254 -0
  260. data/test/virtualbox/host_test.rb +94 -0
  261. data/test/virtualbox/hw_virtualization_test.rb +103 -0
  262. data/test/virtualbox/lib_test.rb +93 -0
  263. data/test/virtualbox/medium_attachment_test.rb +147 -0
  264. data/test/virtualbox/medium_test.rb +192 -0
  265. data/test/virtualbox/nat_engine_test.rb +106 -0
  266. data/test/virtualbox/nat_forwarded_port_test.rb +222 -0
  267. data/test/virtualbox/network_adapter_test.rb +191 -0
  268. data/test/virtualbox/proxies/collection_test.rb +102 -0
  269. data/test/virtualbox/shared_folder_test.rb +219 -0
  270. data/test/virtualbox/snapshot_test.rb +231 -0
  271. data/test/virtualbox/storage_controller_test.rb +197 -0
  272. data/test/virtualbox/system_properties_test.rb +87 -0
  273. data/test/virtualbox/usb_controller_test.rb +112 -0
  274. data/test/virtualbox/usb_device_filter_test.rb +93 -0
  275. data/test/virtualbox/version_test.rb +59 -0
  276. data/test/virtualbox/virtual_system_description_test.rb +61 -0
  277. data/test/virtualbox/vm_test.rb +637 -0
  278. data/test/virtualbox/vrdp_server_test.rb +83 -0
  279. data/test/virtualbox_test.rb +11 -0
  280. data/virtualbox.gemspec +25 -0
  281. metadata +397 -0
@@ -0,0 +1,35 @@
1
+ module VirtualBox
2
+ class AbstractModel
3
+ module VersionMatcher
4
+ # Asserts that two versions match. Otherwise raises an
5
+ # exception.
6
+ def assert_version_match(req, cur)
7
+ if !version_match?(req, cur)
8
+ message = "Required version: #{req}; Current: #{cur}"
9
+ raise Exceptions::UnsupportedVersionException.new(message)
10
+ end
11
+ end
12
+
13
+ # Checks if a given version requirement matches the current
14
+ # version.
15
+ #
16
+ # @return [Boolean]
17
+ def version_match?(requirement, current)
18
+ split_version(requirement) == split_version(current)
19
+ end
20
+
21
+ # Splits a version string into a two-item array with the parts
22
+ # of the version, respectively. If the version has more than two
23
+ # parts, the rest are ignored.
24
+ #
25
+ # @param [String] version
26
+ # @return [Array]
27
+ def split_version(version)
28
+ version.split(/\./)[0,2]
29
+ rescue Exception
30
+ []
31
+ end
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,62 @@
1
+ module VirtualBox
2
+ # Represents an VirtualBox "appliance" which is an exported virtual machine or
3
+ # virtual machines. Appliances typically come with an OVF file and one or more
4
+ # compressed hard disks, and can be used to import directly into other VirtualBox
5
+ # installations. Appliances allow for virtual machine portability.
6
+ class Appliance < AbstractModel
7
+ attribute :path
8
+ attribute :interface, :readonly => true, :property => false
9
+ relationship :virtual_systems, :VirtualSystemDescription
10
+
11
+ def initialize(*args)
12
+ write_attribute(:interface, Lib.lib.virtualbox.create_appliance)
13
+
14
+ initialize_from_path(*args) if args.length == 1
15
+
16
+ clear_dirty!
17
+ end
18
+
19
+ # Initializes this Appliance instance from a path to an OVF file. This sets
20
+ # up the relationships and so on.
21
+ #
22
+ # @param [String] path Path to the OVF file.
23
+ def initialize_from_path(path)
24
+ # Read in the data from the path
25
+ interface.read(path).wait_for_completion(-1)
26
+
27
+ # Interpret the data to fill in the interface properties
28
+ interface.interpret
29
+
30
+ # Load the interface attributes
31
+ load_interface_attributes(interface)
32
+
33
+ # Fill in the virtual systems
34
+ populate_relationship(:virtual_systems, interface.virtual_system_descriptions)
35
+
36
+ # Should be an existing record
37
+ existing_record!
38
+ end
39
+
40
+ # Imports the machines associated with this appliance. If a block is given,
41
+ # it will be yielded every percent that the operation progresses. This can be
42
+ # done to check the progress of the import.
43
+ def import(&block)
44
+ interface.import_machines.wait(&block)
45
+ end
46
+
47
+ # Exports the machines to the given path. If a block is given, it will be yielded
48
+ # every percent that the operation progresses. This can be done to check the progress
49
+ # of the export in real-time.
50
+ def export(&block)
51
+ interface.write("ovf-1.0", path).wait(&block)
52
+ end
53
+
54
+ # Adds a VM to the appliance
55
+ def add_machine(vm, options = {})
56
+ sys_desc = vm.interface.export(interface)
57
+ options.each do |key, value|
58
+ sys_desc.add_description(key, value, value)
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,52 @@
1
+ module VirtualBox
2
+ class AudioAdapter < AbstractModel
3
+ attribute :parent, :readonly => true, :property => false
4
+ attribute :enabled, :boolean => true
5
+ attribute :audio_controller
6
+ attribute :audio_driver
7
+
8
+ class << self
9
+ # Populates a relationship with another model.
10
+ #
11
+ # **This method typically won't be used except internally.**
12
+ #
13
+ # @return [BIOS]
14
+ def populate_relationship(caller, imachine)
15
+ data = new(caller, imachine.audio_adapter)
16
+ end
17
+
18
+ # Saves the relationship.
19
+ #
20
+ # **This method typically won't be used except internally.**
21
+ def save_relationship(caller, instance)
22
+ instance.save
23
+ end
24
+ end
25
+
26
+ def initialize(parent, iaudio)
27
+ write_attribute(:parent, parent)
28
+
29
+ # Load the attributes and mark the whole thing as existing
30
+ load_interface_attributes(iaudio)
31
+ clear_dirty!
32
+ existing_record!
33
+ end
34
+
35
+ def validate
36
+ super
37
+
38
+ validates_inclusion_of :enabled, :in => [true, false]
39
+ validates_inclusion_of :audio_controller, :in => COM::Util.versioned_interface(:AudioControllerType).map
40
+ validates_inclusion_of :audio_driver, :in => COM::Util.versioned_interface(:AudioDriverType).map
41
+ end
42
+
43
+ def save
44
+ parent.with_open_session do |session|
45
+ machine = session.machine
46
+
47
+ # Save them
48
+ save_changed_interface_attributes(machine.audio_adapter)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,50 @@
1
+ module VirtualBox
2
+ # Represents the BIOS settings of a {VM}.
3
+ class BIOS < AbstractModel
4
+ attribute :parent, :readonly => true, :property => false
5
+ attribute :acpi_enabled, :boolean => true
6
+ attribute :io_apic_enabled, :boolean => true
7
+
8
+ class << self
9
+ # Populates a relationship with another model.
10
+ #
11
+ # **This method typically won't be used except internally.**
12
+ #
13
+ # @return [BIOS]
14
+ def populate_relationship(caller, imachine)
15
+ data = new(caller, imachine.bios_settings)
16
+ end
17
+
18
+ # Saves the relationship.
19
+ #
20
+ # **This method typically won't be used except internally.**
21
+ def save_relationship(caller, instance)
22
+ instance.save
23
+ end
24
+ end
25
+
26
+ def initialize(parent, bios_settings)
27
+ write_attribute(:parent, parent)
28
+
29
+ # Load the attributes and mark the whole thing as existing
30
+ load_interface_attributes(bios_settings)
31
+ clear_dirty!
32
+ existing_record!
33
+ end
34
+
35
+ def validate
36
+ super
37
+
38
+ validates_inclusion_of :acpi_enabled, :io_apic_enabled, :in => [true, false]
39
+ end
40
+
41
+ def save
42
+ parent.with_open_session do |session|
43
+ machine = session.machine
44
+
45
+ # Save them
46
+ save_changed_interface_attributes(machine.bios_settings)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,23 @@
1
+ module VirtualBox
2
+ module COM
3
+ WSTRING = :unicode_string
4
+ T_INT32 = :int
5
+ T_INT64 = :long
6
+ T_ULONG = :ulong
7
+ T_UINT8 = :uchar
8
+ T_UINT16 = :ushort
9
+ T_UINT32 = :uint
10
+ T_UINT64 = :ulong
11
+ T_BOOL = :char
12
+ end
13
+ end
14
+
15
+ # The com directory of the gem
16
+ comdir = File.join(File.dirname(__FILE__), 'com')
17
+
18
+ # Require the abstract interface first then glob load all
19
+ # of the interfaces
20
+ require File.expand_path("abstract_interface", comdir)
21
+ require File.expand_path("abstract_enum", comdir)
22
+ VirtualBox::GlobLoader.glob_require(File.join(comdir, "interface"))
23
+ VirtualBox::GlobLoader.glob_require(comdir, %w{base_interface abstract_interface abstract_implementer util ffi/interface ffi/util implementer/base})
@@ -0,0 +1,43 @@
1
+ module VirtualBox
2
+ module COM
3
+ # Represents a C enum type. Provides functionality to easily convert
4
+ # an int value to its proper symbol within the enum.
5
+ class AbstractEnum
6
+ extend Enumerable
7
+
8
+ class << self
9
+ # Defines the mapping of int => symbol for the given Enum.
10
+ # The parameter to this can be an Array or Hash or anything which
11
+ # can be indexed with `[]` and an integer and returns a value of
12
+ # some sort. If value is left nil, it will return the current mapping
13
+ def map(value = nil)
14
+ @map = value if value
15
+ @map
16
+ end
17
+
18
+ # Returns the symbol associatd with the given key
19
+ def [](key)
20
+ @map[key]
21
+ end
22
+
23
+ # Returns the index associated with a value
24
+ def index(key)
25
+ @map.index(key)
26
+ end
27
+
28
+ # Iterate over the enum, yielding each item to a block.
29
+ def each
30
+ @map.each do |key|
31
+ yield key
32
+ end
33
+ end
34
+
35
+ # Provided mostly for testing purposes only, but resets the mapping
36
+ # to nil.
37
+ def reset!
38
+ @map = nil
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,45 @@
1
+ module VirtualBox
2
+ module COM
3
+ # Base class for a COM interface implementer. Any child of this class is
4
+ # responsible for properly handling the various method and propery calls
5
+ # of a given {AbstractInterface} and making them do actual work.
6
+ #
7
+ # This abstraction is necessary to change the behavior of calls between
8
+ # Windows (COM) and Unix (XPCOM), which have different calling conventions.
9
+ class AbstractImplementer
10
+ attr_reader :interface
11
+ attr_reader :lib
12
+
13
+ # Initializes an implementer for the given {AbstractInterface}. The
14
+ # implementor's other methods, such as {read_property} or
15
+ # {call_function} are responsible for executing the said action on
16
+ # the interface.
17
+ #
18
+ # @param [AbstractInterface] interface
19
+ def initialize(interface, lib)
20
+ @interface = interface
21
+ @lib = lib
22
+ end
23
+
24
+ # Read a property of the interface.
25
+ #
26
+ # @param [Symbol] name The propery name
27
+ def read_property(name, opts)
28
+ end
29
+
30
+ # Writes a property of the interface.
31
+ #
32
+ # @param [Symbol] name The property name
33
+ # @param [Object] value The value to set
34
+ def write_property(name, value, opts)
35
+ end
36
+
37
+ # Calls a function on the interface.
38
+ #
39
+ # @param [Symbol] name The function name
40
+ # @param [Array] args The arguments to the function
41
+ def call_function(name, args, opts)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,167 @@
1
+ module VirtualBox
2
+ module COM
3
+ # Base class for a COM (component object model) interface class. This
4
+ # abstraction is necessary to maintain a common ground between
5
+ # Windows COM usage and the VirtualBox C API for unix based systems.
6
+ #
7
+ # # Defining an Interface
8
+ #
9
+ # Defining an interface is done by subclassing AbstractInterface and
10
+ # using the provided class methods to define the COM methods and
11
+ # properties. A small example class is shown below:
12
+ #
13
+ # class Time < AbstractInterface
14
+ # function :now, [[:out, :uint]]
15
+ # property :hour, :uint
16
+ # end
17
+ #
18
+ # # Accessing an Interface
19
+ #
20
+ # Interfaces are never accessed directly. Instead, an {InterfaceRunner}
21
+ # should be used. Depending on the OS of the running system, the VirtualBox
22
+ # gem will automatically either load the MSCOM interface (on Windows)
23
+ # or the XPCOM interface (on Unix). One loaded, interfaces can simply be
24
+ # accessed:
25
+ #
26
+ # # Assume `time` was retrieved already
27
+ # puts time.foo.to_s
28
+ # time.hour = 20
29
+ # x = time.now
30
+ #
31
+ # The above example shows how the properties and functions can be used
32
+ # with a given interface.
33
+ #
34
+ class AbstractInterface
35
+ attr_reader :implementer
36
+ attr_reader :lib
37
+
38
+ class << self
39
+ # Adds a function to the interface with the given name and function
40
+ # spec. The spec determines the arguments required, the order they
41
+ # are required in, and any out-arguments.
42
+ def function(name, type, spec, opts={})
43
+ members << [name, {
44
+ :type => :function,
45
+ :value_type => type,
46
+ :spec => spec,
47
+ :opts => opts
48
+ }]
49
+
50
+ # Define the method to call the function
51
+ define_method(name) { |*args| call_function(name, *args) }
52
+ end
53
+
54
+ # Adds a property to the interface with the given name, type, and
55
+ # options.
56
+ def property(name, type, opts={})
57
+ members << [name, {
58
+ :type => :property,
59
+ :value_type => type,
60
+ :opts => opts
61
+ }]
62
+
63
+ # Define the method to read the property
64
+ define_method(name) { read_property(name) }
65
+
66
+ # Define method to write the property
67
+ define_method("#{name}=".to_sym) { |value| write_property(name, value) } unless opts[:readonly]
68
+ end
69
+
70
+ # Returns the information for a given member
71
+ #
72
+ # @return [Hash]
73
+ def member(name)
74
+ members.each do |current_name, opts|
75
+ if name == current_name
76
+ return opts
77
+ end
78
+ end
79
+
80
+ nil
81
+ end
82
+
83
+ # Returns the members of the interface as an array.
84
+ #
85
+ # @return [Array]
86
+ def members
87
+ @members ||= []
88
+ end
89
+
90
+ # Returns the functions of the interface as an array in the order they
91
+ # were defined.
92
+ #
93
+ # @return [Array]
94
+ def functions
95
+ members.find_all do |data|
96
+ data[1][:type] == :function
97
+ end
98
+ end
99
+
100
+ # Returns the properties of the interface as an array in the order they
101
+ # were defined.
102
+ #
103
+ # @return [Array]
104
+ def properties
105
+ members.find_all do |data|
106
+ data[1][:type] == :property
107
+ end
108
+ end
109
+ end
110
+
111
+ # Initializes the interface with the given implementer
112
+ def initialize(implementer, lib, *args)
113
+ # Instantiate the implementer and set it
114
+ @lib = lib
115
+ @implementer = implementer.new(self, lib, *args)
116
+ end
117
+
118
+ # Reads a property with the given name by calling the read_property
119
+ # method on the implementer.
120
+ def read_property(name)
121
+ # Just call it on the implementer
122
+ @implementer.read_property(name, member(name))
123
+ end
124
+
125
+ # Writes a property with the given name and value by calling the
126
+ # `write_property` method on the implementer.
127
+ def write_property(name, value)
128
+ @implementer.write_property(name, value, member(name))
129
+ end
130
+
131
+ # Calls a function with the given name by calling call_function on the
132
+ # implementer.
133
+ def call_function(name, *args)
134
+ @implementer.call_function(name, args, member(name))
135
+ end
136
+
137
+ # Returns a boolean if a given function exists or not
138
+ def has_function?(name)
139
+ info = member(name)
140
+ !info.nil? && info[:type] == :function
141
+ end
142
+
143
+ # Returns a boolean if a given property exists or not.
144
+ def has_property?(name)
145
+ info = member(name)
146
+ !info.nil? && info[:type] == :property
147
+ end
148
+
149
+ # Returns the member of the interface specified by name. This simply
150
+ # calls {AbstractInterface.member}
151
+ def member(name)
152
+ self.class.member(name)
153
+ end
154
+
155
+ # Returns the members of the interface as an array. This simply calls
156
+ # {AbstractInterface.members}.
157
+ def members
158
+ self.class.members
159
+ end
160
+
161
+ # Concise inspect
162
+ def inspect
163
+ "#<#{self.class.name}>"
164
+ end
165
+ end
166
+ end
167
+ end