1 | #!/bin/sh |
---|
2 | # |
---|
3 | # MondoRescue script: format-and-kludge-vfat |
---|
4 | # |
---|
5 | # $1 = device, e.g. /dev/hda1 |
---|
6 | # |
---|
7 | # This script requires parted and ms-sys |
---|
8 | # |
---|
9 | |
---|
10 | LogIt() { |
---|
11 | echo "$1" >> /dev/stderr |
---|
12 | } |
---|
13 | |
---|
14 | |
---|
15 | ExitHere() { |
---|
16 | echo "Exiting here for testing. " |
---|
17 | exit 1 |
---|
18 | } |
---|
19 | |
---|
20 | Die() { |
---|
21 | LogIt "(format-and-kludge-vfat) $1" 1 |
---|
22 | cat /tmp/fakv.log |
---|
23 | exit 1 |
---|
24 | } |
---|
25 | |
---|
26 | GetPartitionFdiskType() { |
---|
27 | local drive device ftype |
---|
28 | device=$1 |
---|
29 | drive=$2 |
---|
30 | ftype=`parted2fdisk -l $drive 2>/dev/null | grep $device | tr '*' ' ' | tr -s '\t' ' ' | cut -d' ' -f5` |
---|
31 | case $ftype in |
---|
32 | # "b" | "c") |
---|
33 | # the above is correct but mondorestore creates partition with FAT12, so: |
---|
34 | "b" | "c" | "1") |
---|
35 | echo "fat32" |
---|
36 | ;; |
---|
37 | "4" | "e") |
---|
38 | echo "fat16" |
---|
39 | ;; |
---|
40 | *) |
---|
41 | Die "Error: Unsuitable partition type $ftype (or device $device doesn't exist)" |
---|
42 | ;; |
---|
43 | esac |
---|
44 | exit 0 |
---|
45 | } |
---|
46 | |
---|
47 | |
---|
48 | # -------------- main ------------ |
---|
49 | |
---|
50 | LogIt "format-and-kludge-vfat --- starting" |
---|
51 | |
---|
52 | touch /tmp/fakv.log |
---|
53 | |
---|
54 | if [ "$#" -eq "2" ] ; then |
---|
55 | LogIt "Note: Script called with two parameters. Only one needed - the device." 1 |
---|
56 | LogIt " Embleer files are gorn - please ask DevTeam to update his code. ;-)" 1 |
---|
57 | elif [ "$#" -ne "1" ] ; then |
---|
58 | LogIt "Usage: format-and-kludge-vfat <device>" 1 |
---|
59 | exit 1 |
---|
60 | fi |
---|
61 | |
---|
62 | retval=0 |
---|
63 | |
---|
64 | device=$1 |
---|
65 | echo $device | grep -Eq "/cciss/|/mapper/|/ida/" |
---|
66 | if [ $? -eq "0" ]; then |
---|
67 | drive=`echo $device | sed s/[0-9p]*[0-9]//` |
---|
68 | else |
---|
69 | drive=`echo $drive | sed s/[0-9]*[0-9]//` |
---|
70 | fi |
---|
71 | partition=`echo $device | sed s\%$drive\%\%` |
---|
72 | |
---|
73 | type=`GetPartitionFdiskType $device $drive` |
---|
74 | res=$? |
---|
75 | retval=$(($retval+$res)) |
---|
76 | if [ "$res" -ne "0" ]; then |
---|
77 | exit 1 |
---|
78 | fi |
---|
79 | LogIt "Formatting device $device (drive $drive, partition $partition, type $type)" 2 |
---|
80 | parted $drive mkfs $partition $type 2> /tmp/fakv.log > /dev/null |
---|
81 | res=$? |
---|
82 | retval=$(($retval+$res)) |
---|
83 | if [ "$res" -ne "0" ]; then |
---|
84 | LogIt "Errors occurred while formatting $device!" 1 |
---|
85 | cat /tmp/fakv.log |
---|
86 | exit 1 |
---|
87 | fi |
---|
88 | if [ "$device" != "/dev/hda1" ] && [ "$device" != "/dev/sda1" ] ; then |
---|
89 | LogIt "OK, this is not /dev/hda1 or /dev/sda1; so, I shan't kludge it." 1 |
---|
90 | exit 0 |
---|
91 | fi |
---|
92 | LogIt "Setting the boot flag for $device" 2 |
---|
93 | parted $drive set $partition boot on 2> /tmp/fakv.log > /dev/null |
---|
94 | res=$? |
---|
95 | retval=$(($retval+$res)) |
---|
96 | if [ "$res" -ne "0" ]; then |
---|
97 | LogIt "Errors occurred while setting the boot flag for $device!" 1 |
---|
98 | cat /tmp/fakv.log |
---|
99 | exit 1 |
---|
100 | fi |
---|
101 | if [ "`uname -m`" != "ia64" ] ; then |
---|
102 | LogIt "Fixing the boot block of $device with ms-sys" 2 |
---|
103 | ms-sys -w $device 2> /tmp/fakv.log > /dev/null |
---|
104 | res=$? |
---|
105 | retval=$(($retval+$res)) |
---|
106 | if [ "$res" -ne "0" ]; then |
---|
107 | LogIt "Errors occurred while fixing the boot block of $device!" 1 |
---|
108 | cat /tmp/fakv.log |
---|
109 | exit 1 |
---|
110 | fi |
---|
111 | fi |
---|
112 | [ ! -e "/mnt/tmpK" ] && mkdir /mnt/tmpK |
---|
113 | mount $device -t vfat /mnt/tmpK || Die "Can't mount device $device" |
---|
114 | size=`df -m -P /mnt/tmpK | tr -s ' ' ' ' | cut -d' ' -f2 | tail -n 1` |
---|
115 | umount /mnt/tmpK || Die "Can't unmount /mnt/tmpK" |
---|
116 | |
---|
117 | ideal_size=`grep "$device " /tmp/mountlist.txt | tr -s ' ' ' ' | cut -d' ' -f4` |
---|
118 | if [ "$ideal_size" = "" ]; then |
---|
119 | LogIt "format-and-kludge-vfat --- can't find $device in mountlist" 1 |
---|
120 | exit 0 |
---|
121 | fi |
---|
122 | LogIt "ideal_size = $ideal_size" 2 |
---|
123 | ideal_size=$(($ideal_size/1024)) |
---|
124 | difference=$(($ideal_size-$size)) |
---|
125 | [ "$difference" -lt "0" ] && difference=$(((-1)*$difference)) |
---|
126 | LogIt "ideal_size=$ideal_size; size=$size; difference=$difference" |
---|
127 | if [ "$difference" -gt "64" ] ; then |
---|
128 | retval=$(($retval+1)) |
---|
129 | LogIt "(format-and-kludge-vfat-new) Size mismatch. Did kludge work?" 1 |
---|
130 | else |
---|
131 | LogIt "Size matches. (Well, nearly.) Good." 2 |
---|
132 | fi |
---|
133 | |
---|
134 | if [ "$retval" -eq "0" ] ; then |
---|
135 | LogIt "$device was successfully formatted and prepared" 1 |
---|
136 | else |
---|
137 | LogIt "$device failed to be formatted and prepared" 1 |
---|
138 | cat /tmp/fakv.log |
---|
139 | fi |
---|
140 | LogIt "(by format-and-kludge-vfat)" |
---|
141 | |
---|
142 | LogIt "format-and-kludge-vfat --- leaving (retval=$retval)" |
---|
143 | exit $retval |
---|