source: branches/2.2.5/mindi/mindi @ 1797

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

Support /vmfs/volumes for ESX

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