source: MondoRescue/branches/stable/mindi/mindi@ 960

Last change on this file since 960 was 960, checked in by Bruno Cornec, 17 years ago

Removal of FDISKLOG

  • Property svn:keywords set to Rev Id
File size: 106.4 KB
RevLine 
[747]1#!/bin/bash
2
3# $Id: mindi 960 2006-11-23 10:19:43Z bruno $
4#
5#-----------------------------------------------------------------------------
6# mindi - mini-Linux distro based on the user's filesystem & distribution
7#
8# Mindi can create a multi-floppy boot/root kit. The first floppy is the boot
9# disk: it contains a kernel, a ramdisk etc. The second disk is data disk #1;
10# the third disk is data disk #2; and so it goes.
11#
12# See http://www.mondorescue.org for details.
13#-----------------------------------------------------------------------------
14
15### Which arch are we on (useful for ia64 port)
[925]16ARCH=`/bin/arch`
[747]17
18ADDITIONAL_BOOT_PARAMS="acpi=off apm=off devfs=nomount noresume selinux=0 barrier=off"
19
[925]20#RUN_AFTER_INITIAL_BOOT_PHASE="echo \"Who lives in a pineapple under the sea?\" > /tmp/spongebob.squarepants.txt"
[747]21 # after booting from floppy/CD image but before
22 # accessing auxiliary data disks (or the rest of
23 # the CD), the initscript will run the above command.
24
25RUN_AFTER_BOOT_PHASE_COMPLETE="ide-opt"
26 # after the emergency boot process is complete but
27 # before the init script runs mondorestore, it will
28 # run this command.
29
30MINDI_REV=RRR
31MINDI_VER=VVV
32
33MINDI_VERSION=${MINDI_VER}-r$MINDI_REV
34MINDI_PREFIX=XXX
35MINDI_CONF=YYY
36MINDI_SBIN=${MINDI_PREFIX}/sbin
[934]37MINDI_LIB=LLL
[747]38
[925]39# Temporary directory for mindi
40TMPDIR=/tmp
41
[747]42EXTRA_SPACE=24576 ; # increase if you run out of ramdisk space
43IA64_BOOT_SIZE=8192 ; # size of the ia64 boot disk
44WRITE_BOOT_FLOPPIES="yes" ; # do you want to be propted to write floppy images
45PROMPT_WRITE_BOOT_FLOPPIES="yes"
46 # do you want to be prompted to write
47 # floppy images out to floppy disks?
48 # if 'no', images will not be written to floppies
49
50PROMPT_MAKE_CD_IMAGE="yes"
51 # Ask if you want to make a CD Image to be written?
52 # if this is set to 'no', then the image will be created automatically
53
54USE_OWN_KERNEL="no"
55 # If set to "no", you will be prompted for whether or not
56 # you want to use your own kernel, or the supplied default.
57 # If "yes" mindi will automatically use your own kernel.
[925]58
[747]59MY_FSTAB=/etc/fstab
60FLOPPY_MODS="ide-floppy floppy"
61TAPE_MODS="ht st osst ide-tape ide_tape"
62SCSI_MODS="3w-xxxx 53c7,8xx a100u2w a320raid aacraid advansys aha152x aha1542 aha1740 aic79xx aic79xx_mod aic7xxx aic7xxx_mod aic7xxx_old AM53C974 atp870u BusLogic cciss cpqfc dmx3191d dpt_i2o dtc eata eata_dma eata_pio fdomain gdth g_NCR5380 i2o_block i2o_core ide-scsi ieee1394 imm in2000 initio ips iscsi isp megaraid mptbase mptscsih NCR53c406a ncr53c8xx nsp32 pas16 pci2000 pci2220i pcmcia ppa psi240i qla1280 qla2200 qla2300 qlogicfas qlogicfc qlogicisp raw1394 scsi_debug scsi_mod sd_mod seagate sg sim710 sr_mod sym53c416 sym53c8xx sym53c8xx_2 t128 tmscsim u14-34f ultrastor wd7000 vmhgfs"
63
64# ide-probe-mod
65IDE_MODS="ide ide-generic ide-detect ide-mod ide-disk ide-cd ide_cd ide-cs ide-core ide_core libata edd paride ata_piix libata via82cxxx generic"
66PCMCIA_MODS="pcmcia_core ds yenta_socket"
[854]67USB_MODS="usb-storage usb-ohci usb-uhci usbcore usb_storage hid uhci_hcd ehci_hcd uhci-hcd ehci-hcd usbkbd usbhid"
[747]68CDROM_MODS="$TAPE_MODS $FLOPPY_MODS $IDE_MODS af_packet cdrom isocd isofs inflate_fs nls_iso8859-1 nls_cp437 sg sr_mod zlib_inflate $USB_MODS $PCMCIA_MODS"
[766]69NET_MODS="sunrpc nfs nfs_acl lockd loop mii 3c59x e100 bcm5700 bnx2 e1000 eepro100 ne2k-pci tg3 pcnet32 8139cp 8139too 8390 vmxnet"
[747]70EXTRA_MODS="$CDROM_MODS vfat fat loop md-mod linear raid0 raid1 xor raid5 lvm-mod dm-mod jfs xfs xfs_support pagebuf reiserfs ext2 ext3 minix nfs nfs_acl nfsd lockd sunrpc jbd"
[925]71
[747]72LOGFILE=/var/log/mindi.log
73FDDEVICE=/dev/fd0 ; # 1.44MB floppy #0
[925]74CACHE_LOC=/var/cache/mindi
[747]75FORCE_DUAL_FLOPPIES=no
76BOOT_MEDIA_MESSAGE="\
77To format and restore all files automatically, type 'nuke' <enter>.\n\
78To restore some/all files interactively, type 'interactive' <enter>.\n\
79To compare the archives with your filesystem, type 'compare' <enter>.\n\
80To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
81You may add one or more of the following parameters as well:-\n\n\
82 donteject - mondorestore will not eject the CD; this is useful if, for\n\
83 instance, your PC's case has a concealed CD-ROM drive\n\
84 noresize - your mountlist will not be adjusted to use your unallocated\n\
85 hard disk space\n\
86 textonly - do not call any Newt library routines; this is unattractive\n\
87 but valuable if you find your Newt library has bugs in it\n\n\
88e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
89a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
90"
[925]91FDISK=$MINDI_SBIN/parted2fdisk
[747]92
[925]93# Using a config file allow to overwrite some values
94MINDI_CONFIG="$MINDI_CONF/mindi.conf"
95if [ -f $MINDI_CONFIG ]; then
96 . $MINDI_CONFIG
97fi
98
99# Now we can create what we nedd
[940]100MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
101mkdir -p $MINDI_TMP
102
103# Purge from potential old run
104rm -rf $CACHE_LOC/* 2> /dev/null
[925]105mkdir -p $CACHE_LOC
[747]106# ----------------------------------------------------------------------------
107
108
109AbortHere() {
110 [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
111 Die "Program is terminating in response to signal received from OS/user"
112}
113
114
115HackSyslinuxFile() {
116 local incoming
117 incoming=`ReadLine`
118 while [ "$incoming" ] ; do
119 echo -en "$incoming" | sed s/24000/$1/
120 if [ "`echo "$incoming" | grep append`" ] ; then
121 echo -en " $ADDITIONAL_BOOT_PARAMS"
122 fi
123 echo -en "\n"
124 incoming=`ReadLine`
125 done
126 if [ -e "$MINDI_LIB/memtest.img" ] ; then
127 echo -en "label memtest\n kernel memdisk\n append initrd=memtest.img\n\n"
128 fi
129}
130
131
132AbortIfYourDistroIsAPieceOfStercus() {
133 which which > /dev/null 2> /dev/null || Die "Please install 'which'."
134 which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
135 which gawk > /dev/null 2> /dev/null || Die "Gawk is missing from your computer. Please install gawk. You may find the package on Debian's website. How did I know you're running Debian? Because only Debian would be stupid enough not to include gawk in your distribution."
136 which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
137 if which awk &> /dev/null ; then
[925]138 if ! which gawk &> /dev/null ; then
139 LogIt "You have awk but not gawk.\nPlease note that mindi works fine with a _sane_ awk binary.\nIf your awk binary misbehaves then please contact your vendor\nor distribution's mailing list for technical support.\n"
140 fi
[747]141 fi
142 which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
143 [ ! -e "$FDISK" ] && Die "Cannot find (s)fdisk"
144}
145
146
147AbortIfMkfsVfatMissing() {
148 #if grep -F "vfat" /etc/fstab &> /dev/null ; then
149 if ! which mkfs.vfat &> /dev/null ; then
150 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
151 fi
152 #fi
153}
154
155
156Aborted() {
157 trap SIGHUP SIGTERM SIGTRAP SIGINT
[925]158 [ "$CACHE_LOC" != "" ] && rm -f $CACHE_LOC/mindi*img $CACHE_LOC/*gz $CACHE_LOC/mindi.iso
[747]159 [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
160 Die "User abort."
161}
162
163
164AddFileToCfgIfExists() {
165 [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
166}
167
168
169AddFileToDir() {
170 local filename minidir_root noof_disks diskno res filesize disksize would_occupy zipsize complevel cutoff compressed_fname siz
171 filename=$1
172 minidir_root=$2
173 noof_disks=$3
174
175 diskno=$noof_disks
176 mkdir -p $minidir_root/$diskno
177 [ "$LAST_COMPRESSED_SIZE" = "" ] && LAST_COMPRESSED_SIZE=0
178 if [ ! -e "$filename" ] ; then
[925]179 if [ -h "$filename" ] ; then
180 cp --parents -pRdf $filename $minidir_root/$diskno
181 return $noof_disks
182 else
183 Die "AddFileToDir asked me to add $filename, which does not exist. Oops! Did you run out of disk space or is your Linux distro severely broken?"
184 fi
[747]185 fi
[925]186
187 # move to the disk that has room on it (or end up using the last, if all full)
[747]188 while [ "$diskno" -lt "40" ] ; do
[925]189 mkdir -p $minidir_root/$diskno
[747]190 filesize=`du -sk $filename | cut -f1`
[925]191 cp --parents -Rdf $filename $minidir_root/$diskno
[747]192 if [ "$filesize" -le "4" ] ; then
193 siz=$filesize
194 elif [ ! -f "$filename" ] ; then
195 siz=0
196 else
197 siz=`grep -m 1 "$filename.gz$" $minidir_root/compressed/compressed.txt | cut -f1`
198 [ "$siz" = "" ] && Die "FIXME - can't find $filename's size."
199 siz=$(($siz-2));# to allow for sectors & the fact that they round up
200 fi
[925]201 [ ! "$siz" ] && siz=4
202 [ "$siz" -lt "0" ] && siz=0
[747]203 LAST_COMPRESSED_SIZE=$(($LAST_COMPRESSED_SIZE+$siz))
[925]204 [ "$LAST_COMPRESSED_SIZE" -le "$MAX_COMPRESSED_SIZE" ] &&return $diskno
205 echo "disk=$diskno siz=$LAST_COMPRESSED_SIZE" >> $LOGFILE
206 LAST_COMPRESSED_SIZE=0
207 rm -f $minidir_root/$diskno/$filename
[747]208 diskno=$(($diskno+1))
209 done
210 return 0 ; # failed
211}
212
213
214AddKeyboardMappingFile() {
215 local mappath r included_list included_item i res ii sss
216 mappath=$1
217 KBDEPTH=$(($KBDEPTH+1))
218 [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
219 if [ -e "$bigdir/$mappath" ] ; then
220 echo "$mappath already added" >> $LOGFILE
221 return
222 elif [ -d "$bigdir/$mappath" ] ; then
223 echo "Cannot add $mappath: it's a directory. Sorry."
224 return
225 fi
226 echo "Added kbd map $mappath" >> $LOGFILE
227 if [ ! -e "$mappath" ] ; then
228 mappath=`find $KEYDIR/keymaps | grep "i[3-8]86" | grep "$locale[^r][^/]" | grep -vx " *#.*"`
229 if [ ! -e "$mappath" ] ; then
230 LogIt "Cannot add $mappath: kbd map file not found\n"
231 return
232 fi
233 else
234 echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
235 fi
236
237 mkdir -p $bigdir/etc
238 cp --parents -pRdf $mappath $bigdir || LogIt "AKMF -- Could not copy $mappath to $bigdir\n"
239 if [ "`echo $mappath | grep -F ".gz"`" ] ; then
240 included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
241 else
242 included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
243 fi
244 for included_item in $included_list ; do
[925]245 if [ ! -e "$included_item" ] ; then
[747]246 sss=`find $KEYDIR/keymaps | grep -F "${included_item}.inc"`
[925]247 [ "$sss" = "" ] && sss=`find $KEYDIR/keymaps | grep -F "$included_item"`
248 for ii in $sss ; do
[747]249 [ -e "$ii" ] && AddKeyboardMappingFile $ii
[925]250 done
251 else
252 AddKeyboardMappingFile $included_item
253 fi
[747]254 done
255}
256
257
258ChopUpAndCopyFile() {
259 local filename slicesize outdir res biggienumber filesize sliceno noof_slices testfile scratchfile
260 filename=$1
261 outdir=$2
262 slicesize=$3
263 biggienumber=$4
264
265 [ -d "$filename" ] && Die "Cannot chop up $filename: it's a directory. Please amend deplist.txt accordingly."
266 mkdir -p $outdir
267
268 sliceno=0
[940]269 scratchfile=$MINDI_TMP/blah.$$.dat
[747]270 cp -f $filename $scratchfile || Die "CUACF -- cannot copy $filename to $scratchfile - did you run out of disk space?"
271 [ "`head $scratchfile -n1 | grep -F "bin/sh"`" != "" ] && StripComments $scratchfile "-$filename-"
272 [ "`echo "$filename" | grep -F "etc/termcap"`" != "" ] && StripComments $scratchfile "-$filename-"
273 if [ "`echo "$filename" | grep -F "lib/modules/" | grep "\.*o\.gz"`" != "" ] ; then
[925]274 mv $scratchfile $scratchfile.gz
275 gunzip -f $scratchfile || LogIt "Cannot gunzip $scratchfile.gz\n"
276 filename=`echo "$filename" | tr '.' '#' | sed s/#o#gz/#o/ | sed s/#ko#gz/#ko/ | tr '#' '.'`
[747]277 fi
278 filesize=`du -sk $scratchfile | cut -f1`
279 noof_slices=$(($filesize/$slicesize))
280 echo "$filename" > $outdir/slice-$biggienumber.name
281 echo "$filesize" > $outdir/slice-$biggienumber.size
282 [ -x "$scratchfile" ] && StripExecutable $scratchfile "-$filename-"
283 while [ "$sliceno" -le "$noof_slices" ] ; do
284 dd if=$scratchfile skip=$(($sliceno*$slicesize)) of=$outdir/slice-$biggienumber.`printf "%03d" $sliceno` bs=1k count=$slicesize 2> /dev/null
285 sliceno=$(($sliceno+1))
286 done
287 rm -f $scratchfile
288}
289
290
291CopyBootBFile() {
292 local copy_to copy_from possible_locations liloc
293 copy_to=$1
294 copy_from=/boot/boot.b
295 liloc=`which lilo.real 2>/dev/null`
296 [ $liloc ] || liloc=`which lilo 2>/dev/null`
297 if [ $liloc ]; then
298 if ! [ `strings $liloc | grep "boot\.b"` ]; then
299 LogIt "boot.b files built into lilo; I'll create a dummy.\n"
300 > $copy_to
301 return 0
302 fi
303 fi
304 if [ ! -f "$copy_from" ] ; then
305 LogIt "OK, you don't have a /boot/boot.b file, which is odd because\n most _good_ Linux distributions come with one, even if it's only a softlink"
306 copy_from=`grep install= /etc/lilo.conf | grep "\.b" | cut -d'=' -f2`
307 if [ ! -f "$copy_from" ] ; then
308 LogIt "Nor can I find it from your /etc/lilo.conf file. This is very odd.\n"
309 copy_from=`FindSensibleBootBFile`
310 LogIt "I'm going to use '$copy_from'\n"
311 fi
312 fi
313 cp -f $copy_from $copy_to || LogIt "CBBF -- warning -- cannot find your boot.b file. That's it, I quit... (j/k)\n"
314}
315
316
317CopyDependenciesToDirectory() {
318 local outdir incoming fname filesize counter
319 outdir=$1
320 mkdir -p $outdir
321 incoming=`ReadLine`
322 counter=0
323 while [ "$incoming" != "" ] ; do
[925]324 if [ -d "$incoming" ] ; then
[747]325 find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
326 elif [ -e "$incoming" ] ; then
327 filesize=`du -sk $incoming | cut -f1`
328 if [ "$filesize" -gt "$(($CHOPSIZE*2))" ] && [ ! -h "$incoming" ] ; then
329 ChopUpAndCopyFile $incoming $outdir $CHOPSIZE $BIGNO
330 BIGNO=$(($BIGNO+1))
331 else
[953]332 cp --parents -Rdf $incoming $outdir 2> /dev/null || Die "Cannot copy $incoming to $outdir - did you run out of disk space?"
[925]333 if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] ; then
334 gunzip -f $outdir/$incoming || LogIt "Cannot gunzip $outdir/$incoming\n"
335 fi
336 [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
337 fi
338 counter=$(($counter+1))
339 if [ "$counter" -ge "5" ] ; then
340 counter=0
341 echo -en "."
342 fi
[747]343 fi
344 incoming=`ReadLine`
345 done
346}
347
348
349CopyImageToDisk() {
350 local image dev procno res comment
351 image=$1
352 dev=$2
353 comment=$3
354 [ ! -f "$image" ] && [ ! -b "$image" ] && Die "Image $image does not exist. Did you run out of disk space?"
355 Prompt "About to write $comment. Please press ENTER."
356 echo -en "Formatting disk..."
357 if which fdformat > /dev/null ; then
[925]358 fdformat -n $dev > /dev/null 2> /dev/null || Die "Cannot format $dev - is your Linux distro broken?"
[747]359 elif which superformat > /dev/null ; then
[925]360 superformat $dev > /dev/null 2> /dev/null || Die "Cannot format $dev - is your Linux distro broken?"
[747]361 else
[925]362 Die "Please install either fdformat or superformat."
[747]363 fi
364 echo -en "\rWriting $comment"
365 if echo $image | grep "mindi-[r|b]oot\.1440" &> /dev/null ; then
[925]366 cat $image > $dev &
[747]367 else
[925]368 dd if=$image of=$dev &> /dev/null &
[747]369 fi
370 procno=$!
371 ps $procno > /dev/null 2> /dev/null
372 while [ "$?" -eq "0" ] ; do
373 sleep 3
374 echo -en "."
375 ps $procno > /dev/null 2> /dev/null
376 done
377 echo -e "$DONE"
378 LogIt "$comment has been written.\n"
379}
380
381
382CountItemsIn() {
383 local r
384 r=0
385 for q in $1 ; do
386 r=$(($r+1))
387 done
388 echo $r
389}
390
391
392CreateDataDiskImagesFromTarballs() {
393 local tardir outdir diskno noof_disks kp
394 tardir=$1
395 outdir=$2
396 noof_disks=$3
397
398 mkdir -p $outdir
399 diskno=1
400 echo -en "Creating data disk "
401 while [ "$diskno" -le "$noof_disks" ] ; do
[925]402 echo -en "#$diskno..."
403 cp -f $tardir/$diskno.tar.gz $outdir || LogIt "[line 424] Cannot copy $tardir/$diskno.tar.gz to $outdir\n"
[747]404 CreateOneDataDiskImage $tardir/$diskno.tar.gz $outdir/mindi-data-$diskno.img $diskno $noof_disks
405 diskno=$(($diskno+1))
406 done
407 mv -f $tardir/all.tar.gz $outdir
408 du -sk $outdir/*gz >> $LOGFILE
409 echo -e "$DONE"
410}
411
412
413
414CreateOneDataDiskImage() {
415 local tarball imagefile dev diskno noof_disks mountpoint
416 tarball=$1
417 imagefile=$2
418 diskno=$3
419 noof_disks=$4
420
[940]421 mountpoint=$MINDI_TMP/mountpoint.$$
[747]422 mkdir -p $mountpoint
423 dd if=/dev/zero of=$imagefile bs=1k count=1440 &> /dev/null || LogIt "Cannot dd (CODI)\n"
[940]424 mke2fs -N 12 -F $imagefile > $MINDI_TMP/mke2fs.$$ 2>> $MINDI_TMP/mke2fs.$$
425 [ "$?" -ne "0" ] && cat $MINDI_TMP/mke2fs.$$
426 rm -f $MINDI_TMP/mke2fs.$$
[747]427 mount -t ext2 -o loop $imagefile $mountpoint || Die "Can't loopmount $imagefile to $mountpoint! The reason may be missing support for loopfs or ext2 (or both) in the running kernel."
428 mv $tarball $mountpoint/
429 if [ "$?" -ne "0" ] ; then
[925]430 umount $mountpoint
431 Die "Tarball $tarball is too big for disk! (CODI)\nTell Dev Team to adjust MAX_COMPRESSED_SIZE"
[747]432 fi
433 [ "$diskno" -eq "$noof_disks" ] && echo "This is the last disk ($diskno=$noof_disks)" >> $mountpoint/LAST-DISK
434 umount $mountpoint || LogIt "Cannot umount (CODI)\n"
435 rmdir $mountpoint || LogIt "Cannot rmdir (CODI)\n"
436}
437
438
439DidMondoCallMe() {
440 local res
441
442 res=0
443 [ "`ps ax | grep -F "mondoarchive" | grep -v "grep"`" ] && res=$(($res+1))
444 [ -f "/var/run/monitas-mondo.pid" ] && res=$(($res+1))
445 [ "$res" -gt "1" ] && echo "yes"
446}
447
[925]448# Last function called before exiting
449# Parameter is exit code value
[931]450MindiExit() {
[925]451 local my_partitions
[747]452
[925]453 echo "Mindi $MINDI_VERSION is exiting" >> $LOGFILE
454 echo "End date : `date`" >> $LOGFILE
[747]455
[925]456 sync
457 cd /
[747]458
[925]459 # Unmount whtat could remain mounted
460 my_partitions=`mount | grep -F $$ | cut -f1 -d' '`
461 [ "$my_partitions" != "" ] && umount $my_partitions
[940]462 # Clean temporary files only when standalone mindi
[948]463 if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
[940]464 rm -Rf $MINDI_TMP
465 fi
[925]466 exit $1
467}
468
[747]469Die() {
[925]470 local i
[747]471 if [ "$1" = "" ] ; then
[800]472 LogIt "Fatal error\n"
[747]473 else
[800]474 LogIt "Fatal error. $1\n"
[747]475 fi
476
[925]477 # Creates a tar file containing all required files
[941]478 for i in /etc/fstab /etc/lilo.conf /etc/raidtab $LOGFILE /var/log/mondo-archive.log ; do
[940]479 [ -e "$i" ] && cp -f $i $MINDI_TMP
[747]480 done
[925]481 rm -f $TMPDIR/mindi.err.*.tgz
[940]482 tar -cf - $MINDI_TMP | gzip -9 > $TMPDIR/mindi.err.$$.tgz
[925]483 LogIt "Please e-mail a copy of $TMPDIR/mindi.err.$$.tgz to the mailing list.\n"
[747]484 LogIt "See http://www.mondorescue.org for more information.\n"
485 LogIt "WE CANNOT HELP unless you enclose that file.\n"
[925]486 MindiExit -1
[747]487}
488
489
490DropOptimizedLibraries() {
491 local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
492 filelist=$1
493 outdir=$2
494
495 list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
496 if [ "$list_of_optimized_libraries" = "" ] ; then
[859]497 return 0
[747]498 fi
499 echo -en "Dropping i686-optimized libraries if appropriate"
500 for optimized_lib_name in $list_of_optimized_libraries ; do
[859]501 echo -en "."
502 reason=""
503 vanilla_lib_name=`echo "$optimized_lib_name" | sed s/i[5-7]86// | tr -s '/' '/'`
504 echo "$vanilla_lib_name" >> $filelist
505 resolved=$vanilla_lib_name
[747]506 echo "Adding $resolved to filelist" >> $LOGFILE
[861]507 resolved=`ReadAllLink $resolved`
508 echo "Adding $resolved to filelist" >> $LOGFILE
[859]509 mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
510 rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
511 ln -sf $vanilla_lib_name $outdir$optimized_lib_name
512 echo "Excluding $optimized_lib_name" >> $LOGFILE
[935]513 grep -Fvx "$optimized_lib_name" "$filelist" > $filelist.tmp
[859]514 echo "Replacing it with $vanilla_lib_name" >> $LOGFILE
515 echo "$vanilla_lib_name" >> $filelist.tmp
516 mv -f $filelist.tmp $filelist
[747]517 done
[925]518 $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
[747]519 mv -f $filelist.tmp $filelist
520 echo -e "$DONE"
521}
522
523
524FindAndAddUserKeyboardMappingFile() {
525 local r res mapfile mappath included_item included_list keyfile mp locale
526 LogIt "Analyzing your keyboard's configuration.\n"
527 KEYDIR=/lib/kbd
528 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd # Slackware
529 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
530 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
531 if [ ! -e "$KEYDIR" ] ; then
532 LogIt "Keyboard mapping directory not found. I shall use default map at boot-time.\n"
533 return 0
534 fi
535 if [ -e "/etc/sysconfig/keyboard" ] ; then
536 echo "Red Hat-style config detected." >> $LOGFILE
537 keyfile=/etc/sysconfig/keyboard
538 elif [ -e "/etc/rc.d/rc.keymap" ] ; then
539 echo "Slackware-style config detected." >> $LOGFILE
540 keyfile=/etc/rc.d/rc.keymap
541 elif [ -e "/etc/rc.config" ] ; then
542 echo "Debian-style config detected." >> $LOGFILE
543 keyfile=/etc/rc.config
544 elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
545 echo "Debian-style config detected." >> $LOGFILE
546 echo -en "Adding the following keyboard mapping tables: "
547 mkdir -p $bigdir/tmp
548 echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
549 KBDEPTH=0
550 mkdir -p $bigdir/etc/console
551 cp /etc/console/boottime.kmap.gz $bigdir/etc/console
552 echo -e "$DONE"
553 return 0
554 else
555 echo -en "Searching for rc.config ..."
556 keyfile=`find /etc -name rc.config | head -n1`
557 if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
558 LogIt "Unknown config detected. Default keyboard map will be used.\n"
559 return
560 else
561 echo "Found $keyfile" >> $LOGFILE
562 fi
563 fi
564 if [ ! -e "$KEYDIR/keymaps" ] ; then
565 LogIt "Keyboard mapping directory not found. Default keyboard map will be used.\n"
566 return
567 fi
568 echo "keyfile=$keyfile" >> $LOGFILE
569 locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
570 [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'` # Slackware
571 echo "locale=$locale" >> $LOGFILE
572 mp=`find $KEYDIR/keymaps | grep "i[3-8]86" | grep -F "/${locale}." | grep -vx " *#.*"`
573 [ ! "$mp" ] && mp=`find $KEYDIR/keymaps | grep "i[3-8]86" | grep "$locale[^r][^/]" | grep -vx " *#.*"`
574 # If we have multiple keymaps then log it !!
575 echo "$mp" | grep -q " "
576 if [ $? -eq 0 ]; then
577 echo "WARNING: Multiple keymaps found: $mp" | tee -a $LOGFILE
578 echo "The following one will be used" >> $LOGFILE
579 fi
580 for i in $mp ; do
581 mappath=$i
582 [ -e "$i" ] && [ ! -d "$i" ] && break
583 done
584 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
585 mappath=$(locate */kbd/keymaps/*/$locale)
586 fi
587 echo "mappath = $mappath" >> $LOGFILE
588 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
589 LogIt "Keyboard mapping file not found. Default keyboard map will be used.\n"
590 return
591 fi
592 echo -en "Adding the following keyboard mapping tables: "
593 mkdir -p $bigdir/tmp
594 echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
595 KBDEPTH=0
596 AddKeyboardMappingFile $mappath
597 echo -e "$DONE"
598 return 0
599}
600
601
602FindHomeOfMindiAndMondo() {
603 [ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
604 echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
605 echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
606 [ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
607 echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
608 echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
609}
610
611
612FindIsolinuxBinary() {
613 ISOLINUX=/usr/lib/isolinux.bin
614 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
615 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
616 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
617 [ ! -e "$ISOLINUX" ] && ISOLINUX=`locate isolinux.bin | grep -x "/.*/isolinux.bin"`
618 [ ! -e "$ISOLINUX" ] && Die "Please install isolinux first. If your syslinux RPM doesn't include isolinux, you may download an isolinux RPM from Mondo's website - go to http://www.mondorescue.com and click on 'Download'"
619 echo "Found isolinux.bin at $ISOLINUX" >> $LOGFILE
620}
621
622
623FindLiloBinary() {
624 if which lilo &> /dev/null ; then
[925]625 if which lilo.real > /dev/null 2> /dev/null ; then
626 LILO_EXE=lilo.real
627 LogIt "lilo.real found; will be used instead of lilo (*grumble* *mutter*)\n"
628 else
629 LILO_EXE=lilo
630 fi
631 $LILO_EXE -V | grep -F "21.6" > /dev/null && Die "Please upgrade LILO. Your version has a serious bug. If you're not _using_ LILO, fine, uninstall it. :)"
[747]632 else
[925]633 LILO_EXE=`which false`
[747]634 fi
635}
636
[925]637
[747]638FindELiloBinary() {
639 if which elilo &> /dev/null ; then
[925]640 LILO_EXE=elilo
[747]641 else
[925]642 LILO_EXE=`which false`
[747]643 fi
644}
645
646
647FixPathIfBroken() {
[925]648 if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
[747]649 PATH=$PATH:/sbin:/usr/sbin
650 export PATH
651 echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
652 echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
653 echo "You might like to call 'su -' instead of 'su', for example." >> $LOGFILE
654 fi
655}
656
657
658FindSensibleBootBFile() {
659 local i out last
660 out=""
661 last=""
662 for i in `find /boot -type f | grep -v chain | grep -v os2 | sort -u` ; do
663 if [ "`strings $i 2> /dev/null | head -n1`" = "LILO" ] ; then
664 out="$out $i"
[925]665 last="$i"
[747]666 fi
667 done
668 echo "$last"
669}
670
671
672FindSpecificModuleInPath() {
673 local modpaths pwd line
674 pwd=`pwd`
675 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[940]676 cd $MINDI_TMP
[747]677 else
678 cd /
679 fi
680 if [ ! -e "$1" ] ; then
681 LogIt "Warning - cannot search specific path '$1'\n"
682 return 1
683 fi
684 modpaths=`find $1 -name $2.*o -type f`
685 [ "$?" -ne "0" ] && Die "find $1 -name $2.o -type f --- failed"
686 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.o.gz -type f`
687 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.ko.gz -type f`
688 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2 -type f`
689 echo "$modpaths"
690 cd $pwd
691}
692
693
694GenerateGiantDependencyList() {
695 local incoming loc fname list_of_files i tempfile outfile progress filelist res r mapfile mappath included_list included_item old_pwd tempdepfile modres noof_lines lvmversion lvmresolved
696
697 echo -en "Analyzing dependency requirements"
698 outfile=$1
[940]699 tempfile=$MINDI_TMP/$$.txt
[747]700 incoming=`ReadLine`
701
702 > $tempfile
703 progress=0
704 res=0
705 noof_lines=$2
706 while [ "$incoming" != "" ] ; do
[861]707 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
708 incoming=`ReadLine`
709 continue
710 fi
711 if [ "$incoming" = "LVMFILES:" ] ; then
712 break
713 fi
[747]714 filelist=`GenerateListForFile "$incoming"`
715 r=$?
716 [ "$r" -ne "0" ] && LogIt "$incoming not found\n"
717 res=$(($res+$r))
[861]718# echo "'$incoming' generates filelist '$filelist'" >> $LOGFILE
[747]719 for fname in $filelist ; do
[861]720 [ "$fname" != "" ] && echo "$fname" >> $tempfile
[747]721 done
722 progress=$(($progress+1))
723 echo -en "\r\t\t\t\t\t\t\t\t"
724 i=$(($progress*100))
725 i=$(($i/$noof_lines))
726 echo -en "$i"
727 echo -en "%"
728 modres=$(($progress%4))
729 [ "$modres" -eq "0" ] && echo -en "\t/"
730 [ "$modres" -eq "1" ] && echo -en "\t-"
731 [ "$modres" -eq "2" ] && echo -en "\t\\"
732 [ "$modres" -eq "3" ] && echo -en "\t|"
733 incoming=`ReadLine`
734 done
[861]735 if [ "$incoming" = "LVMFILES:" ] ; then
736 incoming=`ReadLine`
737 lvmversion=""
738 while [ "$incoming" != "" ] ; do
739 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
740 incoming=`ReadLine`
741 continue
742 fi
743 filelist=`GenerateListForFile "$incoming"`
744 for tool in $filelist ; do
745 lvmresolved=`readlink -f $tool`
746 if [ "$tool" == "$lvmresolved" ]; then
747 echo "$tool" >> $tempfile
748 elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
749 if [ "$lvmversion" = "" ] ; then
750 lvmversion=`$lvmresolved`
751 echo "$lvmresolved" >> $tempfile
752 fi
753 toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
754 if [ "$lvmversion" == "200" ]; then
755 # pvdata and lvmcreate_initrd don't exist in LVM2
756 case "$toolstripped" in
757 "pvdata")
758 continue
759 ;;
760 "lvmcreate_initrd")
761 continue
762 ;;
763 esac
764 fi
765 toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
766 if [ -e "$toolpath" ] ; then
767 echo "$toolpath" >> $tempfile
768 echo "$tool" >> $tempfile
769 else
770 toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
771 fi
772 if [ -e "$toolpath" ] ; then
773 echo "$toolpath" >> $tempfile
774 echo "$tool" >> $tempfile
775 else
776 echo "Where are your LVM-Tools? Couldn't find $tool"
777 fi
778 else
779 echo "$tool" >> $tempfile
780 fi
781 done
782 progress=$(($progress+1))
783 echo -en "\r\t\t\t\t\t\t\t\t"
784 i=$(($progress*100))
785 i=$(($i/$noof_lines))
786 echo -en "$i"
787 echo -en "%"
788 modres=$(($progress%4))
789 [ "$modres" -eq "0" ] && echo -en "\t/"
790 [ "$modres" -eq "1" ] && echo -en "\t-"
791 [ "$modres" -eq "2" ] && echo -en "\t\\"
792 [ "$modres" -eq "3" ] && echo -en "\t|"
793 incoming=`ReadLine`
794 done
[747]795 fi
796 echo -en "$DONE\nMaking complete dependency list"
797
798 tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
799 mv -f $tempfile.new $tempfile
800 > $outfile.pre
801 progress=0
802 noof_lines=`cat $tempfile | wc -l`
803 for fname in `cat $tempfile` ; do
[925]804 echo "$fname" >> $outfile.pre
805 LocateDeps $fname >> $outfile.pre
806 progress=$(($progress+1))
[747]807 echo -en "\r\t\t\t\t\t\t\t\t"
808 i=$(($progress*100))
809 i=$(($i/$noof_lines))
810 echo -en "$i"
811 echo -en "%"
[925]812 modres=$(($progress%4))
[747]813 [ "$modres" -eq "0" ] && echo -en "\t/"
814 [ "$modres" -eq "1" ] && echo -en "\t-"
815 [ "$modres" -eq "2" ] && echo -en "\t\\"
816 [ "$modres" -eq "3" ] && echo -en "\t|"
817 done
818 if [ "`DidMondoCallMe`" ] ; then
[925]819 mkdir -p $bigdir/tmp
820 mkdir -p $bigdir/sbin
821 mkdir -p $bigdir/bin
[940]822 if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
[925]823 LogIt "\nIncorporating post-nuke tarball\n"
824 old_pwd=`pwd`
825 cd $bigdir
[940]826 tar -zxf $MINDI_TMP/post-nuke.tgz || LogIt "Error occurred when untarring post-nuke tarball\n"
[925]827 cd $old_pwd
[747]828 fi
[940]829 if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin ; then
[925]830 LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
831 else
[940]832 LogIt "Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP\n"
[925]833 LogIt "I bet you've got a spare copy of Mondo or Mindi floating around on your system.\n"
834 LogIt "If Mindi was called by Mondo then send me a bug report.\n It not, type 'ps ax' to see which Mondo-related process is still running;\n then kill it. :-)\n Finally, run Mindi again."
835 Die "Odd."
836 fi
[940]837 cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2> /dev/null || LogIt "\nMondo v1.2x defaults to LILO as the bootloader, BTW.\n"
838 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[925]839 LogIt "Incorporating NFS-related settings\n"
840 for r in NFS-* ISO-PREFIX ; do
[940]841 cp -f $MINDI_TMP/$r $bigdir/tmp || Die "Cannot copy $r - did you run out of disk space?"
[925]842 echo "Copying $r to ramdisk" >> $LOGFILE
843 done
844 fi
[747]845 fi
[925]846 tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
[747]847 rm -f $tempfile $outfile.pre
848 [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
849 return $res
850}
851
852
853GenerateListForFile() {
854 local files_found loc fname incoming i res
855 incoming="$1"
856 files_found=""
857 res=0
858
859 for fname in $incoming ; do
860 files_found="$files_found `LocateFile $fname`"
861 done
862
863 echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
864}
865
866
867# Returns all disk devices which are part of a raid array
868GetAllRaidMembers() {
869 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
870}
871
872
873GetFileSizeList() {
874 local i
875 for i in `find $1 -type d -o -print` ; do
876 du -sk $i
877 done
878}
879
880
881GetHomeDir() {
882 local res loc
883 loc=`which $1 2>/dev/null`
884 res=`file $loc | $AWK '{print $NF;}'`
885 dirname $res
886}
887
888
889# Searches parent raid device of given disk device
890# $1: disk device (i.e. /dev/hda1)
891GetParentRaidDev() {
892 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
893}
894
895
896# Searches members of raid device
897# $1: raid device (/dev/md...)
898GetRaidDevMembers() {
899 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
900}
901
902
903HackPathsToFailsafe() {
904 local incoming newpath kver stub i pwd
905 kver=`uname -r`
906 incoming=`ReadLine`
907 pwd=`pwd`
[940]908 cd $MINDI_TMP
[747]909 while [ "$incoming" != "" ] ; do
[925]910 stub=`basename $incoming`
911 newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
912 for i in $newpath ; do
913 echo "$i"
914 done
915 read incoming
[747]916 done
917 cd $pwd
918}
919
920
921ListAllPartitions() {
922 local res currline partition all_partitions ap_orig remaining i j
923
[957]924 grep -vx " *#.*" $MY_FSTAB | grep -vx " *none.*" | $AWK '/^\/dev\/[imhs]d||^LABEL\=\/|^UUID=/ && !/fdd|cdr|zip|floppy/ {print $1}'
[747]925 [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
926 return
927}
928
929
930ListImagesForUser() {
931 local path fname
932 path=$1
933 echo -en "In the directory '$path' you will find the images:-\n"
934 for fname in `ls $path | grep -F mindi-` ; do
935 printf "%19s " $fname
936 done
937 echo " "
938}
939
940
941ListKernelModulePaths() {
942 local module_list module fname oss r kern
943 oss="/root/oss/modules"
944 module_list="`lsmod | sed -n '2,$s/ .*//p'`"
945###
946### Sq-Modification ... Use kernelname for module search path if specified
947###
948 # kern="`uname -r`"
949 if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
950 then
951 kern=${kernelname}
952 else
953 kern="`uname -r`"
954 fi
955###
956### Sq-Mod End
957###
958 for module in $module_list $EXTRA_MODS ; do
959 r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
960 echo "module $module --> $r" >> $LOGFILE
961 [ "$r" ] && echo "$r"
962 [ -f "$oss" ] && find $oss | grep -F $module
963 done
964 find /lib/modules/$kern/modules.* -type f 2> /dev/null
965 [ -f "$oss" ] && find $oss.* 2> /dev/null
966}
967
968
969LocateDeps() {
970 local incoming fname deps
971 incoming="$1"
972 for fname in $incoming ; do
973 if [ ! -e "$fname" ] ; then
974 echo "Warning - $fname does not exist; cannot be LDD'd." >> $LOGFILE
975 if echo $fname | grep lvm &> /dev/null ; then
976 echo "This warning only affects you if you are using LVM." >> $LOGFILE
977 if lsmod | grep lvm &> /dev/null ; then
978 echo "I think you are, so please take heed!" >> $LOGFILE
979# LogIt "Where is liblvm? You need it."
980 else
981 echo "I don't think you are, so don't worry about it." >> $LOGFILE
982 fi
983 fi
984 elif [ -h "$fname" ] && [ -x "$fname" ] ; then
985 echo "$fname is softlink" >> $LOGFILE
986 else
987 ldd $fname 2> /dev/null | ProcessLDD $fname
988 fi
989 done
990}
991
[925]992
[860]993# Give all symlinks recursively of a full path name
994ReadAllLink() {
995 file="$1"
[747]996
[860]997 if [ ! -h $file ]; then
998 echo "$file"
999 return 0
1000 fi
[747]1001
[860]1002 link=`readlink $file`
[862]1003 d=`dirname $file`
1004 if [ ! -e "$link" -a ! -e "$d/$link" ]; then
1005 echo "Problem with dead link on $file -> $link" >> $LOGFILE
1006 fi
1007 if [ "`echo $link | cut -c1`" = "/" ]; then
[860]1008 echo "$link `ReadAllLink $link`"
1009 else
[861]1010 d=`dirname $file`
1011 echo "$link `ReadAllLink $d/$link`"
[860]1012 fi
1013}
1014
[925]1015
[747]1016LocateFile() {
1017 local i path fname_to_find location output resolved tmp stub cache_id loclist
1018 fname_to_find="$1"
1019 if echo "$fname_to_find" | grep -x "/.*" ; then
[859]1020 output="$fname_to_find"
[860]1021 if [ -h "$output" ] ; then
1022 output="`ReadAllLink $output` $output"
1023 fi
[859]1024 echo "$output"
1025 return 0
[747]1026 fi
1027 output=""
[884]1028 #for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin /usr/lib /usr/lib64 /lib /lib64 /usr/local/lib /usr/local/lib64 /usr/X11R6/lib /usr/X11R6/lib64 `find /usr/lib64 /lib64 /usr/local/lib64 /usr/X11R6/lib64 -type d` ; do
1029 for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin /usr/lib /usr/lib64 /usr/lib64/* /lib /lib64 /lib64/* /usr/local/lib /usr/local/lib64 /usr/local/lib64/* /usr/X11R6/lib /usr/X11R6/lib64 /usr/X11R6/lib64/* ; do
1030 [ ! -d "$path" ] && continue
[860]1031 for location in "$path/$fname_to_find" ; do
[859]1032 [ ! -e "$location" ] && continue
1033 output="$location $output"
[860]1034 if [ -h "$location" ] ; then
[861]1035 output="`ReadAllLink $location` $output"
[860]1036 fi
[859]1037 done
[747]1038 done
1039 if [ "$output" = "" ] ; then
[860]1040 return 1
[747]1041 fi
1042 echo "$output"
1043 return 0
1044}
1045
1046
1047LogIt() {
1048 if [ -e /dev/stderr ] ; then
[925]1049 echo -e "$1" >> /dev/stderr
[747]1050 elif [ -e /usr/bin/logger ] ; then
[925]1051 /usr/bin/logger -s $1
[747]1052 fi
1053 echo -en "$1" >> $LOGFILE
1054}
1055
1056
1057# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
1058MakeMondoConfigFile() {
1059 local outfile use_lzo use_comp use_star
1060 outfile=$1
1061 > $outfile
1062 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
1063 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
1064 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
1065 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
1066 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
1067 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
1068 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
1069 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
1070 echo "use-lzo $use_lzo" >> $outfile
1071 echo "use-star $use_star" >> $outfile
1072 echo "use-comp $use_comp" >> $outfile
1073 echo "datestamp `date`" >> $outfile
1074 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
[940]1075 AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-IPADDR nfs-client-ipaddr $outfile
1076 AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-NETMASK nfs-client-netmask $outfile
1077 AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-BROADCAST nfs-client-broadcast $outfile
1078 AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-DEFGW nfs-client-defgw $outfile
1079 AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-MOUNT nfs-server-mount $outfile
1080 AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-PATH nfs-server-path $outfile
1081 AddFileToCfgIfExists $MINDI_TMP/NFS-DEV nfs-dev $outfile
1082 AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-IPADDR nfs-server-ipaddr $outfile
1083 AddFileToCfgIfExists $MINDI_TMP/ISO-DEV iso-dev $outfile
1084 AddFileToCfgIfExists $MINDI_TMP/ISO-MNT iso-mnt $outfile
1085 AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX iso-prefix $outfile
1086 AddFileToCfgIfExists $MINDI_TMP/ISODIR isodir $outfile
1087 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
1088 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME bootloader.name $outfile
1089 AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
1090 AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
1091 AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
1092 AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL differential $outfile
[949]1093 AddFileToCfgIfExists $MINDI_TMP/ACL acl $outfile
1094 AddFileToCfgIfExists $MINDI_TMP/XATTR xattr $outfile
[747]1095}
1096
1097
1098MakeModuleLoadingScript() {
1099 local module fname params modpath kver outerloop i modpaths kver searchpath list_to_echo j
1100 tmpmodprobe_flag=$1
1101 outfile=$2
1102 > $outfile || Die "Cannot create empty $outfile"
1103 echo -en "#\041/bin/sh\n\n" >> $outfile
1104 echo "echo -en \"Loading your modules...\"" >> $outfile
1105 if [ "$YOUR_KERNEL_SUCKS" ] ; then
1106 kver=$FAILSAFE_KVER
[940]1107 cd $MINDI_TMP
[747]1108 searchpath=lib/modules/$kver
1109 else
1110###
1111### Sq-Modification ... Use kernelname for module search path if specified
1112###
1113 #kver=`uname -r`
1114 if [ "${kernelname}" != "" ]
1115 then
[925]1116 kver=${kernelname}
[747]1117 else
[925]1118 kver=`uname -r`
[747]1119 fi
1120###
1121### Sq-Modification end
1122###
1123 searchpath=/lib/modules/$kver
1124 fi
1125
1126 echo -en "for outerloop in 1 2 3 4 5 ; do\necho -en \".\"\n" >> $outfile
1127 list_to_echo="`lsmod | sed -n '2,$s/ .*//p'`"
[925]1128
[747]1129 # Make temporary modprobe.conf file if we are told so
1130 if [ $tmpmodprobe_flag == "Y" ] ; then
[940]1131 infile="$MINDI_TMP/modprobe.conf.mindi"
[747]1132 find /etc/modprobe.d -maxdepth 1 -name "*" -xtype f -print0 | xargs -0 cat > $infile
1133 else
1134 infile="/etc/modules.conf"
1135 fi
1136 for module in $list_to_echo $EXTRA_MODS ; do
1137 params=`sed -n "s/^options \\+$module \\+//p" $infile`
1138 modpaths=`FindSpecificModuleInPath $searchpath $module`
1139 for i in $modpaths ; do
1140 echo "MyInsmod $i $params > /dev/null 2> /dev/null" \
1141 | tr '.' '#' \
1142 | sed s/#o#gz/#o/ \
1143 | sed s/#o#gz/#o/ \
1144 | sed s/#ko#gz/#ko/ \
1145 | sed s/#ko#gz/#ko/ \
1146 | tr '#' '.' >> $outfile
1147 echo -en "$i added to module list.\n" >> $LOGFILE
1148 done
1149 done
1150 echo -en "done\n" >> $outfile
1151 echo "echo \"Done.\"" >> $outfile
1152 chmod +x $outfile
1153 cd /
1154 # Remove temporary modprobe.conf file if we have created one
1155 if [ $tmpmodprobe_flag == "Y" ] ; then
1156 rm -f $infile
1157 fi
1158}
1159
1160
1161MakeMountlist() {
1162 local scratchdir mountlist all_partitions current_partition \
1163partition_size partition_format outstring partition_number \
1164partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
1165absolute_partition old_partition_fmt current_lvolume
1166
1167 echo "Your raw fstab file looks like this:-" >> $LOGFILE
1168 cat $MY_FSTAB >> $LOGFILE
1169 echo "Your mountlist will look like this:-"
1170
1171# scratchdir, mountlist(OUT)
[940]1172 scratchdir=$MINDI_TMP
[747]1173 mountlist=$1
1174
1175# NB: partition = device
1176# NB: mountpt = where the device is mounted
1177
1178 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1179
1180 rm -f $mountlist
1181 mkdir -p $mountlist
1182 rm -Rf $mountlist
1183 > $mountlist
1184 echo -en "\rHang on...\r"
1185 all_partitions=""
1186
1187 if [ $LVM != "false" ]; then
1188 echo -en "\rAnalyzing LVM...\r"
1189 all_partitions=`$MINDI_LIB/analyze-my-lvm | grep -F ">>>" | cut -d' ' -f2-32`
1190 fi
1191 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1192# echo "all partitions = $all_partitions" > /dev/stderr
1193 for i in $IMAGE_DEVS ; do
1194 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1195 done
1196 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1197 printf " %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL
1198 useless_dev="/dev/floppy /dev/fd0h1440 /dev/fd0H1440 /dev/cdrom /dev/cdrom/cdrom /dev/cdrom/cdrom1 /dev/cdrom/cdrom2 /dev/cdrom0 /dev/cdrom1 /dev/cdrom2 /dev/cdrom3 /dev/cdrw /dev/scd /dev/ram :/ /dev/sr0 /dev/sr1 /dev/cdrom1"
1199 for c_p in $all_partitions ; do
1200 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] && continue
1201 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1202 if [ -h "$c_p" ] && [ "`echo "$c_p" | grep -F "/dev/hd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/sd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/md"`" = "" ] ; then
[861]1203 current_partition=`readlink -f $c_p`
[747]1204 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1205 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1206 else
1207 current_partition="$c_p"
1208 fi
1209 [ "$c_p" = "none" ] && continue
1210 redhat_label=""
[957]1211 uuid=""
[861]1212 absolute_partition=`readlink -f $c_p`
[747]1213 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1214
1215 # Detects noauto partitions not mounted and exclude them
1216 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1217 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1218 continue
1219 fi
1220
1221 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1222 # current_partition contains only first column of /etc/fstab
1223 if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1224 str_to_find_fmt_with=$current_partition
1225 redhat_label=`echo "$current_partition" | /bin/cut -d'=' -f2`
1226 actual_dev=""
[853]1227
1228 # 1st try, findfs - the RHEL way of finding labels and their partitions
1229 if [ -x "/sbin/findfs" ]; then
[855]1230 actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
[853]1231 fi
[747]1232
[853]1233 # 2nd try : blkid, the good way for all LABEL except swap
1234 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[747]1235 actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | /bin/cut -d':' -f1`
1236 # For LVM FS it will give a /dev/dm-# which should then be converted
[748]1237 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[747]1238 major=`/bin/ls -l $actual_dev | awk '{print $5}'`
1239 minor=`/bin/ls -l $actual_dev | awk '{print $6}'`
1240 for dev in `ls /dev/mapper/*`; do
1241 major1=`/bin/ls -l $dev | awk '{print $5}'`
1242 minor1=`/bin/ls -l $dev | awk '{print $6}'`
1243 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1244 actual_dev=`/bin/ls -l $dev | awk '{print $10}'`
1245 break
1246 fi
1247 done
1248 fi
1249 fi
1250
[853]1251 # 3rd try, which works on a standard partition (ext2/3), but not on swap
[747]1252 # For LVM gives a /dev/mapper entry
1253 if [ "x$actual_dev" = "x" ]; then
1254 actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | /bin/cut -d' ' -f1`
1255 fi
1256
[853]1257 # 4th try, with vol_id
[747]1258 # SWAP only
1259 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1260 list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | /bin/awk '{ print $1 }' `
1261 for dev_swap in $list_swaps ; do
1262 dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1263 if [ "x$dev_exists" != "x" ]; then
1264 actual_dev=$dev_swap
1265 break;
1266 fi
1267 done
1268 fi
1269
[853]1270 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
[789]1271 # LABEL=SW-cciss/c0d0p3 (RDP)
[853]1272 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
[747]1273 # SWAP only
[789]1274 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
[853]1275 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1276 do
1277 # Location of the swap label for kernel 2.6
1278 try_dev_label=`dd bs=1 count=16 skip=1052 if=$try_dev 2> /dev/null`
1279 if [ "x$try_dev_label" = "x$redhat_label" ]; then
[855]1280 actual_dev=$try_dev
[853]1281 fi
1282 done
[747]1283 fi
[958]1284 fi
[747]1285
[957]1286 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1287 # current_partition contains only first column of /etc/fstab
1288 if [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1289 str_to_find_fmt_with=$current_partition
1290 uuid=`echo "$current_partition" | /bin/cut -d'=' -f2`
1291 actual_dev=""
1292
1293 # 1st try, findfs - the RHEL way of finding labels and their partitions
1294 if [ -x "/sbin/findfs" ]; then
1295 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1296 fi
1297
1298 # 2nd try : blkid, the good way for all LABEL except swap
1299 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1300 actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | /bin/cut -d':' -f1`
1301 # For LVM FS it will give a /dev/dm-# which should then be converted
1302 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1303 major=`/bin/ls -l $actual_dev | awk '{print $5}'`
1304 minor=`/bin/ls -l $actual_dev | awk '{print $6}'`
1305 for dev in `ls /dev/mapper/*`; do
1306 major1=`/bin/ls -l $dev | awk '{print $5}'`
1307 minor1=`/bin/ls -l $dev | awk '{print $6}'`
1308 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1309 actual_dev=`/bin/ls -l $dev | awk '{print $10}'`
1310 break
1311 fi
1312 done
1313 fi
1314 fi
1315
1316 # 3th try, with vol_id
1317 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1318 list_dev=`mount | /bin/grep -E '^/' | /bin/awk '{ print $1 }' `
1319 for dev in $list_dev ; do
1320 dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1321 if [ "x$dev_exists" != "x" ]; then
1322 actual_dev=$dev
1323 break;
1324 fi
1325 done
1326 fi
1327
[747]1328 # Check if one of all those tries has known success
1329 if [ "x$actual_dev" != "x" ]; then
1330 current_partition=$actual_dev
1331 else
[957]1332 Die "Your system uses a UUID partition ($current_partition), but you lack the tool to support it.\nPlease replace labels with their correct devices in /etc/fstab or install findfs|blkid|vol_id\n"
[747]1333 fi
1334 else
1335 str_to_find_fmt_with=$current_partition
1336 fi
1337
1338 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1339 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1340 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1341 # the former is then a link to the latter, so we test whether
1342 # $current_partition is actually such a link or not and set
[755]1343 # $current_lvolume accordingly. On Debian you may find more than one answer
1344 # so we remove the one corresponding to /dev/.static
1345 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1346 # principle is the same and we need to find the link to it as well.
1347 # Note that $current_lvolume may well be an
[747]1348 # ordinary device. It is just to make sure that we feed the right value
1349 # into any of the LVM tools if possible.
1350
1351 current_lvolume="$current_partition"
[763]1352 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
[755]1353 # .static dir are a Debian specificity
[763]1354 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
[755]1355 echo $current_lvolume | grep -q ' '
[784]1356 if [ $? -eq 0 ]; then
[755]1357 echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE
1358 fi
[747]1359 fi
1360 #
1361 # End of LVM device style variation code (other than $current_lvolume).
1362
[745]1363 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1364 # Size computed via LVM not directly
[747]1365 partition_size="lvm"
1366 else
1367 partition_size=`SizeOfPartition $current_partition`
1368 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1369 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1370 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1371 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1372 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1373 [ "$partition_format" != "swap" ] && partition_format="swap"
1374 if [ "$partition_size" = "" ] ; then
1375 totalsize=0
1376 items=0
1377 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1378 totalsize=$(($totalsize+$i))
1379 items=$(($items+1))
1380 done
1381 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1382 [ "$partition_size" -lt "125000" ] && partition_size=125000
1383 echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1384 fi
1385 fi
1386 fi
1387 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1388 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1389 if [ "$partition_mountpt" = "" ] ; then
1390 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1391 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1392 partition_mountpt="raid"
1393 partition_format="raid"
1394 else
1395 partition_mountpt="lvm"
1396 partition_format="lvm"
1397 fi
1398 fi
1399 fi
1400 psz=$partition_size
1401 echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1402 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1403 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1404 partition_mountpt="image"
1405 old_partition_fmt=$partition_format
[960]1406 echo "------- $FDISK -l log ------------" >> $LOGFILE
[747]1407 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1408 echo "------- $FDISK log end ------------" >> $LOGFILE
1409 partition_size=$(($partition_size+1)); # just in case
1410 if [ "$partition_format" = "Linux" ] ; then
1411 echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1412 echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1413 partition_format=$old_partition_fmt
1414 fi
1415 fi
1416 if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1417 echo "Excluding $current_partition from mountlist" >> $LOGFILE
1418 continue
1419 fi
1420 if [ ! "$partition_mountpt" ] ; then
1421 for qq in "" `find /dev/ida/c*d* ! -name '*p*'` ; do
[960]1422 echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
[747]1423 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1424 echo "------- $FDISK log end ------------" >> $LOGFILE
1425 [ "$partition_format" ] && break
1426 done
1427 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1428 partition_format="compaq"
1429 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1430 LogIt "Unable to find mountpoint of $current_partition - ignoring\n"
1431 continue
1432 fi
1433 fi
1434 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1435 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | awk '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1436 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s\n" $current_partition $partition_mountpt $partition_format $psz`
1437 if [ "$current_partition" = "" ] ; then
1438 echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1439 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1440 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1441 partition_mountpt=raid
1442 partition_format=raid
1443 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1444 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1445 else
1446 echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1447 fi
1448 elif [ "$partition_format" = "" ] ; then
1449 echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1450 elif [ "$partition_size" = "" ] ; then
1451 echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1452 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1453 continue
1454 else
1455 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1456 echo "Stupid bastard..." >> $LOGFILE
1457 partition_format="vfat"
1458 fi
1459 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1460 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1461 fi
1462 done
1463}
1464
1465
1466MakeSureNumberIsInteger() {
1467 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1468 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1469 echo "result = '$res'"
1470 Die "$1 should be an integer"
1471 fi
1472}
1473
1474
1475MakeSyslinuxMessageFile() {
1476 mkdir -p $1
1477 rmdir $1
1478 echo -en " " > $1
1479 if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1480 sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s%DDDDD%"Debian GNU\/`uname -s` `cut -d ' ' -f 3 /etc/issue.net` `hostname`"% | sed s/KKKKK/"Kernel `uname -r` on a `uname -m`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ >> $1.tmp
1481 else
1482 sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s/DDDDD/"`grep -i "linux" /etc/issue.net | head -n1 | tr -s ' ' ' '`"/ | sed s/KKKKK/"`grep -i "kernel" /etc/issue.net | head -n1 | tr -s ' ' ' '`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ | sed s/' '\\r' 'on' 'an' '\/' '`uname -r`' 'on' 'an' '`uname -m`/ >> $1.tmp
1483 fi
1484 sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1485 rm -f $1.tmp
1486 if [ "$CDRECOVERY" != "yes" ] ; then
[940]1487 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]1488 echo -en "Press <enter> to continue.\n" >> $1
[940]1489 elif [ ! "$MINDI_TMP" ] ; then
[747]1490 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1491 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1492 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1493 fi
1494 else
1495 echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1496 fi
1497 else
1498 echo -en " \
1499To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1500CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1501 fi
1502}
1503
1504
1505MoveHyperlinkSensibly() {
1506 local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1507 filename=$1
1508 minidir_root=$2
1509 resides_on_diskno=$3
1510 noof_disks=$4
1511
1512 [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1513
1514 old_diskno=$resides_on_diskno
1515 d=1
1516 while [ "$d" -le "$noof_disks" ] ; do
1517 if [ "$d" -ne "$old_diskno" ] ; then
1518 old_pwd=`pwd`
1519 cd $minidir_root/$old_diskno
1520 cp --parents -Rdf $filename $minidir_root/$d/ || Die "Can't move $filename (sensibly) from $old_diskno to $d"
1521 rm -f $filename
1522 cd $old_pwd
1523 fi
1524# when the softlink is resolvable, our work here is done
1525 [ -e "$minidir_root/$d/$filename" ] && return 0
1526 old_diskno=$d
1527 d=$(($d+1))
1528 done
1529 return 1
1530}
1531
1532
1533
1534OfferToCopyImagesToDisks() {
1535 local imagesdir i imagename dev count boot_dev data_dev
1536 imagesdir=$1
1537 boot_dev=$2
1538 data_dev=$3
[925]1539
[747]1540 echo -en "Would you like to create boot+data floppy disks now (y/n) ?"
1541 read i
1542 [ "$i" != "y" ] && [ "$i" != "Y" ] && return
1543 mount | grep -F /dev/fd > /dev/null && Die "Please unmount your floppies first."
1544 echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
1545 [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
1546 [ ! -e "$data_dev" ] && Die "Cannot find $data_dev - is your Linux distro broken?"
1547 i=`find $imagesdir -type f | grep -F "/mindi-root.1" 2> /dev/null`
1548 j=`find $imagesdir -type f | grep -F "/mindi-boot" | grep -Ev '2880|5760'`
1549 if [ "$i" ] ; then
1550 CopyImageToDisk $j $data_dev "boot disk"
1551 CopyImageToDisk $i $data_dev "root disk"
1552 else
1553 CopyImageToDisk $j $boot_dev "boot/root disk"
1554 fi
1555 count=1
1556 for i in `find $imagesdir | grep -F mindi-data` ; do
1557 CopyImageToDisk $i $data_dev "data disk #$count"
1558 count=$(($count+1))
1559 done
1560}
1561
1562
1563OfferToMakeBootableISO() {
1564 local i old_pwd
1565 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ ! "`DidMondoCallMe`" ] ; then
1566 echo -en "Shall I make a bootable CD image? (y/n) "
1567 read i
1568 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1569 fi
[940]1570 if [ ! "$MINDI_TMP" ] ; then
[747]1571 LogIt "NB: Mindi's bootable CD always uses isolinux.\n"
1572 LogIt "For a bootable CD w/LILO, please use Mondo.\n"
1573 fi
[940]1574 rm -Rf $MINDI_TMP/iso
1575 mkdir -p $MINDI_TMP/iso/{images,archives,isolinux}
1576 cp -f $1/*.img $1/*.gz $MINDI_TMP/iso/images || LogIt "OfferToMakeBootableISO: Cannot copy $i to $MINDI_TMP/iso/images\n"
[747]1577 old_pwd=`pwd`
[940]1578 cd $MINDI_TMP/iso
[747]1579 mkdir -p $MONDO_ROOT/iso/isolinux
1580 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1581 for i in memdisk memtest.bin memtest.img ; do
[953]1582 j=$MINDI_LIB/$i
1583 k=$MINDI_TMP/iso/isolinux
1584 if [ -e "$j" ] ; then
1585 LogIt "Copying $j to $k\n"
1586 cp -f $j $k 2> /dev/null || Die "Failed to copy $j to $k"
1587 cp -f $j $MINDI_TMP 2> /dev/null || Die "Failed to copy $j to $MINDI_TMP"
1588 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1589 fi
[747]1590 done
[940]1591 MakeSyslinuxMessageFile $MINDI_TMP/iso/isolinux/message.txt
[953]1592 cp $kernelpath $MINDI_TMP/iso/isolinux/vmlinuz 2> /dev/null || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MONDO_ROOT/isolinux/vmlinuz). Did you run out of disk space?"
[940]1593 cp $MINDI_TMP/mindi.rdz $MINDI_TMP/iso/isolinux/initrd.img
1594 cp $MINDI_TMP/mindi.rdz $CACHE_LOC/initrd.img
[747]1595 [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
[940]1596 cd $MINDI_TMP/iso/isolinux
1597 cat $iso_cfg_file | HackSyslinuxFile $ramdisk_size $MINDI_TMP/iso > isolinux.cfg || Die "Cannot copy isolinux.cfg from mindi_home to tmp_root - did you run out of disk space?"
1598 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]1599 mv isolinux.cfg isolinux.cfg.old
1600 sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1601 fi
1602 if [ "$ARCH" != "ia64" ] ; then
[953]1603 cp $ISOLINUX isolinux.bin 2> /dev/null || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
[747]1604 cp $ISOLINUX ../
1605 fi
[940]1606 cd $MINDI_TMP/iso
[747]1607 if [ "$ARCH" != "ia64" ] ; then
[953]1608 cp -f $MINDI_TMP/iso/isolinux/{isolinux.cfg,initrd.img,vmlinuz,isolinux.bin,message.txt} $MONDO_ROOT 2> /dev/null || Die "Cannot copy core files to ramdisk for boot disk. Did you run out of disk space?"
[747]1609 fi
1610 [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun .
1611 if [ "$ARCH" != "ia64" ] ; then
[940]1612 mkisofs -U -J -r -o $CACHE_LOC/mindi.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table . > /dev/null 2> $MINDI_TMP/mkisofs.log
[747]1613 else
[940]1614 mkisofs -J -r -o $CACHE_LOC/mindi.iso -b images/mindi-bootroot.$IA64_BOOT_SIZE.img -c isolinux/boot.cat -no-emul-boot . > /dev/null 2> $MINDI_TMP/mkisofs.log
[747]1615 fi
1616 if [ "$?" -ne "0" ] ; then
[925]1617 echo "----------- mkisofs's errors --------------" >> $LOGFILE
[940]1618 cat $MINDI_TMP/mkisofs.log >> $LOGFILE
[925]1619 echo "mkisofs returned the following errors:-"
[940]1620 cat $MINDI_TMP/mkisofs.log
[925]1621 LogIt "Failed to create ISO image.\n"
[747]1622 else
[925]1623 echo "Created bootable ISO image at $CACHE_LOC/mindi.iso" >> $LOGFILE
[747]1624 fi
[940]1625 rm -f $MINDI_TMP/mkisofs.log
[747]1626 cd $old_pwd
1627}
1628
1629
1630PluralOrNot() {
1631 [ "$1" -gt "1" ] && echo -en "s"
1632}
1633
1634
1635MakeMessageFile() {
1636 local disksize
1637 disksize=$1
1638 if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1639 sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s%DDDDD%"Debian GNU\/`uname -s` `cut -d ' ' -f 3 /etc/issue.net` `hostname`"% | sed s/KKKKK/"Kernel `uname -r` on a `uname -m`"/ | sed s/TTTTT/"`LC_TIME=C date`"/
1640 else
1641 sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s/DDDDD/"`grep -i "linux" /etc/issue.net | head -n1 | tr -s ' ' ' '`"/ | sed s/KKKKK/"`grep -i "kernel" /etc/issue.net | head -n1 | tr -s ' ' ' '`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ | sed s/' 'r' 'on' 'an' 'm/' '`uname -r`' 'on' 'an' '`uname -m`/
1642 fi
1643 if [ "$disksize" -gt "2880" ] ; then
[925]1644 if [ "`DidMondoCallMe`" ] ; then
1645 if [ "$CDRECOVERY" != "yes" ] ; then
[940]1646 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[925]1647 echo -en "Press <enter> to continue.\n"
[940]1648 elif [ ! "$MINDI_TMP" ] ; then
[925]1649 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1650 else
1651 echo -en "$BOOT_MEDIA_MESSAGE"
1652 fi
[747]1653 fi
1654 fi
1655 fi
1656 if [ "$CDRECOVERY" = "yes" ] ; then
1657 echo -en "\
1658To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1659CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1660 fi
1661 echo -en "\n\n\n"
1662}
1663
1664
1665write_full_floppy_of_kernel() {
1666 local mtpt image old_pwd res disksize
1667
1668 res=0
1669 old_pwd=`pwd`
1670 KERN_DISK_MADE=1
1671 disksize=$3
1672 rand1=$RANDOM
1673 rand2=$RANDOM
[940]1674 image=$MINDI_TMP/$rand1.$rand2.img
1675 mtpt=$MINDI_TMP/$rand1.$rand2.mtpt
[747]1676 dd if=/dev/zero of=$image bs=1k count=$disksize
1677 mke2fs -N 26 -F $image > /dev/null
1678 mkdir -p $mtpt
1679 mount -o loop $image $mtpt
1680 cd $mtpt
1681 mkdir -p {dev,tmp,boot}
1682 cp -f $1 vmlinuz
1683 if [ "$?" -ne "0" ] ; then
1684 LogIt "Failed to copy $1 to ramdisk\n"
1685 cd $old_pwd
1686 umount $mtpt
1687 rmdir $mtpt
1688 rm $image
1689 return 1
1690 fi
1691
1692 rdev vmlinuz 2,0
1693 rdev -R vmlinuz 0
1694 rdev -r vmlinuz 49152
1695
1696 tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1697 losetup /dev/loop0 > /dev/null 2> /dev/null
1698 [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1699 CopyBootBFile $mtpt/boot.b
1700
1701 MakeLiloConfFile $disksize >> bdlilo.conf
1702
1703 chmod 644 bdlilo.conf
1704 MakeMessageFile $disksize > message
1705 lilo -v -C bdlilo.conf -r $mtpt
1706 res=$?
1707
1708 cd $old_pwd
1709 umount $mtpt
1710 mv -f $image $2
1711 rmdir $mtpt
1712
1713 return $res
1714}
1715
1716
1717MakeLiloConfFile() {
1718 local disksize options i ooo
1719 disksize=$1
1720 options=""
[925]1721
1722 if [ "$ARCH" != "ia64" ] ; then
1723 echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1724 fi
1725 if [ "$disksize" -eq "2880" ] ; then
1726 echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1727 elif [ "$disksize" -eq "1722" ] ; then
1728 echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1729 elif [ "$disksize" -gt "2880" ] ; then
1730 /bin/true
1731 else
1732 echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1733 fi
1734 if [ "$ARCH" != "ia64" ] ; then
1735 echo -en "install=/boot.b\nmap=/boot.map\n"
1736 fi
[747]1737 if [ "$CDRECOVERY" = "yes" ] ; then
1738 echo -en "default=RESTORE\n"
1739 elif [ "$disksize" -gt "2880" ] && [ "`DidMondoCallMe`" ] ; then
[940]1740 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]1741 echo -en "default=iso\n"
1742 else
1743 echo -en "default=interactive\n"
1744 fi
1745 else
1746 echo -en "default=expert\n"
1747 fi
1748
1749 echo -en "prompt\n"
1750 if [ "$ARCH" != "ia64" ] ; then
1751 echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1752 fi
1753 if [ "$CDRECOVERY" != "yes" ] ; then
[925]1754 echo -en "timeout=300\n"
[747]1755 fi
1756 echo -en "\n"
1757 if [ "$CDRECOVERY" = "yes" ] ; then
[925]1758 options="RESTORE expert"
[747]1759 elif [ "$disksize" -gt "2880" ] ; then
1760 if [ "`DidMondoCallMe`" ] ; then
[940]1761 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]1762 options="iso"
1763 else
1764 options="interactive expert compare iso nuke isonuke"
1765# hda hdb hdc hdd"
1766 fi
1767 else
1768 options="expert"
[925]1769 fi
[747]1770 else
1771 options="expert"
1772 fi
1773 for i in $options ; do
[925]1774 ooo=$i
1775 [ "$ooo" = "RESTORE" ] && ooo="nuke"
1776 if [ "$ARCH" = "ia64" ] ; then
1777 rootpart="root=/dev/ram0\n\t"
1778 else
1779 rootpart=""
1780 fi
1781 outstr="image=vmlinuz\n\tlabel=$i\n\tinitrd=/mindi.rdz\n\t${rootpart}append=\" rw ramdisk=$ramdisksize ramdisk_size=$ramdisksize maxcpus=1 $ooo_mode $ADDITIONAL_BOOT_PARAMS"
[747]1782
[925]1783 outstr=$outstr" $ooo_mode"
1784 outstr=$outstr"\"\n"
1785 if [ "$disksize" = "1440" ] ; then
1786 echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1787 else
1788 echo -en "$outstr"
1789 fi
[747]1790 done
1791}
1792
1793
1794PrepareBootDiskImage_LILO() {
1795 local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1796 imagesdir=$1
1797 disksize=$2
1798 kernelpath=$3
1799 ramdisksize=$4
1800
1801 retval=0
1802 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1803 echo -en "Making "$disksize"KB boot disk..."
[940]1804 TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/mindi.rdz $ramdisksize $disksize `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into mindi.rdz; are you SURE your kernel supports loopfs?"
[747]1805 if [ "$ARCH" != "ia64" ] ; then
1806 [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1807 fi
1808 echo -en "..."
1809 imagefile=$imagesdir/mindi-bootroot.$disksize.img
[940]1810 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1811 mkdir -p $mountpoint
1812 dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1813 if [ "$ARCH" = "ia64" ] ; then
[940]1814 mkdosfs $imagefile > $MINDI_TMP/mke2fs.log 2>> $MINDI_TMP/mke2fs.log
[747]1815 t=vfat
1816 else
[940]1817 mke2fs -N 26 -m 0 -F $imagefile > $MINDI_TMP/mke2fs.log 2>> $MINDI_TMP/mke2fs.log
[747]1818 t=ext2
1819 fi
[940]1820 [ "$?" -ne "0" ] && cat $MINDI_TMP/mke2fs.log
1821 rm -f $MINDI_TMP/mke2fs.log
[747]1822 mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
1823# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1824 mkdir -p $mountpoint/etc
1825 if [ "$ARCH" != "ia64" ] ; then
1826 liloconf=$mountpoint/etc/lilo.conf
1827 else
[925]1828 liloconf=$mountpoint/elilo.conf
[747]1829 fi
1830 old_pwd=`pwd`
1831 cd $mountpoint
1832 if [ "$ARCH" != "ia64" ] ; then
1833 tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1834 fi
1835 cd $old_pwd
1836 losetup /dev/loop0 > /dev/null 2> /dev/null
1837 [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1838 CopyBootBFile $mountpoint/boot.b
1839
1840 MakeLiloConfFile $disksize > $liloconf
1841
[940]1842 echo "Copying $MINDI_TMP/mindi.rdz to $mountpoint..." >> $LOGFILE
1843 cp -f $MINDI_TMP/mindi.rdz $mountpoint 2>> $LOGFILE
[747]1844 if [ "$?" -ne "0" ] ; then
[940]1845 LogIt "Failed to copy $MINDI_TMP/mindi.rdz to $mountpoint\n"
1846 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[925]1847 LogIt "Please unload some of your modules and try again.\n"
[940]1848 rm -f $MINDI_TMP/mtpt.$$
[925]1849 LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
[747]1850 retval=$(($retval+1))
1851 fi
1852 MakeMessageFile $disksize > $mountpoint/message
1853
1854 mkdir -p $mountpoint/tmp
[940]1855 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp &> /dev/null
[747]1856 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1857 echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
1858 echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
1859# echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
1860 fi
1861
[925]1862 # copy the kernel across
[747]1863 rm -Rf $mountpoint/lost+found
1864 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1865 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1866 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
1867 if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
[925]1868 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1869 du -sk $mountpoint/* >> $LOGFILE
1870 echo "--- end of list of files ---" >> $LOGFILE
1871 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
[747]1872Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
1873 rm -f $mountpoint/vmlinuz
[925]1874 cd $old_pwd
[747]1875 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1876 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
[925]1877 # losetup /dev/loop0 -d
1878 res=0
[747]1879 write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
[925]1880 res=$(($res+$?))
[940]1881 cp -f $MINDI_TMP/mindi.rdz $imagesdir/mindi-root.1440.img
[925]1882 res=$(($res+$?))
1883 rm -f $imagefile
1884 if [ "$res" -ne "0" ]; then
1885 LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
1886 rm -f $imagesdir/mindi-*.1440.img
1887 fi
1888 return $res
[747]1889 fi
1890 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1891 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1892 echo "Free space left on floppy = $free_space KB" >> $LOGFILE
1893 echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
1894# make it bootable
1895 rm -f $mountpoint/zero
1896 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
1897 if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
1898 if [ "$ARCH" != "ia64" ] ; then
1899 $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
1900 else
1901 /bin/true
1902 fi
1903 elif [ ! "$KERN_DISK_MADE" ] ; then
1904# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
[925]1905 $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
[747]1906 else
[925]1907 echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
[747]1908 fi
[925]1909
1910 # BERLIOS does not test necessarily what it expects
[747]1911 if [ $? -ne "0" ] ; then
[925]1912 if [ "`grep -F "/tmp/dev.0" $LOGFILE`" ] ; then
1913 LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's.\n"
1914 LogIt "Please reboot your PC as a workaround.\n"
1915 Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ.\n"
1916 fi
1917 echo "$LILO_EXE -r $mountpoint ...failed."
1918 echo -en "Press ENTER to continue."; read line
1919 LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug.\n"
1920 retval=$(($retval+1))
[747]1921 fi
[940]1922 cp -f $liloconf $MINDI_TMP/lilo.conf
[747]1923 if [ "$ARCH" = "ia64" ] ; then
1924 cp `dirname $kernelpath`/*.efi $mountpoint
1925 fi
1926 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1927 echo -en "..."
1928 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
1929 if [ "$retval" -eq "0" ] ; then
1930 echo -en "...$DONE\r"
1931 if [ "$KERN_DISK_MADE" ] ; then
1932 LogIt "... $disksize KB boot disks were created OK\r"
1933 fi
1934 else
1935 echo -en "...failed\r"
1936 LogIt $disksize"KB boot disk was NOT created\r"
1937 rm -f $imagefile
1938 fi
1939 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
1940 return $retval
1941}
1942
1943
1944PrepareBootDiskImage_SYSLINUX() {
1945 local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1946 imagesdir=$1
1947 disksize=$2
1948 kernelpath=$3
1949 ramdisksize=$4
1950 do_boot_root_thingy=""
1951 local retval old_pwd
1952 retval=0
[925]1953
[747]1954 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1955 echo -en "Making "$disksize"KB boot disk..."
[940]1956 TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/mindi.rdz $ramdisksize $disksize `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into mindi.rdz; are you SURE your kernel supports loopfs?"
[747]1957 [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1958 echo -en "..."
1959 imagefile=$imagesdir/mindi-bootroot.$disksize.img
[940]1960 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1961 mkdir -p $mountpoint
1962# If I format a 1722KB data file & run syslinux on it, the resultant image
1963# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
1964# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
1965# If I extract it, mount it, copy my files to it, etc. then the resultant
1966# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
1967# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
1968 if [ "$disksize" = "1722" ] ; then
1969 gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
1970 else
1971 dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1972 mkfs.vfat $imagefile
1973 syslinux $imagefile
1974 fi
1975 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
[925]1976
1977 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[747]1978 old_pwd=`pwd`
1979 MakeSyslinuxMessageFile $mountpoint/message.txt
1980 cd $mountpoint
1981 [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
1982 cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
[940]1983 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]1984 mv syslinux.cfg syslinux.cfg.orig
1985 sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
1986 fi
1987 cd $old_pwd
[940]1988 echo "Copying $MINDI_TMP/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
1989 cp -f $MINDI_TMP/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
[747]1990 if [ "$?" -ne "0" ] ; then
[940]1991 LogIt "Failed to copy $MINDI_TMP/mindi.rdz to $mountpoint\n"
1992 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[747]1993 LogIt "Please unload some of your modules and try again.\n"
[940]1994 rm -f $MINDI_TMP/mtpt.$$
[747]1995 LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
1996 retval=$(($retval+1))
1997 fi
1998
1999 mkdir -p $mountpoint/tmp
[940]2000 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp &> /dev/null
[747]2001
[925]2002 # copy the kernel across
[747]2003 rm -Rf $mountpoint/lost+found
2004 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2005 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2006 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2007 if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2008 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2009 du -sk $mountpoint/* >> $LOGFILE
2010 echo "--- end of list of files ---" >> $LOGFILE
2011 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2012Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2013 rm -f $mountpoint/vmlinuz
2014 cd $old_pwd
2015 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2016 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2017
2018 res=0
2019 write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2020 res=$(($res+$?))
[940]2021 cp -f $MINDI_TMP/mindi.rdz $imagesdir/mindi-root.1440.img
[747]2022 res=$(($res+$?))
2023 rm -f $imagefile
2024 if [ "$res" -ne "0" ]; then
2025 LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2026 rm -f $imagesdir/mindi-*.1440.img
2027 fi
2028 return $res
2029 fi
2030 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2031 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2032 echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2033 echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
[925]2034
2035 # make it bootable
[747]2036 rm -f $mountpoint/zero
2037 mkdir -p $mountpoint/etc
2038 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2039 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2040 echo -en "..."
2041 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2042
2043 if [ "$retval" -eq "0" ] ; then
2044 echo -en "...$DONE\r"
2045 if [ "$KERN_DISK_MADE" ] ; then
2046 rm -f $imagefile
2047 LogIt "... $disksize KB boot disks were created OK\r"
2048 fi
2049 else
2050 echo -en "...failed\r"
2051 LogIt $disksize"KB boot disk was NOT created\r"
2052 rm -f $imagefile
2053 fi
2054 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2055 return $retval
2056}
2057
2058
2059PrepareDataDiskImages() {
2060 local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2061
2062 imagesdir=$1
2063 rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
[940]2064 needlist=$MINDI_TMP/what-we-need.txt
2065 bigdir=$MINDI_TMP/bigdir
2066 minidir_root=$MINDI_TMP/minidir
[747]2067 mkdir -p $minidir_root
2068 mkdir -p $bigdir/usr/bin
[940]2069 tardir=$MINDI_TMP/tardir
[747]2070
2071 lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt | grep -vx "" | wc -l`
2072 cat $MINDI_CONF/deplist.txt | GenerateGiantDependencyList $needlist $lines
2073 res=$?
2074 if [ "$YOUR_KERNEL_SUCKS" ]; then
[925]2075 pwd=`pwd`
[940]2076 cd $MINDI_TMP
[747]2077 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
[925]2078 cp --parents -pRdf ./$i $bigdir || Die "PDDI can't cp $i->$bigdir"
2079 if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
2080 cp --parents -pRdf $i $bigdir
2081 else
2082 ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2083 BIGNO=$(($BIGNO+1))
2084 fi
[747]2085 done
[925]2086 for i in $EXTRA_MODS ; do
2087 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
2088 [ ! "$j" ] && echo "Warning - cannot find failsafe module $i.o" >> $LOGFILE
2089 for k in $j ; do
2090 if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
2091 cp --parents -pRdf $k $bigdir
2092 else
2093 ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2094 BIGNO=$(($BIGNO+1))
2095 fi
2096 echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2097 done
2098 done
2099 cd $pwd
[747]2100 else
[925]2101 ListKernelModulePaths >> $needlist
[747]2102 fi
2103 if [ "$res" -ne "0" ] ; then
2104 Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2105 fi
2106 FindAndAddUserKeyboardMappingFile
2107 mkdir -p $bigdir/tmp
2108 if [ "`DidMondoCallMe`" ] ; then
[940]2109 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2110 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
[747]2111 fi
2112 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2113 DropOptimizedLibraries $needlist $bigdir
2114 echo -en "Assembling dependency files"
2115 CopyDependenciesToDirectory < $needlist $bigdir
2116
[925]2117 # also copy io.sys and msdos.sys, if we can find them
[747]2118 for i in `mount | cut -d' ' -f3` ; do
[925]2119 for j in io.sys msdos.sys ; do
2120 [ -e "$i/$j" ] && cp -f $i/$j $bigdir
2121 done
[747]2122 done
2123
[925]2124 # master boot record, too
[940]2125 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
[747]2126 if [ "$i" ] ; then
[925]2127 LogIt "Backing up $i's MBR\n"
2128 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2129 sleep 1
2130 sync
2131 j=$i
2132 [ -h "$j" ] && j=`readlink -f $j`
2133 LogIt "Creating /dev/boot_device ($j)\n"
2134 mkdir -p $bigdir/dev
[953]2135 cp -pRdf $j $bigdir/dev/boot_device 2> /dev/null || Die "Unable to create /dev/boot_device on ramdisk"
[747]2136 fi
2137
2138 old_pwd=`pwd`
2139 cd $bigdir
2140
2141 [ -e "$MINDI_LIB/aux-tools" ] || Die "aux-tools not found in Mindi's home dir. Do you have multiple copies of Mindi lying around? Please delete them. No, don't e-mail me and ask how. ;) Use 'rm'."
2142 cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping aux-tools\n"
2143 if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
[925]2144 tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping x11-tools.tgz\n"
[747]2145 fi
2146 if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2147 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2148 [ "$?" -ne "0" ] && [ "`DidMondoCallMe`" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2149 fi
2150 [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state .
2151 cd $old_pwd
2152 echo -e "$DONE"
2153 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2154 SplitDirectoryIntoMinidirs $bigdir $minidir_root
2155 noof_disks=$?
2156 [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2157# if [ "$noof_disks" -ge "8" ] ; then
2158# LogIt "You are putting a ludicrously large amount of data on these disks."
2159# LogIt "I shall therefore double EXTRA_SPACE, just in case your ramdisk is too small."
2160# EXTRA_SPACE=$(($EXTRA_SPACE*2))
2161# fi
[940]2162 MakeMountlist $MINDI_TMP/mountlist.txt
[747]2163 mkdir -p $minidir_root/$noof_disks/tmp
[953]2164 cp -f $MINDI_TMP/mountlist.txt $minidir_root/$noof_disks/tmp/mountlist.txt 2> /dev/null || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
[940]2165 [ "`DidMondoCallMe`" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MINDI_TMP/.
[747]2166 [ $LVM != "false" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2167 cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2168 ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2169 CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2170 FRIENDLY_OUTSTRING="Boot and data disk images were created."
[925]2171 # One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
[747]2172 rmdir $tardir $bigdir
2173 rm -f $needlist
2174 return $noof_disks
2175}
2176
2177
2178ProcessLDD() {
2179 local main_fname incoming j i fname f newf
2180 main_fname=$1
2181 read incoming
2182 while [ "$incoming" != "" ] ; do
[859]2183 # We take the full path name of the dyn. lib. we want
2184 incoming=`echo "$incoming" | sed '/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*(.*/d ; s/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*\(\/.*\)/\1/ ; s/[[:blank:]]*\(\/.*\)[[:blank:]]*(.*/\1/'`
2185 for f in `echo "$incoming"` ; do
[862]2186 echo "$f `ReadAllLink $f`"
[747]2187 done
2188 read incoming
2189 done
2190}
2191
2192
2193Prompt() {
2194 echo -en "$1"
2195 read line
2196}
2197
2198
2199ReadLine() {
2200 local i incoming
2201 read incoming
2202 i=0
2203 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
[925]2204 i=$(($i+1))
2205 read incoming
[747]2206 done
2207 echo "$incoming"
2208}
2209
2210
2211RejigHyperlinks() {
2212 local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2213 minidir_root=$1
2214 noof_disks=$2
2215
2216 old_pwd=`pwd`
2217 diskno=1
2218 while [ "$diskno" -le "$noof_disks" ] ; do
[859]2219 mkdir -p $minidir_root/$diskno
[747]2220 cd $minidir_root/$diskno
2221 for fname in `find -type d -o -print` ; do
2222 [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2223 done
[925]2224 diskno=$(($diskno+1))
[747]2225 done
2226
2227 cd $old_pwd
2228 return
2229}
2230
2231
2232ReplaceIndividualLine() {
2233 local orig_file new_file lino newstring lines_total lines_remaining
[925]2234
[747]2235 orig_file=$1.orig
2236 mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2237 new_file=$1
2238 lino=$2
2239 newstring="$3"
2240 if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
[925]2241 echo "Can't find string" >> $LOGFILE
2242 return 1
[747]2243 fi
2244 lines_total=`wc -l $orig_file | gawk '{print $1;}'`
2245 lines_remaining=$(($lines_total-$lino))
2246 head -n$(($lino-1)) $orig_file > $new_file
2247 echo "$newstring" >> $new_file
2248 echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2249 tail -n$lines_remaining $orig_file >> $new_file
2250 echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2251 [ -x "$orig_file" ] && chmod +x $new_file
2252 rm -f $orig_file
2253 return 0
2254}
2255
2256
2257ScanCDandTape() {
2258 local i
2259
2260 for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2261 dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2262 done
2263}
2264
2265
2266SizeOfPartition() {
2267 local devpath drive res stub
2268 device=$1
2269 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
[925]2270 res=`SizeOfRaidPartition $device`
2271 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2272 echo "$res"
2273 return 0
[747]2274 fi
[925]2275 # patch from Bill <bill@iwizard.biz> - 2003/08/25
[747]2276 echo "------- $FDISK -l $device log ------------" >> $LOGFILE
[960]2277 res=`$FDISK -s $device 2>> $LOGFILE`
[747]2278 echo "------- $FDISK log end ------------" >> $LOGFILE
[925]2279 # end patch
[747]2280 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2281 [ "$res" = "" ] && res="-1"
2282 echo $res
2283 return 0
2284}
2285
2286
2287SizeOfRaidPartition() {
2288 local real_dev smallest_size silly tmp
2289
2290 silly=999999999
2291 smallest_size=$silly
2292
2293 for real_dev in `GetRaidDevMembers $1` ; do
[925]2294 tmp=`SizeOfPartition $real_dev`
2295 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
[747]2296 done
2297
2298 if [ "$smallest_size" = "$silly" ] ; then
[925]2299 echo "-1"
2300 return 1
[747]2301 else
[925]2302 echo "$smallest_size"
2303 return 0
[747]2304 fi
2305}
2306
2307
2308StripComments()
2309{
2310 local tempfile
[925]2311
[940]2312 tempfile=$MINDI_TMP/$$.strip.txt
[747]2313 cp -f $1 $tempfile
2314 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2315 rm -f $tempfile
2316 echo "Stripped comments from $2" >> $LOGFILE
2317}
2318
2319
2320SplitDirectoryIntoMinidirs() {
2321 local bigdir minidir_root i noof_disks old_pwd res
[925]2322
[747]2323 bigdir=$1
2324 minidir_root=$2
2325 rm -Rf $minidir_root/*
2326
2327 TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2328 noof_disks=$?
2329 if [ "$noof_disks" -eq "0" ] ; then
[925]2330 echo "Failed to fit data into several dirs."
[747]2331 return 0
2332 fi
2333 RejigHyperlinks $minidir_root $noof_disks
2334 rm -Rf $bigdir/*
[925]2335 return $noof_disks
[747]2336}
2337
2338
2339StripExecutable()
2340{
2341 local tmpfile
[925]2342
[940]2343 tmpfile=$MINDI_TMP/stripped.$$.dat
[747]2344 [ -d "$1" ] || [ -h "$1" ] && return
2345 cp -f $1 $tmpfile
2346 strip $tmpfile 2> /dev/null
2347 if [ "$?" -eq "0" ] ; then
[925]2348 cp -f $tmpfile $1
2349 echo "Stripped binary $2" >> $LOGFILE
[747]2350 fi
2351 rm -f $tmpfile
2352}
2353
2354
2355TemporarilyCompressAllFiles() {
2356 local i orig_fname out_fname out_list
2357
2358 i=0
2359 out_list=$2/compressed/compressed.txt
2360 mkdir -p $2/compressed
2361 > $out_list
2362 for orig_fname in $1 ; do
2363 out_fname=$2/compressed/$orig_fname.gz
2364 mkdir -p $out_fname 2> /dev/null
2365 rmdir $out_fname 2> /dev/null
2366 gzip -c6 $orig_fname > $out_fname 2> /dev/null
2367 i=$(((($i+1))%15))
2368 [ "$i" -eq "0" ] && echo -en "."
2369 du -sk $out_fname >> $out_list
2370 done
2371}
2372
2373
2374TryToFindKernelPath() {
2375 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
[925]2376
[747]2377 we_want_version=`uname -r`
2378 possible_kernels=""
2379 duff_kernels=""
2380
2381 if [ "$ARCH" = "ia64" ] ; then
2382 root="/boot/efi/efi"
2383 else
2384 root="/"
2385 fi
2386 for fname in `find $root -maxdepth 2 -type f | grep -F lin | grep -Ev '^/proc/|^/net/'` ; do
[925]2387 [ ! -e "$fname" ] && continue
[747]2388 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
[925]2389 file $fname | grep -q gzip
2390 if [ "$?" -eq "0" ] ; then
2391 # Used by ia64
[747]2392 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
[925]2393 else
[747]2394 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
[925]2395 fi
[747]2396 [ "$fkern_ver" = "" ] && continue
2397 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
[925]2398 [ -f "$fname" ] || continue
2399 [ -h "$fname" ] && continue
2400 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2401 file $fname | grep -q gzip
2402 if [ "$?" -eq "0" ] ; then
2403 # Used by ia64
2404 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2405 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it...\n"
2406 duff_kernels="$fname $duff_kernels"
2407 else
[747]2408 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2409 possible_kernels="$fname $possible_kernels"
[925]2410 fi
[747]2411 else
[925]2412 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2413 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it...\n"
2414 duff_kernels="$fname $duff_kernels"
2415 else
[747]2416 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2417 possible_kernels="$fname $possible_kernels"
[925]2418 fi
[747]2419 fi
2420 done
2421 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
[925]2422 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
[747]2423 fi
2424 if [ ! "$possible_kernels" ] ; then
2425 LogIt "No kernel matches exactly. Are there any duff kernels?\n"
2426 possible_kernels="$duff_kernels"
2427 if [ ! "$possible_kernels" ] ; then
2428 LogIt "Sorry, no duff kernels either\n"
2429 else
2430 LogIt "I bet you're running Debian or Gentoo, aren't you?\n"
2431 LogIt "Your kernel doesn't have a sane builddate. Oh well...\n"
2432 fi
2433 fi
2434 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2435 noof_kernels=`CountItemsIn "$possible_kernels"`
2436 if [ "$noof_kernels" -eq "0" ] ; then
2437 LogIt "Could not find your kernel.\n"
[925]2438 if [ -e "/boot/vmlinuz" ] ; then
2439 LogIt "Using /boot/vmlinuz as a last resort.\n"
2440 output=/boot/vmlinuz
[747]2441 else
[925]2442 output=""
2443 fi
[747]2444 elif [ "$noof_kernels" -eq "1" ] ; then
2445 kernelpath=`echo "$possible_kernels" | sed s/' '//`
2446 echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2447 output="$kernelpath"
2448 else
2449 for i in $possible_kernels ; do
2450 if echo $i | grep "`uname -r`" ; then
[925]2451 LogIt "OK, I used my initiative and found that "
[747]2452 LogIt "$i is probably your kernel.\n "
[925]2453 output="$i"
2454 return
2455 fi
[747]2456 done
[925]2457 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2458 output=/boot/vmlinuz
2459 echo "Schlomo, this one's for you." >> $LOGFILE
2460 else
[747]2461 LogIt "Two or more possible kernels found. You may specify any one of them and the \n"
[925]2462 LogIt "boot disks will still work, probably. If one does not work, try another.\n"
[747]2463 LogIt "$possible_kernels\n"
2464 echo ""
[925]2465 fi
[747]2466 fi
2467 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2468}
2469
2470
2471TryToFitDataIntoSeveralDirs() {
2472 local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2473 local i retval noof_disks total_files list_of_devs
[925]2474
[747]2475 bigdir=$1
2476 minidir_root=$2
2477 BIG_CLUNKY_SIZE_COUNTER=0
2478 retval=0
2479 noof_disks=1
2480
2481 echo -en "\r \rDividing data into several groups..."
2482 old_pwd=`pwd`
2483 cd $bigdir
2484 list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | grep -Fv "/dev/"`
2485 progress=0
2486 total_files=`CountItemsIn "$list_of_files"`
2487 if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2488 filesize=1
2489 fi
2490 mkdir -p $minidir_root/$noof_disks
2491 if [ -e "dev" ] ; then
2492 echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
2493 cp --parents -pRdf dev $minidir_root/$noof_disks
2494 fi
2495 TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2496 for filename in $list_of_files ; do
2497 AddFileToDir $filename $minidir_root $noof_disks
[925]2498 i=$?
2499 if [ "$i" -gt "$noof_disks" ] ; then
2500 noof_disks=$i
2501 echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2502 fi
2503 if [ "$i" -eq "0" ] ; then
2504 LogIt "Cannot add file $filename to minidir $minidir_root\n"
2505 retval=$(($retval+1))
2506 fi
[747]2507 progress=$(($progress+1))
[925]2508 echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
[747]2509 done
2510 cd $old_pwd
2511 echo -en "\rThe files have been subdivided into $noof_disks directories. \r"
2512 rm -Rf $minidir_root/compressed
2513 if [ "$retval" -gt "0" ] ; then
[925]2514 return 0
[747]2515 else
[925]2516 return $noof_disks
[747]2517 fi
2518}
2519
2520
2521TurnTgzIntoRdz() {
2522 local tgz_dir_fname rdz_fname ramdisksize tempfile mountpoint old_pwd nodes disksize kernelsize maxsize res currsize not_copied j k floppy_modules s w
[925]2523
[747]2524 tgz_dir_fname=$1
2525 rdz_fname=$2
2526 ramdisksize=$3
2527 disksize=$4
2528 kernelsize=$5
2529 maxsize=$(($disksize-$kernelsize))
2530 maxsize=$(($maxsize*2)); # to allow for compression of 50%
[940]2531 tempfile=$MINDI_TMP/temp.rd
2532 mountpoint=$MINDI_TMP/mnt1
[747]2533 res=0
2534 echo -en "..."
2535 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2536 echo -en "..."
2537 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2538
[940]2539 [ "$?" -ne "0" ] && cat $MINDI_TMP/mke2fs.log
2540 rm -f $MINDI_TMP/mke2fs.log
[747]2541 echo -en "..."
2542 mkdir -p $mountpoint
2543 mount -t ext2 -o loop $tempfile $mountpoint || Die "Cannot loopmount $tempfile to $mountpoint! The reason may be missing support for loopfs or ext2 (or both) in the running kernel."
2544 echo -en "..."
2545 old_pwd=`pwd`
2546 cd $mountpoint
[959]2547 cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
[747]2548 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2549 cd dev || Die "Can't cd to dev"
2550 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2551 rm -f dev-entries.tgz
2552 cd ..
2553
2554 for w in insmod.static insmod.static.old ; do
[925]2555 s=`which $w 2> /dev/null`
2556 if [ -e "$s" ] ; then
2557 cp --parents -af $s .
2558 fi
[747]2559 done
2560
2561 mkdir -p tmp
2562 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2563 for w in cdrom floppy groovy-stuff ; do
2564 mkdir -p mnt/$w
2565 done
[925]2566 #if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2567 #ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2568 #fi
[747]2569 if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
[925]2570 ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
[747]2571 fi
2572
2573 lsmod > tmp/original-lsmod.txt
2574
2575 cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
2576 cd $old_pwd
2577 echo -en "..."
2578 MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2579 echo -en "..."
2580 old_pwd=`pwd`
2581 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[940]2582 cd $MINDI_TMP
[747]2583 floppy_modules_path=lib/modules/$FAILSAFE_KVER
2584 else
2585 cd /
2586###
2587### Sq-Modification... Use kernel name in module path if specified.
2588###
2589 #floppy_modules_path=lib/modules/`uname -r`
2590 if [ "${kernelname}" != "" ]
2591 then
2592 floppy_modules_path=lib/modules/${kernelname}
2593 else
2594 floppy_modules_path=lib/modules/`uname -r`
2595 fi
2596###
2597### Sq-Modification end
2598###
2599 fi
2600 floppy_modules=""
2601 if [ "$disksize" -lt "2880" ] ; then
2602 list_of_groovy_mods="$FLOPPY_MODS $IDE_MODS ide-scsi sr_mod cdrom isocd isofs `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2603 else
2604 list_of_groovy_mods="$CDROM_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2605 fi
[940]2606 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]2607 # For PXE boot
2608 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2609 fi
2610 [ -e "$floppy_modules_path" ] || LogIt "path $floppy_modules_path does not exist.\n If you're not using a modular kernel then you're NUTS.\n"
2611 for i in $list_of_groovy_mods ; do
2612 floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2613 done
2614 for i in $floppy_modules ; do
2615 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
[940]2616 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
[747]2617 echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
[953]2618 cp -df $i $mountpoint/ 2>/dev/null || LogIt "Unable to copy $i to $mountpoint\n"
[747]2619 [ "`echo "$i" | grep -F ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2620 done
2621 if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2622 echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2623 [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2624 [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2625 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2626 rm -f $mountpoint/sbin/devfsd
2627 fi
2628 cd $old_pwd
2629 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2630 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2631 rm -f $mountpoint/zero
2632 if [ "`DidMondoCallMe`" ] ; then
2633 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
[940]2634 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP &> /dev/null
[953]2635 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>/dev/null || Die "Cannot copy mountlist to ramdisk"
[747]2636 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2637 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2638 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2639 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2640 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2641 fi
2642 mkdir -p $mountpoint/tmp
2643 mkdir -p $mountpoint/proc
2644 echo "$disksize" > $mountpoint/tmp/$disksize.siz
2645 find $mountpoint -name CVS -exec rm -rf '{}' \;
2646 umount $mountpoint || Die "Cannot unmount $tempfile"
2647 dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2648# gzip -9 $tempfile
2649# mv $tempfile.gz $rdz_fname
2650 if [ "$res" -eq "0" ] ; then
2651 echo -en "..."
2652 else
2653 echo -en "\rMade an rdz WITH ERRORS. \n"
2654 fi
2655 return 0
2656}
2657
2658
2659WhichOfTheseModulesAreLoaded() {
2660 local modname loaded_modules
2661 loaded_modules=" `lsmod | tr -s ' ' '\t' | cut -f1 | grep -Fvx "Modules" | tr '\n' ' '` "
2662 for modname in $1 ; do
[925]2663 [ "`echo "$loaded_modules" | grep -F " $modname "`" ] && echo "$modname"
[747]2664 done
2665}
2666
2667
2668ZipMinidirsIntoTarballs() {
2669 local minidir_root tardir noof_disks diskno old_pwd i
2670 minidir_root=$1
2671 tardir=$2
2672 noof_disks=$3
2673
2674 echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2675 mkdir -p $tardir
2676 mkdir -p $minidir_root/all
2677 old_pwd=`pwd`
2678 diskno=1
2679 while [ "$diskno" -le "$noof_disks" ] ; do
2680 cd $minidir_root/$diskno || LogIt "Warning - cannot cd to $minidir_root/$diskno\n"
2681 tar -cf - . 2>> $LOGFILE | gzip -9 > $tardir/$diskno.tar.gz || Die "Can't tar/gzip disk#$diskno; please tell Dev Team -exactly- what the errors where."
2682 diskno=$(($diskno+1))
2683 echo -n "..."
[925]2684 cp -pRdf * $minidir_root/all
[747]2685 done
2686 mkdir -p $minidir_root/all/tmp
2687 cd $minidir_root/all
2688 size_of_all_tools=`du -sk . | cut -f1`
2689 if [ "`DidMondoCallMe`" ] ; then
2690 for q in filelist.full.gz biggielist.txt ; do
[940]2691 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2692 cp -pRdf $MINDI_TMP/$q tmp/
[747]2693 done
2694 mkdir -p $minidir_root/all/tmp
2695 echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
2696 echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
2697 fi
2698 tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
2699 dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
2700 [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
2701 cd $old_pwd
2702 rm -Rf $minidir_root
2703 echo -e "$DONE"
2704}
2705
2706
2707##############################################################################
2708#----------------------------------- main -----------------------------------#
2709##############################################################################
2710
2711
2712> $LOGFILE
2713echo "mindi v$MINDI_VERSION" >> $LOGFILE
2714echo "$ARCH architecture detected" >> $LOGFILE
2715echo "mindi called with the following arguments:" >> $LOGFILE
2716echo "$@" >> $LOGFILE
[800]2717echo "Start date : `date`" >> $LOGFILE
[747]2718
2719if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
2720 LogIt "Warning - Ancient distro detected.\n" 1
2721 ln -sf /etc/conf.modules /etc/modules.conf
2722fi
2723[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2724
2725FindHomeOfMindiAndMondo
2726trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2727AbortIfYourDistroIsAPieceOfStercus
2728[ "`uname -r | grep "2.4.[0-6]" | grep -v "2.4.[0-9][0-9]"`" != "" ] && echo "WARNING! Your kernel may have buggy loopfs code. Consider upgrading to 2.4.7"
2729# If we have a 2.6 kernel, the system uses module-init-tools which means that we
2730# may have the modprobe configuration spread out across multiple files in
2731# directory /etc/modprobe.d. If this is the case we concatenate these files into
2732# a temporary file for further processing. Otherwise we continue in the standard
2733# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
2734# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
2735# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
2736if [ -d "/etc/modprobe.d" ] && [ `uname -r | cut -c1-3` == "2.6" ] ; then
[925]2737 TMPMODPROBE_FLAG="Y"
[747]2738else
[925]2739 TMPMODPROBE_FLAG="N"
2740 [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
2741 [ ! -e "/etc/modules.conf" ] && Die "/etc/modules.conf not found; you may have to create a softlink from /etc/conf.modules to /etc/modules.conf; of course, all good distros use modules.conf anyway..."
[747]2742fi
2743FixPathIfBroken
2744[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2745AbortIfMkfsVfatMissing
[925]2746### BERLIOS
[747]2747### Fix as it's not mandatory on ia64
2748if [ "$ARCH" = "ia64" ] ; then
2749 FindELiloBinary
2750else
2751 FindIsolinuxBinary
2752 FindLiloBinary
2753fi
[925]2754# BERLIOS: Remove as too dangerous and now useless
[940]2755#grep -F " $MINDI_TMP " /proc/mounts | grep -F tmpfs > /dev/null 2> /dev/null && MINDI_TMP=/home/tmpmondo && mkdir -p $MINDI_TMP && LogIt "Changing MINDI_TMP to $MINDI_TMP because you're using tmpfs for /tmp\n" ; # tmpfs doesn't like Mindi and /tmp, for some reason
[747]2756trap "Aborted" SIGTERM
2757DONE="\r\t\t\t\t\t\t\t\tDone. "
2758CHOPSIZE=240
2759BIGNO=0
2760MAX_COMPRESSED_SIZE=1300
2761kernelpath=""
[925]2762MONDO_ROOT=$TMPMONDO/mondo-root
[747]2763mkdir -p $MONDO_ROOT
2764
2765if [ -d "/proc/lvm" ]; then
2766 # LVM v1
2767 LVMCMD=""
2768 LVM="v1"
2769elif [ -d "/dev/mapper" ]; then
2770 # LVM v2
2771 LVMCMD="lvm"
2772 LVM="v2"
2773else
2774 LVM="false"
2775fi
2776
2777if [ "$#" -ge "2" ] ; then
2778 if [ "$1" = "--max-compressed-size" ] ; then
2779 MAX_COMPRESSED_SIZE=$2
2780 shift; shift
2781 fi
2782fi
2783
2784FLOPPY_WAS_MOUNTED=""
2785for mtpt in /media/floppy /mnt/floppy /floppy ; do
2786 if mount | grep -w $mtpt &> /dev/null ; then
2787 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2788 umount $mtpt
2789 fi
2790done
2791
2792if [ "$#" -ne "0" ] ; then
2793 if [ "$1" = "--findkernel" ] ; then
2794 res=`TryToFindKernelPath`
2795 if [ "$res" = "" ] ; then
[925]2796 MindiExit -1
[747]2797 else
2798 echo "$res"
[925]2799 MindiExit 0
[747]2800 fi
2801 elif [ "$1" = "--makemountlist" ] ; then
2802 [ ! "$2" ] && Die "Please specify the output file"
2803 MakeMountlist $2
[925]2804 MindiExit $?
2805 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2806 echo "Mindi v$MINDI_VERSION"
2807 MindiExit 0
[747]2808 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
[940]2809 MONDO_TMP=$2
2810 # Change MINDI_TMP for the one provided by mondo
2811 # So that it can get back the built files
2812 rm -rf $MINDI_TMP
2813 MINDI_TMP=$MONDO_TMP
[953]2814 mkdir -p $MINDI_TMP
[938]2815 CACHE_LOC=$3
2816 if [ _"$CACHE_LOC" != _"" ]; then
2817 mkdir -p $CACHE_LOC
2818 fi
[925]2819 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
[747]2820###
2821### Sq-Modification...
2822### Attempt to locate kernel specific module path
2823### if module path is found then use it other wise use uname -r to set it...
2824###
2825 kernelname=`echo $kernelpath | cut -d'-' -f2-`
[925]2826 LogIt "kernelname = $kernelname\n"
2827 LogIt "kernelpath = $kernelpath\n"
[747]2828 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2829 then
2830 LogIt "Module path for ${kernelpath} not found...\n"
2831 LogIt "using running kernel\'s modules.\n"
2832 kernelname=`uname -r`
2833 else
2834 LogIt "Using modules for kernel: ${kernelname}\n"
2835 fi
2836###
2837### end of Sq-Modification
2838###
[925]2839 TAPEDEV=$5
2840 TAPESIZE=$6
2841 FILES_IN_FILELIST=$7
2842 USE_LZO=$8
2843 CDRECOVERY=$9
[747]2844 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2845 IMAGE_DEVS=""
2846 else
2847 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2848 fi
[925]2849 if [ "${11}" ] ; then
2850 LILO_OPTIONS=""
2851 # LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
2852 fi
2853 LAST_FILELIST_NUMBER=${12}
[747]2854 ESTIMATED_TOTAL_NOOF_SLICES=${13}
2855 EXCLUDE_DEVS="${14}"
2856 USE_COMP="${15}"
2857 USE_LILO="${16}"
[925]2858 USE_STAR="${17}"
2859 INTERNAL_TAPE_BLOCK_SIZE="${18}"
[747]2860 DIFFERENTIAL="${19}"
2861 NOT_BOOT="${20}"
2862 [ "$USE_COMP" = "" ] && USE_COMP=yes
2863 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
[925]2864 [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine.\n"
2865 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
[747]2866 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2867 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2868 then
2869 LogIt "Module path for ${kernelpath} not found...\n"
2870 LogIt "using running kernel\'s modules.\n"
2871 kernelname=`uname -r`
2872 else
2873 LogIt "Using modules for kernel: ${kernelname}\n"
2874 fi
[925]2875 [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
2876 MONDO_ROOT=`echo $CACHE_LOC | sed 's/\(.*\)\/.*/\1/'`
[938]2877 if [ _"$MONDO_ROOT" != _"" ]; then
2878 mkdir -p $MONDO_ROOT
2879 else
2880 Die "MONDO_ROOT is undefined"
2881 fi
[747]2882 else
[925]2883 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
2884 MindiExit -1
[747]2885 fi
2886fi
2887#ScanCDandTape
2888[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2889if [ "$CDRECOVERY" = "yes" ] ; then
2890 iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
2891 sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
2892else
2893 iso_cfg_file=$MINDI_LIB/isolinux.cfg
2894 sys_cfg_file=$MINDI_LIB/syslinux.cfg
2895fi
2896
2897[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
2898if [ ! "`DidMondoCallMe`" ] ; then
2899 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION\n"
[763]2900 LogIt "Latest Mindi is available from http://www.mondorescue.org\n"
[747]2901 LogIt "BusyBox sources are available from http://www.busybox.net\n"
2902 LogIt "------------------------------------------------------------------------------"
2903else
2904 echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> /var/log/mondo-archive.log
2905fi
2906
2907# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
2908insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
2909for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2910 insmod $i >> $LOGFILE 2>> $LOGFILE
2911done
2912
2913KERN_DISK_MADE=""
2914
2915echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
2916echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
2917echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
2918if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
2919 LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else.\n"
[940]2920 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2921 MakeMountlist $MINDI_TMP/mountlist.txt
2922 mkdir -p $MINDI_TMP/small-all/tmp
2923 cd $MINDI_TMP/small-all
[953]2924 cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>/dev/null || Die "Cannot copy small all.tar.gz"
[940]2925 tar -cv tmp | gzip -9 > $MINDI_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
[747]2926 sleep 2
2927 LogIt "Done. Exiting.\n"
[925]2928 MindiExit 0
[747]2929fi
2930
2931if [ "$kernelpath" = "" ] ; then
2932 [ "`DidMondoCallMe`" ] && Die "Please use -k <path> to specify kernel."
2933 if [ $USE_OWN_KERNEL != "yes" ]; then
2934 echo -en "Do you want to use your own kernel to build the boot disk (y/n) ?"
2935 read ch
2936 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2937 USE_OWN_KERNEL="yes"
2938 fi
2939 fi
2940 if [ "$USE_OWN_KERNEL" = "yes" ]; then
[925]2941 YOUR_KERNEL_SUCKS=""
2942 kernelpath=`TryToFindKernelPath`
2943 if [ "$kernelpath" = "" ] ; then
2944 echo -n "Please enter kernel path : "
2945 read kernelpath
2946 fi
[747]2947 else
[925]2948 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
[747]2949 fi
2950fi
2951if [ ! "`DidMondoCallMe`" ] ; then
2952 echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/n) ?"
2953 read ch
2954 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2955 USE_LILO=yes
2956 else
2957 USE_LILO=no
2958 fi
2959fi
2960if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
2961 kernelpath=$MINDI_LIB/vmlinuz
2962 LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks.\n"
2963 LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
2964 LogIt "disks then it may still be a result of a problem with your kernel.\n"
2965 pwd=`pwd`
[940]2966 cd $MINDI_TMP
[747]2967 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2968 cd $pwd
2969 YOUR_KERNEL_SUCKS="Your kernel sucks"
2970fi
[940]2971echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$CACHE_LOC" >> $LOGFILE
[747]2972[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty...\n"
2973
2974[ "$YOUR_KERNEL_SUCKS" ] && [ ! "$FAILSAFE_KVER" ] && Die "Please install mindi-kernel package. You need it. Go to http://www.mondorescue.org and download it, then install it."
2975
2976rm -f /root/images/mindi/{*img,*gz,*iso}
2977
[925]2978PrepareDataDiskImages $CACHE_LOC
[747]2979noof_disks=$?
2980ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2981rds=$(($ramdisk_size-$((ramdisk_size%4096))))
2982ramdisk_size=$rds
2983
2984echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
2985if [ "$USE_LILO" = "yes" ] ; then
2986 if [ "$ARCH" = "ia64" ] ; then
[925]2987 PrepareBootDiskImage_LILO $CACHE_LOC $IA64_BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
[747]2988 else
[925]2989 if ! PrepareBootDiskImage_LILO $CACHE_LOC 1722 $kernelpath $ramdisk_size ; then
[747]2990 LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
2991 LogIt "if you want to make a 1.72MB floppy disk.\n"
2992 fi
[925]2993 if ! PrepareBootDiskImage_LILO $CACHE_LOC 2880 $kernelpath $ramdisk_size ; then
[747]2994 LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
2995 LogIt "Please reduce your kernel's size\n"
2996 LogIt "if you want to make a 2.88MB floppy disk.\n"
[925]2997 PrepareBootDiskImage_LILO $CACHE_LOC 5760 $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
[747]2998 fi
2999 fi
3000else
[925]3001 if ! PrepareBootDiskImage_SYSLINUX $CACHE_LOC 1722 $kernelpath $ramdisk_size ; then
[747]3002 LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3003 LogIt "if you want to make a 1.72MB floppy disk.\n"
[925]3004 if ! PrepareBootDiskImage_SYSLINUX $CACHE_LOC 2880 $kernelpath $ramdisk_size ; then
[747]3005 LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3006 LogIt "Please reduce your kernel's size\n"
3007 LogIt "if you want to make a 2.88MB floppy disk.\n"
[925]3008 PrepareBootDiskImage_SYSLINUX $CACHE_LOC 5760 $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
[747]3009 fi
3010 fi
3011fi
3012
3013[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3014...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3015
3016if [ ! "`DidMondoCallMe`" ] ; then
[925]3017 ListImagesForUser $CACHE_LOC
[747]3018 boot_dev=/dev/fd0u1722
3019 [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3020 [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3021 [ ! -e "$boot_dev" ] && Die "Oh Lord, will you PLEASE tell the vendor to create the 1.72MB devices in /dev?"
3022 if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
[925]3023 OfferToCopyImagesToDisks $CACHE_LOC $boot_dev $FDDEVICE
[747]3024 fi
[925]3025 OfferToMakeBootableISO $CACHE_LOC
[747]3026 LogIt "Finished.\n"
3027elif [ "$TAPEDEV" ] ; then
3028 mkdir -p /root/images/mindi
3029 rm -f /root/images/mindi/{*img,*gz,*iso}
[925]3030 OfferToMakeBootableISO $CACHE_LOC
3031 if [ -e "$CACHE_LOC/all.tar.gz" ] ; then
[940]3032 cp -f $CACHE_LOC/all.tar.gz $MINDI_TMP/
[747]3033 else
[925]3034 Die "Cannot find all.tar.gz, to be written to tape"
[747]3035 fi
3036else
[925]3037 OfferToMakeBootableISO $CACHE_LOC
[747]3038fi
3039# cleanup
3040LogIt "$FRIENDLY_OUTSTRING\n"
3041for mtpt in $FLOPPY_WAS_MOUNTED ; do
3042 mount $mtpt
3043done
[925]3044MindiExit 0
Note: See TracBrowser for help on using the repository browser.