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

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