source: branches/2.2.5/mindi/mindi @ 1761

Last change on this file since 1761 was 1761, checked in by bruno, 12 years ago

Adds preliminary Hardware support to mindi (Proliant SSSTK)
Not tested yet, just coded, and saved in SVN as a backup :-)

  • Property svn:keywords set to Rev Id
File size: 122.9 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 1761 2007-11-01 19:27:45Z 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...|<6>Unpacking 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|$lcMagicExt2fs|$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|$lcMagicExt2fs|$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 -Ec "$lcMagicExt2fs"` -eq 1 ]; then
911        lvUseFilesystem="ext2fs"
912    elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
913        lvUseFilesystem="initramfs"
914    elif [ `echo $lvScanRes | grep -Ec "$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\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        if [ "$redhat_label" ]; then
1506            label="$redhat_label"
1507        elif [ "$uuid" ]; then
1508            label="$uuid"
1509        fi
1510        partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1511        [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1512        unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1513        if [ "$current_partition" = "" ] ; then
1514            echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1515        elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1516            if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1517                partition_mountpt=raid
1518                partition_format=raid
1519                printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1520                printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1521            else
1522                echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1523            fi
1524        elif [ "$partition_format" = "" ] ; then
1525            echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1526        elif [ "$partition_size" = "" ] ; then
1527            echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1528        elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1529            continue
1530        else
1531            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1532                echo "Stupid bastard..." >> $LOGFILE
1533                partition_format="vfat"
1534            fi
1535            printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1536            printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1537        fi
1538    done
1539}
1540
1541
1542MakeSureNumberIsInteger() {
1543    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1544    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1545    echo "result = '$res'"
1546        Die "$1 should be an integer"
1547    fi
1548}
1549
1550
1551MakeSyslinuxMessageFile() {
1552    mkdir -p $1
1553    rmdir $1
1554    echo -en "  " > $1
1555    if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1556        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
1557    else
1558        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
1559    fi
1560    sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1561    rm -f $1.tmp
1562    if [ "$CDRECOVERY" != "yes" ] ; then
1563        if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1564            echo -en "Press <enter> to continue.\n" >> $1
1565        elif [ ! "$MINDI_TMP" ] ; then
1566            echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1567            if [ -e "$MINDI_LIB/memtest.img" ] ; then
1568                echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1569            fi
1570        else
1571            echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1572        fi
1573    else
1574        echo -en " \
1575To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1576CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1577    fi
1578}
1579
1580
1581MoveHyperlinkSensibly() {
1582    local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1583    filename=$1
1584    minidir_root=$2
1585    resides_on_diskno=$3
1586    noof_disks=$4
1587
1588    [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1589
1590    old_diskno=$resides_on_diskno
1591    d=1
1592    while [ "$d" -le "$noof_disks" ] ; do
1593        if [ "$d" -ne "$old_diskno" ] ; then
1594            old_pwd=`pwd`
1595            cd $minidir_root/$old_diskno
1596            cp --parents -Rdf $filename $minidir_root/$d/ 2>> $LOGFILE || Die "Can't move $filename (sensibly) from $old_diskno to $d"
1597            rm -f $filename
1598            cd $old_pwd
1599        fi
1600# when the softlink is resolvable, our work here is done
1601        [ -e "$minidir_root/$d/$filename" ] && return 0
1602        old_diskno=$d
1603        d=$(($d+1))
1604    done
1605    return 1
1606}
1607
1608
1609
1610OfferToCopyImagesToDisks() {
1611    local imagesdir i imagename dev count boot_dev data_dev
1612    imagesdir=$1
1613    boot_dev=$2
1614    data_dev=$3
1615
1616    echo -en "Would you like to create boot+data floppy disks now (y/[n]) ?"
1617    read i
1618    [ "$i" != "y" ] && [ "$i" != "Y" ] && return
1619    mount | grep -F /dev/fd > /dev/null && Die "Please unmount your floppies first."
1620    echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
1621    [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
1622    [ ! -e "$data_dev" ] && Die "Cannot find $data_dev - is your Linux distro broken?"
1623    i=`find $imagesdir -type f | grep -F "/mindi-root.1" 2> /dev/null`
1624    j=`find $imagesdir -type f | grep -F "/mindi-boot" | grep -Ev "2880|$BOOT_SIZE"`
1625    if [ "$i" ] ; then
1626        CopyImageToDisk $j $data_dev "boot disk"
1627        CopyImageToDisk $i $data_dev "root disk"
1628    else
1629        CopyImageToDisk $j $boot_dev "boot/root disk"
1630    fi
1631    count=1
1632    for i in `find $imagesdir | grep -F mindi-data` ; do
1633        CopyImageToDisk $i $data_dev "data disk #$count"
1634        count=$(($count+1))
1635    done
1636}
1637
1638
1639OfferToMakeBootableISO() {
1640    local i old_pwd
1641    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1642        echo -en "Shall I make a bootable CD image? (y/[n]) "
1643        read i
1644        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1645    fi
1646    if [ ! "$MINDI_TMP" ] ; then
1647        LogIt "NB: Mindi's bootable CD always uses isolinux."
1648        LogIt "For a bootable CD w/LILO, please use Mondo."
1649    fi
1650    rm -Rf $MINDI_TMP/iso
1651    mkdir -p $MINDI_TMP/iso/{images,archives,isolinux}
1652    cp -f $1/*.img $1/*.gz $MINDI_TMP/iso/images 2>> $LOGFILE || LogIt "OfferToMakeBootableISO: Cannot copy $i to $MINDI_TMP/iso/images"
1653    old_pwd=`pwd`
1654    cd $MINDI_TMP/iso
1655    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1656    for i in memdisk memtest.bin memtest.img ; do
1657        j=$MINDI_LIB/$i
1658        k=$MINDI_TMP/iso/isolinux
1659        if [ -e "$j" ] ; then
1660            LogIt "Copying $j to $k"
1661            cp -f $j $k 2> /dev/null || Die "Failed to copy $j to $k"
1662            cp -f $j $MINDI_TMP 2> /dev/null || Die "Failed to copy $j to $MINDI_TMP"
1663            cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1664        fi
1665    done
1666    MakeSyslinuxMessageFile $MINDI_TMP/iso/isolinux/message.txt
1667    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?"
1668    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?"
1669    cp $MINDI_TMP/mindi.rdz $MINDI_TMP/iso/isolinux/initrd.img 2>> $LOGFILE
1670    cp $MINDI_TMP/mindi.rdz $MONDO_ROOT/initrd.img 2>> $LOGFILE
1671    [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1672    cd $MINDI_TMP/iso/isolinux
1673    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?"
1674    if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1675        mv isolinux.cfg isolinux.cfg.old
1676        sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1677    fi
1678    if [ "$ARCH" != "ia64" ] ; then
1679        cp $ISOLINUX isolinux.bin 2> /dev/null || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
1680        cp $ISOLINUX ../ 2>> $LOGFILE
1681    fi
1682    cd $MINDI_TMP/iso
1683    if [ "$ARCH" != "ia64" ] ; then
1684        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?"
1685    fi
1686    [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun .    2>> $LOGFILE
1687    if [ "$ARCH" != "ia64" ] ; then
1688        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
1689    else
1690        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
1691    fi
1692    if [ "$?" -ne "0" ] ; then
1693        echo "----------- mkisofs's errors --------------" >> $LOGFILE
1694        cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1695        echo "mkisofs returned the following errors:-"
1696        cat $MINDI_TMP/mkisofs.log
1697        LogIt "Failed to create ISO image."
1698    else
1699        echo "Created bootable ISO image at $CACHE_LOC/mindi.iso" >> $LOGFILE
1700    fi
1701    rm -f $MINDI_TMP/mkisofs.log
1702    cd $old_pwd
1703}
1704
1705
1706OfferToMakeBootableUSB() {
1707    local i old_pwd
1708    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1709        echo "Shall I make a bootable USB image ?"
1710        if [ "$USBDEVICE" != "" ]; then
1711            echo -en "WARNING: This will erase all content on $USBDEVICE ([y]/n) "
1712            read i
1713            [ "$i" = "n" ] || [ "$i" = "N" ] && return 0
1714        else
1715            echo -en "WARNING: This will erase all content on $USBDEVICE (y/[n]) "
1716            read i
1717            [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1718        fi
1719    fi
1720    if [ _"$MINDI_TMP" = _"" ]; then
1721        Die "MINDI_TMP undefined"
1722    fi
1723    rm -Rf $MINDI_TMP/usb
1724    mkdir -p $MINDI_TMP/usb
1725    USBPART="${USBDEVICE}1"
1726
1727    echo -en "Transforming $USBDEVICE in a Bootable device " 
1728    echo -en "."
1729    echo "Transforming $USBDEVICE in a Bootable device"  >> $LOGFILE
1730    echo "Checking $USBDEVICE" >> $LOGFILE
1731    $FDISK -l $USBDEVICE 2>&1 >> $LOGFILE
1732    if [ $? -ne 0 ]; then
1733        echo "Unable to access $USBDEVICE" | tee -a $LOGFILE
1734        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1735        exit -1
1736    fi
1737    echo -en "."
1738    echo "Unmounting $USBDEVICE just in case" >> $LOGFILE
1739    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1740    echo "Erasing $USBDEVICE" >> $LOGFILE
1741    $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
1742d
1743d
1744d
1745d
1746n
1747p
17481
1749
1750
1751t
1752b
1753a
17541
1755w
1756EOF
1757    if [ $? -ne 0 ]; then
1758        echo "Unable to create a vfat Filesystem on $USBDEVICE" | tee -a $LOGFILE
1759        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1760        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1761        MindiExit -1
1762    fi
1763    echo -en "."
1764    echo "Creating a vfat filesystem on $USBPART" >> $LOGFILE
1765    mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1766    if [ $? -ne 0 ]; then
1767        echo "Unable to create a vfat filesystem on $USBPART" | tee -a $LOGFILE
1768        echo "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)" | tee -a $LOGFILE
1769        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1770        MindiExit -1
1771    fi
1772    echo -en "."
1773    echo "Mounting $USBPART on $MINDI_TMP/usb" >> $LOGFILE
1774    mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1775    if [ $? -ne 0 ]; then
1776        echo "Unable to mount $USBPART on $MINDI_TMP/usb" | tee -a $LOGFILE
1777        echo "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)" | tee -a $LOGFILE
1778        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1779        MindiExit -1
1780    fi
1781    echo -en "."
1782    mkdir -p $MINDI_TMP/usb/images
1783    cp -f $1/*.img $1/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogIt "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1784    echo -en "."
1785    old_pwd=`pwd`
1786    cd $MINDI_TMP/usb
1787    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1788    for i in memdisk memtest.bin memtest.img ; do
1789        j=$MINDI_LIB/$i
1790        k=$MINDI_TMP/usb
1791        if [ -e "$j" ] ; then
1792            LogIt "Copying $j to $k"
1793            cp -f $j $k 2> /dev/null || Die "Failed to copy $j to $k"
1794            cp -f $j $MINDI_TMP 2> /dev/null || Die "Failed to copy $j to $MINDI_TMP"
1795        fi
1796    done
1797    echo -en "."
1798    MakeSyslinuxMessageFile $MINDI_TMP/usb/message.txt
1799    echo -en "."
1800    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?"
1801    echo -en "."
1802    cp $MINDI_TMP/mindi.rdz $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1803    echo -en "."
1804    [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1805    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?"
1806    echo -en "."
1807    if [ "$NFS_DEV" != "" ] ; then
1808        perl -pi -e 's/interactive/iso/' syslinux.cfg
1809    fi
1810    cd $old_pwd
1811    echo -en "."
1812    umount $MINDI_TMP/usb
1813    if [ "$ARCH" != "ia64" ] ; then
1814        syslinux $USBPART 2>> $MINDI_TMP/syslinux.log
1815        if [ "$?" -ne "0" ] ; then
1816            echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1817            cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1818            LogIt "Failed to create USB image."
1819        else
1820            echo -e "$DONE"
1821            echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1822        fi
1823        rm -f $MINDI_TMP/syslinux.log
1824    else
1825        echo "No USB boot support for ia64" | tee -a $LOGFILE
1826        MindiExit -1
1827    fi
1828    echo -en "."
1829}
1830
1831
1832PluralOrNot() {
1833    [ "$1" -gt "1" ] && echo -en "s"
1834}
1835
1836
1837MakeMessageFile() {
1838    local disksize
1839    disksize=$1
1840    if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1841        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`"/
1842    else
1843        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`/
1844    fi
1845    if [ "$disksize" -gt "2880" ] ; then
1846        if [ _"$MONDO_SHARE" != _"" ] ; then
1847            if [ "$CDRECOVERY" != "yes" ] ; then
1848                if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1849                    echo -en "Press <enter> to continue.\n"
1850                elif [ ! "$MINDI_TMP" ] ; then
1851                    echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1852                else
1853                    echo -en "$BOOT_MEDIA_MESSAGE"
1854                fi
1855            fi
1856        fi
1857    fi
1858    if [ "$CDRECOVERY" = "yes" ] ; then
1859        echo -en "\
1860To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1861CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1862    fi
1863    echo -en "\n\n\n"
1864}
1865
1866
1867write_full_floppy_of_kernel() {
1868    local mtpt image old_pwd res disksize
1869
1870    res=0
1871    old_pwd=`pwd`
1872    KERN_DISK_MADE=1
1873    disksize=$3
1874    rand1=$RANDOM
1875    rand2=$RANDOM
1876    image=$MINDI_TMP/$rand1.$rand2.img
1877    mtpt=$MINDI_TMP/$rand1.$rand2.mtpt
1878    dd if=/dev/zero of=$image bs=1k count=$disksize &> /dev/null
1879    mke2fs -N 26 -F $image &> /dev/null
1880    mkdir -p $mtpt
1881    mount -o loop $image $mtpt
1882    cd $mtpt
1883    mkdir -p {dev,tmp,boot}
1884    cp -f $1 vmlinuz 2>> $LOGFILE
1885    if [ "$?" -ne "0" ] ; then
1886        LogIt "Failed to copy $1 to ramdisk"
1887        cd $old_pwd
1888        umount $mtpt
1889        rmdir $mtpt
1890        rm $image
1891        return 1
1892    fi
1893
1894    rdev vmlinuz 2,0
1895    rdev -R vmlinuz 0
1896    rdev -r vmlinuz 49152
1897
1898    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz"
1899    # BERLIOS : Useless and generating errors on CentOS ? (losetup miss a param)
1900    #losetup /dev/loop0 > /dev/null 2> /dev/null
1901    #[ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary."
1902    CopyBootBFile $mtpt/boot.b
1903
1904    MakeLiloConfFile $disksize >> bdlilo.conf
1905
1906    chmod 644 bdlilo.conf
1907    MakeMessageFile $disksize > message
1908    lilo -v -C bdlilo.conf -r $mtpt
1909    res=$?
1910
1911    cd $old_pwd
1912    umount $mtpt
1913    mv -f $image $2
1914    rmdir $mtpt
1915
1916    return $res
1917}
1918
1919
1920MakeLiloConfFile() {
1921    local disksize options i ooo
1922    disksize=$1
1923    options=""
1924
1925    if [ "$ARCH" != "ia64" ] ; then
1926        echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1927    fi
1928    if [ "$disksize" -eq "2880" ] ; then
1929        echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1930    elif [ "$disksize" -eq "1722" ] ; then
1931        echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1932    elif [ "$disksize" -gt "2880" ] ; then
1933        /bin/true
1934    else
1935        echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1936    fi
1937    if [ "$ARCH" != "ia64" ] ; then
1938        echo -en "install=/boot.b\nmap=/boot.map\n"
1939    fi
1940    if [ "$CDRECOVERY" = "yes" ] ; then
1941        echo -en "default=RESTORE\n"
1942    elif [ "$disksize" -gt "2880" ] && [ _"$MONDO_SHARE" != _"" ] ; then
1943        if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1944            echo -en "default=iso\n"
1945        else
1946            echo -en "default=interactive\n"
1947        fi
1948    else
1949        echo -en "default=expert\n"
1950    fi
1951
1952    echo -en "prompt\n"
1953    if [ "$ARCH" != "ia64" ] ; then
1954        echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1955    fi
1956    if [ "$CDRECOVERY" != "yes" ] ; then
1957        echo -en "timeout=300\n"
1958    fi
1959    echo -en "\n"
1960    if [ "$CDRECOVERY" = "yes" ] ; then
1961        options="RESTORE expert"
1962    elif [ "$disksize" -gt "2880" ] ; then
1963        if [ _"$MONDO_SHARE" != _"" ] ; then
1964            if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1965                options="iso"
1966            else
1967                options="interactive expert compare iso nuke isonuke"
1968# hda hdb hdc hdd"
1969            fi
1970        else
1971            options="expert"
1972        fi
1973    else
1974        options="expert"
1975    fi
1976    for i in $options ; do
1977        ooo=$i
1978        [ "$ooo" = "RESTORE" ] && ooo="nuke"
1979        if [ "$ARCH" = "ia64" ] ; then
1980            rootpart="root=/dev/ram0\n\t"
1981        else
1982            rootpart=""
1983        fi
1984        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"
1985   
1986        outstr=$outstr" $ooo_mode"
1987        outstr=$outstr"\"\n"
1988        if [ "$disksize" = "1440" ] ; then
1989            echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1990        else
1991            echo -en "$outstr"
1992        fi
1993    done
1994}
1995
1996
1997PrepareBootDiskImage_LILO() {
1998    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1999    imagesdir=$1
2000    disksize=$2
2001    kernelpath=$3
2002    ramdisksize=$4
2003
2004    retval=0
2005    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2006    echo -en "Making "$disksize"KB boot disk..."
2007    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?"
2008    if [ "$ARCH" != "ia64" ] ; then
2009        [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "$BOOT_SIZE" ] && Die "PDBI - disksize is $disksize - bad size"
2010    fi
2011    echo -en "..."
2012    imagefile=$imagesdir/mindi-bootroot.$disksize.img
2013    mountpoint=$MINDI_TMP/mountpoint.$$
2014    mkdir -p $mountpoint
2015    dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
2016    if [ "$ARCH" = "ia64" ] ; then
2017        mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
2018        t=vfat
2019    else
2020        mke2fs -N 26 -m 0 -F $imagefile >> $LOGFILE 2>> $LOGFILE
2021        t=ext2
2022    fi
2023    mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
2024    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
2025    mkdir -p $mountpoint/etc
2026    if [ "$ARCH" != "ia64" ] ; then
2027        liloconf=$mountpoint/etc/lilo.conf
2028    else
2029        liloconf=$mountpoint/elilo.conf
2030    fi
2031    old_pwd=`pwd`
2032    cd $mountpoint
2033    if [ "$ARCH" != "ia64" ] ; then
2034        tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz"
2035    fi
2036    cd $old_pwd
2037    # BERLIOS : Useless and generating errors on CentOS ? (losetup miss a param)
2038    #losetup /dev/loop0 > /dev/null 2> /dev/null
2039    #[ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing   'losetup /dev/loop0 -d'.\nReboot if necessary."
2040    CopyBootBFile $mountpoint/boot.b
2041
2042    MakeLiloConfFile $disksize > $liloconf
2043
2044    # Copy it so that CD-ROM menu entry is satisfied
2045    if [ "$ARCH" = "ia64" ] ; then
2046        mountefi=0
2047        df -T | grep /boot/efi | grep -q vfat
2048        if [ $? -ne 0 ]; then
2049            mount /boot/efi
2050            if [ $? -ne 0 ]; then
2051                echo "You have to mount your EFI partition when using mindi"
2052                MindiExit -1
2053            fi
2054            mountefi=1
2055        fi
2056        el=`find /boot/efi -name elilo.efi`
2057        cp $el $mountpoint
2058        cp $liloconf $mountpoint/elilo.efi $mountpoint/efi/boot
2059        if [ $mountefi -eq 1 ]; then
2060            umount /boot/efi 2>&1 > /dev/null
2061        fi
2062    fi
2063
2064    echo "Copying $MINDI_TMP/mindi.rdz to $mountpoint..." >> $LOGFILE
2065    cp -f $MINDI_TMP/mindi.rdz $mountpoint 2>> $LOGFILE
2066    if [ "$?" -ne "0" ] ; then
2067        LogIt "Failed to copy $MINDI_TMP/mindi.rdz to $mountpoint"
2068        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
2069        LogIt "Please unload some of your modules and try again."
2070        rm -f $MINDI_TMP/mtpt.$$
2071        LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)"
2072        retval=$(($retval+1))
2073    fi
2074    MakeMessageFile $disksize > $mountpoint/message
2075
2076    mkdir -p $mountpoint/tmp
2077    cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2078    if [ -e "$MINDI_LIB/memtest.img" ] ; then
2079        echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
2080        echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
2081#        echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
2082    fi
2083
2084    # copy the kernel across
2085    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
2086    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2087    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2088    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
2089    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2090        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2091        du -sk $mountpoint/* >> $LOGFILE
2092        echo "--- end of list of files ---" >> $LOGFILE
2093        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2094Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2095        rm -f $mountpoint/vmlinuz
2096        cd $old_pwd
2097        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2098        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
2099    #   losetup /dev/loop0 -d
2100        res=0
2101        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2102        res=$(($res+$?))
2103        cp -f $MINDI_TMP/mindi.rdz $imagesdir/mindi-root.1440.img 2>> $LOGFILE
2104        res=$(($res+$?))
2105        rm -f $imagefile
2106        if [ "$res" -ne "0" ]; then
2107            LogIt "WARNING - failed to create 1.44MB boot/root floppies"
2108            rm -f $imagesdir/mindi-*.1440.img
2109        fi
2110        return $res
2111    fi
2112    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2113    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2114    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2115    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2116# make it bootable
2117    rm -f $mountpoint/zero
2118    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
2119    if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
2120        if [ "$ARCH" != "ia64" ] ; then
2121        $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2122        else
2123            /bin/true
2124        fi
2125    elif [ ! "$KERN_DISK_MADE" ] ; then
2126# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
2127        $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2128    else
2129        echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
2130    fi
2131
2132    # BERLIOS  does not test necessarily what it expects
2133    if [ $? -ne "0" ] ; then
2134        if [ "`grep -F "/tmp/dev.0" $LOGFILE`" ] ; then
2135            LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's."
2136            LogIt "Please reboot your PC as a workaround."
2137            Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ."
2138        fi
2139        echo "$LILO_EXE -r $mountpoint ...failed."
2140        echo -en "Press ENTER to continue."; read line
2141        LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug."
2142        retval=$(($retval+1))
2143    fi
2144    cp -f $liloconf $MINDI_TMP/lilo.conf 2>> $LOGFILE
2145    if [ "$ARCH" = "ia64" ] ; then
2146        cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
2147    fi
2148    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2149    echo -en "..."
2150    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
2151    if [ "$retval" -eq "0" ] ; then
2152        echo -en "...$DONE\r"
2153        if [ "$KERN_DISK_MADE" ] ; then
2154            LogIt "... $disksize KB boot disks were created OK\r"
2155        fi
2156    else
2157        echo -en "...failed\r"
2158        LogIt $disksize"KB boot disk was NOT created\r"
2159        rm -f $imagefile
2160    fi
2161    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
2162    return $retval
2163}
2164
2165
2166PrepareBootDiskImage_SYSLINUX() {
2167    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
2168    imagesdir=$1
2169    disksize=$2
2170    kernelpath=$3
2171    ramdisksize=$4
2172    do_boot_root_thingy=""
2173    local retval old_pwd
2174    retval=0
2175
2176    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2177    echo -en "Making "$disksize"KB boot disk..."
2178    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?"
2179    [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "$BOOT_SIZE" ] && Die "PDBI - disksize is $disksize - bad size"
2180    echo -en "..."
2181    imagefile=$imagesdir/mindi-bootroot.$disksize.img
2182    mountpoint=$MINDI_TMP/mountpoint.$$
2183    mkdir -p $mountpoint
2184# If I format a 1722KB data file & run syslinux on it, the resultant image
2185# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
2186# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
2187# If I extract it, mount it, copy my files to it, etc. then the resultant
2188# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
2189# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
2190    if [ "$disksize" = "1722" ] ; then
2191        gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
2192    else
2193        dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
2194        mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
2195        syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
2196    fi
2197    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
2198
2199    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
2200    old_pwd=`pwd`
2201    MakeSyslinuxMessageFile $mountpoint/message.txt
2202    cd $mountpoint
2203    [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
2204    cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
2205    if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
2206        mv syslinux.cfg syslinux.cfg.orig
2207        sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
2208    fi
2209    cd $old_pwd
2210    echo "Copying $MINDI_TMP/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
2211    cp -f $MINDI_TMP/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
2212    if [ "$?" -ne "0" ] ; then
2213        LogIt "Failed to copy $MINDI_TMP/mindi.rdz to $mountpoint"
2214        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
2215        LogIt "Please unload some of your modules and try again."
2216        rm -f $MINDI_TMP/mtpt.$$
2217        LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)"
2218        retval=$(($retval+1))
2219    fi
2220
2221    mkdir -p $mountpoint/tmp
2222    cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2223
2224    # copy the kernel across
2225    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
2226    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2227    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2228    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2229    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2230        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2231        du -sk $mountpoint/* >> $LOGFILE
2232        echo "--- end of list of files ---" >> $LOGFILE
2233        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2234Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2235        rm -f $mountpoint/vmlinuz
2236        cd $old_pwd
2237        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2238        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
2239
2240        res=0
2241        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2242        res=$(($res+$?))
2243        cp -f $MINDI_TMP/mindi.rdz $imagesdir/mindi-root.1440.img 2>> $LOGFILE
2244        res=$(($res+$?))
2245        rm -f $imagefile
2246        if [ "$res" -ne "0" ]; then
2247            LogIt "WARNING - failed to create 1.44MB boot/root floppies"
2248            rm -f $imagesdir/mindi-*.1440.img
2249        fi
2250        return $res
2251    fi
2252    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2253    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2254    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2255    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2256
2257    # make it bootable
2258    rm -f $mountpoint/zero
2259    mkdir -p $mountpoint/etc
2260    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
2261    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2262    echo -en "..."
2263    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
2264
2265    if [ "$retval" -eq "0" ] ; then
2266        echo -en "...$DONE\r"
2267        if [ "$KERN_DISK_MADE" ] ; then
2268            rm -f $imagefile
2269            LogIt "... $disksize KB boot disks were created OK\r"
2270        fi
2271    else
2272        echo -en "...failed\r"
2273        LogIt $disksize"KB boot disk was NOT created\r"
2274        rm -f $imagefile
2275    fi
2276    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
2277    return $retval
2278}
2279
2280
2281PrepareDataDiskImages() {
2282    local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2283
2284    imagesdir=$1
2285    rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
2286    needlist=$MINDI_TMP/what-we-need.txt
2287    bigdir=$MINDI_TMP/bigdir
2288    minidir_root=$MINDI_TMP/minidir
2289    mkdir -p $minidir_root
2290    mkdir -p $bigdir/usr/bin
2291    tardir=$MINDI_TMP/tardir
2292
2293    lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt | grep -vx "" | wc -l`
2294    cat $MINDI_CONF/deplist.txt | GenerateGiantDependencyList $needlist $lines
2295    res=$?
2296    if [ "$YOUR_KERNEL_SUCKS" ]; then
2297        pwd=`pwd`
2298        cd $MINDI_TMP
2299        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2300            cp --parents -pRdf ./$i $bigdir 2>> $LOGFILE || Die "PDDI can't cp $i->$bigdir"
2301            if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
2302                cp --parents -pRdf $i $bigdir 2>> $LOGFILE
2303            else
2304                ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2305                BIGNO=$(($BIGNO+1))
2306            fi
2307        done
2308        for i in $EXTRA_MODS ; do
2309            j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
2310            [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o" >> $LOGFILE
2311            for k in $j ; do
2312                if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
2313                    cp --parents -pRdf $k $bigdir 2>> $LOGFILE
2314                else
2315                    ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2316                    BIGNO=$(($BIGNO+1))
2317                fi
2318                echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2319            done
2320        done
2321        cd $pwd
2322    else
2323        ListKernelModulePaths >> $needlist
2324    fi
2325    if [ "$res" -ne "0" ] ; then
2326        Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2327    fi
2328    FindAndAddUserKeyboardMappingFile
2329    mkdir -p $bigdir/tmp
2330    if [ _"$MONDO_SHARE" != _"" ] ; then
2331        MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2332        cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
2333    fi
2334    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2335    DropOptimizedLibraries $needlist $bigdir
2336    echo -en "Assembling dependency files"
2337    CopyDependenciesToDirectory < $needlist $bigdir
2338
2339    # also copy io.sys and msdos.sys, if we can find them
2340    for i in `mount | cut -d' ' -f3` ; do
2341        for j in io.sys msdos.sys ; do
2342            [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
2343        done
2344    done
2345
2346    # master boot record, too
2347    i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2348    if [ "$i" ] ; then
2349        LogIt "Backing up $i's MBR"
2350        dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2351        sleep 1
2352        sync
2353        j=$i
2354        [ -h "$j" ] && j=`readlink -f $j`
2355        LogIt "Creating /dev/boot_device ($j)"
2356        mkdir -p $bigdir/dev
2357        cp -pRdf $j $bigdir/dev/boot_device 2> /dev/null || Die "Unable to create /dev/boot_device on ramdisk"
2358    fi
2359
2360    old_pwd=`pwd`
2361    cd $bigdir
2362
2363    [ -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'."
2364    cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "WARNING - error occurred while unzipping aux-tools"
2365    if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
2366        tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "WARNING - error occurred while unzipping x11-tools.tgz"
2367    fi
2368    if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2369        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2370        [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2371    fi
2372    [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state . 2>> $LOGFILE
2373    cd $old_pwd
2374    echo -e "$DONE"
2375    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2376    SplitDirectoryIntoMinidirs $bigdir $minidir_root
2377    noof_disks=$?
2378    [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2379#    if [ "$noof_disks" -ge "8" ] ; then
2380#        LogIt "You are putting a ludicrously large amount of data on these disks."
2381#        LogIt "I shall therefore double EXTRA_SPACE, just in case your ramdisk is too small."
2382#        EXTRA_SPACE=$(($EXTRA_SPACE*2))
2383#    fi
2384    MakeMountlist $MINDI_TMP/mountlist.txt
2385    mkdir -p $minidir_root/$noof_disks/tmp
2386    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"
2387    [ _"$MONDO_SHARE" != _"" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
2388    [ $LVM != "false" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm || LVM="false"
2389    cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2390    ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2391    CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2392    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2393    # One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
2394    rmdir $tardir $bigdir
2395    rm -f $needlist
2396    return $noof_disks
2397}
2398
2399
2400ProcessLDD() {
2401    local incoming f
2402    read incoming
2403    while [ "$incoming" != "" ] ; do
2404        # We take the full path name of the dyn. lib. we want
2405        incoming=`echo "$incoming" | awk '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2406        for f in $incoming ; do
2407            echo "$f"
2408            echo "`ReadAllLink $f`"
2409        done
2410        read incoming
2411    done
2412}
2413
2414
2415Prompt() {
2416    echo -en "$1"
2417    read line
2418}
2419
2420
2421ReadLine() {
2422    local i incoming
2423    read incoming
2424    i=0
2425    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2426        i=$(($i+1))
2427        read incoming
2428    done
2429    echo "$incoming"
2430}
2431
2432
2433RejigHyperlinks() {
2434    local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2435    minidir_root=$1
2436    noof_disks=$2
2437
2438    old_pwd=`pwd`
2439    diskno=1
2440    while [ "$diskno" -le "$noof_disks" ] ; do
2441        mkdir -p $minidir_root/$diskno
2442        cd $minidir_root/$diskno
2443        for fname in `find -type d -o -print` ; do
2444            [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2445        done
2446        diskno=$(($diskno+1))
2447    done
2448
2449    cd $old_pwd
2450    return
2451}
2452
2453
2454ReplaceIndividualLine() {
2455    local orig_file new_file lino newstring lines_total lines_remaining
2456
2457    orig_file=$1.orig
2458    mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2459    new_file=$1
2460    lino=$2
2461    newstring="$3"
2462    if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
2463        echo "Can't find string" >> $LOGFILE
2464        return 1
2465    fi
2466    lines_total=`wc -l $orig_file | $AWK '{print $1;}'`
2467    lines_remaining=$(($lines_total-$lino))
2468    head -n$(($lino-1)) $orig_file > $new_file
2469    echo "$newstring" >> $new_file
2470    echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2471    tail -n$lines_remaining $orig_file >> $new_file
2472    echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2473    [ -x "$orig_file" ] && chmod +x $new_file
2474    rm -f $orig_file
2475    return 0
2476}
2477
2478
2479ScanCDandTape() {
2480    local i
2481
2482    for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2483        dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2484    done
2485}
2486
2487
2488SizeOfPartition() {
2489    local devpath drive res stub
2490    device=$1
2491    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2492        res=`SizeOfRaidPartition $device`
2493        [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2494        echo "$res"
2495        return 0
2496    fi
2497    # patch from Bill <bill@iwizard.biz> - 2003/08/25
2498    res=`$FDISK -s $device 2>> $LOGFILE`
2499    # end patch
2500    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2501    [ "$res" = "" ] && res="-1"
2502    echo $res
2503    return 0
2504}
2505
2506
2507SizeOfRaidPartition() {
2508    local real_dev smallest_size silly tmp
2509
2510    silly=999999999
2511    smallest_size=$silly
2512
2513    for real_dev in `GetRaidDevMembers $1` ; do
2514        tmp=`SizeOfPartition $real_dev`
2515        [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2516    done
2517
2518    if [ "$smallest_size" = "$silly" ] ; then
2519        echo "-1"
2520        return 1
2521    else
2522        echo "$smallest_size"
2523        return 0
2524    fi
2525}
2526
2527
2528StripComments()
2529{
2530    local tempfile
2531
2532    tempfile=$MINDI_TMP/$$.strip.txt
2533    cp -f $1 $tempfile 2>> $LOGFILE
2534    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2535    rm -f $tempfile
2536    echo "Stripped comments from $2" >> $LOGFILE
2537}
2538
2539
2540SplitDirectoryIntoMinidirs() {
2541    local bigdir minidir_root i noof_disks old_pwd res
2542
2543    bigdir=$1
2544    minidir_root=$2
2545    [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
2546
2547    TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2548    noof_disks=$?
2549    if [ "$noof_disks" -eq "0" ] ; then
2550        echo "Failed to fit data into several dirs."
2551        return 0
2552    fi
2553    RejigHyperlinks $minidir_root $noof_disks
2554    [ "$bigdir" != "" ] && rm -Rf $bigdir/*
2555    return $noof_disks
2556}
2557
2558
2559StripExecutable()
2560{
2561    local tmpfile
2562
2563    tmpfile=$MINDI_TMP/stripped.$$.dat
2564    [ -d "$1" ] || [ -h "$1" ] && return
2565    cp -f $1 $tmpfile 2>> $LOGFILE
2566    strip $tmpfile 2> /dev/null
2567    if [ "$?" -eq "0" ] ; then
2568        cp -f $tmpfile $1 2>> $LOGFILE
2569        echo "Stripped binary $2" >> $LOGFILE
2570    fi
2571    rm -f $tmpfile
2572}
2573
2574
2575TemporarilyCompressAllFiles() {
2576    local i orig_fname out_fname out_list
2577
2578    i=0
2579    out_list=$2/compressed/compressed.txt
2580    mkdir -p $2/compressed
2581    > $out_list
2582    for orig_fname in $1 ; do
2583        out_fname=$2/compressed/$orig_fname.gz
2584        mkdir -p $out_fname 2> /dev/null
2585        rmdir $out_fname 2> /dev/null
2586        gzip -c6 $orig_fname > $out_fname 2> /dev/null
2587        i=$(((($i+1))%15))
2588        [ "$i" -eq "0" ] && echo -en "."
2589        du -sk $out_fname >> $out_list
2590    done
2591}
2592
2593
2594TryToFindKernelPath() {
2595    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2596
2597    we_want_version=`uname -r`
2598    possible_kernels=""
2599    duff_kernels=""
2600   
2601    if [ "$ARCH" = "ia64" ] ; then
2602       root="/boot/efi/efi"
2603    else
2604       root="/"
2605    fi
2606    for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
2607        [ ! -e "$fname" ] && continue
2608        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2609        file $fname | grep -q gzip
2610        if [ "$?" -eq "0" ] ; then
2611            # Used by ia64
2612            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2613        else
2614            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2615        fi
2616        [ "$fkern_ver" = "" ] && continue
2617        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2618        [ -f "$fname" ] || continue
2619        [ -h "$fname" ] && continue
2620        kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2621        file $fname | grep -q gzip
2622        if [ "$?" -eq "0" ] ; then
2623            # Used by ia64
2624            if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2625                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2626                duff_kernels="$fname $duff_kernels"
2627            else
2628                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2629                possible_kernels="$fname $possible_kernels"
2630            fi
2631        else
2632            if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2633                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2634                duff_kernels="$fname $duff_kernels"
2635            else
2636                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2637                possible_kernels="$fname $possible_kernels"
2638            fi
2639        fi
2640    done
2641    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2642        possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2643    fi
2644    if [ ! "$possible_kernels" ] ; then
2645        LogIt "No kernel matches exactly. Are there any duff kernels?"
2646        possible_kernels="$duff_kernels"
2647        if [ ! "$possible_kernels" ] ; then
2648            LogIt "Sorry, no duff kernels either"
2649        else
2650            LogIt "I bet you're running Debian or Gentoo, aren't you?"
2651            LogIt "Your kernel doesn't have a sane builddate. Oh well..."
2652        fi
2653    fi
2654    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2655    noof_kernels=`CountItemsIn "$possible_kernels"`
2656    if [ "$noof_kernels" -eq "0" ] ; then
2657        LogIt "Could not find your kernel."
2658        if [ -e "/boot/vmlinuz" ] ; then
2659            LogIt "Using /boot/vmlinuz as a last resort."
2660            output=/boot/vmlinuz
2661        else
2662            output=""
2663        fi
2664    elif [ "$noof_kernels" -eq "1" ] ; then
2665        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2666        echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2667        output="$kernelpath"
2668    else
2669        for i in $possible_kernels ; do
2670            if echo $i | grep "`uname -r`" ; then
2671                LogIt "OK, I used my initiative and found that "
2672                LogIt "$i is probably your kernel. "
2673                output="$i"
2674                return
2675            fi
2676        done
2677        if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2678            output=/boot/vmlinuz
2679            echo "Schlomo, this one's for you." >> $LOGFILE
2680        else
2681            LogIt "Two or more possible kernels found. You may specify any one of them and the "
2682            LogIt "boot disks will still work, probably. If one does not work, try another."
2683            LogIt "$possible_kernels"
2684            echo ""
2685        fi
2686    fi
2687    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2688}
2689
2690
2691TryToFitDataIntoSeveralDirs() {
2692    local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2693    local i retval noof_disks total_files list_of_devs
2694
2695    bigdir=$1
2696    minidir_root=$2
2697    BIG_CLUNKY_SIZE_COUNTER=0
2698    retval=0
2699    noof_disks=1
2700
2701    echo -en "\r                                                                            \rDividing data into several groups..."
2702    old_pwd=`pwd`
2703    cd $bigdir
2704    list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | grep -Fv "/dev/"`
2705    progress=0
2706    total_files=`CountItemsIn "$list_of_files"`
2707    if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2708        filesize=1
2709    fi
2710    mkdir -p $minidir_root/$noof_disks
2711    if [ -e "dev" ] ; then
2712        echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
2713        cp --parents -pRdf dev $minidir_root/$noof_disks 2>> $LOGFILE
2714    fi
2715    TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2716    for filename in $list_of_files ; do
2717        AddFileToDir $filename $minidir_root $noof_disks
2718        i=$?
2719        if [ "$i" -gt "$noof_disks" ] ; then
2720            noof_disks=$i
2721            echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2722        fi
2723        if [ "$i" -eq "0" ] ; then
2724            LogIt "Cannot add file $filename to minidir $minidir_root"
2725            retval=$(($retval+1))
2726        fi
2727        progress=$(($progress+1))
2728        echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
2729    done
2730    cd $old_pwd
2731    echo -en "\rThe files have been subdivided into $noof_disks directories.                                                            \r"
2732    [ "$minidir_root" != "" ] && rm -Rf $minidir_root/compressed
2733    if [ "$retval" -gt "0" ] ; then
2734        return 0
2735    else
2736        return $noof_disks
2737    fi
2738}
2739
2740
2741TurnTgzIntoRdz() {
2742    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
2743
2744    tgz_dir_fname=$1
2745    rdz_fname=$2
2746    ramdisksize=$3
2747    disksize=$4
2748    kernelsize=$5
2749    maxsize=$(($disksize-$kernelsize))
2750    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2751    tempfile=$MINDI_TMP/temp.rd
2752    mountpoint=$MINDI_TMP/mnt1
2753    res=0
2754    echo -en "..."
2755    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2756    echo -en "..."
2757    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2758    echo -en "..."
2759    mkdir -p $mountpoint
2760    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."
2761    echo -en "..."
2762    old_pwd=`pwd`
2763    cd $mountpoint
2764    cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2765    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2766    cd dev || Die "Can't cd to dev"
2767    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2768    rm -f dev-entries.tgz
2769    cd ..
2770
2771    for w in insmod.static insmod.static.old ; do
2772        s=`which $w 2> /dev/null`
2773        if [ -e "$s" ] ; then
2774            cp --parents -af $s . 2>> $LOGFILE
2775        fi
2776    done
2777
2778    mkdir -p tmp
2779    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2780
2781    # Management of udev (which includes modprobe in rules)
2782    ps auxww | grep -v grep | grep -qw udevd
2783    if [ $? -eq 0 ]; then
2784        echo "udev device manager found" > tmp/USE-UDEV
2785        LogIt "udev device manager found"
2786        cp --parents -Rdf /etc/udev . 2> /dev/null
2787        cp --parents -Rdf /lib/udev /lib64/udev . 2> /dev/null
2788        if [ -x /sbin/udevd ]; then
2789            lis=`grep -Ev '^#' $MINDI_CONF/udev.files` 
2790            LocateDeps $lis > $MINDI_TMP/udev.lis
2791            for i in $lis; do
2792                if [ "`echo $i | cut -c1`" = "/" ]; then
2793                    j=`echo $i | cut -c2-`
2794                    rm -f $j
2795                fi
2796            done
2797            cp --parents -Rdf $lis `sort -u $MINDI_TMP/udev.lis` .
2798            rm -f $MINDI_TMP/udev.lis
2799        else
2800            echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
2801            echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
2802            rm -f tmp/USE-UDEV
2803        fi
2804    fi
2805    # Management of potential HW info (Proliant only at the moment)
2806    mindi-bkphw $CACHE_LOC $MINDI_CONF | tee -a $LOGFILE
2807    if [ -d $CACHE_LOC/bkphw ]; then
2808        LogIt "Hardware Information found and saved ..."
2809        cp -rp $CACHE_LOC/bkphw .
2810        lis=`grep -Ev '^#' $CACHE_LOC/tools.files` 
2811        LocateDeps $lis > $MINDI_TMP/tools.lis
2812        cp --parents -Rdf $lis `sort -u $MINDI_TMP/tools.lis` .
2813        if [ -f $CACHE_LOC/mindi-rsthw ]; then
2814            mv -f $CACHE_LOC/mindi-rsthw .
2815            chmod 755 ./mindi-rsthw
2816        fi
2817        rm -f $MINDI_TMP/tools.lis $CACHE_LOC/tools.files
2818    fi
2819
2820    for w in cdrom floppy groovy-stuff ; do
2821        mkdir -p mnt/$w
2822    done
2823    #if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2824        #ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2825    #fi
2826    if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
2827        ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
2828    fi
2829
2830    cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
2831
2832    # Handle the case where busybox is dynamically linked
2833    file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically" 
2834    if [ $? -eq 0 ]; then
2835        LocateDeps $MINDI_LIB/rootfs/bin/busybox > $MINDI_TMP/busy.lis
2836        cp --parents -Rdf `sort -u $MINDI_TMP/busy.lis` .
2837        rm -f $MINDI_TMP/busy.lis
2838    fi
2839    cd $old_pwd
2840    echo -en "..."
2841    MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2842    echo -en "..."
2843    old_pwd=`pwd`
2844    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2845        cd $MINDI_TMP
2846        floppy_modules_path=lib/modules/$FAILSAFE_KVER
2847    else
2848        cd /
2849###
2850### Sq-Modification... Use kernel name in module path if specified.
2851###
2852        #floppy_modules_path=lib/modules/`uname -r`
2853        if [ "${kernelname}" != "" ]
2854        then
2855            floppy_modules_path=lib/modules/${kernelname}
2856        else
2857            floppy_modules_path=lib/modules/`uname -r`
2858        fi
2859###
2860### Sq-Modification end
2861###
2862    fi
2863    floppy_modules=""
2864    if [ "$disksize" -lt "2880" ] ; then
2865        list_of_groovy_mods="$FLOPPY_MODS $FORCE_MODS $IDE_MODS ide-scsi sr_mod cdrom isocd isofs `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2866    else
2867        list_of_groovy_mods="$CDROM_MODS $FORCE_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2868    fi
2869    if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
2870        # For PXE boot
2871        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2872    fi
2873    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2874        list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2875    fi
2876    for i in $DENY_MODS; do
2877        echo "Removing $i from the list of modules to load" >> $LOGFILE
2878        list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2879    done
2880
2881    [ -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."
2882    for i in $list_of_groovy_mods ; do
2883        floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2884    done
2885    for i in $floppy_modules ; do
2886        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2887        [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2888        echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2889        cp --parents -pdf $i $mountpoint 2>/dev/null || LogIt "Unable to copy $i to $mountpoint"
2890        if [ "`echo "$i" | grep -F ".gz"`" ]; then
2891                gunzip -f $mountpoint/$i
2892                i=`echo $i | sed 's/.gz//'`
2893        fi
2894        (cd $mountpoint ; ln -s $i . 2>/dev/null)
2895        [ "`echo "$i" | grep -F ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2896    done
2897    # Also copy modules.dep in case of udev so that normal modprobe works
2898    p=`echo $i | cut -d/ -f1-3`
2899    cp -df $p/modules.dep $mountpoint/$p 2>/dev/null || LogIt "Unable to copy modules.dep to $mountpoint"
2900    if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2901        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2902        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2903        [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2904        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2905        rm -f $mountpoint/sbin/devfsd
2906    fi
2907    cd $old_pwd
2908    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2909    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2910    rm -f $mountpoint/zero
2911    if [ _"$MONDO_SHARE" != _"" ] ; then
2912        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2913        cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP &> /dev/null
2914        cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>/dev/null || Die "Cannot copy mountlist to ramdisk"
2915        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2916        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2917        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2918        [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2919        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2920        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2921    fi
2922    mkdir -p $mountpoint/tmp
2923    mkdir -p $mountpoint/proc
2924    echo "$disksize" > $mountpoint/tmp/$disksize.siz
2925    find $mountpoint -name CVS -exec rm -rf '{}' \;
2926    # Determine what filesystem to use for initrd image
2927    echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2928    gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2929    [ -z  gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2930    case "$gvFileSystem" in
2931    "ext2fs")
2932        # say what will be used
2933        echo "Creating an ext2 initrd image..." >> $LOGFILE
2934        # kernel expects linuxrc in ext2 filesystem
2935        ( cd $mountpoint && ln -sf sbin/init linuxrc )
2936        # unmount loop filesystem and create image file using the standard approach
2937        umount $mountpoint || Die "Cannot unmount $tempfile"
2938        dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2939        # log that we are done
2940        echo "...done." >> $LOGFILE
2941    ;;
2942    "initramfs")
2943        # say what will be used
2944        echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
2945        # make sure that cpio is there
2946        which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2947        # go into filesystem
2948        cd $mountpoint
2949        # kernel expects init in cpio filesystem
2950        ln -sf sbin/init init
2951        # create cpio image file and unmount loop filesystem
2952        find . -print | cpio -o -H newc | gzip -9 > $old_pwd/$rdz_fname 2> /dev/null
2953        cd $old_pwd
2954        umount $mountpoint || Die "Cannot unmount $tempfile"
2955        # log that we are done
2956        echo "...done." >> $LOGFILE
2957    ;;
2958    *)
2959        Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2960    ;;
2961    esac
2962    if [ "$res" -eq "0" ] ; then
2963        echo -en "..."
2964    else
2965        echo -en "\rMade an rdz WITH ERRORS.           \n"
2966    fi
2967    return 0
2968}
2969
2970
2971WhichOfTheseModulesAreLoaded() {
2972    local modname loaded_modules
2973    loaded_modules="$MODULES"
2974    for modname in $1 ; do
2975        [ "`echo "$loaded_modules" | grep -w "$modname"`" ] && echo "$modname"
2976    done
2977}
2978
2979
2980ZipMinidirsIntoTarballs() {
2981    local minidir_root tardir noof_disks diskno old_pwd i
2982    minidir_root=$1
2983    tardir=$2
2984    noof_disks=$3
2985
2986    echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2987    mkdir -p $tardir
2988    mkdir -p $minidir_root/all
2989    old_pwd=`pwd`
2990    diskno=1
2991    while [ "$diskno" -le "$noof_disks" ] ; do
2992        cd $minidir_root/$diskno || LogIt "WARNING - cannot cd to $minidir_root/$diskno"
2993        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."
2994        diskno=$(($diskno+1))
2995        echo -n "..."
2996        cp -pRdf * $minidir_root/all 2>> $LOGFILE
2997    done
2998    mkdir -p $minidir_root/all/tmp
2999    cd $minidir_root/all
3000    size_of_all_tools=`du -sk . | cut -f1`
3001    if [ _"$MONDO_SHARE" != _"" ]; then
3002        for q in filelist.full.gz biggielist.txt ; do
3003            [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
3004            cp -pRdf $MINDI_TMP/$q tmp/ 2>> $LOGFILE
3005        done
3006        mkdir -p $minidir_root/all/tmp
3007        echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
3008        echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
3009    fi
3010    tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
3011    dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
3012    [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
3013    cd $old_pwd
3014    [ "$minidir_root" != "" ] && rm -Rf $minidir_root
3015    echo -e "$DONE"
3016}
3017
3018
3019##############################################################################
3020#----------------------------------- Main -----------------------------------#
3021##############################################################################
3022
3023
3024> $LOGFILE
3025echo "mindi v$MINDI_VERSION" >> $LOGFILE
3026echo "$ARCH architecture detected" >> $LOGFILE
3027echo "mindi called with the following arguments:" >> $LOGFILE
3028echo "$@" >> $LOGFILE
3029echo "Start date : `date`" >> $LOGFILE
3030echo "-----------------------------" >> $LOGFILE
3031
3032if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
3033    LogIt "WARNING - Ancient distro detected." 1
3034    ln -sf /etc/conf.modules /etc/modules.conf
3035fi
3036[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
3037
3038# Log some capital variables
3039[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
3040echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
3041echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
3042[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
3043echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
3044echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
3045
3046trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
3047
3048# Sanity checks
3049which which > /dev/null 2> /dev/null || Die "Please install 'which'."
3050which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
3051which 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."
3052which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
3053if which awk &> /dev/null ; then
3054    if ! which gawk &> /dev/null ; then
3055        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"
3056    fi
3057fi
3058which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
3059[ ! -e "$FDISK" ] && Die "Cannot find (s)fdisk"
3060
3061[ "`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"
3062# If we have a 2.6 kernel, the system uses module-init-tools which means that we
3063# may have the modprobe configuration spread out across multiple files in
3064# directory /etc/modprobe.d. If this is the case we concatenate these files into
3065# a temporary file for further processing. Otherwise we continue in the standard
3066# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
3067# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
3068# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
3069if [ -d "/etc/modprobe.d" ] && [ "`uname -r | cut -c1-3`" = "2.6" ] ; then
3070    TMPMODPROBE_FLAG="Y"
3071else
3072    TMPMODPROBE_FLAG="N"
3073    [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
3074    [ ! -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..."
3075fi
3076
3077# Update the PATH variable if incomplete
3078if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
3079    PATH=$PATH:/sbin:/usr/sbin
3080    export PATH
3081    echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
3082    echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
3083    echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
3084fi
3085
3086[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
3087
3088if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
3089    Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
3090fi
3091
3092### BERLIOS
3093### Fix as it's not mandatory on ia64
3094if [ "$ARCH" = "ia64" ] ; then
3095    if which elilo &> /dev/null ; then
3096        LILO_EXE=elilo
3097    else
3098        LILO_EXE=`which false`
3099    fi
3100else
3101    FindIsolinuxBinary
3102    FindLiloBinary
3103fi
3104# BERLIOS: Remove as too dangerous and now useless
3105#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
3106trap "Aborted" SIGTERM
3107DONE="\r\t\t\t\t\t\t\t\tDone.         "
3108CHOPSIZE=240
3109BIGNO=0
3110MAX_COMPRESSED_SIZE=1300
3111kernelpath=""
3112MONDO_ROOT=/var/cache/mondo
3113mkdir -p $MONDO_ROOT
3114
3115if [ -d "/proc/lvm" ]; then
3116    # LVM v1
3117    LVMCMD=""
3118    LVM="v1"
3119elif [ -d "/dev/mapper" ]; then
3120    # LVM v2
3121    LVMCMD="lvm"
3122    LVM="v2"
3123else
3124    LVM="false"
3125fi
3126echo "LVM set to $LVM" >> $LOGFILE
3127echo "----------" >> $LOGFILE
3128echo "df result:" >> $LOGFILE
3129echo "----------" >> $LOGFILE
3130df -T >> $LOGFILE
3131echo "-------------" >> $LOGFILE
3132echo "mount result:" >> $LOGFILE
3133echo "-------------" >> $LOGFILE
3134mount >> $LOGFILE
3135echo "-------------" >> $LOGFILE
3136if [ -e /etc/raidtab ]; then
3137    echo "-------------" >> $LOGFILE
3138    echo "/etc/raidtab content:" >> $LOGFILE
3139    echo "-------------" >> $LOGFILE
3140    cat /etc/raidtab >> $LOGFILE
3141fi
3142echo "-------------" >> $LOGFILE
3143echo "cat /proc/cmdline:" >> $LOGFILE
3144echo "-------------" >> $LOGFILE
3145cat /proc/cmdline >> $LOGFILE
3146echo "-------------" >> $LOGFILE
3147echo "lsmod result:" >> $LOGFILE
3148echo "-------------" >> $LOGFILE
3149lsmod >> $LOGFILE
3150MODULES="`cat /proc/modules | awk '{print $1}'`"
3151if [ -x /usr/sbin/esxcfg-module ]; then
3152    echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
3153    echo "-------------" >> $LOGFILE
3154    echo "VMWare modules" >> $LOGFILE
3155    echo "-------------" >> $LOGFILE
3156    /usr/sbin/esxcfg-module -l >> $LOGFILE
3157    MODULES="$MODULES `esxcfg-module -l | awk '{print $1}'`"
3158fi
3159echo "-------------" >> $LOGFILE
3160echo "Liste of extra modules is:" >> $LOGFILE
3161echo "$EXTRA_MODS" >> $LOGFILE
3162echo "-------------" >> $LOGFILE
3163
3164# Compute libata version
3165laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/  *//g'`
3166# If libata v2 is used then remove ide-generic as it will perturbate boot
3167if [ "`echo $MODULES | grep libata`" ]; then
3168    if [ "$laver" = "2" ]; then
3169        DENY_MODS="$DENY_MODS ide-generic"
3170        echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
3171        echo "-------------" >> $LOGFILE
3172    fi
3173fi
3174
3175if [ "$#" -ge "2" ] ; then
3176    if [ "$1" = "--max-compressed-size" ] ; then
3177        MAX_COMPRESSED_SIZE=$2
3178        shift; shift
3179    fi
3180fi
3181
3182FLOPPY_WAS_MOUNTED=""
3183for mtpt in /media/floppy /mnt/floppy /floppy ; do
3184    if mount | grep -w $mtpt &> /dev/null ; then
3185        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3186        umount $mtpt
3187    fi
3188done
3189
3190#
3191# If we have a USB device we need to store info
3192# and remove it from the parameters line
3193#
3194if [ "$#" -ne "0" ] ; then
3195    if [ "$1" = "--usb" ] ; then
3196        shift
3197        USBDEVICE=$1
3198        if [ _"$USBDEVICE" = _"" ]; then
3199            Die "No USB device specified"
3200        fi
3201        shift
3202    fi
3203fi
3204
3205if [ "$#" -ne "0" ] ; then
3206    if [ "$1" = "--findkernel" ] ; then
3207        res=`TryToFindKernelPath`
3208        # Avoids logfile content for mondo
3209        export MONDO_SHARE=""
3210        if [ "$res" = "" ] ; then
3211            MindiExit -1
3212        else
3213            echo "$res"
3214            MindiExit 0
3215        fi
3216    elif [ "$1" = "--locatedeps" ] ; then
3217        [ ! "$2" ] && Die "Please specify the binary to look at"
3218        LocateDeps $2
3219        # Avoids logfile content for mondo
3220        export MONDO_SHARE=""
3221        MindiExit $?
3222    elif [ "$1" = "--makemountlist" ] ; then
3223        [ ! "$2" ] && Die "Please specify the output file"
3224        MakeMountlist $2
3225        # Avoids logfile content for mondo
3226        export MONDO_SHARE=""
3227        MindiExit $?
3228    elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3229        echo "Mindi v$MINDI_VERSION"
3230        # Avoids logfile content for mondo
3231        export MONDO_SHARE=""
3232        MindiExit 0
3233    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3234        MONDO_TMP=$2
3235        # Change MINDI_TMP for the one provided by mondo
3236        # So that it can get back the built files
3237        mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2> /dev/null
3238        rmdir $MINDI_TMP
3239        export MINDI_TMP=$MONDO_TMP
3240        mkdir -p $MINDI_TMP
3241        # This is the scratch dir in mondo - subdir images
3242        CACHE_LOC=$3
3243        if [ _"$CACHE_LOC" != _"" ]; then
3244            mkdir -p $CACHE_LOC
3245        fi
3246        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3247###
3248### Sq-Modification...
3249### Attempt to locate kernel specific module path
3250### if module path is found then use it other wise use uname -r to set it...
3251###
3252        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3253        LogIt "kernelname = $kernelname"
3254        LogIt "kernelpath = $kernelpath"
3255        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3256        then
3257           LogIt "Module path for ${kernelpath} not found..."
3258           LogIt "using running kernel\'s modules."
3259           kernelname=`uname -r`
3260        else
3261           LogIt "Using modules for kernel: ${kernelname}"
3262        fi
3263###
3264### end of Sq-Modification
3265###
3266        TAPEDEV=$5
3267        TAPESIZE=$6
3268        FILES_IN_FILELIST=$7
3269        USE_LZO=$8
3270        CDRECOVERY=$9
3271        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3272            IMAGE_DEVS=""
3273        else
3274            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3275        fi
3276        if [ "${11}" ] ; then
3277            LILO_OPTIONS=""
3278    #       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3279        fi
3280        LAST_FILELIST_NUMBER=${12}
3281        ESTIMATED_TOTAL_NOOF_SLICES=${13}
3282        EXCLUDE_DEVS="${14}"
3283        USE_COMP="${15}"
3284        USE_LILO="${16}"
3285        USE_STAR="${17}"
3286        INTERNAL_TAPE_BLOCK_SIZE="${18}"
3287        DIFFERENTIAL="${19}"
3288        USE_GZIP="${20}"
3289        NOT_BOOT="${21}"
3290        [ "$USE_COMP" = "" ] && USE_COMP=yes
3291        [ "$USE_GZIP" = "" ] && USE_GZIP=no
3292        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3293        [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
3294        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3295        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3296        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3297        then
3298           LogIt "Module path for ${kernelpath} not found..."
3299           LogIt "using running kernel\'s modules."
3300           kernelname=`uname -r`
3301        else
3302           LogIt "Using modules for kernel: ${kernelname}"
3303        fi
3304        [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
3305        # MONDO_ROOT is the real scratchdir
3306        MONDO_ROOT=`echo $CACHE_LOC | sed 's/\(.*\)\/.*/\1/'`
3307        if [ _"$MONDO_ROOT" != _"" ]; then
3308            mkdir -p $MONDO_ROOT
3309        else
3310            Die "MONDO_ROOT is undefined"
3311        fi
3312    else
3313        echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3314        MindiExit -1
3315    fi
3316fi
3317#ScanCDandTape
3318[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3319if [ "$CDRECOVERY" = "yes" ] ; then
3320    iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
3321    sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
3322else
3323    iso_cfg_file=$MINDI_LIB/isolinux.cfg
3324    sys_cfg_file=$MINDI_LIB/syslinux.cfg
3325fi
3326
3327[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
3328if [ _"$MONDO_SHARE" = _"" ]; then
3329    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3330    LogIt "Latest Mindi is available from http://www.mondorescue.org"
3331    LogIt "BusyBox sources are available from http://www.busybox.net"
3332    LogIt "------------------------------------------------------------------------------"
3333else
3334    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
3335fi
3336if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3337    LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3338else
3339    LogIt "Unable to find mindi-busybox, please install it"
3340    MindiExit -1
3341fi
3342
3343# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
3344insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
3345for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3346    insmod $i >> $LOGFILE 2>> $LOGFILE
3347done
3348
3349KERN_DISK_MADE=""
3350
3351echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3352echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3353echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3354if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3355    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
3356    MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3357    MakeMountlist $MINDI_TMP/mountlist.txt
3358    mkdir -p $MINDI_TMP/small-all/tmp
3359    cd $MINDI_TMP/small-all
3360    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"
3361    tar -cv tmp | gzip -9 > $MINDI_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
3362    sleep 2
3363    LogIt "Done. Exiting."
3364    MindiExit 0
3365fi
3366
3367if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3368    LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
3369fi
3370
3371if [ "$kernelpath" = "" ] ; then
3372    [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
3373    echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3374    read ch
3375    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3376        USE_OWN_KERNEL="yes"
3377    fi
3378    if [ "$USE_OWN_KERNEL" = "yes" ]; then
3379        YOUR_KERNEL_SUCKS=""
3380        kernelpath=`TryToFindKernelPath`
3381        if [ "$kernelpath" = "" ] ; then
3382            echo -n "Please enter kernel path : "
3383            read kernelpath
3384        fi
3385    else
3386        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3387    fi
3388fi
3389if [ _"$MONDO_SHARE" = _"" ] && [ "$ARCH" != "ia64" ]; then
3390    echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/[n]) ?"
3391    read ch
3392    if [ "$ch" != "y" ] && [ "$ch" != "Y" ] ; then
3393        USE_LILO=no
3394    else
3395        USE_LILO=yes
3396    fi
3397fi
3398if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3399    kernelpath=$MINDI_LIB/vmlinuz
3400    LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3401    LogIt "However, you are still running your kernel. If Mindi fails to create your"
3402    LogIt "disks then it may still be a result of a problem with your kernel."
3403    pwd=`pwd`
3404    cd $MINDI_TMP
3405    bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3406    cd $pwd
3407    YOUR_KERNEL_SUCKS="Your kernel sucks"
3408fi
3409echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$CACHE_LOC" >> $LOGFILE
3410[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
3411
3412[ "$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."
3413
3414PrepareDataDiskImages $CACHE_LOC
3415noof_disks=$?
3416ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3417rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3418ramdisk_size=$rds
3419
3420echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
3421if [ "$ARCH" = "ia64" ] ; then
3422    PrepareBootDiskImage_LILO $CACHE_LOC $BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
3423else
3424    if [ "$USE_LILO" = "yes" ] ; then
3425        if ! PrepareBootDiskImage_LILO $CACHE_LOC 1722 $kernelpath $ramdisk_size ; then
3426            LogIt "WARNING - failed to create 1.72MB boot image."
3427            LogIt "Please reduce your kernel's size if you want to make a 1.72MB floppy disk."
3428        fi
3429        if ! PrepareBootDiskImage_LILO $CACHE_LOC 2880 $kernelpath $ramdisk_size ;  then
3430            LogIt "WARNING - failed to create 2.88MB floppy disk image."
3431            LogIt "Please reduce your kernel's size if you want to make a 2.88MB floppy disk."
3432            PrepareBootDiskImage_LILO $CACHE_LOC $BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
3433        fi
3434    else
3435        if ! PrepareBootDiskImage_SYSLINUX $CACHE_LOC 1722 $kernelpath $ramdisk_size ; then
3436            LogIt "WARNING - failed to create 1.72MB boot image."
3437            LogIt "Please reduce your kernel's size if you want to make a 1.72MB floppy disk."
3438            if ! PrepareBootDiskImage_SYSLINUX $CACHE_LOC 2880 $kernelpath $ramdisk_size ; then
3439                LogIt "WARNING - failed to create 2.88MB floppy disk image."
3440                LogIt "Please reduce your kernel's size if you want to make a 2.88MB floppy disk."
3441                PrepareBootDiskImage_SYSLINUX $CACHE_LOC $BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
3442            fi
3443        fi
3444    fi
3445fi
3446
3447[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3448...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3449
3450if [ _"$MONDO_SHARE" = _"" ]; then
3451    ListImagesForUser $CACHE_LOC
3452    boot_dev=/dev/fd0u1722
3453    [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3454    [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3455    [ ! -e "$boot_dev" ] && Die "Oh Lord, will you PLEASE tell the vendor to create the 1.72MB devices in /dev?"
3456    if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
3457        OfferToCopyImagesToDisks $CACHE_LOC $boot_dev $FDDEVICE
3458    fi
3459    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
3460        OfferToMakeBootableUSB $CACHE_LOC
3461    fi
3462    OfferToMakeBootableISO $CACHE_LOC
3463    LogIt "Finished."
3464elif [ "$TAPEDEV" ] ; then
3465    OfferToMakeBootableISO $CACHE_LOC
3466    if [ -e "$CACHE_LOC/all.tar.gz" ] ; then
3467        cp -f $CACHE_LOC/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
3468    else
3469        Die "Cannot find all.tar.gz, to be written to tape"
3470    fi
3471elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3472    OfferToMakeBootableUSB $CACHE_LOC
3473else
3474    OfferToMakeBootableISO $CACHE_LOC
3475fi
3476# cleanup
3477LogIt "$FRIENDLY_OUTSTRING"
3478for mtpt in $FLOPPY_WAS_MOUNTED ; do
3479    mount $mtpt
3480done
3481MindiExit 0
Note: See TracBrowser for help on using the repository browser.