source: MondoRescue/trunk/mindi/mindi @ 618

Last change on this file since 618 was 618, checked in by bcornec, 14 years ago

merge -r 591:617 $SVN_M/branches/stable

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