source: branches/2.2.5/mindi/mindi @ 1713

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