macinbox 3.3.0 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 36bd1285647b90d338e5519ba42e429e6bb8ea12
4
- data.tar.gz: 65c6e91a11e43bed2921f006fe1469542d716205
2
+ SHA256:
3
+ metadata.gz: 36a4f3b181302a8a5d4efdf5e23d97add1b2f7424c1b981d0fa8467f4317a398
4
+ data.tar.gz: cbab11b8a79ee6eb57db5e164ac34867a3e892f97b166afe3176d1ed9f629657
5
5
  SHA512:
6
- metadata.gz: e08c547e56e15487b2d22cdc492aeaa7b3b78dd13b4df4ebdd77daa09537237b18413daa63bd3e473e2b67d4fb4e83137cf493cca63452e54fb994e5ced8953a
7
- data.tar.gz: 1d4dbf5faac11e49922894e001ea1a32988a11dc85a9327f2f78a6708e9769c18ef32286fbb888273e74183b23e971cf3962328d77d0f443c798bb4df4c235cf
6
+ metadata.gz: 706f282c101a01f8077f3b5e826441610263aee40c19e7b3ffea6480be6c50252f0e38070c4160153abb094a898dddd5b4195fb5d75ae9ecd1c69f1002c54a6c
7
+ data.tar.gz: 65c34dc426dc8a155319a781d0225920208e02c5eeaf74d3c61791fe9cfa0c85a6e8fe79021f1713653c9bd17f14cba039472954182264b7e268b7f80992a687
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## 3.4.0 (November 12, 2019)
2
+
3
+ FEATURES:
4
+
5
+ - Create `vagrant` group on first boot of the box. [GH-37]
6
+ - Add a preflight check to ensure that VMware disk conversion will be successful. [GH-12]
7
+
8
+ BUG FIXES:
9
+
10
+ - Handle missing package in Parallels Tools. [GH-43]
11
+
12
+ IMPROVEMENTS:
13
+
14
+ - Remove dependency on vmware-rawdiskCreator tool.
15
+
1
16
  ## 3.3.0 (February 26, 2019)
2
17
 
3
18
  FEATURES:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- macinbox (3.3.0)
4
+ macinbox (3.4.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -17,4 +17,4 @@ DEPENDENCIES
17
17
  rake (~> 10.0)
18
18
 
19
19
  BUNDLED WITH
20
- 1.16.1
20
+ 1.17.2
data/README.md CHANGED
@@ -24,13 +24,13 @@ The following software is required. Versions other than those mentioned may work
24
24
 
25
25
  To boot a box created by `macinbox` you will need Vagrant:
26
26
 
27
- * [Vagrant 2.2.3](https://www.vagrantup.com/)
27
+ * [Vagrant 2.2.5](https://www.vagrantup.com/)
28
28
 
29
29
  ### macOS Installer
30
30
 
31
31
  To create a box you will need a macOS installer application:
32
32
 
33
- * [macOS 10.14.3 Mojave installer application](http://appstore.com/mac/macosmojave)
33
+ * [macOS Mojave installer application](http://appstore.com/mac/macosmojave) Tested with 10.14.3, 10.14.4, 10.14.5, 10.14.6
34
34
 
35
35
  Previous versions of the macOS installer (e.g. High Sierra) may also work.
36
36
 
@@ -44,23 +44,21 @@ One of the following virtualization applications is required:
44
44
 
45
45
  To create and boot a box in the 'vmware_fusion' or 'vmware_desktop' formats you will need:
46
46
 
47
- * [VMware Fusion Pro 10.1.5](http://www.vmware.com/products/fusion.html)
48
- * [Vagrant VMware Desktop Provider 2.0.1](https://www.vagrantup.com/vmware/)
49
-
50
- **NOTE:** VMware Fusion Pro 11 is not yet supported for box creation; see [issue #12](https://github.com/bacongravy/macinbox/issues/12) for more information. As a workaround you can install `qemu-img` and pass the `--use-qemu` option.
47
+ * [VMware Fusion Pro 11.5.1](http://www.vmware.com/products/fusion.html)
48
+ * [Vagrant VMware Desktop Provider 2.0.3](https://www.vagrantup.com/vmware/)
51
49
 
52
50
  #### Parallels Desktop
53
51
 
54
52
  To create and boot a box in the 'parallels' format you will need:
55
53
 
56
- * [Parallels Desktop 14 for Mac Pro Edition 14.1.0](https://www.parallels.com/products/desktop/)
57
- * [Vagrant Parallels Provider 1.7.8](https://parallels.github.io/vagrant-parallels/)
54
+ * [Parallels Desktop 15 for Mac Pro Edition 15.0.0](https://www.parallels.com/products/desktop/)
55
+ * [Vagrant Parallels Provider 2.0.1](https://parallels.github.io/vagrant-parallels/)
58
56
 
59
57
  #### VirtualBox
60
58
 
61
59
  To create and boot a box in the 'virtualbox' format you will need:
62
60
 
63
- * [VirtualBox 6.0.2 with the extension pack](https://www.virtualbox.org)
61
+ * [VirtualBox 6.0.12 with the extension pack](https://www.virtualbox.org)
64
62
 
65
63
  ## Installation
66
64
 
@@ -228,7 +226,7 @@ opts[:full_name] = "Vagrant"
228
226
  opts[:password] = "vagrant"
229
227
  opts[:image_path] = "macinbox.sparseimage"
230
228
  opts[:boxes_dir] = File.expand_path "~/.vagrant.d/boxes"
231
- opts[:debug] = true
229
+ $debug = $verbose = true
232
230
 
233
231
  include Macinbox::Actions
234
232
 
data/lib/macinbox.rb CHANGED
@@ -4,7 +4,9 @@ require "macinbox/collector"
4
4
  require "macinbox/copyfiles"
5
5
  require "macinbox/error"
6
6
  require "macinbox/logger"
7
+ require "macinbox/os_version"
7
8
  require "macinbox/task"
8
9
  require "macinbox/tty"
9
10
  require "macinbox/version"
10
11
  require "macinbox/virtual_disk"
12
+ require "macinbox/vmdk"
@@ -1,3 +1,6 @@
1
+ require "macinbox/error"
2
+ require "macinbox/os_version"
3
+
1
4
  module Macinbox
2
5
 
3
6
  module Actions
@@ -16,21 +19,14 @@ module Macinbox
16
19
  install_info_plist = "#{@installer_app}/Contents/SharedSupport/InstallInfo.plist"
17
20
  raise Macinbox::Error.new("InstallInfo.plist not found in installer app bundle") unless File.exist? install_info_plist
18
21
 
19
- installer_os_version = Task.backtick %W[ /usr/libexec/PlistBuddy -c #{'Print :System\ Image\ Info:version'} #{install_info_plist} ]
20
- installer_os_version_components = installer_os_version.split(".") rescue [0, 0, 0]
21
- installer_os_version_major = installer_os_version_components[0]
22
- installer_os_version_minor = installer_os_version_components[1]
22
+ installer_os_version = Macinbox::OSVersion.new(Task.backtick %W[ /usr/libexec/PlistBuddy -c #{'Print :System\ Image\ Info:version'} #{install_info_plist} ])
23
23
  Logger.info "Installer macOS version detected: #{installer_os_version}" if $verbose
24
24
 
25
- host_os_version = Task.backtick %W[ /usr/bin/sw_vers -productVersion ]
26
- host_os_version_components = host_os_version.split(".") rescue [0, 0, 0]
27
- host_os_version_major = host_os_version_components[0]
28
- host_os_version_minor = host_os_version_components[1]
25
+ host_os_version = Macinbox::OSVersion.new(Task.backtick %W[ /usr/bin/sw_vers -productVersion ])
29
26
  Logger.info "Host macOS version detected: #{host_os_version}" if $verbose
30
27
 
31
- if installer_os_version_major != host_os_version_major || installer_os_version_minor != host_os_version_minor
28
+ if installer_os_version.major != host_os_version.major || installer_os_version.minor != host_os_version.minor
32
29
  Logger.error "Warning: host OS version (#{host_os_version}) and installer OS version (#{installer_os_version}) do not match"
33
- # raise Macinbox::Error.new("host OS version (#{host_os_version}) and installer OS version (#{installer_os_version}) do not match")
34
30
  end
35
31
 
36
32
  installer_os_version
@@ -6,6 +6,7 @@ require 'macinbox/error'
6
6
  require 'macinbox/logger'
7
7
  require 'macinbox/task'
8
8
  require 'macinbox/virtual_disk'
9
+ require 'macinbox/vmdk'
9
10
 
10
11
  module Macinbox
11
12
 
@@ -94,8 +95,10 @@ module Macinbox
94
95
  FileUtils.mkdir tools_expanded_packages_dir
95
96
 
96
97
  tools_packages.each do |package|
97
- Task.run %W[ /usr/sbin/pkgutil --expand #{tools_packages_dir}/#{package} #{tools_expanded_packages_dir}/#{package} ]
98
- Task.run %W[ /usr/bin/ditto -x -z #{tools_expanded_packages_dir}/#{package}/Payload #{@image_mountpoint} ]
98
+ if File.exist? "#{tools_packages_dir}/#{package}"
99
+ Task.run %W[ /usr/sbin/pkgutil --expand #{tools_packages_dir}/#{package} #{tools_expanded_packages_dir}/#{package} ]
100
+ Task.run %W[ /usr/bin/ditto -x -z #{tools_expanded_packages_dir}/#{package}/Payload #{@image_mountpoint} ]
101
+ end
99
102
  end
100
103
 
101
104
  prl_nettool_source = "/Library/Parallels Guest Tools/prl_nettool"
@@ -122,53 +125,7 @@ module Macinbox
122
125
 
123
126
  def convert_image
124
127
  Logger.info "Converting the image to HDD format..." do
125
-
126
- disk_info = Task.backtick %W[ /usr/sbin/fdisk #{@disk.device} ]
127
-
128
- geometry_re = /geometry: (\d+)\/(\d+)\/(\d+) \[(\d+) sectors\]/
129
-
130
- match = geometry_re.match(disk_info)
131
-
132
- raise Macinbox::Error.new("failed to determine disk geometry") if match.nil? || match.captures.length != 4
133
-
134
- device_sectors = match.captures[3]
135
-
136
- device_cylinders = match.captures[0]
137
- device_heads_per_track = match.captures[1]
138
- device_sectors_per_track = match.captures[2]
139
-
140
- bios_cylinders = 1024
141
- bios_heads_per_track = device_heads_per_track
142
- bios_sectors_per_track = device_sectors_per_track
143
-
144
- File.write "#{@temp_dir}/macinbox.vmdk", <<~EOF
145
- # Disk DescriptorFile
146
- version=1
147
- encoding="UTF-8"
148
- CID=fffffffe
149
- parentCID=ffffffff
150
- isNativeSnapshot="no"
151
- createType="monolithicFlat"
152
-
153
- # Extent description
154
- RW #{device_sectors} FLAT "#{@disk.device}" 0
155
-
156
- # The Disk Data Base
157
- #DDB
158
-
159
- ddb.adapterType = "lsilogic"
160
- ddb.deletable = "true"
161
- ddb.geometry.biosCylinders = "#{bios_cylinders}"
162
- ddb.geometry.biosHeads = "#{bios_heads_per_track}"
163
- ddb.geometry.biosSectors = "#{bios_sectors_per_track}"
164
- ddb.geometry.cylinders = "#{device_cylinders}"
165
- ddb.geometry.heads = "#{device_heads_per_track}"
166
- ddb.geometry.sectors = "#{device_sectors_per_track}"
167
- ddb.longContentID = "9fa218b506cfe68615c39994fffffffe"
168
- ddb.uuid = "60 00 C2 99 91 76 dd 77-6e 0d 84 8b b0 24 6e 00"
169
- ddb.virtualHWVersion = "14"
170
- EOF
171
-
128
+ VMDK.create_raw_vmdk(@disk.device, "#{@temp_dir}/macinbox.vmdk")
172
129
  prl_convert = "#{@parallels_app}/Contents/MacOS/prl_convert"
173
130
  task_opts = $verbose ? {} : { :out => File::NULL }
174
131
  Task.run %W[ #{prl_convert} #{@temp_dir}/macinbox.vmdk --allow-no-os --dst=#{@temp_dir} ] + [task_opts]
@@ -48,6 +48,7 @@ module Macinbox
48
48
  install_macos
49
49
  create_rc_vagrant
50
50
  automate_user_account_creation
51
+ automate_vagrant_group_creation
51
52
  automate_vagrant_ssh_key_installation
52
53
  enable_passwordless_sudo
53
54
  enable_sshd
@@ -107,17 +108,28 @@ module Macinbox
107
108
  end
108
109
 
109
110
  def create_rc_vagrant
110
- scratch_rc_installer_cleanup = "#{@scratch_mountpoint}/private/etc/rc.installer_cleanup"
111
- @scratch_rc_vagrant = "#{@scratch_mountpoint}/private/etc/rc.vagrant"
112
- File.write scratch_rc_installer_cleanup, <<~EOF
113
- #!/bin/sh
114
- rm -f /etc/rc.installer_cleanup
115
- /etc/rc.vagrant &
116
- exit 0
111
+ first_boot_launch_daemon = "#{@scratch_mountpoint}/Library/LaunchDaemons/rc.vagrant.plist"
112
+ File.write first_boot_launch_daemon, <<~EOF
113
+ <?xml version="1.0" encoding="UTF-8"?>
114
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
115
+ <plist version="1.0">
116
+ <dict>
117
+ <key>Label</key>
118
+ <string>rc.vagrant</string>
119
+ <key>ProgramArguments</key>
120
+ <array>
121
+ <string>/etc/rc.vagrant</string>
122
+ </array>
123
+ <key>RunAtLoad</key>
124
+ <true/>
125
+ </dict>
126
+ </plist>
117
127
  EOF
118
- FileUtils.chmod 0755, scratch_rc_installer_cleanup
128
+ FileUtils.chmod 0755, first_boot_launch_daemon
129
+ @scratch_rc_vagrant = "#{@scratch_mountpoint}/private/etc/rc.vagrant"
119
130
  File.write @scratch_rc_vagrant, <<~EOF
120
131
  #!/bin/sh
132
+ rm -r /Library/LaunchDaemons/rc.vagrant.plist
121
133
  rm -f /etc/rc.vagrant
122
134
  EOF
123
135
  FileUtils.chmod 0755, @scratch_rc_vagrant
@@ -154,6 +166,23 @@ module Macinbox
154
166
  end
155
167
  end
156
168
 
169
+ def automate_vagrant_group_creation
170
+ if @short_name == "vagrant"
171
+ Logger.info "Configuring the 'vagrant' group..." do
172
+ contents = <<~EOF
173
+ until dscl . -read /Users/vagrant UniqueID; do
174
+ sleep 1
175
+ done
176
+ dscl . -create /Groups/vagrant
177
+ dscl . -create /Groups/vagrant gid 501
178
+ dscl . -create /Groups/vagrant GroupMembers `dscl . -read /Users/vagrant GeneratedUID | cut -d ' ' -f 2`
179
+ dscl . -create /Groups/vagrant GroupMembership vagrant
180
+ EOF
181
+ File.write @scratch_rc_vagrant, contents, mode: 'a'
182
+ end
183
+ end
184
+ end
185
+
157
186
  def automate_vagrant_ssh_key_installation
158
187
  if @short_name == "vagrant"
159
188
  Logger.info "Installing the default insecure vagrant ssh key..." do
@@ -6,6 +6,7 @@ require 'macinbox/error'
6
6
  require 'macinbox/logger'
7
7
  require 'macinbox/task'
8
8
  require 'macinbox/virtual_disk'
9
+ require 'macinbox/vmdk'
9
10
 
10
11
  module Macinbox
11
12
 
@@ -139,11 +140,15 @@ module Macinbox
139
140
  else
140
141
  @disk.attach
141
142
  task_opts = $verbose ? {} : { :out => File::NULL }
142
- rawdiskCreator = "#{@vmware_fusion_app}/Contents/Library/vmware-rawdiskCreator"
143
143
  vdiskmanager = "#{@vmware_fusion_app}/Contents/Library/vmware-vdiskmanager"
144
144
  Dir.chdir(@temp_dir) do
145
- Task.run %W[ #{rawdiskCreator} create #{@disk.device} fullDevice rawdisk lsilogic ] + [task_opts]
146
- Task.run %W[ #{vdiskmanager} -t 0 -r rawdisk.vmdk macinbox.vmdk ] + [task_opts]
145
+ VMDK.create_raw_vmdk(@disk.device, "rawdisk.vmdk")
146
+ begin
147
+ Task.run %W[ #{vdiskmanager} -t 0 -r rawdisk.vmdk macinbox.vmdk ] + [task_opts]
148
+ rescue Macinbox::Error => e
149
+ Logger.error "If the conversion failed due to an AppleXPC error please see https://kb.vmware.com/s/article/65163 for a possible workaround."
150
+ raise e
151
+ end
147
152
  end
148
153
  @disk.eject
149
154
  end
@@ -17,7 +17,7 @@ module Macinbox
17
17
  @box_format = opts[:box_format] or raise ArgumentError.new(":box_format not specified")
18
18
  @boxes_dir = opts[:boxes_dir] or raise ArgumentError.new(":boxes_dir not specified")
19
19
 
20
- @box_version = opts[:macos_version]
20
+ @box_version = opts[:macos_version].to_s rescue nil
21
21
 
22
22
  raise Macinbox::Error.new("box not found: #{@input_box}") unless File.exist? @input_box
23
23
  raise Macinbox::Error.new("boxes directory not found: #{@boxes_dir}") unless File.exist? @boxes_dir
data/lib/macinbox/cli.rb CHANGED
@@ -57,8 +57,12 @@ module Macinbox
57
57
  raise Macinbox::Error.new("Box format not supported: #{@options[:box_format]}")
58
58
  end
59
59
 
60
- if /^vmware_(fusion|desktop)$/ === @options[:box_format] && !File.exists?(@options[:vmware_path])
61
- raise Macinbox::Error.new("VMware Fusion app not found: #{@options[:vmware_path]}")
60
+ if /^vmware_(fusion|desktop)$/ === @options[:box_format]
61
+ unless File.exists?(@options[:vmware_path])
62
+ raise Macinbox::Error.new("VMware Fusion app not found: #{@options[:vmware_path]}")
63
+ end
64
+ vmware_version = Task.backtick %W[ defaults read #{@options[:vmware_path]}/Contents/Info.plist CFBundleShortVersionString ]
65
+ @options[:vmware_major_version] = vmware_version.split(".")[0].to_i rescue 10
62
66
  end
63
67
 
64
68
  if /^parallels$/ === @options[:box_format] && !File.exists?(@options[:parallels_path])
@@ -73,6 +77,18 @@ module Macinbox
73
77
  raise Macinbox::Error.new("QEMU not found: /usr/local/bin/qemu-img")
74
78
  end
75
79
 
80
+ if /^vmware_(fusion|desktop)$/ === @options[:box_format] && !@options[:use_qemu] && @options[:vmware_major_version] >= 11
81
+ fusion_is_not_running = false
82
+ begin
83
+ Task.run %W[ pgrep -q #{"^VMware Fusion$"} ]
84
+ rescue
85
+ fusion_is_not_running = true
86
+ end
87
+ if fusion_is_not_running || !File.exist?("/Library/PrivilegedHelperTools/com.vmware.DiskHelper")
88
+ raise Macinbox::Error.new("VMware Fusion is not running and the workaround was not detected. See https://kb.vmware.com/s/article/65163 for more information, or try the --use-qemu option.")
89
+ end
90
+ end
91
+
76
92
  vagrant_home = ENV["VAGRANT_HOME"]
77
93
 
78
94
  if vagrant_home.nil? or vagrant_home.empty?
@@ -0,0 +1,56 @@
1
+ module Macinbox
2
+
3
+ class OSVersion
4
+
5
+ def initialize(version)
6
+ @version = version
7
+ @components = @version.split(".") rescue [0, 0]
8
+ end
9
+
10
+ def to_s
11
+ @version
12
+ end
13
+
14
+ def major
15
+ @components[0].to_i rescue 0
16
+ end
17
+
18
+ def minor
19
+ @components[1].to_i rescue 0
20
+ end
21
+
22
+ def darwin_major
23
+ minor + 4
24
+ end
25
+
26
+ def is_sierra?
27
+ major == 10 && minor == 12
28
+ end
29
+
30
+ def is_high_sierra?
31
+ major == 10 && minor == 13
32
+ end
33
+
34
+ def is_mojave?
35
+ major == 10 && minor == 14
36
+ end
37
+
38
+ def is_catalina?
39
+ major == 10 && minor == 15
40
+ end
41
+
42
+ def is_sierra_or_later?
43
+ major == 10 && minor >= 12
44
+ end
45
+
46
+ def is_mojave_or_earlier?
47
+ major == 10 && minor <= 14
48
+ end
49
+
50
+ def is_catalina_or_later?
51
+ major == 10 && minor >= 15
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -1,3 +1,3 @@
1
1
  module Macinbox
2
- VERSION = "3.3.0"
2
+ VERSION = "3.4.0"
3
3
  end
@@ -0,0 +1,60 @@
1
+ require 'macinbox/error'
2
+ require 'macinbox/task'
3
+
4
+ module Macinbox
5
+
6
+ class VMDK
7
+
8
+ def self.create_raw_vmdk(device, output)
9
+
10
+ disk_info = Task.backtick %W[ /usr/sbin/fdisk #{device} ]
11
+
12
+ geometry_re = /geometry: (\d+)\/(\d+)\/(\d+) \[(\d+) sectors\]/
13
+
14
+ match = geometry_re.match(disk_info)
15
+
16
+ raise Macinbox::Error.new("failed to determine disk geometry") if match.nil? || match.captures.length != 4
17
+
18
+ device_sectors = match.captures[3]
19
+
20
+ device_cylinders = match.captures[0]
21
+ device_heads_per_track = match.captures[1]
22
+ device_sectors_per_track = match.captures[2]
23
+
24
+ bios_cylinders = 1024
25
+ bios_heads_per_track = device_heads_per_track
26
+ bios_sectors_per_track = device_sectors_per_track
27
+
28
+ File.write output, <<~EOF
29
+ # Disk DescriptorFile
30
+ version=1
31
+ encoding="UTF-8"
32
+ CID=fffffffe
33
+ parentCID=ffffffff
34
+ isNativeSnapshot="no"
35
+ createType="monolithicFlat"
36
+
37
+ # Extent description
38
+ RW #{device_sectors} FLAT "#{device}" 0
39
+
40
+ # The Disk Data Base
41
+ #DDB
42
+
43
+ ddb.adapterType = "lsilogic"
44
+ ddb.deletable = "true"
45
+ ddb.geometry.biosCylinders = "#{bios_cylinders}"
46
+ ddb.geometry.biosHeads = "#{bios_heads_per_track}"
47
+ ddb.geometry.biosSectors = "#{bios_sectors_per_track}"
48
+ ddb.geometry.cylinders = "#{device_cylinders}"
49
+ ddb.geometry.heads = "#{device_heads_per_track}"
50
+ ddb.geometry.sectors = "#{device_sectors_per_track}"
51
+ ddb.longContentID = "9fa218b506cfe68615c39994fffffffe"
52
+ ddb.uuid = "60 00 C2 99 91 76 dd 77-6e 0d 84 8b b0 24 6e 00"
53
+ ddb.virtualHWVersion = "14"
54
+ EOF
55
+
56
+ end
57
+
58
+ end
59
+
60
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: macinbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Kramer
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-27 00:00:00.000000000 Z
11
+ date: 2019-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -74,10 +74,12 @@ files:
74
74
  - lib/macinbox/copyfiles.rb
75
75
  - lib/macinbox/error.rb
76
76
  - lib/macinbox/logger.rb
77
+ - lib/macinbox/os_version.rb
77
78
  - lib/macinbox/task.rb
78
79
  - lib/macinbox/tty.rb
79
80
  - lib/macinbox/version.rb
80
81
  - lib/macinbox/virtual_disk.rb
82
+ - lib/macinbox/vmdk.rb
81
83
  - macinbox.gemspec
82
84
  homepage: https://github.com/bacongravy/macinbox
83
85
  licenses:
@@ -101,8 +103,7 @@ requirements:
101
103
  - macOS Mojave
102
104
  - macOS Mojave installer app
103
105
  - Vagrant
104
- rubyforge_project:
105
- rubygems_version: 2.5.2.3
106
+ rubygems_version: 3.0.3
106
107
  signing_key:
107
108
  specification_version: 4
108
109
  summary: Puts macOS in a Vagrant box