iesd 1.1.2 → 1.2.0
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.
- checksums.yaml +4 -4
- data/bin/iesd +21 -19
- data/iesd.gemspec +1 -1
- data/lib/iesd.rb +0 -2
- data/lib/iesd/InstallESD/BaseSystem.dmg.rb +5 -5
- data/lib/iesd/InstallESD/Extensions.rb +23 -7
- data/lib/iesd/InstallESD/InstallESD.dmg.rb +18 -16
- data/lib/iesd/InstallESD/Packages/BaseSystemBinaries.pkg.rb +9 -7
- data/lib/iesd/InstallESD/Packages/OSInstall.pkg.rb +11 -5
- data/lib/iesd/utility.rb +0 -17
- data/lib/iesd/utility/hdiutil.rb +15 -11
- data/lib/iesd/utility/kextcache.rb +9 -4
- data/lib/iesd/utility/pkgutil.rb +5 -2
- data/lib/iesd/utility/tty.rb +3 -9
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d6447d914c3336dfcbd31bed32b08e466afd817
|
4
|
+
data.tar.gz: 1283183f073d822b41df8721be9068f6771645b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3891f8b6de4af530d2708ac096dab375d92cf88070d5fd9f89dced055503d4c15f320b6d7c9257da7f81bbe037080f45f9aa66ad1a2847f2efe4dc16899a5ff8
|
7
|
+
data.tar.gz: f181900399e4ed2f78d99cfd6929709a0c8085589ed12604f1d4e9c6ee01eefb3fd5d8308a78dc30aaacc924aa38c29d858aaf27163acdf6f277c700de941dfd
|
data/bin/iesd
CHANGED
@@ -27,7 +27,7 @@ options = {
|
|
27
27
|
:mach_kernel => nil,
|
28
28
|
:extensions => {
|
29
29
|
:install => [],
|
30
|
-
:
|
30
|
+
:uninstall=> [],
|
31
31
|
:kextcache => nil,
|
32
32
|
:postinstall => true
|
33
33
|
}
|
@@ -39,23 +39,23 @@ optparse = OptionParser.new do |opts|
|
|
39
39
|
opts.separator ""
|
40
40
|
opts.separator "Specific options:"
|
41
41
|
|
42
|
-
opts.on("-i", "--input
|
43
|
-
"
|
42
|
+
opts.on("-i", "--input file",
|
43
|
+
"Specify the input dmg or app.") do |input|
|
44
44
|
options[:input] = File.absolute_path input
|
45
45
|
end
|
46
46
|
|
47
|
-
opts.on("-o", "--output
|
48
|
-
"
|
47
|
+
opts.on("-o", "--output file",
|
48
|
+
"Specify the output dmg.") do |output|
|
49
49
|
output << ".dmg" if File.extname(output).downcase != ".dmg"
|
50
50
|
options[:output] = File.absolute_path output
|
51
51
|
end
|
52
52
|
|
53
53
|
opts.on("-t", "--type type", [:BaseSystem, :InstallESD],
|
54
|
-
"
|
54
|
+
"Specify the output type. Type could be BaseSystem or InstallESD.") do |type|
|
55
55
|
options[:type] = type
|
56
56
|
end
|
57
57
|
|
58
|
-
opts.on("-s", "--[no-]interactive-shell", "
|
58
|
+
opts.on("-s", "--[no-]interactive-shell", "Open #{ENV["SHELL"]} inside the temporary mount directory.") do |interactive|
|
59
59
|
options[:interactive] = interactive
|
60
60
|
end
|
61
61
|
|
@@ -63,44 +63,46 @@ optparse = OptionParser.new do |opts|
|
|
63
63
|
opts.separator "HDIUtil options:"
|
64
64
|
|
65
65
|
opts.on("--grow sectors", OptionParser::DecimalInteger,
|
66
|
-
"
|
66
|
+
"Specify the size of the image to grow in 512-byte sectors.") do |sectors|
|
67
67
|
options[:hdiutil][:resize][:grow] = sectors
|
68
68
|
end
|
69
69
|
|
70
|
-
opts.on("--[no-]shrink", "
|
70
|
+
opts.on("--[no-]shrink", "Do [not] shrink the output image.") do |s|
|
71
71
|
options[:hdiutil][:resize][:shrink] = s
|
72
72
|
end
|
73
73
|
|
74
74
|
opts.separator ""
|
75
75
|
opts.separator "Boot options:"
|
76
76
|
|
77
|
-
opts.on("--[no-]kernel", "
|
77
|
+
opts.on("--[no-]fallback-kernel", "Do [not] fallback to mach_kernel when kernelcache fails to boot.") do |k|
|
78
78
|
options[:mach_kernel] = k
|
79
79
|
end
|
80
80
|
|
81
81
|
opts.separator ""
|
82
|
-
opts.separator "
|
82
|
+
opts.separator "Extensions options:"
|
83
83
|
|
84
|
-
opts.on("--
|
85
|
-
|
84
|
+
opts.on("--install-extension kext",
|
85
|
+
"Add the kext to the list of the extensions to be installed.") do |kext|
|
86
|
+
options[:extensions][:install].push File.absolute_path kext
|
86
87
|
end
|
87
88
|
|
88
|
-
opts.on("--
|
89
|
-
|
89
|
+
opts.on("--uninstall-extension kext",
|
90
|
+
"Add the kext to the list of the extensions to be uninstalled.") do |kext|
|
91
|
+
options[:extensions][:uninstall].push kext
|
90
92
|
end
|
91
93
|
|
92
|
-
opts.on("--[no-]postinstall-
|
94
|
+
opts.on("--[no-]postinstall-extensions", "Do [not] patch OSInstall.pkg to postinstall extensions.") do |p|
|
93
95
|
options[:extensions][:postinstall] = p
|
94
96
|
end
|
95
97
|
|
96
|
-
opts.on("--[no-]
|
98
|
+
opts.on("--[no-]update-kernelcache", "Do [not] rebuild the startup kernelcache.") do |c|
|
97
99
|
options[:extensions][:kextcache] = c
|
98
100
|
end
|
99
101
|
|
100
102
|
opts.separator ""
|
101
103
|
opts.separator "Common options:"
|
102
104
|
|
103
|
-
opts.on("
|
105
|
+
opts.on("--[no-]verbose", "Run verbosely") do |v|
|
104
106
|
ENV['VERBOSE'] = '1'
|
105
107
|
end
|
106
108
|
|
@@ -129,7 +131,7 @@ end
|
|
129
131
|
begin
|
130
132
|
raise "input file does not exist" unless File.exist? options[:input]
|
131
133
|
raise "output file already exists" if File.exist? options[:output]
|
132
|
-
options[:extensions][:
|
134
|
+
options[:extensions][:uninstall].select { |kext|
|
133
135
|
if File.extname(kext) == ".kext"
|
134
136
|
true
|
135
137
|
else
|
data/iesd.gemspec
CHANGED
@@ -2,7 +2,7 @@ Gem::Specification.new do |s|
|
|
2
2
|
s.required_ruby_version = ">= 1.9.2"
|
3
3
|
|
4
4
|
s.name = "iesd"
|
5
|
-
s.version = "1.
|
5
|
+
s.version = "1.2.0"
|
6
6
|
s.summary = "Customize OS X InstallESD."
|
7
7
|
s.description = "Modify Extensions, Kextcache and Packages on InstallESD."
|
8
8
|
s.authors = "なつき"
|
data/lib/iesd.rb
CHANGED
@@ -8,7 +8,7 @@ module IESD
|
|
8
8
|
when :BaseSystem, nil
|
9
9
|
Dir.mktmpdir { |tmp|
|
10
10
|
HDIUtil.write(@url, (tmpfile = File.join(tmp, File.basename(@url))), options[:hdiutil]) { |volume_root|
|
11
|
-
options[:extensions][:up_to_date] = (options[:extensions][:
|
11
|
+
options[:extensions][:up_to_date] = (options[:extensions][:uninstall].empty? and options[:extensions][:install].empty?)
|
12
12
|
options[:mach_kernel] = File.exist? File.join(volume_root, "mach_kernel") if options[:mach_kernel].nil?
|
13
13
|
|
14
14
|
yield volume_root if block_given?
|
@@ -25,7 +25,7 @@ module IESD
|
|
25
25
|
HDIUtil.shell volume_root
|
26
26
|
end
|
27
27
|
}
|
28
|
-
system(
|
28
|
+
system("/usr/bin/env", "mv", tmpfile, options[:output])
|
29
29
|
}
|
30
30
|
else
|
31
31
|
raise "invalid output type"
|
@@ -37,7 +37,7 @@ module IESD
|
|
37
37
|
def pre_update_extension volume_root, options
|
38
38
|
if !File.exist? (mach_kernel = File.join(volume_root, "mach_kernel")) and (options[:mach_kernel] or !options[:extensions][:up_to_date])
|
39
39
|
IESD::Packages::BaseSystemBinaries.new(File.join(volume_root, *PACKAGES, "BaseSystemBinaries.pkg")).extract_mach_kernel mach_kernel
|
40
|
-
system(
|
40
|
+
system("/usr/bin/env", "chflags", "hidden", mach_kernel)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -46,13 +46,13 @@ module IESD
|
|
46
46
|
IESD::Packages::OSInstall.new(File.join(volume_root, *PACKAGES, "OSInstall.pkg")).postinstall_extensions options[:extensions]
|
47
47
|
end
|
48
48
|
if !options[:mach_kernel] and File.exist? (mach_kernel = File.join(volume_root, "mach_kernel"))
|
49
|
-
system(
|
49
|
+
system("/usr/bin/env", "rm", mach_kernel)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
53
|
class Extensions < IESD::Extensions
|
54
54
|
def update extensions
|
55
|
-
|
55
|
+
uninstall extensions[:uninstall]
|
56
56
|
install extensions[:install]
|
57
57
|
KextCache.update_volume @volume_root if extensions[:kextcache] or (extensions[:kextcache].nil? and !extensions[:up_to_date])
|
58
58
|
end
|
@@ -1,20 +1,29 @@
|
|
1
1
|
module IESD
|
2
2
|
class Extensions
|
3
3
|
EXTENSIONS = %w{ System Library Extensions }
|
4
|
+
EXTRA_EXTENSIONS = %w{ Library Extensions }
|
4
5
|
|
5
6
|
attr_reader :volume_root, :url
|
6
7
|
|
7
8
|
def initialize volume_root
|
8
9
|
@volume_root = volume_root
|
9
|
-
@
|
10
|
+
@extensions = File.join @volume_root, *EXTENSIONS
|
11
|
+
@extra_extensions = File.join @volume_root, *EXTRA_EXTENSIONS
|
10
12
|
end
|
11
13
|
|
12
|
-
def
|
14
|
+
def uninstall kexts
|
13
15
|
if !kexts.empty?
|
14
|
-
oh1 "
|
16
|
+
oh1 "Uninstalling Extensions"
|
15
17
|
kexts.each { |kext|
|
16
|
-
|
17
|
-
|
18
|
+
kext_url = File.join(@extra_extensions, kext)
|
19
|
+
if File.exist? kext_url
|
20
|
+
system("/usr/bin/env", "rm", "-rf", kext_url)
|
21
|
+
puts "Uninstalled: #{kext_url}"
|
22
|
+
else
|
23
|
+
kext_url = File.join(@extensions, kext)
|
24
|
+
system("/usr/bin/env", "rm", "-rf", kext_url)
|
25
|
+
puts "Removed: #{kext_url}"
|
26
|
+
end
|
18
27
|
}
|
19
28
|
end
|
20
29
|
end
|
@@ -23,8 +32,15 @@ module IESD
|
|
23
32
|
if !kexts.empty?
|
24
33
|
oh1 "Installing Extensions"
|
25
34
|
kexts.each { |kext|
|
26
|
-
|
27
|
-
|
35
|
+
kext_url = File.join(@extensions, File.basename(kext))
|
36
|
+
if File.exist? kext_url
|
37
|
+
system("/usr/bin/env", "ditto", kext, kext_url)
|
38
|
+
puts "Overwrote: #{kext_url}"
|
39
|
+
else
|
40
|
+
kext_url = File.join(@extra_extensions, File.basename(kext)) if File.exist? @extra_extensions
|
41
|
+
system("/usr/bin/env", "ditto", kext, kext_url)
|
42
|
+
puts "Installed: #{kext_url}"
|
43
|
+
end
|
28
44
|
}
|
29
45
|
end
|
30
46
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "shellwords"
|
2
|
+
|
1
3
|
module IESD
|
2
4
|
class DMG
|
3
5
|
class InstallESD < HDIUtil::DMG
|
@@ -13,23 +15,23 @@ module IESD
|
|
13
15
|
}
|
14
16
|
}
|
15
17
|
}.merge(options)
|
16
|
-
options[:hdiutil][:resize][:grow] += (
|
18
|
+
options[:hdiutil][:resize][:grow] += ( `/usr/bin/env hdiutil resize -limits #{@url.shellescape}`.chomp.split.map { |s| s.to_i } ).first
|
17
19
|
|
18
20
|
show { |installesd|
|
19
21
|
IESD::DMG::BaseSystem.new(File.join(installesd, "BaseSystem.dmg")).export(options) { |basesystem|
|
20
22
|
installesd_packages = File.join installesd, PACKAGES
|
21
23
|
basesystem_packages = File.join basesystem, *IESD::DMG::BaseSystem::PACKAGES
|
22
24
|
oh1 "Copying #{installesd_packages}"
|
23
|
-
system(
|
24
|
-
system(
|
25
|
+
system("/usr/bin/env", "rm", basesystem_packages)
|
26
|
+
system("/usr/bin/env", "ditto", installesd_packages, basesystem_packages)
|
25
27
|
puts "Copied: #{basesystem_packages}"
|
26
28
|
|
27
29
|
installesd_mach_kernel = File.join installesd, "mach_kernel"
|
28
30
|
basesystem_mach_kernel = File.join basesystem, "mach_kernel"
|
29
31
|
if File.exist? installesd_mach_kernel
|
30
32
|
oh1 "Copying #{installesd_mach_kernel}"
|
31
|
-
system(
|
32
|
-
system(
|
33
|
+
system("/usr/bin/env", "ditto", installesd_mach_kernel, basesystem_mach_kernel)
|
34
|
+
system("/usr/bin/env", "chflags", "hidden", basesystem_mach_kernel)
|
33
35
|
puts "Copied: #{basesystem_mach_kernel}"
|
34
36
|
end
|
35
37
|
}
|
@@ -37,7 +39,7 @@ module IESD
|
|
37
39
|
when :InstallESD, nil
|
38
40
|
Dir.mktmpdir { |tmp|
|
39
41
|
HDIUtil.write(@url, (tmpfile = File.join(tmp, File.basename(@url))), options[:hdiutil]) { |installesd|
|
40
|
-
options[:extensions][:up_to_date] = (options[:extensions][:
|
42
|
+
options[:extensions][:up_to_date] = (options[:extensions][:uninstall].empty? and options[:extensions][:install].empty?)
|
41
43
|
options[:mach_kernel] = File.exist? File.join(installesd, "mach_kernel") if options[:mach_kernel].nil?
|
42
44
|
|
43
45
|
yield installesd if block_given?
|
@@ -46,24 +48,24 @@ module IESD
|
|
46
48
|
|
47
49
|
basesystem_options = options.clone
|
48
50
|
basesystem_options[:input] = basesystem_options[:output] = File.join(installesd, "BaseSystem.dmg")
|
49
|
-
basesystem_flags =
|
51
|
+
basesystem_flags = `/usr/bin/env ls -lO #{basesystem_options[:input].shellescape}`.split[4]
|
50
52
|
IESD::DMG::InstallESD::BaseSystem.new(File.join(basesystem_options[:input])).export(basesystem_options) { |basesystem|
|
51
53
|
installesd_mach_kernel = File.join installesd, "mach_kernel"
|
52
54
|
basesystem_mach_kernel = File.join basesystem, "mach_kernel"
|
53
55
|
if File.exist? installesd_mach_kernel
|
54
56
|
oh1 "Copying #{installesd_mach_kernel}"
|
55
|
-
system(
|
56
|
-
system(
|
57
|
+
system("/usr/bin/env", "ditto", installesd_mach_kernel, basesystem_mach_kernel)
|
58
|
+
system("/usr/bin/env", "chflags", "hidden", basesystem_mach_kernel)
|
57
59
|
puts "Copied: #{basesystem_mach_kernel}"
|
58
60
|
end
|
59
61
|
}
|
60
|
-
system(
|
62
|
+
system("/usr/bin/env", "chflags", basesystem_flags, basesystem_options[:output]) unless basesystem_flags == "-"
|
61
63
|
|
62
64
|
if File.exist? (kextcache = File.join(installesd, "kernelcache"))
|
63
65
|
IESD::DMG::InstallESD::BaseSystem.new(File.join(basesystem_options[:output])).show { |basesystem|
|
64
66
|
oh1 "Updating Kextcache"
|
65
|
-
system(
|
66
|
-
system(
|
67
|
+
system("/usr/bin/env", "ditto", File.join(basesystem, *KextCache::KERNELCACHE), kextcache)
|
68
|
+
system("/usr/bin/env", "chflags", "hidden", kextcache)
|
67
69
|
puts "Updated: #{kextcache}"
|
68
70
|
}
|
69
71
|
end
|
@@ -76,7 +78,7 @@ module IESD
|
|
76
78
|
HDIUtil.shell installesd
|
77
79
|
end
|
78
80
|
}
|
79
|
-
system(
|
81
|
+
system("/usr/bin/env", "mv", tmpfile, options[:output])
|
80
82
|
}
|
81
83
|
else
|
82
84
|
raise "invalid output type"
|
@@ -88,7 +90,7 @@ module IESD
|
|
88
90
|
def pre_update_extension volume_root, options
|
89
91
|
if !File.exist? (mach_kernel = File.join(volume_root, "mach_kernel")) and (options[:mach_kernel] or !options[:extensions][:up_to_date])
|
90
92
|
IESD::Packages::BaseSystemBinaries.new(File.join(volume_root, *PACKAGES, "BaseSystemBinaries.pkg")).extract_mach_kernel mach_kernel
|
91
|
-
system(
|
93
|
+
system("/usr/bin/env", "chflags", "hidden", mach_kernel)
|
92
94
|
end
|
93
95
|
end
|
94
96
|
|
@@ -97,7 +99,7 @@ module IESD
|
|
97
99
|
IESD::Packages::OSInstall.new(File.join(volume_root, *PACKAGES, "OSInstall.pkg")).postinstall_extensions options[:extensions]
|
98
100
|
end
|
99
101
|
if !options[:mach_kernel] and File.exist? (mach_kernel = File.join(volume_root, "mach_kernel"))
|
100
|
-
system(
|
102
|
+
system("/usr/bin/env", "rm", mach_kernel)
|
101
103
|
end
|
102
104
|
end
|
103
105
|
|
@@ -110,7 +112,7 @@ module IESD
|
|
110
112
|
|
111
113
|
def post_update_extension volume_root, options
|
112
114
|
if File.exist? (mach_kernel = File.join(volume_root, "mach_kernel"))
|
113
|
-
system(
|
115
|
+
system("/usr/bin/env", "rm", mach_kernel)
|
114
116
|
end
|
115
117
|
end
|
116
118
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "shellwords"
|
2
|
+
|
1
3
|
module IESD
|
2
4
|
class Packages
|
3
5
|
class BaseSystemBinaries < PKGUtil::PKG
|
@@ -6,18 +8,18 @@ module IESD
|
|
6
8
|
payload = "#{pkg}/Payload"
|
7
9
|
cpio = "#{payload}.cpio"
|
8
10
|
ohai "Unarchiving #{payload}"
|
9
|
-
case
|
11
|
+
case `/usr/bin/env file --brief --mime-type #{payload.shellescape}`.chomp
|
10
12
|
when "application/x-bzip2"
|
11
|
-
system(
|
12
|
-
system(
|
13
|
+
system("/usr/bin/env", "mv", payload, "#{cpio}.bz2")
|
14
|
+
system("/usr/bin/env", "bunzip2", "#{cpio}.bz2")
|
13
15
|
when "application/x-gzip"
|
14
|
-
system(
|
15
|
-
system(
|
16
|
+
system("/usr/bin/env", "mv", payload, "#{cpio}.gz")
|
17
|
+
system("/usr/bin/env", "gunzip", "#{cpio}.gz")
|
16
18
|
end
|
17
19
|
puts "Unarchived: #{cpio}"
|
18
20
|
ohai "Extracting /mach_kernel"
|
19
|
-
system("
|
20
|
-
system(
|
21
|
+
system("/usr/bin/env cpio -p -d -I #{cpio.shellescape} -- #{payload.shellescape} <<</mach_kernel >/dev/null 2>&1")
|
22
|
+
system("/usr/bin/env", "mv", "#{payload}/mach_kernel", output)
|
21
23
|
puts "Extracted: #{output}"
|
22
24
|
}
|
23
25
|
end
|
@@ -7,13 +7,19 @@ module IESD
|
|
7
7
|
script = File.join pkg, *%w{ Scripts postinstall_actions kext.tool }
|
8
8
|
File.open(script, "a+") { |f|
|
9
9
|
f.puts("#!/bin/sh")
|
10
|
-
extensions[:
|
11
|
-
f.puts(
|
12
|
-
f.puts("/bin/rm -rf
|
10
|
+
extensions[:uninstall].each { |kext|
|
11
|
+
f.puts(%Q{logger -p install.info "Uninstalling #{kext}"})
|
12
|
+
f.puts(%Q{/bin/test -e "$3%{extra_extensions_kext}" && /bin/rm -rf "$3%{extra_extensions_kext}" || /bin/rm -rf "$3%{extensions_kext}"} % {
|
13
|
+
:extensions_kext => "/System/Library/Extensions/#{kext}",
|
14
|
+
:extra_extensions_kext => "/Library/Extensions/#{kext}"
|
15
|
+
})
|
13
16
|
}
|
14
17
|
extensions[:install].each { |kext|
|
15
|
-
f.puts(
|
16
|
-
f.puts("/usr/bin/ditto
|
18
|
+
f.puts(%Q{logger -p install.info "Installing #{File.basename kext}"})
|
19
|
+
f.puts(%Q{/bin/test -e "%{extensions_kext}" && /usr/bin/ditto "%{extensions_kext}" "$3%{extensions_kext}" || /usr/bin/ditto "%{extra_extensions_kext}" "$3%{extra_extensions_kext}"} % {
|
20
|
+
:extensions_kext => "/System/Library/Extensions/#{File.basename kext}",
|
21
|
+
:extra_extensions_kext => "/Library/Extensions/#{File.basename kext}"
|
22
|
+
})
|
17
23
|
}
|
18
24
|
}
|
19
25
|
File.chmod(0755, script)
|
data/lib/iesd/utility.rb
CHANGED
@@ -1,18 +1 @@
|
|
1
|
-
require "tmpdir"
|
2
|
-
|
3
|
-
module Utility
|
4
|
-
BUNZIP2 = "/usr/bin/bunzip2"
|
5
|
-
CHFLAGS = "/usr/bin/chflags"
|
6
|
-
CPIO = "/usr/bin/cpio"
|
7
|
-
DITTO = "/usr/bin/ditto"
|
8
|
-
FILE = "/usr/bin/file"
|
9
|
-
GUNZIP = "/usr/bin/gunzip"
|
10
|
-
HDIUTIL = "/usr/bin/hdiutil"
|
11
|
-
KEXTCACHE = "/usr/sbin/kextcache"
|
12
|
-
LS = "/bin/ls"
|
13
|
-
MV = "/bin/mv"
|
14
|
-
PKGUTIL = "/usr/sbin/pkgutil"
|
15
|
-
RM = "/bin/rm"
|
16
|
-
end
|
17
|
-
|
18
1
|
Dir[File.join(File.dirname(__FILE__), "utility", "*.rb")].each { |rb| require rb }
|
data/lib/iesd/utility/hdiutil.rb
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
require "shellwords"
|
2
|
+
require "tmpdir"
|
3
|
+
require_relative "tty"
|
4
|
+
|
1
5
|
module HDIUtil
|
2
6
|
DEFAULT_MOUNT_OPTIONS = %w{ -nobrowse -quiet -noverify }
|
3
7
|
DEFAULT_MOUNT_OPTIONS.concat(%w{ -owners on }) if Process.uid == 0
|
@@ -27,11 +31,11 @@ module HDIUtil
|
|
27
31
|
Dir.mktmpdir { |tmp|
|
28
32
|
shadow = File.join(tmp, "#{File.basename input}.shadow")
|
29
33
|
shadow_options = ["-shadow", shadow]
|
30
|
-
format_options = ["-format",
|
34
|
+
format_options = ["-format", `/usr/bin/env hdiutil imageinfo -format #{input.shellescape}`.chomp]
|
31
35
|
Dir.mktmpdir(nil, tmp) { |mountpoint|
|
32
|
-
resize_limits =
|
36
|
+
resize_limits = `/usr/bin/env hdiutil resize -limits -shadow #{shadow.shellescape} #{input.shellescape}`.chomp.split.map { |s| s.to_i }
|
33
37
|
sectors = (resize_limits[1] + options[:resize][:grow]).to_s
|
34
|
-
system(
|
38
|
+
system("/usr/bin/env", "hdiutil", "resize", "-growonly", "-sectors", sectors, *shadow_options, input)
|
35
39
|
attach input, mountpoint, [*DEFAULT_MOUNT_OPTIONS, *shadow_options]
|
36
40
|
if block_given?
|
37
41
|
yield mountpoint
|
@@ -39,29 +43,29 @@ module HDIUtil
|
|
39
43
|
shell mountpoint
|
40
44
|
end
|
41
45
|
detach input, mountpoint, [*DEFAULT_UNMOUNT_OPTIONS]
|
42
|
-
system(
|
46
|
+
system("/usr/bin/env", "hdiutil", "resize", "-shrinkonly", "-sectors", "min", *shadow_options, input) if options[:resize][:shrink]
|
43
47
|
}
|
44
48
|
oh1 "Merging #{shadow}"
|
45
|
-
system(
|
49
|
+
system("/usr/bin/env", "hdiutil", "convert", *DEFAULT_CONVERT_OPTIONS, *format_options, *shadow_options, "-o", output, input)
|
46
50
|
puts "Merged: #{output}"
|
47
51
|
}
|
48
52
|
end
|
49
53
|
|
50
54
|
def self.validate input
|
51
|
-
Kernel.system(
|
55
|
+
Kernel.system(%Q{/usr/bin/env hdiutil imageinfo #{input.shellescape} >/dev/null 2>&1})
|
52
56
|
end
|
53
57
|
|
54
58
|
private
|
55
59
|
|
56
60
|
def self.attach dmg, mountpoint, arguments = []
|
57
61
|
ohai "Mounting #{dmg}"
|
58
|
-
system(
|
62
|
+
system("/usr/bin/env", "hdiutil", "attach", *arguments, "-mountpoint", mountpoint, dmg)
|
59
63
|
puts "Mounted: #{mountpoint}"
|
60
64
|
end
|
61
65
|
|
62
66
|
def self.detach dmg, mountpoint, arguments = []
|
63
67
|
ohai "Unmounting #{dmg}"
|
64
|
-
system(
|
68
|
+
system("/usr/bin/env", "hdiutil", "detach", *arguments, mountpoint)
|
65
69
|
puts "Unmounted: #{mountpoint}"
|
66
70
|
end
|
67
71
|
|
@@ -91,10 +95,10 @@ module HDIUtil
|
|
91
95
|
|
92
96
|
def update &block
|
93
97
|
Dir.mktmpdir { |tmp|
|
94
|
-
flags =
|
98
|
+
flags = `/usr/bin/env ls -lO #{@url.shellescape}`.split[4]
|
95
99
|
HDIUtil.write(@url, (tmpfile = File.join(tmp, File.basename(@url))), &block)
|
96
|
-
system(
|
97
|
-
system(
|
100
|
+
system("/usr/bin/env", "mv", tmpfile, @url)
|
101
|
+
system("/usr/bin/env", "chflags", flags, @url) unless flags == "-"
|
98
102
|
}
|
99
103
|
end
|
100
104
|
|
@@ -1,7 +1,10 @@
|
|
1
|
+
require_relative "tty"
|
2
|
+
|
1
3
|
module KextCache
|
2
4
|
KEXTCACHE_DEFAULT_OPTIONS = %w{ -v 0 -no-authentication }
|
3
5
|
|
4
6
|
EXTENSIONS = %w{ System Library Extensions }
|
7
|
+
EXTRA_EXTENSIONS = %w{ Library Extensions }
|
5
8
|
KERNELCACHE = %w{ System Library Caches com.apple.kext.caches Startup kernelcache }
|
6
9
|
MKEXT = %w{ System Library Caches com.apple.kext.caches Startup Extensions.mkext }
|
7
10
|
MKEXT_PPC = %w{ System Library Extensions.mkext }
|
@@ -9,16 +12,18 @@ module KextCache
|
|
9
12
|
def self.update_volume volume_root
|
10
13
|
oh1 "Updating Kextcache"
|
11
14
|
if File.exist? (mach_kernel = File.join(volume_root, "mach_kernel"))
|
15
|
+
extensions_path = [File.join(volume_root, *EXTENSIONS)]
|
16
|
+
extensions_path.push(File.join(volume_root, *EXTRA_EXTENSIONS)) if File.exist? File.join(volume_root, *EXTRA_EXTENSIONS)
|
12
17
|
case
|
13
18
|
when (File.exist? (url = File.join(volume_root, *KERNELCACHE)))
|
14
|
-
system(
|
19
|
+
system("/usr/bin/env", "kextcache", *KEXTCACHE_DEFAULT_OPTIONS, "-prelinked-kernel", url, "-kernel", mach_kernel, "-volume-root", volume_root, "--", *extensions_path)
|
15
20
|
when (File.exist? (url = File.join(volume_root, *MKEXT)))
|
16
|
-
system(
|
21
|
+
system("/usr/bin/env", "kextcache", *KEXTCACHE_DEFAULT_OPTIONS, *%w{ -a i386 -a x86_64 }, "-mkext", url, "-kernel", mach_kernel, "-volume-root", volume_root, "--", *extensions_path)
|
17
22
|
if File.exist? (mkext_ppc = File.join(volume_root, *MKEXT_PPC))
|
18
|
-
system(
|
23
|
+
system("/usr/bin/env", "ditto", url, mkext_ppc)
|
19
24
|
end
|
20
25
|
when (File.exist? (url = File.join(volume_root, *MKEXT_PPC)))
|
21
|
-
system(
|
26
|
+
system("/usr/bin/env", "ditto", *KEXTCACHE_DEFAULT_OPTIONS, *%w{ -a ppc -a i386 }, "-mkext", url, "-kernel", mach_kernel, "-volume-root", volume_root, "--", *extensions_path)
|
22
27
|
else
|
23
28
|
puts "kextcache aborted: unknown kernel cache type"
|
24
29
|
return
|
data/lib/iesd/utility/pkgutil.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require "tmpdir"
|
2
|
+
require_relative "tty"
|
3
|
+
|
1
4
|
module PKGUtil
|
2
5
|
def self.read input
|
3
6
|
Dir.mktmpdir { |tmp|
|
@@ -28,13 +31,13 @@ module PKGUtil
|
|
28
31
|
|
29
32
|
def self.expand pkg, dir
|
30
33
|
ohai "Expanding #{pkg}"
|
31
|
-
system(
|
34
|
+
system("/usr/bin/env", "pkgutil", "--expand", pkg, dir)
|
32
35
|
puts "Expanded: #{dir}"
|
33
36
|
end
|
34
37
|
|
35
38
|
def self.flatten dir, pkg
|
36
39
|
ohai "Flattening #{dir}"
|
37
|
-
system(
|
40
|
+
system("/usr/bin/env", "pkgutil", "--flatten", dir, pkg)
|
38
41
|
puts "Flattened: #{pkg}"
|
39
42
|
end
|
40
43
|
|
data/lib/iesd/utility/tty.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "shellwords"
|
2
|
+
|
1
3
|
module Tty extend self
|
2
4
|
def blue; bold 34; end
|
3
5
|
def white; bold 39; end
|
@@ -32,14 +34,6 @@ module Tty extend self
|
|
32
34
|
end
|
33
35
|
end
|
34
36
|
|
35
|
-
class Array
|
36
|
-
def shell_s
|
37
|
-
cp = dup
|
38
|
-
first = cp.shift
|
39
|
-
cp.map{ |arg| arg.gsub " ", "\\ " }.unshift(first) * " "
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
37
|
def ohai title, *sput
|
44
38
|
title = Tty.truncate(title) if $stdout.tty? && ENV['VERBOSE'].nil?
|
45
39
|
puts "#{Tty.blue}==>#{Tty.white} #{title}#{Tty.reset}"
|
@@ -67,7 +61,7 @@ def odie error
|
|
67
61
|
end
|
68
62
|
|
69
63
|
def system *args
|
70
|
-
abort "Failed during: #{args.
|
64
|
+
abort "Failed during: #{args.shelljoin}" unless Kernel.system *args
|
71
65
|
end
|
72
66
|
|
73
67
|
def sudo *args
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iesd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "なつき"
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Modify Extensions, Kextcache and Packages on InstallESD.
|
14
14
|
email: i@ntk.me
|