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

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