Root/
| |
---|---|
Source at commit 1165 created 13 years 10 days ago. By slice, new targets: make image and make pkg, Russian localization | |
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 |