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

Last change on this file since 971 was 971, checked in by Bruno Cornec, 13 years ago

Do not use compare to -1 rather != 0

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