source: MondoRescue/branches/2.2.5/mindi/mindi @ 1729

Last change on this file since 1729 was 1729, checked in by Bruno Cornec, 12 years ago

Still trying to activate USB correctly at boot time with udev

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