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

Last change on this file since 692 was 692, checked in by bcornec, 18 years ago

Tries to fix bug on RHEL4 with Adaptec Zero-Channel RAID Cards
(Bug #6455 https://developer.berlios.de/bugs/?func=detailbug&bug_id=6455&group_id=2524)

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