1# 2# BuildAsset.rb 3# CertificateTool 4# 5# Copyright 2012 Apple Inc. All rights reserved. 6# 7 8require 'FileUtils' 9 10class BuildPKIAsset 11 attr_reader :ios_SDK_path 12 attr_reader :base_path 13 attr_reader :output_directory 14 attr_reader :asset_directory 15 attr_reader :asset_top_directory 16 attr_reader :asset_data_directory 17 attr_reader :staging_directory 18 attr_reader :info_plist_path 19 attr :verbose 20 21 def validate_path(path, isDir = true) 22 return false if path.nil? || path.empty? 23 return false if !FileTest.exists?(path) 24 return false if isDir != FileTest.directory?(path) 25 true 26 end 27 28 def output_str(str, header = false) 29 return if !@verbose 30 31 puts "=====================================================" if header 32 puts str if !str.nil? 33 end 34 35 def ensure_directory(path) 36 FileUtils.mkdir_p path if !validate_path(path) 37 validate_path(path) 38 end 39 40 41 def initialize(input_dir, output_directory, project_path, staging_directory, verbose = false) 42 43 @verbose = verbose 44 45 output_str(nil, true) 46 output_str "In BuildPKIAsset.initialize" 47 output_str "input_dir = #{input_dir}" 48 output_str "output_directory = #{output_directory}" 49 output_str "staging_directory = #{staging_directory}" 50 output_str(nil, true) 51 output_str( " ") 52 53 # Check the input parameter 54 if !ensure_directory(input_dir) 55 puts "Invalid base directory given: #{input_dir}" 56 exit 57 end 58 59 @base_path = File.expand_path(input_dir) 60 61 @info_plist_path = File.join(File.join(File.expand_path(project_path), "CertificateTool"), "Info.plist") 62 63 if !FileTest.exists? @info_plist_path 64 puts "Could not find the Info.plist file" 65 exit 66 end 67 68 69 if output_directory.nil? || output_directory.empty? 70 puts "No output directory was given" 71 exit 72 end 73 74 asset_tool_path = `xcodebuild -sdk iphoneos.internal -find assettool` 75 if asset_tool_path.nil? 76 puts "Unable to find the mobile asset tool in the iPhone SDK" 77 exit 78 end 79 80 81 @output_directory = File.expand_path(output_directory) 82 83 @asset_directory = File.join(@output_directory, "Assets") 84 ensure_directory(@asset_directory) 85 86 @asset_top_directory = File.join(@asset_directory, "SecurityCertificatesAssets") 87 ensure_directory(@asset_top_directory) 88 89 @asset_data_directory = File.join(@asset_top_directory, "AssetData/PKITrustData") 90 ensure_directory(@asset_data_directory) 91 92 @staging_directory = File.expand_path(staging_directory) 93 ensure_directory(@staging_directory) 94 95 96 output_str(nil, true) 97 output_str "@base_path = #{@base_path }" 98 output_str "@output_directory = #{@output_directory }" 99 output_str "@asset_directory = #{@asset_directory }" 100 output_str "@asset_top_directory = #{@asset_top_directory }" 101 output_str "@asset_data_directory = #{@asset_data_directory }" 102 output_str "@staging_directory = #{@staging_directory }" 103 output_str "@info_plist_path = #{@info_plist_path}" 104 output_str "Done with BuildPKIAsset.initialize" 105 output_str(nil, true) 106 output_str( " ") 107 108 end 109 110 def stage 111 112 output_str(nil, true) 113 output_str "In BuildPKIAsset.stage" 114 output_str(nil, true) 115 output_str( " ") 116 117 #copy over the files into the asset directory 118 input_plist_file_path = @info_plist_path 119 120 output_str(nil, true) 121 output_str "input_plist_file_path = #{input_plist_file_path}" 122 123 FileUtils.cp(input_plist_file_path, @asset_top_directory) 124 125 output_str "About to copy over the plist files" 126 127 # copy all of the necessary files into the asset data directory 128 file_list = %w(AppleESCertificates.plist AssetVersion.plist Blocked.plist GrayListedKeys.plist EVRoots.plist certsIndex.data certsTable.data manifest.data) 129 file_list.each do |file| 130 file_path = File.join(@base_path, file) 131 if !FileTest.exists?(file_path) 132 output_str(nil, true) 133 output_str( " ") 134 puts "#{file_path} is missing in the base directory" 135 exit 136 end 137 FileUtils.cp(file_path, @asset_data_directory) 138 end 139 140 output_str "Completed copying over the plist files" 141 142 output_str "About to call assettool stage" 143 `xcrun -sdk iphoneos.internal assettool stage -p #{@asset_directory} -s #{@staging_directory}` 144 output_str "Completed call to assettool stage" 145 output_str(nil, true) 146 output_str( " ") 147 148 output_str(nil, true) 149 output_str "Done with BuildPKIAsset.stage" 150 output_str(nil, true) 151 output_str( " ") 152 end 153 154 def sign 155 output_str(nil, true) 156 output_str "In BuildPKIAsset.sign" 157 output_str "About to call assettool sign" 158 `xcrun -sdk iphoneos.internal assettool sign -s #{@staging_directory}` 159 output_str "Completed call to assettool sign" 160 output_str "Done with BuildPKIAsset.sign" 161 output_str(nil, true) 162 output_str( " ") 163 end 164 165end 166 167@verbose = false 168 169def do_output_str(str, header = false) 170 return if !@verbose 171 172 puts "=====================================================" if header 173 puts str if !str.nil? 174end 175 176build_dir = ENV["BUILT_PRODUCTS_DIR"] 177project_dir = ENV["PROJECT_DIR"] 178 179do_output_str "Environment variables" 180do_output_str " " 181do_output_str "build_dir = #{build_dir}" 182do_output_str "project_dir = #{project_dir}" 183do_output_str(nil, true) 184do_output_str(" ") 185 186input_path = File.join(build_dir, "asset_out") 187output_path = File.join(build_dir, "Asset") 188staging_path = File.join(build_dir, "staging") 189asset_name = "com_apple_MobileAsset_PKITrustServices_PKITrustData" 190full_asset_path = File.join(staging_path, asset_name) 191 192do_output_str(nil, true) 193do_output_str "Path variables" 194do_output_str " " 195do_output_str "input_path = #{input_path}" 196do_output_str "output_path = #{output_path}" 197do_output_str "staging_path = #{staging_path}" 198do_output_str "full_asset_path = #{full_asset_path}" 199do_output_str(nil, true) 200do_output_str(" ") 201 202do_output_str(nil, true) 203do_output_str "Creating a BuildPKIAsset object to stage and sign the asset" 204b = BuildPKIAsset.new(input_path, output_path, project_dir, staging_path, @verbose) 205b.stage 206b.sign 207 208do_output_str "Finished with BuildAsset" 209do_output_str(nil, true) 210do_output_str(" ") 211 212do_output_str(nil, true) 213do_output_str "Output Path variables" 214do_output_str(" ") 215do_output_str "build_dir = #{build_dir}" 216do_output_str "full_asset_path = #{full_asset_path}" 217 218#FileUtils.cp_r(full_asset_path, build_dir) 219 220do_output_str "That's all folks!" 221do_output_str(nil, true) 222do_output_str(" ")