source: branches/stable/mindi/mindi @ 1009

Last change on this file since 1009 was 1009, checked in by Bruno Cornec, 14 years ago
  • UUID and LABELS are now both correctly handled by mindi (it's one or the other so only a single else case)
  • LABEL SWAP are working again.
  • Property svn:keywords set to Rev Id
File size: 107.2 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 1009 2006-12-21 16:30:20Z 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="yes"
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 nvidia"
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 vmnet"
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 -e "$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_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
1067    use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
1068    use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
1069    echo "use-lzo $use_lzo" >> $outfile
1070    echo "use-gzip $use_gzip" >> $outfile
1071    echo "use-star $use_star" >> $outfile
1072    echo "use-comp $use_comp" >> $outfile
1073    echo "datestamp `date`" >> $outfile
1074    [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
1075    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-IPADDR nfs-client-ipaddr $outfile
1076    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-NETMASK nfs-client-netmask $outfile
1077    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-BROADCAST nfs-client-broadcast $outfile
1078    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-DEFGW  nfs-client-defgw  $outfile
1079    AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-MOUNT  nfs-server-mount  $outfile
1080    AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-PATH   nfs-server-path   $outfile
1081    AddFileToCfgIfExists $MINDI_TMP/NFS-DEV           nfs-dev           $outfile
1082    AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-IPADDR nfs-server-ipaddr $outfile
1083    AddFileToCfgIfExists $MINDI_TMP/ISO-DEV           iso-dev           $outfile
1084    AddFileToCfgIfExists $MINDI_TMP/ISO-MNT           iso-mnt           $outfile
1085    AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX        iso-prefix        $outfile
1086    AddFileToCfgIfExists $MINDI_TMP/ISODIR            isodir            $outfile
1087    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
1088    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME   bootloader.name   $outfile
1089    AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
1090    AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
1091    AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
1092    AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL      differential      $outfile
1093    AddFileToCfgIfExists $MINDI_TMP/ACL      acl      $outfile
1094    AddFileToCfgIfExists $MINDI_TMP/XATTR      xattr      $outfile
1095}
1096
1097
1098MakeModuleLoadingScript() {
1099    local module fname params modpath kver outerloop i modpaths kver searchpath list_to_echo j
1100    tmpmodprobe_flag=$1
1101    outfile=$2
1102    > $outfile || Die "Cannot create empty $outfile"
1103    echo -en "#\041/bin/sh\n\n" >> $outfile
1104    echo "echo -en \"Loading your modules...\"" >> $outfile
1105    if [ "$YOUR_KERNEL_SUCKS" ] ; then
1106        kver=$FAILSAFE_KVER
1107        cd $MINDI_TMP
1108        searchpath=lib/modules/$kver
1109    else
1110###
1111### Sq-Modification ... Use kernelname for module search path if specified
1112###
1113        #kver=`uname -r`
1114        if [ "${kernelname}" != "" ]
1115        then
1116            kver=${kernelname}
1117        else
1118            kver=`uname -r`
1119        fi
1120###
1121### Sq-Modification end
1122###
1123        searchpath=/lib/modules/$kver
1124    fi
1125   
1126    echo -en "for outerloop in 1 2 3 4 5 ; do\necho -en \".\"\n" >> $outfile
1127    list_to_echo="`lsmod | sed -n '2,$s/ .*//p'`"
1128
1129    # Make temporary modprobe.conf file if we are told so
1130    if [ $tmpmodprobe_flag == "Y" ] ; then
1131        infile="$MINDI_TMP/modprobe.conf.mindi"
1132        find /etc/modprobe.d -maxdepth 1 -name "*" -xtype f -print0 | xargs -0 cat > $infile
1133    else
1134        infile="/etc/modules.conf"
1135    fi
1136    for module in $list_to_echo $EXTRA_MODS ; do
1137        params=`sed -n "s/^options \\+$module \\+//p" $infile`
1138        modpaths=`FindSpecificModuleInPath $searchpath $module`
1139        for i in $modpaths ; do
1140            echo "MyInsmod $i $params > /dev/null 2> /dev/null" \
1141                | tr '.' '#' \
1142                | sed s/#o#gz/#o/ \
1143                | sed s/#o#gz/#o/ \
1144                | sed s/#ko#gz/#ko/ \
1145                | sed s/#ko#gz/#ko/ \
1146                | tr '#' '.' >> $outfile
1147            echo -en "$i added to module list.\n" >> $LOGFILE
1148        done
1149    done
1150    echo -en "done\n" >> $outfile
1151    echo "echo \"Done.\"" >> $outfile
1152    chmod +x $outfile
1153    cd /
1154    # Remove temporary modprobe.conf file if we have created one
1155    if [ $tmpmodprobe_flag == "Y" ] ; then
1156        rm -f $infile
1157    fi
1158}
1159
1160
1161MakeMountlist() {
1162    local scratchdir mountlist all_partitions current_partition \
1163partition_size partition_format outstring partition_number \
1164partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
1165absolute_partition old_partition_fmt current_lvolume
1166
1167    echo "Your raw fstab file looks like this:" >> $LOGFILE
1168    echo "------------------------------------" >> $LOGFILE
1169    cat $MY_FSTAB >> $LOGFILE
1170    echo "Your mountlist will look like this:" | tee -a $LOGFILE
1171    echo "-----------------------------------" >> $LOGFILE
1172
1173# scratchdir, mountlist(OUT)
1174    scratchdir=$MINDI_TMP
1175    mountlist=$1
1176
1177# NB: partition = device
1178# NB: mountpt = where the device is mounted
1179
1180    [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1181
1182    rm -f $mountlist
1183    mkdir -p $mountlist
1184    rm -Rf $mountlist
1185    > $mountlist
1186    echo -en "\rHang on...\r"
1187    all_partitions=""
1188   
1189    if [ $LVM != "false" ]; then
1190        echo -en "\rAnalyzing LVM...\r"
1191        $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
1192        if [ $? -ne 0 ]; then
1193            LVM="false"
1194        fi
1195        all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-32`
1196    fi
1197    all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1198#    echo "all partitions = $all_partitions" > /dev/stderr
1199    for i in $IMAGE_DEVS ; do
1200        mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1201    done
1202    [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1203    printf "        %-15s %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL UUID | tee -a $LOGFILE
1204    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"
1205    for c_p in $all_partitions ; do
1206        [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] && continue
1207        [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1208        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
1209            current_partition=`readlink -f $c_p`
1210            [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1211            [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1212        else
1213            current_partition="$c_p"
1214        fi
1215        [ "$c_p" = "none" ] && continue
1216        redhat_label=""
1217        uuid=""
1218        absolute_partition=`readlink -f $c_p`
1219        partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1220
1221        # Detects noauto partitions not mounted and exclude them
1222        partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1223        if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" =  "" ] ; then
1224            continue
1225        fi
1226
1227        # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1228        # current_partition contains only first column of /etc/fstab
1229        if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1230            str_to_find_fmt_with=$current_partition
1231            redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1232            actual_dev=""
1233
1234            # 1st try, findfs - the RHEL way of finding labels and their partitions
1235            if [ -x "/sbin/findfs" ]; then
1236                actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
1237            fi
1238   
1239            # 2nd try : blkid, the good way for all LABEL except swap
1240            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1241                actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1242                # For LVM FS it will give a /dev/dm-# which should then be converted
1243                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1244                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1245                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1246                    for dev in `ls /dev/mapper/*`; do
1247                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1248                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1249                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1250                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1251                            break
1252                        fi
1253                    done
1254                fi
1255            fi
1256   
1257            # 3rd try, which works on a standard partition (ext2/3), but not on swap
1258            # For LVM gives a /dev/mapper entry
1259            if [ "x$actual_dev" = "x" ]; then
1260                actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
1261            fi
1262   
1263            # 4th try, with vol_id
1264            # SWAP only
1265            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1266                list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
1267                for dev_swap in $list_swaps ; do
1268                    dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1269                    if [ "x$dev_exists" != "x" ]; then
1270                        actual_dev=$dev_swap
1271                        break;
1272                    fi
1273                done
1274            fi
1275
1276            # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1277            # LABEL=SW-cciss/c0d0p3 (RDP)
1278            # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1279            # SWAP only
1280            if [ "x$actual_dev" = "x" -a  _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1281                    for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1282                    do
1283                        # Location of the swap label for kernel 2.6
1284                        try_dev_label=`dd bs=1 count=16 skip=1052 if=$try_dev 2> /dev/null`
1285                        if [ "x$try_dev_label" = "x$redhat_label" ]; then
1286                            actual_dev=$try_dev
1287                        fi
1288                    done
1289            fi
1290
1291            # Check if one of all those tries has known success
1292            if [ "x$actual_dev" != "x" ]; then
1293                current_partition=$actual_dev
1294            else
1295                Die "Your system uses a LABEL partition ($current_partition), but you lack the tool to support it.\nPlease replace labels with their correct devices in /etc/fstab or install findfs|blkid|vol_id"
1296            fi
1297        # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1298        # current_partition contains only first column of /etc/fstab
1299        elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1300            str_to_find_fmt_with=$current_partition
1301            uuid=`echo "$current_partition" | cut -d'=' -f2`
1302            actual_dev=""
1303
1304            # 1st try, findfs - the RHEL way of finding labels and their partitions
1305            if [ -x "/sbin/findfs" ]; then
1306                actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1307            fi
1308   
1309            # 2nd try : blkid, the good way for all LABEL except swap
1310            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1311                actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
1312                # For LVM FS it will give a /dev/dm-# which should then be converted
1313                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1314                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1315                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1316                    for dev in `ls /dev/mapper/*`; do
1317                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1318                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1319                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1320                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1321                            break
1322                        fi
1323                    done
1324                fi
1325            fi
1326   
1327            # 3th try, with vol_id
1328            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1329                list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1330                for dev in $list_dev ; do
1331                    dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1332                    if [ "x$dev_exists" != "x" ]; then
1333                        actual_dev=$dev
1334                        break;
1335                    fi
1336                done
1337            fi
1338
1339            # Check if one of all those tries has known success
1340            if [ "x$actual_dev" != "x" ]; then
1341                current_partition=$actual_dev
1342            else
1343                Die "Your system uses a 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"
1344            fi
1345        else
1346            str_to_find_fmt_with=$current_partition
1347        fi
1348
1349        partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1350        # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1351        # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1352        # the former is then a link to the latter, so we test whether
1353        # $current_partition is actually such a link or not and set
1354        # $current_lvolume accordingly. On Debian you may find more than one answer
1355        # so we remove the one corresponding to /dev/.static
1356        # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1357        # principle is the same and we need to find the link to it as well.
1358        # Note that $current_lvolume may well be an
1359        # ordinary device. It is just to make sure that we feed the right value
1360        # into any of the LVM tools if possible.
1361
1362        current_lvolume="$current_partition"
1363        if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1364            # .static dir are a Debian specificity
1365            current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1366            echo $current_lvolume | grep -q ' '
1367            if [ $? -eq 0 ]; then
1368                echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE 
1369            fi
1370        fi
1371        #
1372        # End of LVM device style variation code (other than $current_lvolume).
1373
1374        if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1375            # Size computed via LVM not directly
1376            partition_size="lvm"
1377        else
1378            partition_size=`SizeOfPartition $current_partition`
1379            [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1380            [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1381            if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1382                partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1383                [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1384                [ "$partition_format" != "swap" ] && partition_format="swap"
1385                if [ "$partition_size" = "" ] ; then
1386                    totalsize=0
1387                    items=0
1388                    for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1389                        totalsize=$(($totalsize+$i))
1390                        items=$(($items+1))
1391                    done
1392                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1393                    [ "$partition_size" -lt "125000" ] && partition_size=125000
1394                    echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1395                fi
1396            fi
1397        fi
1398        [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1399        [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1400        if [ "$partition_mountpt" = "" ] ; then
1401            if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1402                if  [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1403                    partition_mountpt="raid"
1404                    partition_format="raid"
1405                else
1406                    partition_mountpt="lvm"
1407                    partition_format="lvm"
1408                fi
1409            fi
1410        fi
1411        psz=$partition_size
1412        echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1413        [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1414        if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1415            partition_mountpt="image"
1416            old_partition_fmt=$partition_format
1417            partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1418            partition_size=$(($partition_size+1)); # just in case
1419            if [ "$partition_format" = "Linux" ] ; then
1420                echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1421                echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1422                partition_format=$old_partition_fmt
1423            fi
1424        fi
1425        if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1426            echo "Excluding $current_partition from mountlist" >> $LOGFILE
1427            continue
1428        fi
1429        if [ ! "$partition_mountpt" ] ; then
1430            echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1431            for qq in "" `find /dev/ida/c*d* ! -name '*p*'` ; do
1432                partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1433                [ "$partition_format" ] && break
1434            done
1435            echo "------- $FDISK log end ------------" >> $LOGFILE
1436            if [ "$partition_format" = "Compaq diagnostics" ] ; then
1437                partition_format="compaq"
1438            elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1439                LogIt "Unable to find mountpoint of $current_partition - ignoring"
1440                continue
1441            fi
1442        fi
1443        partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1444        [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1445        unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label" $uuid`
1446        if [ "$current_partition" = "" ] ; then
1447            echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1448        elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1449            if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1450                partition_mountpt=raid
1451                partition_format=raid
1452                printf "\t%-15s %-15s %-15s %7s %-15s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label" $uuid | tee -a $LOGFILE
1453                printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" $uuid >> $mountlist
1454            else
1455                echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1456            fi
1457        elif [ "$partition_format" = "" ] ; then
1458            echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1459        elif [ "$partition_size" = "" ] ; then
1460            echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1461        elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1462            continue
1463        else
1464            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1465                echo "Stupid bastard..." >> $LOGFILE
1466                partition_format="vfat"
1467            fi
1468            printf "\t%-15s %-15s %-15s %7s %-15s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label" $uuid | tee -a $LOGFILE
1469            printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" $uuid >> $mountlist
1470        fi
1471    done
1472}
1473
1474
1475MakeSureNumberIsInteger() {
1476    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1477    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1478    echo "result = '$res'"
1479        Die "$1 should be an integer"
1480    fi
1481}
1482
1483
1484MakeSyslinuxMessageFile() {
1485    mkdir -p $1
1486    rmdir $1
1487    echo -en "  " > $1
1488    if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1489        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
1490    else
1491        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
1492    fi
1493    sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1494    rm -f $1.tmp
1495    if [ "$CDRECOVERY" != "yes" ] ; then
1496        if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1497            echo -en "Press <enter> to continue.\n" >> $1
1498        elif [ ! "$MINDI_TMP" ] ; then
1499            echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1500            if [ -e "$MINDI_LIB/memtest.img" ] ; then
1501                echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1502            fi
1503        else
1504            echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1505        fi
1506    else
1507        echo -en " \
1508To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1509CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1510    fi
1511}
1512
1513
1514MoveHyperlinkSensibly() {
1515    local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1516    filename=$1
1517    minidir_root=$2
1518    resides_on_diskno=$3
1519    noof_disks=$4
1520
1521    [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1522
1523    old_diskno=$resides_on_diskno
1524    d=1
1525    while [ "$d" -le "$noof_disks" ] ; do
1526        if [ "$d" -ne "$old_diskno" ] ; then
1527            old_pwd=`pwd`
1528            cd $minidir_root/$old_diskno
1529            cp --parents -Rdf $filename $minidir_root/$d/ 2>> $LOGFILE || Die "Can't move $filename (sensibly) from $old_diskno to $d"
1530            rm -f $filename
1531            cd $old_pwd
1532        fi
1533# when the softlink is resolvable, our work here is done
1534        [ -e "$minidir_root/$d/$filename" ] && return 0
1535        old_diskno=$d
1536        d=$(($d+1))
1537    done
1538    return 1
1539}
1540
1541
1542
1543OfferToCopyImagesToDisks() {
1544    local imagesdir i imagename dev count boot_dev data_dev
1545    imagesdir=$1
1546    boot_dev=$2
1547    data_dev=$3
1548
1549    echo -en "Would you like to create boot+data floppy disks now (y/[n]) ?"
1550    read i
1551    [ "$i" != "y" ] && [ "$i" != "Y" ] && return
1552    mount | grep -F /dev/fd > /dev/null && Die "Please unmount your floppies first."
1553    echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
1554    [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
1555    [ ! -e "$data_dev" ] && Die "Cannot find $data_dev - is your Linux distro broken?"
1556    i=`find $imagesdir -type f | grep -F "/mindi-root.1" 2> /dev/null`
1557    j=`find $imagesdir -type f | grep -F "/mindi-boot" | grep -Ev '2880|5760'`
1558    if [ "$i" ] ; then
1559        CopyImageToDisk $j $data_dev "boot disk"
1560        CopyImageToDisk $i $data_dev "root disk"
1561    else
1562        CopyImageToDisk $j $boot_dev "boot/root disk"
1563    fi
1564    count=1
1565    for i in `find $imagesdir | grep -F mindi-data` ; do
1566        CopyImageToDisk $i $data_dev "data disk #$count"
1567        count=$(($count+1))
1568    done
1569}
1570
1571
1572OfferToMakeBootableISO() {
1573    local i old_pwd
1574    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ ! "`DidMondoCallMe`" ] ; then
1575        echo -en "Shall I make a bootable CD image? (y/[n]) "
1576        read i
1577        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1578    fi
1579    if [ ! "$MINDI_TMP" ] ; then
1580        LogIt "NB: Mindi's bootable CD always uses isolinux."
1581        LogIt "For a bootable CD w/LILO, please use Mondo."
1582    fi
1583    rm -Rf $MINDI_TMP/iso
1584    mkdir -p $MINDI_TMP/iso/{images,archives,isolinux}
1585    cp -f $1/*.img $1/*.gz $MINDI_TMP/iso/images 2>> $LOGFILE || LogIt "OfferToMakeBootableISO: Cannot copy $i to $MINDI_TMP/iso/images"
1586    old_pwd=`pwd`
1587    cd $MINDI_TMP/iso
1588    mkdir -p $MONDO_ROOT/iso/isolinux
1589    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1590    for i in memdisk memtest.bin memtest.img ; do
1591        j=$MINDI_LIB/$i
1592        k=$MINDI_TMP/iso/isolinux
1593        if [ -e "$j" ] ; then
1594            LogIt "Copying $j to $k"
1595            cp -f $j $k 2> /dev/null || Die "Failed to copy $j to $k"
1596            cp -f $j $MINDI_TMP 2> /dev/null || Die "Failed to copy $j to $MINDI_TMP"
1597            cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1598        fi
1599    done
1600    MakeSyslinuxMessageFile $MINDI_TMP/iso/isolinux/message.txt
1601    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?"
1602    cp $MINDI_TMP/mindi.rdz $MINDI_TMP/iso/isolinux/initrd.img 2>> $LOGFILE
1603    cp $MINDI_TMP/mindi.rdz $CACHE_LOC/initrd.img 2>> $LOGFILE
1604    [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1605    cd $MINDI_TMP/iso/isolinux
1606    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?"
1607    if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1608        mv isolinux.cfg isolinux.cfg.old
1609        sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1610    fi
1611    if [ "$ARCH" != "ia64" ] ; then
1612        cp $ISOLINUX isolinux.bin 2> /dev/null || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
1613        cp $ISOLINUX ../ 2>> $LOGFILE
1614    fi
1615    cd $MINDI_TMP/iso
1616    if [ "$ARCH" != "ia64" ] ; then
1617        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?"
1618    fi
1619    [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun .    2>> $LOGFILE
1620    if [ "$ARCH" != "ia64" ] ; then
1621        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
1622    else
1623        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
1624    fi
1625    if [ "$?" -ne "0" ] ; then
1626        echo "----------- mkisofs's errors --------------" >> $LOGFILE
1627        cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1628        echo "mkisofs returned the following errors:-"
1629        cat $MINDI_TMP/mkisofs.log
1630        LogIt "Failed to create ISO image."
1631    else
1632        echo "Created bootable ISO image at $CACHE_LOC/mindi.iso" >> $LOGFILE
1633    fi
1634    rm -f $MINDI_TMP/mkisofs.log
1635    cd $old_pwd
1636}
1637
1638
1639PluralOrNot() {
1640    [ "$1" -gt "1" ] && echo -en "s"
1641}
1642
1643
1644MakeMessageFile() {
1645    local disksize
1646    disksize=$1
1647    if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1648        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`"/
1649    else
1650        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`/
1651    fi
1652    if [ "$disksize" -gt "2880" ] ; then
1653        if [ "`DidMondoCallMe`" ] ; then
1654            if [ "$CDRECOVERY" != "yes" ] ; then
1655                if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1656                    echo -en "Press <enter> to continue.\n"
1657                elif [ ! "$MINDI_TMP" ] ; then
1658                    echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1659                else
1660                    echo -en "$BOOT_MEDIA_MESSAGE"
1661                fi
1662            fi
1663        fi
1664    fi
1665    if [ "$CDRECOVERY" = "yes" ] ; then
1666        echo -en "\
1667To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1668CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1669    fi
1670    echo -en "\n\n\n"
1671}
1672
1673
1674write_full_floppy_of_kernel() {
1675    local mtpt image old_pwd res disksize
1676
1677    res=0
1678    old_pwd=`pwd`
1679    KERN_DISK_MADE=1
1680    disksize=$3
1681    rand1=$RANDOM
1682    rand2=$RANDOM
1683    image=$MINDI_TMP/$rand1.$rand2.img
1684    mtpt=$MINDI_TMP/$rand1.$rand2.mtpt
1685    dd if=/dev/zero of=$image bs=1k count=$disksize &> /dev/null
1686    mke2fs -N 26 -F $image &> /dev/null
1687    mkdir -p $mtpt
1688    mount -o loop $image $mtpt
1689    cd $mtpt
1690    mkdir -p {dev,tmp,boot}
1691    cp -f $1 vmlinuz 2>> $LOGFILE
1692    if [ "$?" -ne "0" ] ; then
1693        LogIt "Failed to copy $1 to ramdisk"
1694        cd $old_pwd
1695        umount $mtpt
1696        rmdir $mtpt
1697        rm $image
1698        return 1
1699    fi
1700
1701    rdev vmlinuz 2,0
1702    rdev -R vmlinuz 0
1703    rdev -r vmlinuz 49152
1704
1705    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz"
1706    losetup /dev/loop0 > /dev/null 2> /dev/null
1707    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary."
1708    CopyBootBFile $mtpt/boot.b
1709
1710    MakeLiloConfFile $disksize >> bdlilo.conf
1711
1712    chmod 644 bdlilo.conf
1713    MakeMessageFile $disksize > message
1714    lilo -v -C bdlilo.conf -r $mtpt
1715    res=$?
1716
1717    cd $old_pwd
1718    umount $mtpt
1719    mv -f $image $2
1720    rmdir $mtpt
1721
1722    return $res
1723}
1724
1725
1726MakeLiloConfFile() {
1727    local disksize options i ooo
1728    disksize=$1
1729    options=""
1730
1731    if [ "$ARCH" != "ia64" ] ; then
1732        echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1733    fi
1734    if [ "$disksize" -eq "2880" ] ; then
1735        echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1736    elif [ "$disksize" -eq "1722" ] ; then
1737        echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1738    elif [ "$disksize" -gt "2880" ] ; then
1739        /bin/true
1740    else
1741        echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1742    fi
1743    if [ "$ARCH" != "ia64" ] ; then
1744        echo -en "install=/boot.b\nmap=/boot.map\n"
1745    fi
1746    if [ "$CDRECOVERY" = "yes" ] ; then
1747        echo -en "default=RESTORE\n"
1748    elif [ "$disksize" -gt "2880" ] && [ "`DidMondoCallMe`" ] ; then
1749        if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1750            echo -en "default=iso\n"
1751        else
1752            echo -en "default=interactive\n"
1753        fi
1754    else
1755        echo -en "default=expert\n"
1756    fi
1757
1758    echo -en "prompt\n"
1759    if [ "$ARCH" != "ia64" ] ; then
1760        echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1761    fi
1762    if [ "$CDRECOVERY" != "yes" ] ; then
1763        echo -en "timeout=300\n"
1764    fi
1765    echo -en "\n"
1766    if [ "$CDRECOVERY" = "yes" ] ; then
1767        options="RESTORE expert"
1768    elif [ "$disksize" -gt "2880" ] ; then
1769        if [ "`DidMondoCallMe`" ] ; then
1770            if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1771                options="iso"
1772            else
1773                options="interactive expert compare iso nuke isonuke"
1774# hda hdb hdc hdd"
1775            fi
1776        else
1777            options="expert"
1778        fi
1779    else
1780        options="expert"
1781    fi
1782    for i in $options ; do
1783        ooo=$i
1784        [ "$ooo" = "RESTORE" ] && ooo="nuke"
1785        if [ "$ARCH" = "ia64" ] ; then
1786            rootpart="root=/dev/ram0\n\t"
1787        else
1788            rootpart=""
1789        fi
1790        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"
1791   
1792        outstr=$outstr" $ooo_mode"
1793        outstr=$outstr"\"\n"
1794        if [ "$disksize" = "1440" ] ; then
1795            echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1796        else
1797            echo -en "$outstr"
1798        fi
1799    done
1800}
1801
1802
1803PrepareBootDiskImage_LILO() {
1804    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1805    imagesdir=$1
1806    disksize=$2
1807    kernelpath=$3
1808    ramdisksize=$4
1809
1810    retval=0
1811    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1812    echo -en "Making "$disksize"KB boot disk..."
1813    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?"
1814    if [ "$ARCH" != "ia64" ] ; then
1815        [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1816    fi
1817    echo -en "..."
1818    imagefile=$imagesdir/mindi-bootroot.$disksize.img
1819    mountpoint=$MINDI_TMP/mountpoint.$$
1820    mkdir -p $mountpoint
1821    dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1822    if [ "$ARCH" = "ia64" ] ; then
1823        mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1824        t=vfat
1825    else
1826        mke2fs -N 26 -m 0 -F $imagefile >> $LOGFILE 2>> $LOGFILE
1827        t=ext2
1828    fi
1829    mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1830    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1831    mkdir -p $mountpoint/etc
1832    if [ "$ARCH" != "ia64" ] ; then
1833        liloconf=$mountpoint/etc/lilo.conf
1834    else
1835        liloconf=$mountpoint/elilo.conf
1836    fi
1837    old_pwd=`pwd`
1838    cd $mountpoint
1839    if [ "$ARCH" != "ia64" ] ; then
1840        tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz"
1841    fi
1842    cd $old_pwd
1843    losetup /dev/loop0 > /dev/null 2> /dev/null
1844    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing   'losetup /dev/loop0 -d'.\nReboot if necessary."
1845    CopyBootBFile $mountpoint/boot.b
1846
1847    MakeLiloConfFile $disksize > $liloconf
1848
1849    echo "Copying $MINDI_TMP/mindi.rdz to $mountpoint..." >> $LOGFILE
1850    cp -f $MINDI_TMP/mindi.rdz $mountpoint 2>> $LOGFILE
1851    if [ "$?" -ne "0" ] ; then
1852        LogIt "Failed to copy $MINDI_TMP/mindi.rdz to $mountpoint"
1853        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1854        LogIt "Please unload some of your modules and try again."
1855        rm -f $MINDI_TMP/mtpt.$$
1856        LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)"
1857        retval=$(($retval+1))
1858    fi
1859    MakeMessageFile $disksize > $mountpoint/message
1860
1861    mkdir -p $mountpoint/tmp
1862    cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp &> /dev/null
1863    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1864        echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
1865        echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
1866#        echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
1867    fi
1868
1869    # copy the kernel across
1870    rm -Rf $mountpoint/lost+found
1871    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1872    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1873    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
1874    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
1875        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1876        du -sk $mountpoint/* >> $LOGFILE
1877        echo "--- end of list of files ---" >> $LOGFILE
1878        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1879Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
1880        rm -f $mountpoint/vmlinuz
1881        cd $old_pwd
1882        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1883        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1884    #   losetup /dev/loop0 -d
1885        res=0
1886        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
1887        res=$(($res+$?))
1888        cp -f $MINDI_TMP/mindi.rdz $imagesdir/mindi-root.1440.img 2>> $LOGFILE
1889        res=$(($res+$?))
1890        rm -f $imagefile
1891        if [ "$res" -ne "0" ]; then
1892            LogIt "WARNING - failed to create 1.44MB boot/root floppies"
1893            rm -f $imagesdir/mindi-*.1440.img
1894        fi
1895        return $res
1896    fi
1897    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1898    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1899    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
1900    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
1901# make it bootable
1902    rm -f $mountpoint/zero
1903    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1904    if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
1905        if [ "$ARCH" != "ia64" ] ; then
1906        $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
1907        else
1908            /bin/true
1909        fi
1910    elif [ ! "$KERN_DISK_MADE" ] ; then
1911# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
1912        $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
1913    else
1914        echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
1915    fi
1916
1917    # BERLIOS  does not test necessarily what it expects
1918    if [ $? -ne "0" ] ; then
1919        if [ "`grep -F "/tmp/dev.0" $LOGFILE`" ] ; then
1920            LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's."
1921            LogIt "Please reboot your PC as a workaround."
1922            Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ."
1923        fi
1924        echo "$LILO_EXE -r $mountpoint ...failed."
1925        echo -en "Press ENTER to continue."; read line
1926        LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug."
1927        retval=$(($retval+1))
1928    fi
1929    cp -f $liloconf $MINDI_TMP/lilo.conf 2>> $LOGFILE
1930    if [ "$ARCH" = "ia64" ] ; then
1931        cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1932    fi
1933    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1934    echo -en "..."
1935    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1936    if [ "$retval" -eq "0" ] ; then
1937        echo -en "...$DONE\r"
1938        if [ "$KERN_DISK_MADE" ] ; then
1939            LogIt "... $disksize KB boot disks were created OK\r"
1940        fi
1941    else
1942        echo -en "...failed\r"
1943        LogIt $disksize"KB boot disk was NOT created\r"
1944        rm -f $imagefile
1945    fi
1946    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1947    return $retval
1948}
1949
1950
1951PrepareBootDiskImage_SYSLINUX() {
1952    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1953    imagesdir=$1
1954    disksize=$2
1955    kernelpath=$3
1956    ramdisksize=$4
1957    do_boot_root_thingy=""
1958    local retval old_pwd
1959    retval=0
1960
1961    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1962    echo -en "Making "$disksize"KB boot disk..."
1963    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?"
1964    [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1965    echo -en "..."
1966    imagefile=$imagesdir/mindi-bootroot.$disksize.img
1967    mountpoint=$MINDI_TMP/mountpoint.$$
1968    mkdir -p $mountpoint
1969# If I format a 1722KB data file & run syslinux on it, the resultant image
1970# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
1971# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
1972# If I extract it, mount it, copy my files to it, etc. then the resultant
1973# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
1974# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
1975    if [ "$disksize" = "1722" ] ; then
1976        gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
1977    else
1978        dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1979        mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1980        syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1981    fi
1982    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1983
1984    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1985    old_pwd=`pwd`
1986    MakeSyslinuxMessageFile $mountpoint/message.txt
1987    cd $mountpoint
1988    [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
1989    cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
1990    if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1991        mv syslinux.cfg syslinux.cfg.orig
1992        sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
1993    fi
1994    cd $old_pwd
1995    echo "Copying $MINDI_TMP/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
1996    cp -f $MINDI_TMP/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
1997    if [ "$?" -ne "0" ] ; then
1998        LogIt "Failed to copy $MINDI_TMP/mindi.rdz to $mountpoint"
1999        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
2000        LogIt "Please unload some of your modules and try again."
2001        rm -f $MINDI_TMP/mtpt.$$
2002        LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)"
2003        retval=$(($retval+1))
2004    fi
2005
2006    mkdir -p $mountpoint/tmp
2007    cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2008
2009    # copy the kernel across
2010    rm -Rf $mountpoint/lost+found
2011    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2012    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2013    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2014    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2015        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2016        du -sk $mountpoint/* >> $LOGFILE
2017        echo "--- end of list of files ---" >> $LOGFILE
2018        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2019Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2020        rm -f $mountpoint/vmlinuz
2021        cd $old_pwd
2022        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2023        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
2024
2025        res=0
2026        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2027        res=$(($res+$?))
2028        cp -f $MINDI_TMP/mindi.rdz $imagesdir/mindi-root.1440.img 2>> $LOGFILE
2029        res=$(($res+$?))
2030        rm -f $imagefile
2031        if [ "$res" -ne "0" ]; then
2032            LogIt "WARNING - failed to create 1.44MB boot/root floppies"
2033            rm -f $imagesdir/mindi-*.1440.img
2034        fi
2035        return $res
2036    fi
2037    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2038    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2039    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2040    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2041
2042    # make it bootable
2043    rm -f $mountpoint/zero
2044    mkdir -p $mountpoint/etc
2045    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
2046    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2047    echo -en "..."
2048    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
2049
2050    if [ "$retval" -eq "0" ] ; then
2051        echo -en "...$DONE\r"
2052        if [ "$KERN_DISK_MADE" ] ; then
2053            rm -f $imagefile
2054            LogIt "... $disksize KB boot disks were created OK\r"
2055        fi
2056    else
2057        echo -en "...failed\r"
2058        LogIt $disksize"KB boot disk was NOT created\r"
2059        rm -f $imagefile
2060    fi
2061    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
2062    return $retval
2063}
2064
2065
2066PrepareDataDiskImages() {
2067    local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2068
2069    imagesdir=$1
2070    rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
2071    needlist=$MINDI_TMP/what-we-need.txt
2072    bigdir=$MINDI_TMP/bigdir
2073    minidir_root=$MINDI_TMP/minidir
2074    mkdir -p $minidir_root
2075    mkdir -p $bigdir/usr/bin
2076    tardir=$MINDI_TMP/tardir
2077
2078    lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt | grep -vx "" | wc -l`
2079    cat $MINDI_CONF/deplist.txt | GenerateGiantDependencyList $needlist $lines
2080    res=$?
2081    if [ "$YOUR_KERNEL_SUCKS" ]; then
2082        pwd=`pwd`
2083        cd $MINDI_TMP
2084        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2085            cp --parents -pRdf ./$i $bigdir 2>> $LOGFILE || Die "PDDI can't cp $i->$bigdir"
2086            if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
2087                cp --parents -pRdf $i $bigdir 2>> $LOGFILE
2088            else
2089                ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2090                BIGNO=$(($BIGNO+1))
2091            fi
2092        done
2093        for i in $EXTRA_MODS ; do
2094            j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
2095            [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o" >> $LOGFILE
2096            for k in $j ; do
2097                if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
2098                    cp --parents -pRdf $k $bigdir 2>> $LOGFILE
2099                else
2100                    ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2101                    BIGNO=$(($BIGNO+1))
2102                fi
2103                echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2104            done
2105        done
2106        cd $pwd
2107    else
2108        ListKernelModulePaths >> $needlist
2109    fi
2110    if [ "$res" -ne "0" ] ; then
2111        Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2112    fi
2113    FindAndAddUserKeyboardMappingFile
2114    mkdir -p $bigdir/tmp
2115    if [ "`DidMondoCallMe`" ] ; then
2116        MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2117        cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
2118    fi
2119    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2120    DropOptimizedLibraries $needlist $bigdir
2121    echo -en "Assembling dependency files"
2122    CopyDependenciesToDirectory < $needlist $bigdir
2123
2124    # also copy io.sys and msdos.sys, if we can find them
2125    for i in `mount | cut -d' ' -f3` ; do
2126        for j in io.sys msdos.sys ; do
2127            [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
2128        done
2129    done
2130
2131    # master boot record, too
2132    i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2133    if [ "$i" ] ; then
2134        LogIt "Backing up $i's MBR"
2135        dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2136        sleep 1
2137        sync
2138        j=$i
2139        [ -h "$j" ] && j=`readlink -f $j`
2140        LogIt "Creating /dev/boot_device ($j)"
2141        mkdir -p $bigdir/dev
2142        cp -pRdf $j $bigdir/dev/boot_device 2> /dev/null || Die "Unable to create /dev/boot_device on ramdisk"
2143    fi
2144
2145    old_pwd=`pwd`
2146    cd $bigdir
2147
2148    [ -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'."
2149    cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "WARNING - error occurred while unzipping aux-tools"
2150    if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
2151        tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "WARNING - error occurred while unzipping x11-tools.tgz"
2152    fi
2153    if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2154        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2155        [ "$?" -ne "0" ] && [ "`DidMondoCallMe`" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2156    fi
2157    [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state . 2>> $LOGFILE
2158    cd $old_pwd
2159    echo -e "$DONE"
2160    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2161    SplitDirectoryIntoMinidirs $bigdir $minidir_root
2162    noof_disks=$?
2163    [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2164#    if [ "$noof_disks" -ge "8" ] ; then
2165#        LogIt "You are putting a ludicrously large amount of data on these disks."
2166#        LogIt "I shall therefore double EXTRA_SPACE, just in case your ramdisk is too small."
2167#        EXTRA_SPACE=$(($EXTRA_SPACE*2))
2168#    fi
2169    MakeMountlist $MINDI_TMP/mountlist.txt
2170    mkdir -p $minidir_root/$noof_disks/tmp
2171    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"
2172    [ "`DidMondoCallMe`" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
2173    [ $LVM != "false" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm || LVM="false"
2174    cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2175    ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2176    CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2177    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2178    # One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
2179    rmdir $tardir $bigdir
2180    rm -f $needlist
2181    return $noof_disks
2182}
2183
2184
2185ProcessLDD() {
2186    local main_fname incoming j i fname f newf
2187    main_fname=$1
2188    read incoming
2189    while [ "$incoming" != "" ] ; do
2190        # We take the full path name of the dyn. lib. we want
2191        incoming=`echo "$incoming" | sed '/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*(.*/d ; s/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*\(\/.*\)/\1/ ; s/[[:blank:]]*\(\/.*\)[[:blank:]]*(.*/\1/'`
2192        for f in `echo "$incoming"` ; do
2193            echo "$f `ReadAllLink $f`"
2194        done
2195        read incoming
2196    done
2197}
2198
2199
2200Prompt() {
2201    echo -en "$1"
2202    read line
2203}
2204
2205
2206ReadLine() {
2207    local i incoming
2208    read incoming
2209    i=0
2210    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2211        i=$(($i+1))
2212        read incoming
2213    done
2214    echo "$incoming"
2215}
2216
2217
2218RejigHyperlinks() {
2219    local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2220    minidir_root=$1
2221    noof_disks=$2
2222
2223    old_pwd=`pwd`
2224    diskno=1
2225    while [ "$diskno" -le "$noof_disks" ] ; do
2226        mkdir -p $minidir_root/$diskno
2227        cd $minidir_root/$diskno
2228        for fname in `find -type d -o -print` ; do
2229            [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2230        done
2231        diskno=$(($diskno+1))
2232    done
2233
2234    cd $old_pwd
2235    return
2236}
2237
2238
2239ReplaceIndividualLine() {
2240    local orig_file new_file lino newstring lines_total lines_remaining
2241
2242    orig_file=$1.orig
2243    mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2244    new_file=$1
2245    lino=$2
2246    newstring="$3"
2247    if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
2248        echo "Can't find string" >> $LOGFILE
2249        return 1
2250    fi
2251    lines_total=`wc -l $orig_file | $AWK '{print $1;}'`
2252    lines_remaining=$(($lines_total-$lino))
2253    head -n$(($lino-1)) $orig_file > $new_file
2254    echo "$newstring" >> $new_file
2255    echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2256    tail -n$lines_remaining $orig_file >> $new_file
2257    echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2258    [ -x "$orig_file" ] && chmod +x $new_file
2259    rm -f $orig_file
2260    return 0
2261}
2262
2263
2264ScanCDandTape() {
2265    local i
2266
2267    for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2268        dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2269    done
2270}
2271
2272
2273SizeOfPartition() {
2274    local devpath drive res stub
2275    device=$1
2276    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2277        res=`SizeOfRaidPartition $device`
2278        [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2279        echo "$res"
2280        return 0
2281    fi
2282    # patch from Bill <bill@iwizard.biz> - 2003/08/25
2283    res=`$FDISK -s $device 2>> $LOGFILE`
2284    # end patch
2285    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2286    [ "$res" = "" ] && res="-1"
2287    echo $res
2288    return 0
2289}
2290
2291
2292SizeOfRaidPartition() {
2293    local real_dev smallest_size silly tmp
2294
2295    silly=999999999
2296    smallest_size=$silly
2297
2298    for real_dev in `GetRaidDevMembers $1` ; do
2299        tmp=`SizeOfPartition $real_dev`
2300        [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2301    done
2302
2303    if [ "$smallest_size" = "$silly" ] ; then
2304        echo "-1"
2305        return 1
2306    else
2307        echo "$smallest_size"
2308        return 0
2309    fi
2310}
2311
2312
2313StripComments()
2314{
2315    local tempfile
2316
2317    tempfile=$MINDI_TMP/$$.strip.txt
2318    cp -f $1 $tempfile 2>> $LOGFILE
2319    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2320    rm -f $tempfile
2321    echo "Stripped comments from $2" >> $LOGFILE
2322}
2323
2324
2325SplitDirectoryIntoMinidirs() {
2326    local bigdir minidir_root i noof_disks old_pwd res
2327
2328    bigdir=$1
2329    minidir_root=$2
2330    rm -Rf $minidir_root/*
2331
2332    TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2333    noof_disks=$?
2334    if [ "$noof_disks" -eq "0" ] ; then
2335        echo "Failed to fit data into several dirs."
2336        return 0
2337    fi
2338    RejigHyperlinks $minidir_root $noof_disks
2339    rm -Rf $bigdir/*
2340    return $noof_disks
2341}
2342
2343
2344StripExecutable()
2345{
2346    local tmpfile
2347
2348    tmpfile=$MINDI_TMP/stripped.$$.dat
2349    [ -d "$1" ] || [ -h "$1" ] && return
2350    cp -f $1 $tmpfile 2>> $LOGFILE
2351    strip $tmpfile 2> /dev/null
2352    if [ "$?" -eq "0" ] ; then
2353        cp -f $tmpfile $1 2>> $LOGFILE
2354        echo "Stripped binary $2" >> $LOGFILE
2355    fi
2356    rm -f $tmpfile
2357}
2358
2359
2360TemporarilyCompressAllFiles() {
2361    local i orig_fname out_fname out_list
2362
2363    i=0
2364    out_list=$2/compressed/compressed.txt
2365    mkdir -p $2/compressed
2366    > $out_list
2367    for orig_fname in $1 ; do
2368        out_fname=$2/compressed/$orig_fname.gz
2369        mkdir -p $out_fname 2> /dev/null
2370        rmdir $out_fname 2> /dev/null
2371        gzip -c6 $orig_fname > $out_fname 2> /dev/null
2372        i=$(((($i+1))%15))
2373        [ "$i" -eq "0" ] && echo -en "."
2374        du -sk $out_fname >> $out_list
2375    done
2376}
2377
2378
2379TryToFindKernelPath() {
2380    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2381
2382    we_want_version=`uname -r`
2383    possible_kernels=""
2384    duff_kernels=""
2385   
2386    if [ "$ARCH" = "ia64" ] ; then
2387       root="/boot/efi/efi"
2388    else
2389       root="/"
2390    fi
2391    for fname in `find $root -maxdepth 2 -type f | grep -F lin | grep -Ev '^/proc/|^/net/'` ; do
2392        [ ! -e "$fname" ] && continue
2393        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2394        file $fname | grep -q gzip
2395        if [ "$?" -eq "0" ] ; then
2396            # Used by ia64
2397            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2398        else
2399            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2400        fi
2401        [ "$fkern_ver" = "" ] && continue
2402        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2403        [ -f "$fname" ] || continue
2404        [ -h "$fname" ] && continue
2405        kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2406        file $fname | grep -q gzip
2407        if [ "$?" -eq "0" ] ; then
2408            # Used by ia64
2409            if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2410                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2411                duff_kernels="$fname $duff_kernels"
2412            else
2413                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2414                possible_kernels="$fname $possible_kernels"
2415            fi
2416        else
2417            if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2418                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2419                duff_kernels="$fname $duff_kernels"
2420            else
2421                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2422                possible_kernels="$fname $possible_kernels"
2423            fi
2424        fi
2425    done
2426    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2427        possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2428    fi
2429    if [ ! "$possible_kernels" ] ; then
2430        LogIt "No kernel matches exactly. Are there any duff kernels?"
2431        possible_kernels="$duff_kernels"
2432        if [ ! "$possible_kernels" ] ; then
2433            LogIt "Sorry, no duff kernels either"
2434        else
2435            LogIt "I bet you're running Debian or Gentoo, aren't you?"
2436            LogIt "Your kernel doesn't have a sane builddate. Oh well..."
2437        fi
2438    fi
2439    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2440    noof_kernels=`CountItemsIn "$possible_kernels"`
2441    if [ "$noof_kernels" -eq "0" ] ; then
2442        LogIt "Could not find your kernel."
2443        if [ -e "/boot/vmlinuz" ] ; then
2444            LogIt "Using /boot/vmlinuz as a last resort."
2445            output=/boot/vmlinuz
2446        else
2447            output=""
2448        fi
2449    elif [ "$noof_kernels" -eq "1" ] ; then
2450        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2451        echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2452        output="$kernelpath"
2453    else
2454        for i in $possible_kernels ; do
2455            if echo $i | grep "`uname -r`" ; then
2456                LogIt "OK, I used my initiative and found that "
2457                LogIt "$i is probably your kernel. "
2458                output="$i"
2459                return
2460            fi
2461        done
2462        if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2463            output=/boot/vmlinuz
2464            echo "Schlomo, this one's for you." >> $LOGFILE
2465        else
2466            LogIt "Two or more possible kernels found. You may specify any one of them and the "
2467            LogIt "boot disks will still work, probably. If one does not work, try another."
2468            LogIt "$possible_kernels"
2469            echo ""
2470        fi
2471    fi
2472    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2473}
2474
2475
2476TryToFitDataIntoSeveralDirs() {
2477    local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2478    local i retval noof_disks total_files list_of_devs
2479
2480    bigdir=$1
2481    minidir_root=$2
2482    BIG_CLUNKY_SIZE_COUNTER=0
2483    retval=0
2484    noof_disks=1
2485
2486    echo -en "\r                                                                            \rDividing data into several groups..."
2487    old_pwd=`pwd`
2488    cd $bigdir
2489    list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | grep -Fv "/dev/"`
2490    progress=0
2491    total_files=`CountItemsIn "$list_of_files"`
2492    if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2493        filesize=1
2494    fi
2495    mkdir -p $minidir_root/$noof_disks
2496    if [ -e "dev" ] ; then
2497        echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
2498        cp --parents -pRdf dev $minidir_root/$noof_disks 2>> $LOGFILE
2499    fi
2500    TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2501    for filename in $list_of_files ; do
2502        AddFileToDir $filename $minidir_root $noof_disks
2503        i=$?
2504        if [ "$i" -gt "$noof_disks" ] ; then
2505            noof_disks=$i
2506            echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2507        fi
2508        if [ "$i" -eq "0" ] ; then
2509            LogIt "Cannot add file $filename to minidir $minidir_root"
2510            retval=$(($retval+1))
2511        fi
2512        progress=$(($progress+1))
2513        echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
2514    done
2515    cd $old_pwd
2516    echo -en "\rThe files have been subdivided into $noof_disks directories.                                                            \r"
2517    rm -Rf $minidir_root/compressed
2518    if [ "$retval" -gt "0" ] ; then
2519        return 0
2520    else
2521        return $noof_disks
2522    fi
2523}
2524
2525
2526TurnTgzIntoRdz() {
2527    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
2528
2529    tgz_dir_fname=$1
2530    rdz_fname=$2
2531    ramdisksize=$3
2532    disksize=$4
2533    kernelsize=$5
2534    maxsize=$(($disksize-$kernelsize))
2535    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2536    tempfile=$MINDI_TMP/temp.rd
2537    mountpoint=$MINDI_TMP/mnt1
2538    res=0
2539    echo -en "..."
2540    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2541    echo -en "..."
2542    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2543    echo -en "..."
2544    mkdir -p $mountpoint
2545    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."
2546    echo -en "..."
2547    old_pwd=`pwd`
2548    cd $mountpoint
2549    cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2550    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2551    cd dev || Die "Can't cd to dev"
2552    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2553    rm -f dev-entries.tgz
2554    cd ..
2555
2556    for w in insmod.static insmod.static.old ; do
2557        s=`which $w 2> /dev/null`
2558        if [ -e "$s" ] ; then
2559            cp --parents -af $s . 2>> $LOGFILE
2560        fi
2561    done
2562
2563    mkdir -p tmp
2564    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2565    for w in cdrom floppy groovy-stuff ; do
2566        mkdir -p mnt/$w
2567    done
2568    #if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2569        #ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2570    #fi
2571    if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
2572        ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
2573    fi
2574
2575    lsmod > tmp/original-lsmod.txt
2576   
2577    cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
2578    cd $old_pwd
2579    echo -en "..."
2580    MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2581    echo -en "..."
2582    old_pwd=`pwd`
2583    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2584        cd $MINDI_TMP
2585        floppy_modules_path=lib/modules/$FAILSAFE_KVER
2586    else
2587        cd /
2588###
2589### Sq-Modification... Use kernel name in module path if specified.
2590###
2591        #floppy_modules_path=lib/modules/`uname -r`
2592        if [ "${kernelname}" != "" ]
2593        then
2594            floppy_modules_path=lib/modules/${kernelname}
2595        else
2596            floppy_modules_path=lib/modules/`uname -r`
2597        fi
2598###
2599### Sq-Modification end
2600###
2601    fi
2602    floppy_modules=""
2603    if [ "$disksize" -lt "2880" ] ; then
2604        list_of_groovy_mods="$FLOPPY_MODS $IDE_MODS ide-scsi sr_mod cdrom isocd isofs `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2605    else
2606        list_of_groovy_mods="$CDROM_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2607    fi
2608    if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
2609        # For PXE boot
2610        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2611    fi
2612    [ -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."
2613    for i in $list_of_groovy_mods ; do
2614        floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2615    done
2616    for i in $floppy_modules ; do
2617        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2618        [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2619        echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2620        cp -df $i $mountpoint/ 2>/dev/null || LogIt "Unable to copy $i to $mountpoint"
2621        [ "`echo "$i" | grep -F ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2622    done
2623    if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2624        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2625        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2626        [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2627        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2628        rm -f $mountpoint/sbin/devfsd
2629    fi
2630    cd $old_pwd
2631    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2632    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2633    rm -f $mountpoint/zero
2634    if [ "`DidMondoCallMe`" ] ; then
2635        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2636        cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP &> /dev/null
2637        cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>/dev/null || Die "Cannot copy mountlist to ramdisk"
2638        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2639        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2640        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2641        [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2642        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2643        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2644    fi
2645    mkdir -p $mountpoint/tmp
2646    mkdir -p $mountpoint/proc
2647    echo "$disksize" > $mountpoint/tmp/$disksize.siz
2648    find $mountpoint -name CVS -exec rm -rf '{}' \;
2649    umount $mountpoint || Die "Cannot unmount $tempfile"
2650    dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2651#    gzip -9 $tempfile
2652#    mv $tempfile.gz $rdz_fname
2653    if [ "$res" -eq "0" ] ; then
2654        echo -en "..."
2655    else
2656        echo -en "\rMade an rdz WITH ERRORS.           \n"
2657    fi
2658    return 0
2659}
2660
2661
2662WhichOfTheseModulesAreLoaded() {
2663    local modname loaded_modules
2664    loaded_modules=" `lsmod | tr -s ' ' '\t' | cut -f1 | grep -Fvx "Modules" | tr '\n' ' '` "
2665    for modname in $1 ; do
2666        [ "`echo "$loaded_modules" | grep -F " $modname "`" ] && echo "$modname"
2667    done
2668}
2669
2670
2671ZipMinidirsIntoTarballs() {
2672    local minidir_root tardir noof_disks diskno old_pwd i
2673    minidir_root=$1
2674    tardir=$2
2675    noof_disks=$3
2676
2677    echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2678    mkdir -p $tardir
2679    mkdir -p $minidir_root/all
2680    old_pwd=`pwd`
2681    diskno=1
2682    while [ "$diskno" -le "$noof_disks" ] ; do
2683        cd $minidir_root/$diskno || LogIt "WARNING - cannot cd to $minidir_root/$diskno"
2684        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."
2685        diskno=$(($diskno+1))
2686        echo -n "..."
2687        cp -pRdf * $minidir_root/all 2>> $LOGFILE
2688    done
2689    mkdir -p $minidir_root/all/tmp
2690    cd $minidir_root/all
2691    size_of_all_tools=`du -sk . | cut -f1`
2692    if [ "`DidMondoCallMe`" ] ; then
2693        for q in filelist.full.gz biggielist.txt ; do
2694            [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2695            cp -pRdf $MINDI_TMP/$q tmp/ 2>> $LOGFILE
2696        done
2697        mkdir -p $minidir_root/all/tmp
2698        echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
2699        echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
2700    fi
2701    tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
2702    dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
2703    [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
2704    cd $old_pwd
2705    rm -Rf $minidir_root
2706    echo -e "$DONE"
2707}
2708
2709
2710##############################################################################
2711#----------------------------------- main -----------------------------------#
2712##############################################################################
2713
2714
2715> $LOGFILE
2716echo "mindi v$MINDI_VERSION" >> $LOGFILE
2717echo "$ARCH architecture detected" >> $LOGFILE
2718echo "mindi called with the following arguments:" >> $LOGFILE
2719echo "$@" >> $LOGFILE
2720echo "Start date : `date`" >> $LOGFILE
2721
2722if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
2723    LogIt "WARNING - Ancient distro detected." 1
2724    ln -sf /etc/conf.modules /etc/modules.conf
2725fi
2726[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2727
2728FindHomeOfMindiAndMondo
2729trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2730AbortIfYourDistroIsAPieceOfStercus
2731[ "`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"
2732# If we have a 2.6 kernel, the system uses module-init-tools which means that we
2733# may have the modprobe configuration spread out across multiple files in
2734# directory /etc/modprobe.d. If this is the case we concatenate these files into
2735# a temporary file for further processing. Otherwise we continue in the standard
2736# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
2737# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
2738# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
2739if [ -d "/etc/modprobe.d" ] && [ `uname -r | cut -c1-3` == "2.6" ] ; then
2740    TMPMODPROBE_FLAG="Y"
2741else
2742    TMPMODPROBE_FLAG="N"
2743    [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
2744    [ ! -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..."
2745fi
2746FixPathIfBroken
2747[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2748AbortIfMkfsVfatMissing
2749### BERLIOS
2750### Fix as it's not mandatory on ia64
2751if [ "$ARCH" = "ia64" ] ; then
2752    FindELiloBinary
2753else
2754    FindIsolinuxBinary
2755    FindLiloBinary
2756fi
2757# BERLIOS: Remove as too dangerous and now useless
2758#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
2759trap "Aborted" SIGTERM
2760DONE="\r\t\t\t\t\t\t\t\tDone.         "
2761CHOPSIZE=240
2762BIGNO=0
2763MAX_COMPRESSED_SIZE=1300
2764kernelpath=""
2765MONDO_ROOT=$TMPMONDO/mondo-root
2766mkdir -p $MONDO_ROOT
2767
2768if [ -d "/proc/lvm" ]; then
2769    # LVM v1
2770    LVMCMD=""
2771    LVM="v1"
2772elif [ -d "/dev/mapper" ]; then
2773    # LVM v2
2774    LVMCMD="lvm"
2775    LVM="v2"
2776else
2777    LVM="false"
2778fi
2779
2780if [ "$#" -ge "2" ] ; then
2781    if [ "$1" = "--max-compressed-size" ] ; then
2782        MAX_COMPRESSED_SIZE=$2
2783        shift; shift
2784    fi
2785fi
2786
2787FLOPPY_WAS_MOUNTED=""
2788for mtpt in /media/floppy /mnt/floppy /floppy ; do
2789    if mount | grep -w $mtpt &> /dev/null ; then
2790        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2791        umount $mtpt
2792    fi
2793done
2794
2795if [ "$#" -ne "0" ] ; then
2796    if [ "$1" = "--findkernel" ] ; then
2797        res=`TryToFindKernelPath`
2798        if [ "$res" = "" ] ; then
2799            MindiExit -1
2800        else
2801            echo "$res"
2802            MindiExit 0
2803        fi
2804    elif [ "$1" = "--makemountlist" ] ; then
2805        [ ! "$2" ] && Die "Please specify the output file"
2806        MakeMountlist $2
2807        MindiExit $?
2808    elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2809        echo "Mindi v$MINDI_VERSION"
2810        MindiExit 0
2811    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2812        MONDO_TMP=$2
2813        # Change MINDI_TMP for the one provided by mondo
2814        # So that it can get back the built files
2815        rm -rf $MINDI_TMP
2816        MINDI_TMP=$MONDO_TMP
2817        mkdir -p $MINDI_TMP
2818        CACHE_LOC=$3
2819        if [ _"$CACHE_LOC" != _"" ]; then
2820            mkdir -p $CACHE_LOC
2821        fi
2822        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2823###
2824### Sq-Modification...
2825### Attempt to locate kernel specific module path
2826### if module path is found then use it other wise use uname -r to set it...
2827###
2828        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2829        LogIt "kernelname = $kernelname"
2830        LogIt "kernelpath = $kernelpath"
2831        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2832        then
2833           LogIt "Module path for ${kernelpath} not found..."
2834           LogIt "using running kernel\'s modules."
2835           kernelname=`uname -r`
2836        else
2837           LogIt "Using modules for kernel: ${kernelname}"
2838        fi
2839###
2840### end of Sq-Modification
2841###
2842        TAPEDEV=$5
2843        TAPESIZE=$6
2844        FILES_IN_FILELIST=$7
2845        USE_LZO=$8
2846        CDRECOVERY=$9
2847        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2848            IMAGE_DEVS=""
2849        else
2850            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2851        fi
2852        if [ "${11}" ] ; then
2853            LILO_OPTIONS=""
2854    #       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
2855        fi
2856        LAST_FILELIST_NUMBER=${12}
2857        ESTIMATED_TOTAL_NOOF_SLICES=${13}
2858        EXCLUDE_DEVS="${14}"
2859        USE_COMP="${15}"
2860        USE_LILO="${16}"
2861        USE_STAR="${17}"
2862        INTERNAL_TAPE_BLOCK_SIZE="${18}"
2863        DIFFERENTIAL="${19}"
2864        USE_GZIP="${20}"
2865        NOT_BOOT="${21}"
2866        [ "$USE_COMP" = "" ] && USE_COMP=yes
2867        [ "$USE_GZIP" = "" ] && USE_GZIP=no
2868        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
2869        [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
2870        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2871        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2872        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2873        then
2874           LogIt "Module path for ${kernelpath} not found..."
2875           LogIt "using running kernel\'s modules."
2876           kernelname=`uname -r`
2877        else
2878           LogIt "Using modules for kernel: ${kernelname}"
2879        fi
2880        [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
2881        MONDO_ROOT=`echo $CACHE_LOC | sed 's/\(.*\)\/.*/\1/'`
2882        if [ _"$MONDO_ROOT" != _"" ]; then
2883            mkdir -p $MONDO_ROOT
2884        else
2885            Die "MONDO_ROOT is undefined"
2886        fi
2887    else
2888        echo "Syntax: mindi (--custom ....)" >> /dev/stderr
2889        MindiExit -1
2890    fi
2891fi
2892#ScanCDandTape
2893[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2894if [ "$CDRECOVERY" = "yes" ] ; then
2895    iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
2896    sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
2897else
2898    iso_cfg_file=$MINDI_LIB/isolinux.cfg
2899    sys_cfg_file=$MINDI_LIB/syslinux.cfg
2900fi
2901
2902[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
2903if [ ! "`DidMondoCallMe`" ] ; then
2904    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
2905    LogIt "Latest Mindi is available from http://www.mondorescue.org"
2906    LogIt "BusyBox sources are available from http://www.busybox.net"
2907    LogIt "------------------------------------------------------------------------------"
2908else
2909    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> /var/log/mondo-archive.log
2910fi
2911if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
2912    LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
2913else
2914    LogIt "Unable to find mindi-busybox, please install it"
2915    MindiExit -1
2916fi
2917
2918# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
2919insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
2920for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2921    insmod $i >> $LOGFILE 2>> $LOGFILE
2922done
2923
2924KERN_DISK_MADE=""
2925
2926echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
2927echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
2928echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
2929if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
2930    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
2931    MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2932    MakeMountlist $MINDI_TMP/mountlist.txt
2933    mkdir -p $MINDI_TMP/small-all/tmp
2934    cd $MINDI_TMP/small-all
2935    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"
2936    tar -cv tmp | gzip -9 > $MINDI_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
2937    sleep 2
2938    LogIt "Done. Exiting."
2939    MindiExit 0
2940fi
2941
2942if [ "$kernelpath" = "" ] ; then
2943    [ "`DidMondoCallMe`" ] && Die "Please use -k <path> to specify kernel."
2944    echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2945    read ch
2946    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2947        USE_OWN_KERNEL="yes"
2948    fi
2949    if [ "$USE_OWN_KERNEL" = "yes" ]; then
2950        YOUR_KERNEL_SUCKS=""
2951        kernelpath=`TryToFindKernelPath`
2952        if [ "$kernelpath" = "" ] ; then
2953            echo -n "Please enter kernel path : "
2954            read kernelpath
2955        fi
2956    else
2957        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
2958    fi
2959fi
2960if [ ! "`DidMondoCallMe`" ] ; then
2961    echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/[n]) ?"
2962    read ch
2963    if [ "$ch" != "y" ] && [ "$ch" != "Y" ] ; then
2964        USE_LILO=no
2965    else
2966        USE_LILO=yes
2967    fi
2968fi
2969if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
2970    kernelpath=$MINDI_LIB/vmlinuz
2971    LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2972    LogIt "However, you are still running your kernel. If Mindi fails to create your"
2973    LogIt "disks then it may still be a result of a problem with your kernel."
2974    pwd=`pwd`
2975    cd $MINDI_TMP
2976    bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2977    cd $pwd
2978    YOUR_KERNEL_SUCKS="Your kernel sucks"
2979fi
2980echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$CACHE_LOC" >> $LOGFILE
2981[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
2982
2983[ "$YOUR_KERNEL_SUCKS" ] && [ ! "$FAILSAFE_KVER" ] && Die "Please install mindi-kernel package. You need it.\nGo to http://www.mondorescue.org and download it, then install it."
2984
2985rm -f /root/images/mindi/{*img,*gz,*iso}
2986
2987PrepareDataDiskImages $CACHE_LOC
2988noof_disks=$?
2989ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2990rds=$(($ramdisk_size-$((ramdisk_size%4096))))
2991ramdisk_size=$rds
2992
2993echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
2994if [ "$USE_LILO" = "yes" ] ; then
2995    if [ "$ARCH" = "ia64" ] ; then
2996        PrepareBootDiskImage_LILO $CACHE_LOC $IA64_BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
2997    else
2998        if ! PrepareBootDiskImage_LILO $CACHE_LOC 1722 $kernelpath $ramdisk_size ; then
2999            LogIt "WARNING - failed to create 1.72MB boot image."
3000            LogIt "Please reduce your kernel's size if you want to make a 1.72MB floppy disk."
3001        fi
3002        if ! PrepareBootDiskImage_LILO $CACHE_LOC 2880 $kernelpath $ramdisk_size ;  then
3003            LogIt "WARNING - failed to create 2.88MB floppy disk image."
3004            LogIt "Please reduce your kernel's size if you want to make a 2.88MB floppy disk."
3005            PrepareBootDiskImage_LILO $CACHE_LOC 5760 $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
3006        fi
3007    fi
3008else
3009    if ! PrepareBootDiskImage_SYSLINUX $CACHE_LOC 1722 $kernelpath $ramdisk_size ; then
3010        LogIt "WARNING - failed to create 1.72MB boot image."
3011        LogIt "Please reduce your kernel's size if you want to make a 1.72MB floppy disk."
3012        if ! PrepareBootDiskImage_SYSLINUX $CACHE_LOC 2880 $kernelpath $ramdisk_size ; then
3013            LogIt "WARNING - failed to create 2.88MB floppy disk image."
3014            LogIt "Please reduce your kernel's size if you want to make a 2.88MB floppy disk."
3015            PrepareBootDiskImage_SYSLINUX $CACHE_LOC 5760 $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
3016        fi
3017    fi
3018fi
3019
3020[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3021...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3022
3023if [ ! "`DidMondoCallMe`" ] ; then
3024    ListImagesForUser $CACHE_LOC
3025    boot_dev=/dev/fd0u1722
3026    [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3027    [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3028    [ ! -e "$boot_dev" ] && Die "Oh Lord, will you PLEASE tell the vendor to create the 1.72MB devices in /dev?"
3029    if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
3030        OfferToCopyImagesToDisks $CACHE_LOC $boot_dev $FDDEVICE
3031    fi
3032    OfferToMakeBootableISO $CACHE_LOC
3033    LogIt "Finished."
3034elif [ "$TAPEDEV" ] ; then
3035    mkdir -p /root/images/mindi
3036    rm -f /root/images/mindi/{*img,*gz,*iso}
3037    OfferToMakeBootableISO $CACHE_LOC
3038    if [ -e "$CACHE_LOC/all.tar.gz" ] ; then
3039        cp -f $CACHE_LOC/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
3040    else
3041        Die "Cannot find all.tar.gz, to be written to tape"
3042    fi
3043else
3044    OfferToMakeBootableISO $CACHE_LOC
3045fi
3046# cleanup
3047LogIt "$FRIENDLY_OUTSTRING"
3048for mtpt in $FLOPPY_WAS_MOUNTED ; do
3049    mount $mtpt
3050done
3051MindiExit 0
Note: See TracBrowser for help on using the repository browser.