source: trunk/mindi/mindi @ 939

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

merge -r931:938 $SVN_M/branches/stable

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