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

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

elilo.efi is now searched throughout /boot/efi and not in a fixed place as there is no standard

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