source: MondoRescue/branches/stable/mindi/mindi @ 964

Last change on this file since 964 was 964, checked in by Bruno Cornec, 14 years ago

Improved again mindi's messages

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