source: branches/stable/mindi/mindi @ 934

Last change on this file since 934 was 934, checked in by bruno, 13 years ago

Fix another x86_64 issue on mindi

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