Root/
| |
---|---|
Source at commit 1166 created 13 years 10 days ago. By meklort, Fixed recent Makefile changes. Please do not use /Users/evan/SourceCode/tmp/chameleon/trunk or VPATH. the *only* time you should use /Users/evan/SourceCode/tmp/chameleon/trunk is when setting the SRCROOT variable. Also note that very soon make pkg is going to be removed. The pkg build script in trunk is very out of date. Instead please use the package maker at http://forge.voodooprojects.org/p/chameleonApplications/. Once this is ready for trunk it will be merged. | |
1 | #!/bin/bash␊ |
2 | ␊ |
3 | ␊ |
4 | diskloader="boot0"␊ |
5 | partitionloader="boot1h"␊ |
6 | filesystemloader="boot"␊ |
7 | ␊ |
8 | diskmicrocodetype[1]="GRUB,47525542"␊ |
9 | diskmicrocodetype[2]="LILO,4c494c4f"␊ |
10 | ␊ |
11 | start ()␊ |
12 | {␊ |
13 | # 1 volume␊ |
14 | ␊ |
15 | bootvolume="${@}"␊ |
16 | bootresources="${0%/*}"␊ |
17 | ␊ |
18 | if [ -z "${bootvolume}" ]; then␊ |
19 | ␉echo␊ |
20 | ␉echo "Cannot find the volume. Exiting."␊ |
21 | ␉echo␊ |
22 | ␉exit␊ |
23 | fi␊ |
24 | ␊ |
25 | bootdev=$( df "${bootvolume}" | sed -n '2p' | awk '{print $1}' )␊ |
26 | bootrdev=${bootdev/disk/rdisk}␊ |
27 | ␊ |
28 | if [ "${bootdev}" = "${bootdev#*disk*s}" ]; then␊ |
29 | ␉echo␊ |
30 | ␉echo "ERROR Volume does not use slices."␊ |
31 | ␉echo␊ |
32 | ␉exit␉␉␉␉␊ |
33 | fi␊ |
34 | ␊ |
35 | bootdisk=${bootdev%s*}␊ |
36 | bootrdisk=${bootdisk/disk/rdisk}␊ |
37 | bootslice=${bootdev#*disk*s}␊ |
38 | ␊ |
39 | echo "Volume is ${bootvolume}"␊ |
40 | echo "Volume device is ${bootdev}"␊ |
41 | echo "Volume raw device is ${bootrdev}"␊ |
42 | echo "Volume slice is ${bootslice}"␊ |
43 | echo "Disk device is ${bootdisk}"␊ |
44 | echo "Disk raw device is ${bootrdisk}"␊ |
45 | echo "Disk loader is ${diskloader}"␊ |
46 | echo "Partition loader is ${partitionloader}"␊ |
47 | echo "Filesystem loader is ${filesystemloader}"␊ |
48 | echo "Boot Resources is ${bootresources}"␊ |
49 | ␊ |
50 | }␊ |
51 | ␊ |
52 | checkdiskmicrocodetype ()␊ |
53 | {␊ |
54 | diskmicrocode=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
55 | ␊ |
56 | diskmicrocodetypecounter=0␊ |
57 | while [ ${diskmicrocodetypecounter} -lt ${#diskmicrocodetype[@]} ]; do␊ |
58 | diskmicrocodetypecounter=$(( ${diskmicrocodetypecounter} + 1 ))␊ |
59 | diskmicrocodetypeid=${diskmicrocodetype[${diskmicrocodetypecounter}]#*,}␊ |
60 | if [ ! "${diskmicrocode}" = "${diskmicrocode/${diskmicrocodetypeid}/}" ]; then␊ |
61 | echo "${diskmicrocodetype[${diskmicrocodetypecounter}]%,*} found."␊ |
62 | fi␊ |
63 | done␊ |
64 | }␊ |
65 | ␊ |
66 | checkdiskmicrocode ()␊ |
67 | {␊ |
68 | # 1 action ( check or set )␊ |
69 | ␊ |
70 | diskmicrocode=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
71 | diskmicrocodemd5=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=1 bs=437 | md5 )␊ |
72 | ␊ |
73 | if [ $( echo "${diskmicrocode}" | awk -F0 '{print NF-1}' ) = 874 ]; then␊ |
74 | ␉if [ "${1}" = "set" ]; then␊ |
75 | ␉␉echo "No disk microcode found. Updating."␊ |
76 | ␉␉diskupdate=true␊ |
77 | ␉else␊ |
78 | ␉␉echo "No disk microcode found."␊ |
79 | ␉fi␊ |
80 | else␊ |
81 | ␉if [ ${1} = set ]; then␊ |
82 | ␉␉echo "Disk microcode found. Preserving."␊ |
83 | ␉else␊ |
84 | ␉␉echo "Disk microcode found."␊ |
85 | ␉fi␊ |
86 | ␉echo "Disk microcode MD5 is ${diskmicrocodemd5}"␊ |
87 | fi␊ |
88 | }␊ |
89 | ␊ |
90 | checkdisksignature ()␊ |
91 | {␊ |
92 | disksignature=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=4 bs=1 skip=440 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
93 | ␊ |
94 | if [ $( echo "${disksignature}" | awk -F0 '{print NF-1}' ) = 8 ]; then␊ |
95 | ␉echo "No disk signature found."␊ |
96 | else␊ |
97 | ␉echo "Disk signature found."␊ |
98 | ␉echo "Disk signature is 0x${disksignature}"␊ |
99 | fi␊ |
100 | }␊ |
101 | ␊ |
102 | checkpartitionbootcode ()␊ |
103 | {␊ |
104 | # 1 action ( check or set )␊ |
105 | ␊ |
106 | partitionbootcode=$( dd if=${bootrdev} count=1 2>/dev/null | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
107 | partitionbootcodeextended=$( dd if=${bootrdev} count=1 skip=1 2>/dev/null | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
108 | ␊ |
109 | if [ $( echo "${partitionbootcode}" | awk -F0 '{print NF-1}' ) = 1024 ]; then␊ |
110 | ␉if [ "${1}" = "set" ]; then␊ |
111 | ␉␉echo "No partition bootcode found. Updating."␊ |
112 | ␉else␊ |
113 | ␉␉echo "No partition bootcode found."␊ |
114 | ␉fi␊ |
115 | else␊ |
116 | ␉if [ "${1}" = "set" ]; then␊ |
117 | ␉␉echo "Partition bootcode found. Overwriting."␊ |
118 | ␉else␊ |
119 | ␉␉echo "Partition bootcode found."␊ |
120 | ␉fi␊ |
121 | ␉if [ $( echo "${partitionbootcodeextended}" | awk -F0 '{print NF-1}' ) = 1024 ]; then␊ |
122 | ␉␉partitionbootcodemd5=$( dd 2>/dev/null if=${bootrdev} count=1 | md5 )␊ |
123 | ␉else␊ |
124 | ␉␉partitionbootcodemd5=$( dd 2>/dev/null if=${bootrdev} count=2 | md5 )␊ |
125 | ␉␉echo "Partition bootcode is dual sector."␊ |
126 | ␉fi␊ |
127 | ␉echo "Partition bootcode MD5 is ${partitionbootcodemd5}"␊ |
128 | fi␊ |
129 | }␊ |
130 | ␊ |
131 | checkpartitionactive ()␊ |
132 | {␊ |
133 | partitionactive=$( fdisk -d ${bootrdisk} | grep -n "*" | awk -F: '{print $1}')␊ |
134 | ␊ |
135 | if [ -n "${partitionactive}" ]; then ␊ |
136 | ␉echo "Partition flagged active is ${partitionactive}"␊ |
137 | else␊ |
138 | ␉echo "No partition flagged active."␊ |
139 | fi␊ |
140 | ␊ |
141 | }␊ |
142 | ␊ |
143 | start ${3}␊ |
144 | ␊ |
145 | #partitiontable=$( diskutil list ${bootdisk} | sed -n '3p' | awk '{print $2}' )␊ |
146 | #[ "${partitiontable}" = "GUID_partition_scheme" ] && echo "GPT found."␊ |
147 | #[ "${partitiontable}" = "FDisk_partition_scheme" ] && echo "MBR found."␊ |
148 | #[ "${partitiontable}" = "Apple_partition_scheme" ] && echo "APT found." && exit␊ |
149 | ␊ |
150 | partitiontable=$( dd 2>/dev/null if=${bootdisk} count=1 skip=1 | dd 2>/dev/null count=8 bs=1 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
151 | if [ "${partitiontable:0:16}" == "4546492050415254" ]; then␉␊ |
152 | ␉partitiontable=$( dd 2>/dev/null if=${bootdisk} count=1 | dd 2>/dev/null count=64 bs=1 skip=446 | perl -ne '@a=split"";for(@a){printf"%02x",ord}' )␊ |
153 | ␉if [ "${partitiontable:8:2}" == "ee" ]; then␊ |
154 | ␉␉if [ "${partitiontable:40:2}" == "00" ] && [ "${partitiontable:72:2}" == "00" ] && [ "${partitiontable:104:2}" == "00" ]; then␊ |
155 | ␉␉␉partitiontable="GPT"␊ |
156 | ␉ ␉else␊ |
157 | ␉␉␉partitiontable="GPT/MBR"␊ |
158 | ␉␉fi␊ |
159 | ␉fi␊ |
160 | else␊ |
161 | ␉partitiontable="MBR"␊ |
162 | fi␊ |
163 | ␊ |
164 | echo "${partitiontable} found."␊ |
165 | ␊ |
166 | diskupdate=false␊ |
167 | ␊ |
168 | checkdiskmicrocodetype␊ |
169 | checkdiskmicrocode set␊ |
170 | checkdisksignature␊ |
171 | checkpartitionbootcode set␊ |
172 | checkpartitionactive␊ |
173 | ␊ |
174 | if ${diskupdate}; then␊ |
175 | ␉echo "Executing command: fdisk -u -f /usr/standalone/i386/${diskloader} -y ${bootdisk}"␊ |
176 | ␉fdisk -u -f "${bootvolume}/usr/standalone/i386/${diskloader}" -y ${bootdisk}␊ |
177 | fi␊ |
178 | ␊ |
179 | echo "Executing command: dd if=/usr/standalone/i386/${partitionloader} of=${bootrdev}"␊ |
180 | dd if="${bootvolume}/usr/standalone/i386/${partitionloader}" of=${bootrdev}␊ |
181 | ␊ |
182 | echo "Executing command: cp /usr/standalone/i386/${filesystemloader} ${bootvolume}"␊ |
183 | cp "${bootvolume}/usr/standalone/i386/${filesystemloader}" "${bootvolume}"␊ |
184 | ␊ |
185 | echo "Executing command: ${bootresources}/Tools/SetFile -a V ${bootvolume}/${filesystemloader}"␊ |
186 | "${bootresources}/Tools/SetFile" -a V "${bootvolume}/${filesystemloader}"␊ |
187 | ␊ |
188 | # If table is GPT make the first partition active (BadAxe compatibility).␊ |
189 | [ "${partitiontable}" = "GPT" ] && bootslice=1␊ |
190 | fdisk -e ${bootdisk} <<-MAKEACTIVE␊ |
191 | print␊ |
192 | flag ${bootslice}␊ |
193 | write␊ |
194 | y␊ |
195 | quit␊ |
196 | MAKEACTIVE␊ |
197 | ␊ |
198 | checkdiskmicrocode check␊ |
199 | checkdisksignature␊ |
200 | checkpartitionbootcode check␊ |
201 | checkpartitionactive␊ |
202 | ␊ |
203 | if ! [ -d "${bootvolume}/Extra/Extensions" ]; then␊ |
204 | ␉echo "Executing command: mkdir -p ${bootvolume}/Extra/Extensions"␊ |
205 | ␉mkdir -p "${bootvolume}/Extra/Extensions"␊ |
206 | fi␊ |
207 | # unpack any existing Extensions.mkext already on the booter volume␊ |
208 | if [ -f "${2}/Extra/Extensions.mkext" ]; then␊ |
209 | ␉echo "Executing command: mkextunpack -d ${2}/Extra/Extensions ${2}/Extra/Extensions.mkext"␊ |
210 | ␉mkextunpack -d "${2}/Extra/Extensions" "${2}/Extra/Extensions.mkext"␊ |
211 | ␉echo "Executing command: rm -R -f ${2}/Extra/Extensions.mkext"␊ |
212 | ␉rm -R -f "${2}/Extra/Extensions.mkext"␊ |
213 | fi␉␊ |
214 | ␊ |
215 | # setup link for extras␊ |
216 | [ -h "${2}/.Chameleon" ] && unlink "${2}/.Chameleon"␊ |
217 | echo "Executing command: ln -s . ${2}/.Chameleon"␊ |
218 | ln -s "." "${2}/.Chameleon"␊ |
219 | ␊ |
220 | exit␊ |
221 |