source: MondoRescue/trunk/mindi/mindi @ 687

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

merge -r671:686 $SVN_M/branches/stable

  • Property svn:keywords set to Rev Id
File size: 113.8 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 687 2006-07-17 13:39:42Z 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 grep -F "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 | grep -F ".gz"`" ] ; then
306        included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
307    else
308        included_list=`grep -Fi 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 | grep -F "${included_item}.inc"`
313        [ "$sss" = "" ] && sss=`find $KEYDIR/keymaps | grep -F "$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 | grep -F "bin/sh"`" != "" ] && StripComments $scratchfile "-$filename-"
343    [ "`echo "$filename" | grep -F "etc/termcap"`" != "" ] && StripComments $scratchfile "-$filename-"
344    if [ "`echo "$filename" | grep -F "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 | grep -F "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 | grep -F $$ | 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    grep -Fvx "$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=`grep -F 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" | grep -F "${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 | grep -F "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 [ "$tool" == "$lvmresolved" ]; then
835            echo "$tool" >> $tempfile
836            elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
837            if [ "$lvmversion" = "" ] ; then
838            lvmversion=`$lvmresolved`
839            echo "$lvmresolved" >> $tempfile
840            fi
841            toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
842            if [ "$lvmversion" == "200" ]; then
843            # pvdata and lvmcreate_initrd don't exist in LVM2
844            case "$toolstripped" in
845                "pvdata")
846                continue
847                ;;
848                "lvmcreate_initrd")
849                continue
850                ;;
851            esac
852            fi
853            toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
854            if [ -e "$toolpath" ] ; then
855            echo "$toolpath" >> $tempfile
856            echo "$tool" >> $tempfile
857            else
858            toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
859            fi
860            if [ -e "$toolpath" ] ; then
861            echo "$toolpath" >> $tempfile
862            echo "$tool" >> $tempfile
863            else
864            echo "Where are your LVM-Tools? Couldn't find $tool"
865            fi
866        else
867            echo "$tool" >> $tempfile
868        fi
869        done
870        progress=$(($progress+1))
871        echo -en "\r\t\t\t\t\t\t\t\t"
872        i=$(($progress*100))
873        i=$(($i/$noof_lines))
874        echo -en "$i"
875        echo -en "%"
876        modres=$(($progress%4))
877        [ "$modres" -eq "0" ] && echo -en "\t/"
878        [ "$modres" -eq "1" ] && echo -en "\t-"
879        [ "$modres" -eq "2" ] && echo -en "\t\\"
880        [ "$modres" -eq "3" ] && echo -en "\t|"
881        incoming=`ReadLine`
882    done
883    fi
884    echo -en "$DONE\nMaking complete dependency list"
885
886    tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
887    mv -f $tempfile.new $tempfile
888    > $outfile.pre
889    progress=0
890    noof_lines=`cat $tempfile | wc -l`
891    for fname in `cat $tempfile` ; do
892        tempdepfile=`mktemp /tmp/mindilinux/tempdepfile.XXXXXX`
893        LocateDeps $fname > $tempdepfile
894    echo "$fname" >> $outfile.pre
895        cat $tempdepfile >> $outfile.pre
896        rm -f $tempdepfile
897    progress=$(($progress+1))
898        echo -en "\r\t\t\t\t\t\t\t\t"
899        i=$(($progress*100))
900        i=$(($i/$noof_lines))
901        echo -en "$i"
902        echo -en "%"
903    modres=$(($progress%4))
904        [ "$modres" -eq "0" ] && echo -en "\t/"
905        [ "$modres" -eq "1" ] && echo -en "\t-"
906        [ "$modres" -eq "2" ] && echo -en "\t\\"
907        [ "$modres" -eq "3" ] && echo -en "\t|"
908    done
909    if [ "`DidMondoCallMe`" ] ; then
910    mkdir -p $bigdir/tmp
911    mkdir -p $bigdir/sbin
912    mkdir -p $bigdir/bin
913    if [ -e "$MONDO_TMP/post-nuke.tgz" ] ; then
914        LogIt "\nIncorporating post-nuke tarball\n"
915        old_pwd=`pwd`
916        cd $bigdir
917        tar -zxf $MONDO_TMP/post-nuke.tgz || LogIt "Error occurred when untarring post-nuke tarball\n"
918        cd $old_pwd
919    fi
920    if cp -f $MONDO_TMP/mondo*restore $bigdir/usr/bin ; then
921            LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
922    else
923        LogIt "Cannot find mondo*restore in mondo's tempdir, $MONDO_TMP\n"
924        LogIt "I bet you've got a spare copy of Mondo or Mindi floating around on your system.\n"
925            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."
926            Die "Odd."
927        fi
928        cp -f $MONDO_TMP/BOOTLOADER.* $bigdir 2> /dev/null || LogIt "\nMondo v1.2x defaults to LILO as the bootloader, BTW.\n"
929    if [ -e "$MONDO_TMP/start-nfs" ] ; then
930        LogIt "Incorporating NFS-related settings\n"
931        cp -f $MONDO_TMP/start-nfs $bigdir/sbin || Die "Cannot find start-nfs"
932        for r in NFS-SERVER-MOUNT NFS-SERVER-PATH NFS-DEV NFS-CLIENT-IPADDR NFS-SERVER-IPADDR ; do
933        cp -f $MONDO_TMP/$r $bigdir/tmp || Die "Cannot copy $r - did you run out of disk space?"
934                echo "Copying $r to ramdisk" >> $LOGFILE
935        done
936    fi
937    fi
938     tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
939    rm -f $tempfile $outfile.pre
940    [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
941    return $res
942}
943
944
945
946
947
948GenerateListForFile() {
949    local files_found loc fname incoming i res
950    incoming="$1"
951    files_found=""
952    res=0
953
954    for fname in $incoming ; do
955        files_found="$files_found `LocateFile $fname`"
956    done
957
958    echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
959}
960
961
962
963# Returns all disk devices which are part of a raid array
964
965GetAllRaidMembers() {
966    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
967}
968
969
970GetFileSizeList() {
971    local i
972    for i in `find $1 -type d -o -print` ; do
973        du -sk $i
974    done
975}
976
977
978
979GetHomeDir() {
980    local res loc
981    loc=`which $1 2>/dev/null`
982    res=`file $loc | $AWK '{print $NF;}'`
983    dirname $res
984}
985
986
987
988
989
990# Searches parent raid device of given disk device
991# $1: disk device (i.e. /dev/hda1)
992
993GetParentRaidDev() {
994    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
995}
996
997
998
999# Searches members of raid device
1000# $1: raid device (/dev/md...)
1001
1002GetRaidDevMembers() {
1003    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
1004}
1005
1006
1007HackAwk() {
1008    local pathname filename dir old_pwd new_fname
1009    pathname=$1
1010    filename=$2
1011    dir=`echo "$pathname" | sed s/$filename//`
1012    old_pwd=`pwd`
1013    cd $dir
1014    [ -f "$filename" ] || Die "Can't find $filename at $dir"
1015    new_fname="an.icky.icky.spider.ewww"
1016    [ "$filename" = "gawk" ] && new_fname="awk"
1017    [ "$filename" = "awk" ] && new_fname="gawk"
1018    ln -s $filename $new_fname
1019    cd $old_pwd
1020}
1021
1022
1023
1024
1025HackMountlist() {
1026    local scratchdir outfile partlist pst partstr \
1027res partition swapsize
1028    scratchdir=$TMP_ROOT
1029    outfile=$1
1030
1031    mkdir -p $outfile
1032    rm -Rf $outfile
1033    > $outfile
1034    partlist=$(mount | cut -d' ' -f1,3,5 \
1035    | grep -Ev "((none|/tmp|/ISOs|/proc|/dev/root) )|/mnt/" \
1036    | tr ' ' '|')
1037
1038    echo -n "Modifying mountlist..."
1039
1040    if [ ! -f "/mountlist.hacked" ] ; then
1041        Die "Can't find modified mountlist.hacked!"
1042    else
1043        cp /mountlist.hacked "$outfile"
1044        LogIt "Done. (Created by auto-archive, I assume?)\n"
1045    fi
1046}
1047
1048
1049
1050
1051HackPathsToFailsafe() {
1052    local incoming newpath kver stub i pwd
1053    kver=`uname -r`
1054    incoming=`ReadLine`
1055    pwd=`pwd`
1056    cd $TMP_ROOT
1057    while [ "$incoming" != "" ] ; do
1058    stub=`basename $incoming`
1059    newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
1060    for i in $newpath ; do
1061        echo "$i"
1062    done
1063    read incoming
1064    done
1065    cd $pwd
1066}
1067
1068
1069
1070ListAllPartitions() {
1071    local res currline partition all_partitions ap_orig remaining i j
1072
1073    grep -vx " *#.*" $MY_FSTAB | grep -vx " *none.*" | $AWK '/^\/dev\/[imhs]d||LABEL\=\// && !/fdd|cdr|zip|floppy/ {print $1}'
1074#    for partition in `$FDISK -l | tr -s ' ' '\n' | grep /dev` ; do
1075#        [ -e "$i" ] && all_partitions=echo "$i"
1076#    done
1077    [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
1078    return
1079}
1080
1081
1082
1083
1084
1085ListImagesForUser() {
1086    local path fname
1087    path=$1
1088    echo -en "In the directory '$path' you will find the images:-\n"
1089    for fname in `ls $path | grep -F mindi-` ; do
1090        printf "%19s " $fname
1091    done
1092    echo " "
1093}
1094
1095
1096
1097ListKernelModulePaths() {
1098    local module_list module fname oss r kern
1099    oss="/root/oss/modules"
1100    module_list="`lsmod | sed -n '2,$s/ .*//p'`"
1101###
1102### Sq-Modification ... Use kernelname for module search path if specified
1103###
1104    # kern="`uname -r`"
1105    if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
1106    then
1107        kern=${kernelname}
1108    else
1109        kern="`uname -r`"
1110    fi
1111###
1112### Sq-Mod End
1113###
1114    for module in $module_list $EXTRA_MODS ; do
1115        r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
1116        echo "module $module --> $r" >> $LOGFILE
1117        [ "$r" ] && echo "$r"
1118        [ -f "$oss" ] && find $oss | grep -F $module
1119    done
1120    find /lib/modules/$kern/modules.* -type f 2> /dev/null
1121    [ -f "$oss" ] && find $oss.* 2> /dev/null
1122}
1123
1124
1125
1126#ListKernelModules() {
1127    #local output q
1128    #output=""
1129    #for q in `lsmod | sed -n '2,$s/ .*//p'` ; do
1130        #output="$q $output"
1131    #done
1132    #echo "`lsmod | sed -n '2,$s/ .*//p'`"
1133#}
1134
1135
1136
1137LocateDeps() {
1138    local incoming fname deps
1139    incoming="$1"
1140    for fname in $incoming ; do
1141        if [ ! -e "$fname" ] ; then
1142            echo "Warning - $fname does not exist; cannot be LDD'd." >> $LOGFILE
1143        if echo $fname | grep lvm &> /dev/null ; then
1144        echo "This warning only affects you if you are using LVM." >> $LOGFILE
1145        if lsmod | grep lvm &> /dev/null ; then
1146            echo "I think you are, so please take heed!" >> $LOGFILE
1147#           LogIt "Where is liblvm? You need it."
1148        else
1149            echo "I don't think you are, so don't worry about it." >> $LOGFILE
1150        fi
1151        fi
1152        elif [ -h "$fname" ] && [ -x "$fname" ] ; then
1153        echo "$fname is softlink" >> $LOGFILE
1154#            echo "$fname will not be LDD'd. It is a softlink to `WhatSoftlinkPointsTo $fname`, which should already be in queue to be analyzed." >> $LOGFILE
1155#            echo "$fname"
1156        else
1157            ldd $fname 2> /dev/null | ProcessLDD $fname
1158        fi
1159    done
1160}
1161
1162
1163
1164LocateFile() {
1165    local i path fname_to_find location output resolved tmp stub cache_id loclist
1166    fname_to_find="$1"
1167    if [ "$FILE_CACHE" ] ; then
1168        touch $FILE_CACHE
1169        output=""; cache_id=`echo $fname_to_find | md5sum`
1170        output=`sed -n -e "s/^$cache_id //p" $FILE_CACHE`
1171        if [ ! "$output" = "" ] ; then
1172            echo "$output"
1173            return 0
1174        fi
1175    fi
1176    if echo "$fname_to_find" | grep -x "/.*" ; then
1177    output="$fname_to_find"
1178    location="$fname_to_find"
1179    while [ -h "$location" ] ; do
1180        resolved=`WhatSoftlinkPointsTo $location`
1181        location=$resolved
1182        output="$location $output"
1183    done
1184    echo "$output"
1185    return 0
1186    fi
1187    output=""
1188    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
1189    [ ! -d "$path" ] && continue
1190    location=`echo "$path/$fname_to_find" | tr -s '/' '/'`
1191    if echo "$location" | grep "lib/lib" 2> /dev/null ; then
1192        loclist=`find $path -maxdepth 1 | grep -F "$fname_to_find"`
1193    else
1194        loclist=$location
1195    fi
1196    for location in $loclist ; do
1197        [ ! -e "$location" ] && continue
1198        output="$location $output"
1199        copies_found=$(($copies_found+1))
1200        while [ -h "$location" ] ; do
1201                resolved=`WhatSoftlinkPointsTo $location`
1202                location=$resolved
1203                output="$location $output"
1204            done
1205#       resolved=`file $location | $AWK '{print $NF;}'`
1206#       if [ "`echo "$resolved" | grep -F "/"`" = "" ] ; then
1207#           stub=`dirname $location`
1208#           output="/$stub/$resolved $output"
1209#       fi
1210#       fi
1211    done
1212    done
1213    if [ "$output" = "" ] ; then
1214#   echo "$fname_to_find not found" >> /dev/stderr
1215    return 1
1216    fi
1217    echo "$output"
1218    [ "$FILE_CACHE" ] && echo -ne "$cache_id $output\n" >> $FILE_CACHE
1219    return 0
1220}
1221
1222
1223
1224LogIt() {
1225    if [ -e /dev/stderr ] ; then
1226    echo -e "$1" >> /dev/stderr
1227    elif [ -e /usr/bin/logger ] ; then
1228    /usr/bin/logger -s $1
1229    fi
1230    echo -en "$1" >> $LOGFILE
1231}
1232
1233
1234
1235
1236
1237
1238
1239# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
1240
1241MakeMondoConfigFile() {
1242    local outfile use_lzo use_comp use_star
1243    outfile=$1
1244    > $outfile
1245    [ "$TAPESIZE" ]     && echo "media-size $TAPESIZE" >> $outfile
1246    [ "$TAPEDEV" ]          && echo "media-dev $TAPEDEV" >> $outfile
1247    [ "$FILES_IN_FILELIST" ]    && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
1248    [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
1249    [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
1250    use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
1251    use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
1252    use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
1253    echo "use-lzo $use_lzo" >> $outfile
1254    echo "use-star $use_star" >> $outfile
1255    echo "use-comp $use_comp" >> $outfile
1256    echo "datestamp `date`" >> $outfile
1257    [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
1258   AddFileToCfgIfExists $MONDO_TMP/NFS-CLIENT-IPADDR nfs-client-ipaddr $outfile
1259   AddFileToCfgIfExists $MONDO_TMP/NFS-CLIENT-NETMASK nfs-client-netmask $outfile
1260   AddFileToCfgIfExists $MONDO_TMP/NFS-CLIENT-BROADCAST nfs-client-broadcast $outfile
1261   AddFileToCfgIfExists $MONDO_TMP/NFS-CLIENT-DEFGW  nfs-client-defgw  $outfile
1262   AddFileToCfgIfExists $MONDO_TMP/NFS-SERVER-MOUNT  nfs-server-mount  $outfile
1263   AddFileToCfgIfExists $MONDO_TMP/NFS-SERVER-PATH   nfs-server-path   $outfile
1264   AddFileToCfgIfExists $MONDO_TMP/NFS-DEV           nfs-dev           $outfile
1265   AddFileToCfgIfExists $MONDO_TMP/NFS-SERVER-IPADDR nfs-server-ipaddr $outfile
1266   AddFileToCfgIfExists $MONDO_TMP/ISO-DEV           iso-dev           $outfile
1267   AddFileToCfgIfExists $MONDO_TMP/ISO-MNT           iso-mnt           $outfile
1268   AddFileToCfgIfExists $MONDO_TMP/ISO-PREFIX        iso-prefix        $outfile
1269   AddFileToCfgIfExists $MONDO_TMP/ISODIR            isodir            $outfile
1270   AddFileToCfgIfExists $MONDO_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
1271   AddFileToCfgIfExists $MONDO_TMP/BOOTLOADER.NAME   bootloader.name   $outfile
1272   AddFileToCfgIfExists $MONDO_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
1273   AddFileToCfgIfExists $MONDO_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
1274   AddFileToCfgIfExists $MONDO_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
1275   AddFileToCfgIfExists $MONDO_TMP/DIFFERENTIAL      differential      $outfile
1276}
1277
1278
1279
1280
1281MakeModuleLoadingScript() {
1282    local module fname params modpath kver outerloop i modpaths kver searchpath list_to_echo j
1283    tmpmodprobe_flag=$1
1284    outfile=$2
1285    > $outfile || Die "Cannot create empty $outfile"
1286    echo -en "#\041/bin/sh\n\n" >> $outfile
1287    echo "echo -en \"Loading your modules...\"" >> $outfile
1288    if [ "$YOUR_KERNEL_SUCKS" ] ; then
1289        kver=$FAILSAFE_KVER
1290        cd $TMP_ROOT
1291        searchpath=lib/modules/$kver
1292    else
1293###
1294### Sq-Modification ... Use kernelname for module search path if specified
1295###
1296        #kver=`uname -r`
1297        if [ "${kernelname}" != "" ]
1298        then
1299          kver=${kernelname}
1300        else
1301          kver=`uname -r`
1302        fi
1303###
1304### Sq-Modification end
1305###
1306        searchpath=/lib/modules/$kver
1307    fi
1308   
1309    echo -en "for outerloop in 1 2 3 4 5 ; do\necho -en \".\"\n" >> $outfile
1310    list_to_echo="`lsmod | sed -n '2,$s/ .*//p'`"
1311#    LTE=`echo "$list_to_echo" | tr ' ' '\n' | grep -n "" | cut -d':' -f2,3,4 | tr '\n' ' '`
1312#    lte_old="$LTE"
1313#    LTE=""
1314#    for q in $lte_old ; do
1315#   LTE="$q $LTE"
1316#    done
1317#echo "LTE = '$LTE'" >> $LOGFILE
1318    # Make temporary modprobe.conf file if we are told so
1319    if [ $tmpmodprobe_flag == "Y" ] ; then
1320        infile="/tmp/modprobe.conf.mindi.$$"
1321        find /etc/modprobe.d -maxdepth 1 -name "*" -xtype f -print0 | xargs -0 cat > $infile
1322    else
1323        infile="/etc/modules.conf"
1324    fi
1325    for module in $list_to_echo $EXTRA_MODS ; do
1326        params=`sed -n "s/^options \\+$module \\+//p" $infile`
1327        modpaths=`FindSpecificModuleInPath $searchpath $module`
1328        for i in $modpaths ; do
1329            echo "MyInsmod $i $params > /dev/null 2> /dev/null" \
1330                | tr '.' '#' \
1331                | sed s/#o#gz/#o/ \
1332                | sed s/#o#gz/#o/ \
1333                | sed s/#ko#gz/#ko/ \
1334                | sed s/#ko#gz/#ko/ \
1335                | tr '#' '.' >> $outfile
1336            echo -en "$i added to module list.\n" >> $LOGFILE
1337        done
1338    done
1339    echo -en "done\n" >> $outfile
1340    echo "echo \"Done.\"" >> $outfile
1341    chmod +x $outfile
1342#    cp $outfile /tmp/out.txt
1343    cd /
1344    # Remove temporary modprobe.conf file if we have created one
1345    if [ $tmpmodprobe_flag == "Y" ] ; then
1346        rm -f $infile
1347    fi
1348}
1349
1350
1351
1352
1353
1354MakeMountlist() {
1355    local scratchdir mountlist all_partitions current_partition \
1356partition_size partition_format outstring partition_number \
1357partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
1358absolute_partition old_partition_fmt current_lvolume
1359
1360    echo "Your raw fstab file looks like this:-" >> $LOGFILE
1361    cat $MY_FSTAB >> $LOGFILE
1362    echo "Your mountlist will look like this:-"
1363
1364# scratchdir, mountlist(OUT)
1365    scratchdir=$TMP_ROOT
1366    mountlist=$1
1367
1368# NB: partition = device
1369# NB: mountpt = where the device is mounted
1370
1371    [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1372
1373    rm -f $mountlist
1374    mkdir -p $mountlist
1375    rm -Rf $mountlist
1376    > $mountlist
1377    echo -en "\rHang on...\r"
1378    all_partitions=""
1379   
1380    if [ -d "/proc/lvm" ] || [ -d "/dev/mapper" ]; then
1381        echo -en "\rAnalyzing LVM...\r"
1382        all_partitions=`$MINDI_LIB/analyze-my-lvm | grep -F ">>>" | cut -d' ' -f2-32`
1383    fi
1384    all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1385#    echo "all partitions = $all_partitions" > /dev/stderr
1386    for i in $IMAGE_DEVS ; do
1387        mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1388    done
1389    [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1390    printf "        %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)"
1391    for c_p in $all_partitions ; do
1392#        echo "c_p = $c_p" > /dev/stderr
1393        [ "`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" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep -F "/dev/scd"`" != "" ] || [ "`echo "$c_p" | grep -F "/dev/ram"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -F ":/"`" != "" ] && continue
1394        [ "`echo "/dev/scd0 /dev/scd1 /dev/sr0 /dev/sr1 /dev/cdrom /dev/cdrom1" | grep -F "$c_p"`" ] && continue
1395        [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1396        if [ -h "$c_p" ] && [ "`echo "$c_p" | grep -F "/dev/hd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/sd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/md"`" = "" ] ; then
1397            current_partition=`ResolveSoftlink $c_p`
1398            [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1399            [ "`echo "/dev/scd0 /dev/scd1 /dev/sr0 /dev/sr1 /dev/cdrom /dev/cdrom1" | grep -F "$current_partition"`" ] && continue
1400        else
1401            current_partition="$c_p"
1402        fi
1403        [ "$c_p" = "none" ] && continue
1404        absolute_partition=`ResolveSoftlink $c_p`
1405        partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1406
1407        # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1408        # current_partition contains only first column of /etc/fstab
1409        if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1410            str_to_find_fmt_with=$current_partition
1411            redhat_label=`echo "$current_partition" | /bin/cut -d'=' -f2`
1412            actual_dev=""
1413   
1414        # 1st try : blkid, the good way
1415        if [ -x "/sbin/blkid" ]; then
1416            actual_dev=`/sbin/blkid | /bin/grep "$current_partition" | /bin/cut -d':' -f1`
1417        fi
1418
1419        # 2nd try, which works on a standard partition (ext2/3), but not on swap
1420        if [ "x$actual_dev" = "x" ]; then
1421            actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | /bin/cut -d' ' -f1`
1422        fi
1423
1424        # 3rd try, with vol_id (which works with swap)
1425        if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1426                list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | /bin/awk '{ print $1 }' `
1427                for dev_swap in $list_swaps ; do
1428                    dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1429                    if [ "x$dev_exists" != "x" ]; then
1430                        actual_dev=$dev_swap
1431                        break;
1432                    fi
1433                done
1434        fi
1435
1436        # 4th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice. e.g. : LABEL=SWAP-hda5
1437        if [ "x$actual_dev" = "x" -a  _"`echo $current_partition | /bin/grep -i 'LABEL=SWAP'`" != _"" ]; then
1438                try_dev="`echo "$redhat_label" | /bin/cut -d '-' -f2`"
1439                present_dev="`/bin/cat /proc/swaps | /bin/grep -w /dev/$try_dev`"
1440                if [ "x$present_dev" != "x" ] ; then
1441                    actual_dev="/dev/$try_dev"
1442                fi
1443        fi
1444
1445        # Check if one of all those tries has known success
1446        if [ "x$actual_dev" != "x" ]; then
1447                current_partition=$actual_dev
1448        else
1449            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"
1450        fi
1451    else
1452        str_to_find_fmt_with=$current_partition
1453    fi
1454
1455    partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1456    # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1457    # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1458    # the former is then a link to the latter, so we test whether
1459    # $current_partition is actually such a link or not and set
1460    # $current_lvolume accordingly. Note that $current_lvolume may well be an
1461    # ordinary device. It is just to make sure that we feed the right value
1462    # into any of the LVM tools if possible.
1463    if [ -d "/dev/mapper" ] && [ -z "`lvm lvdisplay $current_partition 2> /dev/null`" ]; then
1464        partition_stub="`echo "$current_partition" | sed "s|^/dev/mapper/|/dev/|" | cut -d"-" -f1`"
1465        current_lvolume="`find /dev -lname "$current_partition" | grep "^$partition_stub"`"
1466    fi
1467    if [ -z "$current_lvolume" ]; then
1468        current_lvolume="$current_partition"
1469    fi
1470    # End of LVM device style variation code (other than $current_lvolume).
1471    if [ -d "/proc/lvm" ] && [ "`lvdisplay $current_lvolume 2> /dev/null`" ]; then
1472        partition_size="lvm"
1473    elif [ -d "/dev/mapper" ] && [ "`lvm lvdisplay $current_lvolume 2> /dev/null`" ]; then
1474        partition_size="lvm"
1475    else
1476        partition_size=`SizeOfPartition $current_partition`
1477        [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1478        [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1479        if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1480        partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1481        [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1482                [ "$partition_format" != "swap" ] && partition_format="swap"
1483        if [ "$partition_size" = "" ] ; then
1484            totalsize=0
1485            items=0
1486            for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1487            totalsize=$(($totalsize+$i))
1488            items=$(($items+1))
1489            done
1490                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1491            [ "$partition_size" -lt "125000" ] && partition_size=125000
1492            echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1493        fi
1494        fi
1495    fi
1496    [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1497    [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1498    if [ "$partition_mountpt" = "" ] ; then
1499        if [ "`pvdisplay $current_lvolume 2> /dev/null`" != "" ] || [ "`lvm pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1500        if  [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1501            partition_mountpt="raid"
1502            partition_format="raid"
1503        else
1504#           lvm_dev="`pvdisplay $current_lvolume | grep -i "VG N" | head -n1 | tr -s ' ' ' ' | cut -d' ' -f3`"
1505            partition_mountpt="lvm"
1506            partition_format="lvm"
1507        fi
1508        fi
1509    fi
1510    psz=$partition_size
1511    echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1512    [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1513    if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1514        partition_mountpt="image"
1515            old_partition_fmt=$partition_format
1516#       partition_format="`$FDISK -l 2>> $LOGFILE | tr -s '\t' ' ' | grep -w "$absolute_partition" | $AWK 'x=$(NF-1}'`"
1517        partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1518            echo "------- $FDISK -l log ------------" >> $LOGFILE
1519            cat $FDISKLOG >> $LOGFILE
1520            echo "------- $FDISK log end ------------" >> $LOGFILE
1521        partition_size=$(($partition_size+1)); # just in case
1522            if [ "$partition_format" = "Linux" ] ; then
1523                echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1524                echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1525                partition_format=$old_partition_fmt
1526            fi
1527    fi
1528        if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1529            echo "Excluding $current_partition from mountlist" >> $LOGFILE
1530            continue
1531        fi
1532        if [ ! "$partition_mountpt" ] ; then
1533        for qq in "" `find /dev/ida/c*d* ! -name '*p*'` ; do
1534        partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1535                echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1536                cat $FDISKLOG >> $LOGFILE
1537                echo "------- $FDISK log end ------------" >> $LOGFILE
1538        [ "$partition_format" ] && break
1539        done
1540        if [ "$partition_format" = "Compaq diagnostics" ] ; then
1541        partition_format="compaq"
1542        elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1543        LogIt "Unable to find mountpoint of $current_partition - ignoring\n"
1544        continue
1545        fi
1546    fi
1547    partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1548    [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | awk '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1549    unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s\n" $current_partition $partition_mountpt $partition_format $psz`
1550    if [ "$current_partition" = "" ] ; then
1551        echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1552    elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1553        if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1554        partition_mountpt=raid
1555        partition_format=raid
1556            printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1557                printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1558        else
1559        echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1560        fi
1561        elif [ "$partition_format" = "" ] ; then
1562        echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1563    elif [ "$partition_size" = "" ] ; then
1564        echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1565    elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1566        continue
1567    else
1568            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1569                echo "Stupid bastard..." >> $LOGFILE
1570                partition_format="vfat"
1571            fi
1572        printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1573        printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1574    fi
1575    done
1576}
1577
1578
1579
1580
1581
1582
1583MakeSureNumberIsInteger() {
1584    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1585    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1586    echo "result = '$res'"
1587        Die "$1 should be an integer"
1588    fi
1589}
1590
1591
1592
1593
1594
1595MakeSyslinuxMessageFile() {
1596    mkdir -p $1
1597    rmdir $1
1598    echo -en "  " > $1
1599    if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1600        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
1601    else
1602        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
1603    fi
1604    sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1605    rm -f $1.tmp
1606    if [ "$CDRECOVERY" != "yes" ] ; then
1607        if [ -e "$MONDO_TMP/start-nfs" ] ; then
1608            echo -en "Press <enter> to continue.\n" >> $1
1609        elif [ ! "$MONDO_TMP" ] ; then
1610            echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1611            if [ -e "$MINDI_LIB/memtest.img" ] ; then
1612                echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1613            fi
1614        else
1615            echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1616        fi
1617    else
1618        echo -en " \
1619To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1620CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1621    fi
1622}
1623
1624
1625
1626
1627MoveHyperlinkSensibly() {
1628    local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1629    filename=$1
1630    minidir_root=$2
1631    resides_on_diskno=$3
1632    noof_disks=$4
1633
1634    [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1635
1636    old_diskno=$resides_on_diskno
1637    d=1
1638    while [ "$d" -le "$noof_disks" ] ; do
1639        if [ "$d" -ne "$old_diskno" ] ; then
1640            old_pwd=`pwd`
1641            cd $minidir_root/$old_diskno
1642            cp --parents -Rdf $filename $minidir_root/$d/ || Die "Can't move $filename (sensibly) from $old_diskno to $d"
1643            rm -f $filename
1644            cd $old_pwd
1645        fi
1646# when the softlink is resolvable, our work here is done
1647        [ -e "$minidir_root/$d/$filename" ] && return 0
1648        old_diskno=$d
1649        d=$(($d+1))
1650    done
1651    return 1
1652}
1653
1654
1655OfferToMakeBootableISO() {
1656    local i old_pwd
1657    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ ! "`DidMondoCallMe`" ] ; then
1658        echo -en "Shall I make a bootable CD image? (y/n) "
1659        read i
1660        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1661    fi
1662    if [ ! "$MONDO_TMP" ] ; then
1663        LogIt "NB: Mindi's bootable CD always uses isolinux.\n"
1664        LogIt "For a bootable CD w/LILO, please use Mondo.\n"
1665    fi
1666    rm -Rf $TMP_ROOT/iso
1667    mkdir -p $TMP_ROOT/iso/{images,archives,isolinux}
1668    cp -f $1/*.img $1/*.gz $TMP_ROOT/iso/images || LogIt "OfferToMakeBootableISO: Cannot copy $i to $TMP_ROOT/iso/images\n"
1669    old_pwd=`pwd`
1670    cd $TMP_ROOT/iso
1671    mkdir -p $MONDO_ROOT/iso/isolinux
1672    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1673    cp $MINDI_LIB/mem{test,disk}* $MONDO_ROOT 2>> $LOGFILE
1674    for i in memdisk memtest.bin memtest.img ; do
1675    j=$MINDI_LIB/$i
1676    k=$TMP_ROOT/iso/isolinux
1677    if [ -e "$j" ] ; then
1678        LogIt "Copying $j to $k\n"
1679        cp -f $j $k || Die "Failed to copy $j to $k"
1680        cp -f $j $TMP_ROOT || Die "Failed to copy $j to $k"
1681    fi
1682    done
1683    MakeSyslinuxMessageFile $TMP_ROOT/iso/isolinux/message.txt
1684    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?"
1685    cp $TMP_ROOT/mindi.rdz $TMP_ROOT/iso/isolinux/initrd.img
1686    cp $TMP_ROOT/mindi.rdz $CACHEDIR/initrd.img
1687    [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1688    cd $TMP_ROOT/iso/isolinux
1689    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?"
1690    if [ -e "$MONDO_TMP/start-nfs" ] ; then
1691    mv isolinux.cfg isolinux.cfg.old
1692    sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1693    fi
1694    if [ "$ARCH" != "ia64" ] ; then
1695        cp $ISOLINUX isolinux.bin || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
1696    cp $ISOLINUX ../
1697    fi
1698    cd $TMP_ROOT/iso
1699    if [ "$ARCH" != "ia64" ] ; then
1700        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?"
1701    fi
1702    [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun .   
1703    if [ -d "/home/MondoCD" ] ; then
1704    cp -pRdu /home/MondoCD/* .
1705    fi
1706    if [ "$ARCH" != "ia64" ] ; then
1707        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
1708    else
1709        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
1710    fi
1711    if [ "$?" -ne "0" ] ; then
1712    echo "----------- mkisofs's errors --------------" >> $LOGFILE
1713    cat /tmp/$$.mk >> $LOGFILE
1714    echo "mkisofs returned the following errors:-"
1715    cat /tmp/$$.mk
1716    LogIt "Failed to create ISO image.\n"
1717    else
1718    echo "Created bootable ISO image at $CACHEDIR/mindi.iso" >> $LOGFILE
1719    fi
1720    rm -f /tmp/$$.mk
1721    cd $old_pwd
1722}
1723
1724
1725
1726PluralOrNot() {
1727    [ "$1" -gt "1" ] && echo -en "s"
1728}
1729
1730
1731
1732
1733MakeMessageFile() {
1734    local disksize
1735    disksize=$1
1736    if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1737        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`"/
1738    else
1739        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`/
1740    fi
1741    if [ "$disksize" -gt "2880" ] ; then
1742    if [ "`DidMondoCallMe`" ] ; then
1743        if [ "$CDRECOVERY" != "yes" ] ; then
1744            if [ -e "$MONDO_TMP/start-nfs" ] ; then
1745                echo -en "Press <enter> to continue.\n"
1746            elif [ ! "$MONDO_TMP" ] ; then
1747                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1748            else
1749                echo -en "$BOOT_MEDIA_MESSAGE"
1750            fi
1751        fi
1752    fi
1753    fi
1754    if [ "$CDRECOVERY" = "yes" ] ; then
1755        echo -en "\
1756To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1757CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1758    fi
1759    echo -en "\n\n\n"
1760}
1761
1762
1763
1764
1765write_full_floppy_of_kernel() {
1766    local mtpt image old_pwd res disksize
1767
1768    res=0
1769    old_pwd=`pwd`
1770    KERN_DISK_MADE=1
1771    disksize=$3
1772    rand1=$RANDOM
1773    rand2=$RANDOM
1774    image=/tmp/$rand1.$rand2.img
1775    mtpt=/tmp/$rand1.$rand2.mtpt
1776    dd if=/dev/zero of=$image bs=1k count=$disksize
1777    mke2fs -N 26 -F $image > /dev/null
1778    mkdir -p $mtpt
1779    mount -o loop $image $mtpt
1780    cd $mtpt
1781    mkdir -p {dev,tmp,boot}
1782    cp -f $1 vmlinuz
1783    if [ "$?" -ne "0" ] ; then
1784        LogIt "Failed to copy $1 to ramdisk\n"
1785        cd $old_pwd
1786        umount $mtpt
1787        rmdir $mtpt
1788        rm $image
1789        return 1
1790    fi
1791
1792    rdev vmlinuz 2,0
1793    rdev -R vmlinuz 0
1794    rdev -r vmlinuz 49152
1795
1796    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1797    losetup /dev/loop0 > /dev/null 2> /dev/null
1798    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1799    CopyBootBFile $mtpt/boot.b
1800
1801#    echo "root=/dev/loop0" > bdlilo.conf
1802    MakeLiloConfFile $disksize >> bdlilo.conf
1803
1804#    cat bdlilo.conf > /tmp/bdlilo.conf
1805
1806#    cat /home/mondostuff/bdlc > bdlilo.conf
1807
1808    chmod 644 bdlilo.conf
1809    MakeMessageFile $disksize > message
1810    lilo -v -C bdlilo.conf -r $mtpt
1811    res=$?
1812
1813#echo "lilo -v -C bdlilo.conf -r $mtpt"
1814#echo -en "Press enter"; read line
1815
1816    cd $old_pwd
1817    umount $mtpt
1818    mv -f $image $2
1819    rmdir $mtpt
1820
1821    return $res
1822
1823}
1824
1825
1826
1827
1828
1829
1830MakeLiloConfFile() {
1831    local disksize options i ooo
1832    disksize=$1
1833    options=""
1834        if [ "$ARCH" != "ia64" ] ; then
1835            echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1836        fi
1837        if [ "$disksize" -eq "2880" ] ; then
1838            echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1839        elif [ "$disksize" -eq "1722" ] ; then
1840            echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1841        elif [ "$disksize" -gt "2880" ] ; then
1842            /bin/true
1843        else
1844            echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1845        fi
1846        if [ "$ARCH" != "ia64" ] ; then
1847            echo -en "install=/boot.b\nmap=/boot.map\n"
1848        fi
1849    if [ "$CDRECOVERY" = "yes" ] ; then
1850        echo -en "default=RESTORE\n"
1851    elif [ "$disksize" -gt "2880" ] && [ "`DidMondoCallMe`" ] ; then
1852        if [ -e "$MONDO_TMP/start-nfs" ] ; then
1853            echo -en "default=iso\n"
1854        else
1855            echo -en "default=interactive\n"
1856        fi
1857    else
1858        echo -en "default=expert\n"
1859    fi
1860
1861    echo -en "prompt\n"
1862    if [ "$ARCH" != "ia64" ] ; then
1863        echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1864    fi
1865    if [ "$CDRECOVERY" != "yes" ] ; then
1866    echo -en "timeout=300\n"
1867    fi
1868    echo -en "\n"
1869    if [ "$CDRECOVERY" = "yes" ] ; then
1870    options="RESTORE expert"
1871    elif [ "$disksize" -gt "2880" ] ; then
1872        if [ "`DidMondoCallMe`" ] ; then
1873            if [ -e "$MONDO_TMP/start-nfs" ] ; then
1874                options="iso"
1875            else
1876                options="interactive expert compare iso nuke isonuke"
1877# hda hdb hdc hdd"
1878            fi
1879        else
1880            options="expert"
1881    fi
1882    else
1883        options="expert"
1884    fi
1885    for i in $options ; do
1886    ooo=$i
1887    [ "$ooo" = "RESTORE" ] && ooo="nuke"
1888    if [ "$ARCH" = "ia64" ] ; then
1889        rootpart="root=/dev/ram0\n\t"
1890    else
1891        rootpart=""
1892    fi
1893    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"
1894   
1895    outstr=$outstr" $ooo_mode"
1896    outstr=$outstr"\"\n"
1897    if [ "$disksize" = "1440" ] ; then
1898        echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1899    else
1900        echo -en "$outstr"
1901    fi
1902    done
1903}
1904
1905
1906
1907
1908PrepareBootDiskImage_LILO() {
1909    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1910    imagesdir=$1
1911    disksize=$2
1912    kernelpath=$3
1913    ramdisksize=$4
1914
1915    retval=0
1916    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1917    echo -en "Making "$disksize"KB boot disk..."
1918    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?"
1919    if [ "$ARCH" != "ia64" ] ; then
1920        [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1921    fi
1922    echo -en "..."
1923    imagefile=$imagesdir/mindi-bootroot.$disksize.img
1924    mountpoint=$TMP_ROOT/mountpoint.$$
1925    mkdir -p $mountpoint
1926    dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1927    if [ "$ARCH" = "ia64" ] ; then
1928        mkdosfs $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1929    t=vfat
1930    else
1931        mke2fs -N 26 -m 0 -F $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1932    t=ext2
1933    fi
1934    [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
1935    rm -f /tmp/mke2fs.$$
1936    mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
1937# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1938    mkdir -p $mountpoint/etc
1939    if [ "$ARCH" != "ia64" ] ; then
1940        liloconf=$mountpoint/etc/lilo.conf
1941    else
1942    liloconf=$mountpoint/elilo.conf
1943    fi
1944    old_pwd=`pwd`
1945    cd $mountpoint
1946    if [ "$ARCH" != "ia64" ] ; then
1947        tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1948    fi
1949    cd $old_pwd
1950    losetup /dev/loop0 > /dev/null 2> /dev/null
1951    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing   'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1952    CopyBootBFile $mountpoint/boot.b
1953
1954    MakeLiloConfFile $disksize > $liloconf
1955
1956    echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint..." >> $LOGFILE
1957    cp -f $TMP_ROOT/mindi.rdz $mountpoint 2>> $LOGFILE
1958    if [ "$?" -ne "0" ] ; then
1959    LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
1960    cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
1961    LogIt "Please unload some of your modules and try again.\n"
1962    rm -f $TMP_ROOT/mtpt.$$
1963    LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
1964        retval=$(($retval+1))
1965    fi
1966    MakeMessageFile $disksize > $mountpoint/message
1967
1968    mkdir -p $mountpoint/tmp
1969    cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
1970    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1971        echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
1972        echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
1973#        echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
1974    fi
1975    if [ -d "/home/MondoCD" ] ; then
1976    cp -pRdu /home/MondoCD/* . || Die "Cannot do kung pow"
1977    fi
1978
1979# copy the kernel across
1980    rm -Rf $mountpoint/lost+found
1981    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1982    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1983    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
1984    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
1985    echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1986    du -sk $mountpoint/* >> $LOGFILE
1987    echo "--- end of list of files ---" >> $LOGFILE
1988    echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1989Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
1990        rm -f $mountpoint/vmlinuz
1991    cd $old_pwd
1992        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1993        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
1994#   losetup /dev/loop0 -d
1995    res=0
1996        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
1997    res=$(($res+$?))
1998        cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
1999    res=$(($res+$?))
2000    rm -f $imagefile
2001    if [ "$res" -ne "0" ]; then
2002        LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2003        rm -f $imagesdir/mindi-*.1440.img
2004    fi
2005    return $res
2006    fi
2007    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2008    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2009    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2010    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2011# make it bootable
2012    rm -f $mountpoint/zero
2013    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2014    if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
2015        if [ "$ARCH" != "ia64" ] ; then
2016        $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2017        else
2018            /bin/true
2019        fi
2020    elif [ ! "$KERN_DISK_MADE" ] ; then
2021# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
2022    $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2023    else
2024    echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
2025    fi
2026    if [ $? -ne "0" ] ; then
2027    if [ "`grep -F "/tmp/dev.0" $LOGFILE`" ] ; then
2028        LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's.\n"
2029        LogIt "Please reboot your PC as a workaround.\n"
2030        Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ.\n"
2031    fi
2032    echo "$LILO_EXE -r $mountpoint ...failed."
2033    echo -en "Press ENTER to continue."; read line
2034    LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug.\n"
2035    retval=$(($retval+1))
2036    fi
2037    cp -f $liloconf /tmp/lilo.conf
2038    if [ "$ARCH" = "ia64" ] ; then
2039        cp `dirname $kernelpath`/*.efi $mountpoint
2040    fi
2041    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2042    echo -en "..."
2043    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2044    if [ "$retval" -eq "0" ] ; then
2045        echo -en "...$DONE\r"
2046        if [ "$KERN_DISK_MADE" ] ; then
2047            LogIt "... $disksize KB boot disks were created OK\r"
2048        fi
2049    else
2050        echo -en "...failed\r"
2051        LogIt $disksize"KB boot disk was NOT created\r"
2052        rm -f $imagefile
2053    fi
2054    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2055    return $retval
2056}
2057
2058
2059
2060
2061PrepareBootDiskImage_SYSLINUX() {
2062    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
2063    imagesdir=$1
2064    disksize=$2
2065    kernelpath=$3
2066    ramdisksize=$4
2067    do_boot_root_thingy=""
2068    local retval old_pwd
2069    retval=0
2070    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2071    echo -en "Making "$disksize"KB boot disk..."
2072    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?"
2073    [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
2074    echo -en "..."
2075    imagefile=$imagesdir/mindi-bootroot.$disksize.img
2076    mountpoint=$TMP_ROOT/mountpoint.$$
2077    mkdir -p $mountpoint
2078# If I format a 1722KB data file & run syslinux on it, the resultant image
2079# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
2080# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
2081# If I extract it, mount it, copy my files to it, etc. then the resultant
2082# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
2083# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
2084    if [ "$disksize" = "1722" ] ; then
2085        gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
2086    else
2087        dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
2088        mkfs.vfat $imagefile
2089        syslinux $imagefile
2090    fi
2091    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
2092# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
2093    old_pwd=`pwd`
2094    MakeSyslinuxMessageFile $mountpoint/message.txt
2095    cd $mountpoint
2096    [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
2097#    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n" <--- present for LILO; is it nec. for SYSLINUX too?
2098    cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
2099    if [ -e "$MONDO_TMP/start-nfs" ] ; then
2100        mv syslinux.cfg syslinux.cfg.orig
2101        sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
2102    fi
2103    cd $old_pwd
2104    echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
2105    cp -f $TMP_ROOT/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
2106    if [ "$?" -ne "0" ] ; then
2107        LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
2108        cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
2109        LogIt "Please unload some of your modules and try again.\n"
2110        rm -f $TMP_ROOT/mtpt.$$
2111        LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
2112        retval=$(($retval+1))
2113    fi
2114
2115    mkdir -p $mountpoint/tmp
2116    cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2117
2118# copy the kernel across
2119    rm -Rf $mountpoint/lost+found
2120    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2121    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2122    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2123    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2124        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2125        du -sk $mountpoint/* >> $LOGFILE
2126        echo "--- end of list of files ---" >> $LOGFILE
2127        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2128Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2129        rm -f $mountpoint/vmlinuz
2130        cd $old_pwd
2131        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2132        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2133#   losetup /dev/loop0 -d
2134
2135        res=0
2136        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2137        res=$(($res+$?))
2138        cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
2139        res=$(($res+$?))
2140        rm -f $imagefile
2141        if [ "$res" -ne "0" ]; then
2142            LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2143            rm -f $imagesdir/mindi-*.1440.img
2144        fi
2145        return $res
2146    fi
2147    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2148    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2149    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2150    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2151# make it bootable
2152    rm -f $mountpoint/zero
2153    mkdir -p $mountpoint/etc
2154    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2155    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2156    echo -en "..."
2157    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2158
2159    if [ "$retval" -eq "0" ] ; then
2160        echo -en "...$DONE\r"
2161        if [ "$KERN_DISK_MADE" ] ; then
2162            rm -f $imagefile
2163            LogIt "... $disksize KB boot disks were created OK\r"
2164        fi
2165    else
2166        echo -en "...failed\r"
2167        LogIt $disksize"KB boot disk was NOT created\r"
2168        rm -f $imagefile
2169    fi
2170    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2171    return $retval
2172}
2173
2174
2175PrepareDataDiskImages() {
2176    local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2177
2178    imagesdir=$1
2179    rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
2180    needlist=$TMP_ROOT/what-we-need.txt
2181    bigdir=$TMP_ROOT/bigdir
2182    minidir_root=$TMP_ROOT/minidir
2183    mkdir -p $minidir_root
2184    mkdir -p $bigdir/usr/bin
2185    tardir=$TMP_ROOT/tardir
2186
2187    lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt | grep -vx "" | wc -l`
2188    cat $MINDI_CONF/deplist.txt | GenerateGiantDependencyList $needlist $lines
2189    res=$?
2190    if [ "$YOUR_KERNEL_SUCKS" ]; then
2191    pwd=`pwd`
2192    cd $TMP_ROOT
2193        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2194        cp --parents -pRdf ./$i $bigdir || Die "PDDI can't cp $i->$bigdir"
2195        if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
2196        cp --parents -pRdf $i $bigdir
2197        else
2198        ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2199        BIGNO=$(($BIGNO+1))
2200        fi
2201    done
2202    for i in $EXTRA_MODS ; do
2203        j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
2204        [ ! "$j" ] && echo "Warning - cannot find failsafe module $i.o" >> $LOGFILE
2205        for k in $j ; do
2206        if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
2207            cp --parents -pRdf $k $bigdir
2208        else
2209            ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2210            BIGNO=$(($BIGNO+1))
2211        fi
2212        echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2213        done
2214    done
2215    cd $pwd
2216    else
2217    ListKernelModulePaths >> $needlist
2218    fi
2219    if [ "$res" -ne "0" ] ; then
2220        Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2221    fi
2222    FindAndAddUserKeyboardMappingFile
2223    mkdir -p $bigdir/tmp
2224    if [ "`DidMondoCallMe`" ] ; then
2225        MakeMondoConfigFile $TMP_ROOT/mondo-restore.cfg
2226        cp -f $TMP_ROOT/mondo-restore.cfg $bigdir/tmp &> /dev/null
2227        cp -f $TMP_ROOT/mondo-restore.cfg $CACHE_LOC &> /dev/null
2228    fi
2229    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2230    DropOptimizedLibraries $needlist $bigdir
2231    echo -en "Assembling dependency files"
2232    CopyDependenciesToDirectory < $needlist $bigdir
2233
2234# also copy io.sys and msdos.sys, if we can find them
2235    for i in `mount | cut -d' ' -f3` ; do
2236    for j in io.sys msdos.sys ; do
2237        [ -e "$i/$j" ] && cp -f $i/$j $bigdir
2238    done
2239    done
2240
2241# master boot record, too
2242    i=`cat $MONDO_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2243    if [ "$i" ] ; then
2244    LogIt "Backing up $i's MBR\n"
2245    dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2246# < < E O F
2247    sleep 1
2248    sync
2249#        [ "$?" -ne "0" ] && echo "Failed to save $i's MBR to bigdir" >> $LOGFILE
2250    j=$i
2251    [ -h "$j" ] && j=`ResolveSoftlink $j`
2252    LogIt "Creating /dev/boot_device ($j)\n"
2253    mkdir -p $bigdir/dev
2254    cp -pRdf $j $bigdir/dev/boot_device || Die "Unable to create /dev/boot_device on ramdisk"
2255    fi
2256
2257# more stuff
2258#    cp -f $MINDI_LIB/embleer* $bigdir
2259    old_pwd=`pwd`
2260    cd $bigdir
2261
2262    [ -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'."
2263    cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping aux-tools\n"
2264    if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
2265    tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping x11-tools.tgz\n"
2266    fi
2267    if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2268        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2269        [ "$?" -ne "0" ] && [ "`DidMondoCallMe`" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2270    fi
2271    [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state .
2272    cd $old_pwd
2273    echo -e "$DONE"
2274    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2275    SplitDirectoryIntoMinidirs $bigdir $minidir_root
2276    noof_disks=$?
2277    [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2278#    if [ "$noof_disks" -ge "8" ] ; then
2279#        LogIt "You are putting a ludicrously large amount of data on these disks."
2280#        LogIt "I shall therefore double EXTRA_SPACE, just in case your ramdisk is too small."
2281#        EXTRA_SPACE=$(($EXTRA_SPACE*2))
2282#    fi
2283    MakeMountlist $TMP_ROOT/mountlist.txt
2284    mkdir -p $minidir_root/$noof_disks/tmp
2285    cp -f $TMP_ROOT/mountlist.txt $minidir_root/$noof_disks/tmp/mountlist.txt || Die "Cannot copy mountlist.txt from $TMP_ROOT to data disk"
2286    cp -f $TMP_ROOT/mountlist.txt $CACHE_LOC
2287    [ "`DidMondoCallMe`" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MONDO_TMP/.
2288    [ -d "/proc/lvm" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2289    [ -d "/dev/mapper" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2290    cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2291    ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2292    CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2293    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2294# One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
2295    rmdir $tardir $bigdir
2296    rm -f $needlist
2297    return $noof_disks
2298}
2299
2300
2301ProcessLDD() {
2302    local main_fname incoming j i fname f newf
2303    main_fname=$1
2304    read incoming
2305    while [ "$incoming" != "" ] ; do
2306        incoming=`echo "$incoming" | sed '/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*(.*/d ; s/[[:blank:]]*\(.*\)[[:blank:]]*=>[[:blank:]]*\/.*/\1/ ; s/[[:blank:]]*\(\/.*\)[[:blank:]]*(.*/\1/'`
2307        for fname in `echo "$incoming"` ; do
2308            fname=`LocateFile $fname`
2309            for f in $fname ; do
2310                [ -e "$f" ] && echo $f
2311            done
2312        done
2313        read incoming
2314    done
2315}
2316
2317
2318
2319Prompt() {
2320    echo -en "$1"
2321    read line
2322}
2323
2324
2325
2326ReadLine() {
2327    local i incoming
2328    read incoming
2329    i=0
2330    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2331    i=$(($i+1))
2332    read incoming
2333    done
2334    echo "$incoming"
2335}
2336
2337
2338
2339RejigHyperlinks() {
2340    local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2341    minidir_root=$1
2342    noof_disks=$2
2343
2344    old_pwd=`pwd`
2345    diskno=1
2346    while [ "$diskno" -le "$noof_disks" ] ; do
2347    mkdir -p $minidir_root/$diskno
2348        cd $minidir_root/$diskno
2349        for fname in `find -type d -o -print` ; do
2350            [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2351        done
2352    diskno=$(($diskno+1))
2353    done
2354
2355
2356    cd $old_pwd
2357    return
2358
2359
2360
2361# do some awk/gawk stuff
2362    cd $minidir_root
2363    awk_loc=`find -name awk`
2364    gawk_loc=`find -name gawk`
2365    if [ "$awk_loc" = "" ] && [ "$gawk_loc" != "" ] ; then
2366        for i in $gawk_loc ; do HackAwk $i gawk ; done
2367    elif [ "$gawk_loc" = "" ] && [ "$awk_loc" != "" ] ; then
2368        for i in $awk_loc ; do HackAwk $i awk ; done
2369    elif [ "$gawk_loc" != "" ] && [ "$awk_loc" != "" ] ; then
2370        echo -en "Gawk/awk found. Good.\r"
2371    else
2372        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? :-)"
2373    fi
2374    cd $old_pwd
2375}
2376
2377
2378
2379EliminateRelatives() {
2380# eliminate /../../..... from path string
2381    local orig i old_i newo
2382    newo=$1
2383    while [ "`echo "$newo" | grep "\.\."`" ] ; do
2384        orig="`echo "$newo" | tr -s '/' '/'`"
2385#        echo "orig=$orig"
2386        newo="/"
2387        old_i=""
2388        for i in `echo "$orig" | tr '/' ' '` ; do
2389            if [ ! "$old_i" ] ; then
2390                old_i=$i
2391                continue
2392            fi
2393            if [ "$old_i" ] && [ "$i" = ".." ] ; then
2394                if [ "$old_i" = ".." ] ; then
2395                    newo="$newo"$old_i/
2396#                    echo "two --- $old_i $i"
2397                    old_i="$i"
2398                    continue
2399#                else
2400#                    echo "swallowing ($old_i $i)"
2401                fi
2402            elif [ "$old_i" != ".." ] ; then
2403                newo="$newo"$old_i/
2404            fi
2405            old_i=$i
2406        done
2407        newo="$newo"$i
2408    done
2409    echo "$newo"
2410}
2411
2412
2413WhatSoftlinkPointsTo() {
2414    local orig new resolved
2415        orig=$1
2416        new=`ls -l $orig | tr -s ' ' '\t' | $AWK '{printf $NF;}'`
2417        if [ "`echo "$new" | cut -d'/' -f1`" ] ; then
2418            resolved=`dirname $orig`/$new
2419        else
2420            resolved=$new
2421        fi
2422    EliminateRelatives $resolved
2423}
2424
2425
2426
2427
2428
2429ReplaceIndividualLine() {
2430    local orig_file new_file lino newstring lines_total lines_remaining
2431    orig_file=$1.orig
2432    mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2433    new_file=$1
2434    lino=$2
2435    newstring="$3"
2436    if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
2437    echo "Can't find string" >> $LOGFILE
2438    return 1
2439    fi
2440    lines_total=`wc -l $orig_file | gawk '{print $1;}'`
2441    lines_remaining=$(($lines_total-$lino))
2442    head -n$(($lino-1)) $orig_file > $new_file
2443    echo "$newstring" >> $new_file
2444    echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2445    tail -n$lines_remaining $orig_file >> $new_file
2446    echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2447#    cp -f $new_file /tmp/init.new
2448    [ -x "$orig_file" ] && chmod +x $new_file
2449    rm -f $orig_file
2450    return 0
2451}
2452
2453
2454
2455
2456ResolveSoftlink() {
2457    local resolved new
2458    resolved=$1
2459    while [ -h "$resolved" ] ; do
2460        resolved=`WhatSoftlinkPointsTo $resolved`
2461    done
2462    echo "$resolved"
2463}
2464
2465
2466
2467
2468ScanCDandTape() {
2469    local i
2470
2471    for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2472        dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2473    done
2474}
2475
2476
2477
2478SizeOfPartition() {
2479    local devpath drive res stub
2480    device=$1
2481    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2482    res=`SizeOfRaidPartition $device`
2483    [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2484    echo "$res"
2485    return 0
2486    fi
2487#    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/-//`
2488# patch from Bill <bill@iwizard.biz> - 2003/08/25
2489    res=`$FDISK -s $device`
2490    echo "------- $FDISK -l $device log ------------" >> $LOGFILE
2491    cat $FDISKLOG >> $LOGFILE
2492    echo "------- $FDISK log end ------------" >> $LOGFILE
2493# end patch
2494    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2495    [ "$res" = "" ] && res="-1"
2496    echo $res
2497    return 0
2498}
2499
2500
2501SizeOfRaidPartition() {
2502    local real_dev smallest_size silly tmp
2503
2504    silly=999999999
2505    smallest_size=$silly
2506
2507    for real_dev in `GetRaidDevMembers $1` ; do
2508    tmp=`SizeOfPartition $real_dev`
2509    [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2510    done
2511
2512    if [ "$smallest_size" = "$silly" ] ; then
2513    echo "-1"
2514    return 1
2515    else
2516    echo "$smallest_size"
2517    return 0
2518    fi
2519}
2520
2521
2522
2523
2524
2525
2526StripComments()
2527{
2528    local tempfile
2529    tempfile=$TMP_ROOT/$$.strip.txt
2530    cp -f $1 $tempfile
2531    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2532    rm -f $tempfile
2533    echo "Stripped comments from $2" >> $LOGFILE
2534}
2535
2536
2537
2538
2539
2540
2541SplitDirectoryIntoMinidirs() {
2542    local bigdir minidir_root i noof_disks old_pwd res
2543    bigdir=$1
2544    minidir_root=$2
2545    rm -Rf $minidir_root/*
2546
2547    TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2548    noof_disks=$?
2549    if [ "$noof_disks" -eq "0" ] ; then
2550    echo "Failed to fit data into several dirs."
2551        return 0
2552    fi
2553    RejigHyperlinks $minidir_root $noof_disks
2554    rm -Rf $bigdir/*
2555   return $noof_disks
2556}
2557
2558
2559
2560StripExecutable()
2561{
2562    local tmpfile
2563    tmpfile=$TMP_ROOT/stripped.$$.dat
2564    [ -d "$1" ] || [ -h "$1" ] && return
2565    cp -f $1 $tmpfile
2566    strip $tmpfile 2> /dev/null
2567    if [ "$?" -eq "0" ] ; then
2568    cp -f $tmpfile $1
2569    echo "Stripped binary $2" >> $LOGFILE
2570    fi
2571    rm -f $tmpfile
2572}
2573
2574
2575TemporarilyCompressAllFiles() {
2576    local i orig_fname out_fname out_list
2577
2578    i=0
2579    out_list=$2/compressed/compressed.txt
2580    mkdir -p $2/compressed
2581    > $out_list
2582    for orig_fname in $1 ; do
2583        out_fname=$2/compressed/$orig_fname.gz
2584        mkdir -p $out_fname 2> /dev/null
2585        rmdir $out_fname 2> /dev/null
2586        gzip -c6 $orig_fname > $out_fname 2> /dev/null
2587        i=$(((($i+1))%15))
2588        [ "$i" -eq "0" ] && echo -en "."
2589        du -sk $out_fname >> $out_list
2590    done
2591}
2592
2593
2594
2595TryToFindKernelPath() {
2596    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2597    we_want_version=`uname -r`
2598    possible_kernels=""
2599    duff_kernels=""
2600   
2601    if [ "$ARCH" = "ia64" ] ; then
2602       root="/boot/efi/efi"
2603    else
2604       root="/"
2605    fi
2606    for fname in `find $root -maxdepth 2 -type f | grep -F lin | grep -Ev '^/proc/|^/net/'` ; do
2607    [ ! -e "$fname" ] && continue
2608        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2609    file $fname | grep -q gzip
2610    if [ "$?" -eq "0" ] ; then
2611        # Used by ia64
2612            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2613    else
2614            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2615    fi
2616        [ "$fkern_ver" = "" ] && continue
2617#   echo "$fname --> $fkern_ver (but we want $we_want_version)" >> /dev/stderr
2618        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2619    [ -f "$fname" ] || continue
2620    [ -h "$fname" ] && continue
2621    kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2622    file $fname | grep -q gzip
2623    if [ "$?" -eq "0" ] ; then
2624        # Used by ia64
2625        if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2626            LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it...\n"
2627            duff_kernels="$fname $duff_kernels"
2628        else
2629                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2630                possible_kernels="$fname $possible_kernels"
2631        fi
2632    else
2633        if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2634            LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it...\n"
2635            duff_kernels="$fname $duff_kernels"
2636        else
2637                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2638                possible_kernels="$fname $possible_kernels"
2639        fi
2640    fi
2641    done
2642    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2643    possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2644    fi
2645    if [ ! "$possible_kernels" ] ; then
2646        LogIt "No kernel matches exactly. Are there any duff kernels?\n"
2647        possible_kernels="$duff_kernels"
2648        if [ ! "$possible_kernels" ] ; then
2649            LogIt "Sorry, no duff kernels either\n"
2650        else
2651            LogIt "I bet you're running Debian or Gentoo, aren't you?\n"
2652            LogIt "Your kernel doesn't have a sane builddate. Oh well...\n"
2653        fi
2654    fi
2655    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2656    noof_kernels=`CountItemsIn "$possible_kernels"`
2657    if [ "$noof_kernels" -eq "0" ] ; then
2658        LogIt "Could not find your kernel.\n"
2659    if [ -e "/boot/vmlinuz" ] ; then
2660        LogIt "Using /boot/vmlinuz as a last resort.\n"
2661        output=/boot/vmlinuz
2662        else
2663        output=""
2664    fi
2665    elif [ "$noof_kernels" -eq "1" ] ; then
2666        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2667        echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2668        output="$kernelpath"
2669    else
2670        for i in $possible_kernels ; do
2671            if echo $i | grep "`uname -r`" ; then
2672        LogIt "OK, I used my initiative and found that "
2673                LogIt "$i is probably your kernel.\n "
2674        output="$i"
2675        return
2676        fi
2677        done
2678    if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2679        output=/boot/vmlinuz
2680        echo "Schlomo, this one's for you." >> $LOGFILE
2681    else
2682            LogIt "Two or more possible kernels found. You may specify any one of them and the \n"
2683        LogIt "boot disks will still work, probably. If one does not work, try another.\n"
2684            LogIt "$possible_kernels\n"
2685            echo ""
2686    fi
2687    fi
2688    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2689}
2690
2691
2692
2693
2694
2695TryToFitDataIntoSeveralDirs() {
2696    local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2697    local i retval noof_disks total_files list_of_devs
2698    bigdir=$1
2699    minidir_root=$2
2700    BIG_CLUNKY_SIZE_COUNTER=0
2701    retval=0
2702    noof_disks=1
2703
2704    echo -en "\r                                                                            \rDividing data into several groups..."
2705    old_pwd=`pwd`
2706    cd $bigdir
2707    list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | grep -Fv "/dev/"`
2708    progress=0
2709    total_files=`CountItemsIn "$list_of_files"`
2710    if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2711        filesize=1
2712    fi
2713    mkdir -p $minidir_root/$noof_disks
2714    if [ -e "dev" ] ; then
2715        echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
2716        cp --parents -pRdf dev $minidir_root/$noof_disks
2717    fi
2718    TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2719    for filename in $list_of_files ; do
2720        AddFileToDir $filename $minidir_root $noof_disks
2721    i=$?
2722    if [ "$i" -gt "$noof_disks" ] ; then
2723        noof_disks=$i
2724        echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2725    fi
2726    if [ "$i" -eq "0" ] ; then
2727        LogIt "Cannot add file $filename to minidir $minidir_root\n"
2728        retval=$(($retval+1))
2729    fi
2730        progress=$(($progress+1))
2731    echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
2732    done
2733    cd $old_pwd
2734    echo -en "\rThe files have been subdivided into $noof_disks directories.                                                            \r"
2735    rm -Rf $minidir_root/compressed
2736    if [ "$retval" -gt "0" ] ; then
2737    return 0
2738    else
2739    return $noof_disks
2740    fi
2741}
2742
2743
2744
2745TurnTgzIntoRdz() {
2746    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
2747    tgz_dir_fname=$1
2748    rdz_fname=$2
2749    ramdisksize=$3
2750    disksize=$4
2751    kernelsize=$5
2752    maxsize=$(($disksize-$kernelsize))
2753    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2754    tempfile=$TMP_ROOT/temp.rd
2755    mountpoint=$TMP_ROOT/mnt1
2756    res=0
2757    echo -en "..."
2758    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2759    echo -en "..."
2760    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2761
2762    [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
2763    rm -f /tmp/mke2fs.$$
2764    echo -en "..."
2765    mkdir -p $mountpoint
2766    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."
2767    echo -en "..."
2768    old_pwd=`pwd`
2769    cd $mountpoint
2770#    [ -e "$MINDI_LIB/memtest.img" ] && echo "Yep, this is a multi-function CD" > MULTIFUNC
2771    cp -Rdf $tgz_dir_fname/* . 2>> $LOGFILE >> $LOGFILE
2772    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2773    cd dev || Die "Can't cd to dev"
2774    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2775    rm -f dev-entries.tgz
2776    cd ..
2777
2778# add insmod.static and insmod.static.old if (a) they exist and (b) this is a 64-bit distro
2779#    if [ "`uname -a | grep x86`" ] || [ "`uname -a | grep amd64`" ] ; then
2780
2781    for w in insmod.static insmod.static.old ; do
2782    s=`which $w 2> /dev/null`
2783    if [ -e "$s" ] ; then
2784        cp --parents -af $s .
2785#       LogIt "Copying $s to initrd"
2786    fi
2787    done
2788
2789#    fi
2790
2791    mkdir -p tmp
2792    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2793    for w in cdrom floppy groovy-stuff ; do
2794        mkdir -p mnt/$w
2795    done
2796    if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2797    ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2798    fi
2799    if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
2800    ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
2801    fi
2802
2803    lsmod > tmp/original-lsmod.txt
2804   
2805    cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
2806    cd $old_pwd
2807    echo -en "..."
2808    MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2809    echo -en "..."
2810    old_pwd=`pwd`
2811    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2812        cd $TMP_ROOT
2813        floppy_modules_path=lib/modules/$FAILSAFE_KVER
2814    else
2815        cd /
2816###
2817### Sq-Modification... Use kernel name in module path if specified.
2818###
2819        #floppy_modules_path=lib/modules/`uname -r`
2820        if [ "${kernelname}" != "" ]
2821        then
2822            floppy_modules_path=lib/modules/${kernelname}
2823        else
2824            floppy_modules_path=lib/modules/`uname -r`
2825        fi
2826###
2827### Sq-Modification end
2828###
2829    fi
2830    floppy_modules=""
2831    if [ "$disksize" -lt "2880" ] ; then
2832        list_of_groovy_mods="$FLOPPY_MODS $IDE_MODS ide-scsi sr_mod cdrom isocd isofs `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2833    else
2834        list_of_groovy_mods="$CDROM_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2835    fi
2836    if [ -e "$MONDO_TMP/start-nfs" ] ; then
2837        cp -a $MONDO_TMP/start-nfs $mountpoint/sbin
2838        # For PXE boot
2839        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2840        # Here we need the net busybox
2841        mv $mountpoint/bin/busybox.net $mountpoint/bin/busybox
2842    else
2843        rm -f $mountpoint/bin/busybox.net
2844    fi
2845    [ -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"
2846    for i in $list_of_groovy_mods ; do
2847        floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2848    done
2849    for i in $floppy_modules ; do
2850        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2851        [ "$YOUR_KERNEL_SUCKS" ] && i=$TMP_ROOT/$i
2852        echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2853        cp -df $i $mountpoint/ || LogIt "Unable to copy $i to $mountpoint\n"
2854        [ "`echo "$i" | grep -F ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2855    done
2856#    if [ -e "/dev/.devfsd" ] ; then
2857#   echo "Copying devfs stuff to ramdisk" >> $LOGFILE
2858#   for i in /dev /etc/devfsd.conf /etc/modules.devfs /lib/dev-state ; do
2859#       cp --parents -pRdf $i $mountpoint/ 2>> $LOGFILE
2860#   done
2861#    fi
2862    if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2863        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2864        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2865        [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2866        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2867#        ls -l $mountpoint/sbin/devfsd &> /dev/null || Die "Can't find devfsd daemon on ramdisk"
2868        rm -f $mountpoint/sbin/devfsd
2869    fi
2870    cd $old_pwd
2871    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2872    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2873    rm -f $mountpoint/zero
2874    if [ "`DidMondoCallMe`" ] ; then
2875        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2876        cp -f $mountpoint/tmp/mondo-restore.cfg $MONDO_TMP &> /dev/null
2877        cp -f $TMP_ROOT/mountlist.txt $mountpoint/tmp/ || Die "Cannot copy mountlist to ramdisk"
2878        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2879        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2880        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2881        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2882        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2883    fi
2884    mkdir -p $mountpoint/tmp
2885    mkdir -p $mountpoint/proc
2886    echo "$disksize" > $mountpoint/tmp/$disksize.siz
2887    find $mountpoint -name CVS -exec rm -rf '{}' \;
2888    umount $mountpoint || Die "Cannot unmount $tempfile"
2889    dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2890#    gzip -9 $tempfile
2891#    mv $tempfile.gz $rdz_fname
2892    if [ "$res" -eq "0" ] ; then
2893        echo -en "..."
2894    else
2895        echo -en "\rMade an rdz WITH ERRORS.           \n"
2896    fi
2897    return 0
2898}
2899
2900
2901
2902WhichOfTheseModulesAreLoaded() {
2903    local modname loaded_modules
2904    loaded_modules=" `lsmod | tr -s ' ' '\t' | cut -f1 | grep -Fvx "Modules" | tr '\n' ' '` "
2905    for modname in $1 ; do
2906    [ "`echo "$loaded_modules" | grep -F " $modname "`" ] && echo "$modname"
2907    done
2908}
2909
2910
2911
2912
2913ZipMinidirsIntoTarballs() {
2914    local minidir_root tardir noof_disks diskno old_pwd i
2915    minidir_root=$1
2916    tardir=$2
2917    noof_disks=$3
2918
2919    echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2920    mkdir -p $tardir
2921    mkdir -p $minidir_root/all
2922    old_pwd=`pwd`
2923    diskno=1
2924    while [ "$diskno" -le "$noof_disks" ] ; do
2925        cd $minidir_root/$diskno || LogIt "Warning - cannot cd to $minidir_root/$diskno\n"
2926        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."
2927        diskno=$(($diskno+1))
2928        echo -n "..."
2929    cp -pRdf * $minidir_root/all
2930    done
2931    mkdir -p $minidir_root/all/tmp
2932    cd $minidir_root/all
2933    size_of_all_tools=`du -sk . | cut -f1`
2934    if [ "`DidMondoCallMe`" ] ; then
2935        for q in filelist.full.gz biggielist.txt ; do
2936            [ ! -e "$MONDO_TMP/$q" ] && Die "Cannot find $MONDO_TMP/$q"
2937            cp -pRdf $MONDO_TMP/$q tmp/
2938        done
2939        mkdir -p $minidir_root/all/tmp
2940        echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
2941        echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
2942    fi
2943    tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
2944    dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
2945    [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
2946    cd $old_pwd
2947    rm -Rf $minidir_root
2948    echo -e "$DONE"
2949}
2950
2951
2952
2953# BERLIOS: This function is wrong
2954# Should be recoded. Desactivated in between
2955
2956#ListUnsavedKernelModules() {
2957    #local fname modules
2958    #fname=/tmp/$RANDOM.$$.$RANDOM
2959    #lsmod | sed -n '2,$s/ .*//p' > $fname
2960    #modules=`sort $fname | uniq -d2 | tr '\n' ' '`
2961    #rm -f $fname
2962    #[ "$modules" ] && echo "Unsaved kernel modules: $modules" >> $LOGFILE
2963#}
2964
2965
2966
2967
2968
2969##############################################################################
2970#----------------------------------- main -----------------------------------#
2971##############################################################################
2972
2973
2974if [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2975    echo "mindi v$MINDI_VERSION"
2976    exit 0
2977fi
2978
2979if [ "$1" = "-printvar" ] ; then
2980    shift
2981    if [ _"$1" != _"" ] ; then
2982        set | egrep "^$1" | cut -d= -f2
2983    fi
2984    exit 0
2985fi
2986
2987> $LOGFILE
2988echo "mindi v$MINDI_VERSION" >> $LOGFILE
2989echo "$ARCH architecture detected" >> $LOGFILE
2990echo "mindi called with the following arguments:" >> $LOGFILE
2991echo "$@" >> $LOGFILE
2992
2993if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
2994    LogIt "Warning - Ancient distro detected.\n" 1
2995    ln -sf /etc/conf.modules /etc/modules.conf
2996fi
2997[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2998
2999FindHomeOfMindiAndMondo
3000trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
3001AbortIfYourDistroIsAPieceOfStercus
3002[ "`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"
3003# If we have a 2.6 kernel, the system uses module-init-tools which means that we
3004# may have the modprobe configuration spread out across multiple files in
3005# directory /etc/modprobe.d. If this is the case we concatenate these files into
3006# a temporary file for further processing. Otherwise we continue in the standard
3007# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
3008# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
3009# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
3010if [ -d "/etc/modprobe.d" ] && [ `uname -r | cut -c1-3` == "2.6" ] ; then
3011  TMPMODPROBE_FLAG="Y"
3012else
3013  TMPMODPROBE_FLAG="N"
3014  [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
3015  [ ! -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..."
3016fi
3017FixPathIfBroken
3018[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
3019AbortIfMkfsVfatMissing
3020### BCO
3021### Fix as it's not mandatory on ia64
3022if [ "$ARCH" = "ia64" ] ; then
3023    FindELiloBinary
3024else
3025    FindIsolinuxBinary
3026    FindLiloBinary
3027fi
3028grep -F " $TMP_ROOT " /proc/mounts | grep -F 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
3029rm -f /tmp/mindi_lo
3030trap "Aborted" SIGTERM
3031DONE="\r\t\t\t\t\t\t\t\tDone.         "
3032CHOPSIZE=240
3033BIGNO=0
3034MAX_COMPRESSED_SIZE=1300
3035imagesdir=$CACHEDIR
3036kernelpath=""
3037MONDO_ROOT=/tmp/mindilinux/mondo-root
3038mkdir -p $MONDO_ROOT
3039
3040if [ "$#" -ge "2" ] ; then
3041    if [ "$1" = "--max-compressed-size" ] ; then
3042        MAX_COMPRESSED_SIZE=$2
3043        shift; shift
3044    fi
3045fi
3046
3047FLOPPY_WAS_MOUNTED=""
3048for mtpt in /media/floppy /mnt/floppy /floppy ; do
3049    if mount | grep -w $mtpt &> /dev/null ; then
3050        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3051        umount $mtpt
3052    fi
3053done
3054
3055if [ "$#" -ne "0" ] ; then
3056    if [ "$1" = "--findkernel" ] ; then
3057        res=`TryToFindKernelPath`
3058#    2> /dev/null`
3059        if [ "$res" = "" ] ; then
3060            exit 1
3061        else
3062            echo "$res"
3063            exit 0
3064        fi
3065    elif [ "$1" = "--makemountlist" ] ; then
3066        [ ! "$2" ] && Die "Please specify the output file"
3067        MakeMountlist $2
3068        exit $?
3069    elif [ "$1" = " --version" ] || [ "$1" = "-v" ] ; then
3070        echo "Mindi v$MINDI_VERSION"
3071        exit 0
3072    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3073        TMP_ROOT=$2
3074        MONDO_TMP=$2
3075        imagesdir=$3
3076        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3077###
3078### Sq-Modification...
3079### Attempt to locate kernel specific module path
3080### if module path is found then use it other wise use uname -r to set it...
3081###
3082        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3083        LogIt "kernelname = $kernelname\n"
3084        LogIt "kernelpath = $kernelpath\n"
3085        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3086        then
3087           LogIt "Module path for ${kernelpath} not found...\n"
3088           LogIt "using running kernel\'s modules.\n"
3089           kernelname=`uname -r`
3090        else
3091           LogIt "Using modules for kernel: ${kernelname}\n"
3092        fi
3093###
3094### end of Sq-Modification
3095###
3096        TAPEDEV=$5
3097        TAPESIZE=$6
3098        FILES_IN_FILELIST=$7
3099        USE_LZO=$8
3100        CDRECOVERY=$9
3101        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3102            IMAGE_DEVS=""
3103        else
3104            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3105        fi
3106        if [ "${11}" ] ; then
3107            LILO_OPTIONS=""
3108#       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3109        fi
3110        LAST_FILELIST_NUMBER=${12}
3111        ESTIMATED_TOTAL_NOOF_SLICES=${13}
3112        EXCLUDE_DEVS="${14}"
3113        USE_COMP="${15}"
3114        USE_LILO="${16}"
3115        USE_STAR="${17}"
3116        INTERNAL_TAPE_BLOCK_SIZE="${18}"
3117        DIFFERENTIAL="${19}"
3118        NOT_BOOT="${20}"
3119        [ "$USE_COMP" = "" ] && USE_COMP=yes
3120        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3121        [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine.\n"
3122        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3123        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3124        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3125        then
3126           LogIt "Module path for ${kernelpath} not found...\n"
3127           LogIt "using running kernel\'s modules.\n"
3128           kernelname=`uname -r`
3129        else
3130           LogIt "Using modules for kernel: ${kernelname}\n"
3131        fi
3132        [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
3133        MONDO_ROOT=`echo $imagesdir | sed 's/\(.*\)\/.*/\1/'`
3134        [ "$MONDO_ROOT" = "" ] && Die "MONDO_ROOT is undefined"
3135    else
3136        echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3137        exit 1
3138    fi
3139fi
3140#ScanCDandTape
3141[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3142if [ "$CDRECOVERY" = "yes" ] ; then
3143    iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
3144    sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
3145else
3146    iso_cfg_file=$MINDI_LIB/isolinux.cfg
3147    sys_cfg_file=$MINDI_LIB/syslinux.cfg
3148fi
3149
3150
3151[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
3152rm -Rf $TMP_ROOT/mindilinux/*
3153TMP_ROOT=$TMP_ROOT/mindilinux/$$
3154mkdir -p $TMP_ROOT
3155if [ ! "`DidMondoCallMe`" ] ; then
3156    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION\n"
3157    LogIt "Latest Mindi is available from http://www.mondorescue.org\n"
3158    LogIt "BusyBox sources are available from http://www.busybox.net\n"
3159    LogIt "------------------------------------------------------------------------------"
3160else
3161    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> /var/log/mondo-archive.log
3162fi
3163
3164# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
3165insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
3166for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3167    insmod $i >> $LOGFILE 2>> $LOGFILE
3168done
3169
3170FILE_CACHE=$TMP_ROOT/mindi-file-loc-cache
3171KERN_DISK_MADE=""
3172
3173echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3174echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3175echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3176if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3177    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else.\n"
3178    MakeMondoConfigFile $MONDO_TMP/mondo-restore.cfg
3179    MakeMountlist $MONDO_TMP/mountlist.txt
3180    mkdir -p $MONDO_TMP/small-all/tmp
3181    cd $MONDO_TMP/small-all
3182    cp -f $MONDO_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp || Die "Cannot copy small all.tar.gz"
3183    tar -cv tmp | gzip -9 > $MONDO_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
3184    sleep 2
3185    LogIt "Done. Exiting.\n"
3186    exit 0
3187fi
3188
3189if [ "$kernelpath" = "" ] ; then
3190    [ "`DidMondoCallMe`" ] && Die "Please use -k <path> to specify kernel."
3191    if [ $USE_OWN_KERNEL != "yes" ]; then
3192        echo -en "Do you want to use your own kernel to build the boot disk (y/n) ?"
3193        read ch
3194        if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3195            USE_OWN_KERNEL="yes"
3196        fi
3197    fi
3198    if [ "$USE_OWN_KERNEL" = "yes" ]; then
3199        YOUR_KERNEL_SUCKS=""
3200        kernelpath=`TryToFindKernelPath`
3201        if [ "$kernelpath" = "" ] ; then
3202            echo -n "Please enter kernel path : "
3203            read kernelpath
3204        fi
3205    else
3206        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3207    fi
3208fi
3209if [ ! "`DidMondoCallMe`" ] ; then
3210    echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/n) ?"
3211    read ch
3212    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3213        USE_LILO=yes
3214    else
3215        USE_LILO=no
3216    fi
3217fi
3218if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3219    kernelpath=$MINDI_LIB/vmlinuz
3220    LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks.\n"
3221    LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
3222    LogIt "disks then it may still be a result of a problem with your kernel.\n"
3223    pwd=`pwd`
3224    cd $TMP_ROOT
3225    bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3226    cd $pwd
3227    YOUR_KERNEL_SUCKS="Your kernel sucks"
3228fi
3229echo -e "Mindi's temp dir = $TMP_ROOT \nMindi's output dir=$imagesdir" >> $LOGFILE
3230[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty...\n"
3231rm -f /tmp/mindi.err.*.tgz
3232
3233[ "$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."
3234
3235rm -f $CACHEDIR/{*img,*gz,*iso}
3236
3237rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
3238needlist=$TMP_ROOT/what-we-need.txt
3239bigdir=$TMP_ROOT/bigdir
3240minidir_root=$TMP_ROOT/minidir
3241mkdir -p $minidir_root
3242mkdir -p $bigdir/usr/bin
3243tardir=$TMP_ROOT/tardir
3244
3245lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt $DEPLIST_DIR/* | grep -vx "" | wc -l`
3246cat $MINDI_CONF/deplist.txt $DEPLIST_DIR/* | GenerateGiantDependencyList $needlist $lines
3247res=$?
3248if [ "$YOUR_KERNEL_SUCKS" ]; then
3249    pwd=`pwd`
3250    cd $TMP_ROOT
3251    for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
3252        cp --parents -pRdf ./$i $bigdir || Die "PDDI can't cp $i->$bigdir"
3253        if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
3254            cp --parents -pRdf $i $bigdir
3255        else
3256            ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
3257            BIGNO=$(($BIGNO+1))
3258        fi
3259    done
3260    for i in $EXTRA_MODS ; do
3261        j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
3262        [ ! "$j" ] && echo "Warning - cannot find failsafe module $i.o" >> $LOGFILE
3263        for k in $j ; do
3264            if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
3265                    cp --parents -pRdf $k $bigdir
3266        else
3267                ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
3268                BIGNO=$(($BIGNO+1))
3269            fi
3270            echo "Added failsafe module $k to ramdisk" >> $LOGFILE
3271        done
3272    done
3273    cd $pwd
3274else
3275    ListKernelModulePaths >> $needlist
3276fi
3277if [ "$res" -ne "0" ] ; then
3278    Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
3279fi
3280FindAndAddUserKeyboardMappingFile
3281mkdir -p $bigdir/tmp
3282if [ "`DidMondoCallMe`" ] ; then
3283    MakeMondoConfigFile $TMP_ROOT/mondo-restore.cfg
3284    cp -f $TMP_ROOT/mondo-restore.cfg $bigdir/tmp &> /dev/null
3285    cp -f $TMP_ROOT/mondo-restore.cfg $CACHEDIR &> /dev/null
3286fi
3287[ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
3288DropOptimizedLibraries $needlist $bigdir
3289echo -en "Assembling dependency files"
3290CopyDependenciesToDirectory < $needlist $bigdir
3291
3292# also copy io.sys and msdos.sys, if we can find them
3293for i in `mount | cut -d' ' -f3` ; do
3294    for j in io.sys msdos.sys ; do
3295        [ -e "$i/$j" ] && cp -f $i/$j $bigdir
3296    done
3297done
3298
3299# master boot record, too
3300i=`cat $MONDO_TMP/BOOTLOADER.DEVICE 2> /dev/null`
3301if [ "$i" ] ; then
3302    LogIt "Backing up $i's MBR\n"
3303    dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
3304# < < E O F
3305    sleep 1
3306    sync
3307#        [ "$?" -ne "0" ] && echo "Failed to save $i's MBR to bigdir" >> $LOGFILE
3308    j=$i
3309    [ -h "$j" ] && j=`ResolveSoftlink $j`
3310    LogIt "Creating /dev/boot_device ($j)\n"
3311    mkdir -p $bigdir/dev
3312    cp -pRdf $j $bigdir/dev/boot_device || Die "Unable to create /dev/boot_device on ramdisk"
3313fi
3314
3315# more stuff
3316#    cp -f $MINDI_LIB/embleer* $bigdir
3317old_pwd=`pwd`
3318cd $bigdir
3319
3320[ -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'."
3321cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping aux-tools\n"
3322if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
3323    tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping x11-tools.tgz\n"
3324fi
3325if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
3326    cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
3327    [ "$?" -ne "0" ] && [ "`DidMondoCallMe`" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
3328fi
3329[ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state .
3330cd $old_pwd
3331echo -e "$DONE"
3332TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
3333SplitDirectoryIntoMinidirs $bigdir $minidir_root
3334noof_disks=$?
3335[ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
3336MakeMountlist $TMP_ROOT/mountlist.txt
3337mkdir -p $minidir_root/$noof_disks/tmp
3338cp -f $TMP_ROOT/mountlist.txt $minidir_root/$noof_disks/tmp/mountlist.txt || Die "Cannot copy mountlist.txt from $TMP_ROOT to data disk"
3339cp -f $TMP_ROOT/mountlist.txt $CACHEDIR
3340[ "`DidMondoCallMe`" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MONDO_TMP/.
3341[ -d "/proc/lvm" ] && $MINDI_SBIN/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
3342[ -d "/dev/mapper" ] && $MINDI_SBIN/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
3343cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
3344ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
3345CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
3346FRIENDLY_OUTSTRING="Boot and data disk images were created."
3347# One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
3348rmdir $tardir $bigdir
3349rm -f $needlist
3350#return $noof_disks
3351
3352ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3353rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3354ramdisk_size=$rds
3355
3356echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
3357if [ "$USE_LILO" = "yes" ] ; then
3358    if [ "$ARCH" = "ia64" ] ; then
3359        PrepareBootDiskImage_LILO $imagesdir $IA64_BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
3360    else
3361        if ! PrepareBootDiskImage_LILO $imagesdir 1722 $kernelpath $ramdisk_size ; then
3362            LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3363            LogIt "if you want to make a 1.72MB floppy disk.\n"
3364        fi
3365        if ! PrepareBootDiskImage_LILO $imagesdir 2880 $kernelpath $ramdisk_size ;  then
3366            LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3367            LogIt "Please reduce your kernel's size\n"
3368            LogIt "if you want to make a 2.88MB floppy disk.\n"
3369            PrepareBootDiskImage_LILO $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
3370        fi
3371    fi
3372else
3373    if ! PrepareBootDiskImage_SYSLINUX $imagesdir 1722 $kernelpath $ramdisk_size ; then
3374        LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3375        LogIt "if you want to make a 1.72MB floppy disk.\n"
3376        if ! PrepareBootDiskImage_SYSLINUX $imagesdir 2880 $kernelpath $ramdisk_size ; then
3377            LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3378            LogIt "Please reduce your kernel's size\n"
3379            LogIt "if you want to make a 2.88MB floppy disk.\n"
3380            PrepareBootDiskImage_SYSLINUX $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
3381        fi
3382    fi
3383fi
3384
3385
3386
3387[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3388...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3389
3390
3391if [ ! "`DidMondoCallMe`" ] ; then
3392    ListImagesForUser $imagesdir
3393    boot_dev=/dev/fd0u1722
3394    [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3395    [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3396    [ ! -e "$boot_dev" ] && Die "Will you PLEASE tell your distribution maker to create the 1.72MB devices in /dev?"
3397    if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
3398        echo -en "Would you like to create boot+data floppy disks now (y/n) ?"
3399        read i
3400        [ "$i" != "y" ] && [ "$i" != "Y" ] && return
3401        mount | fgrep /dev/fd > /dev/null && Die "Please unmount your floppies first."
3402        echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
3403        [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
3404        [ ! -e "$FDDEVICE" ] && Die "Cannot find $FDDEVICE - is your Linux distro broken?"
3405        i=`find $imagesdir -type f | fgrep "/mindi-root.1" 2> /dev/null`
3406        j=`find $imagesdir -type f | fgrep "/mindi-boot" | egrep -v '2880|5760'`
3407        if [ "$i" ] ; then
3408            CopyImageToDisk $j $FDDEVICE "boot disk"
3409            CopyImageToDisk $i $FDDEVICE "root disk"
3410        else
3411            CopyImageToDisk $j $boot_dev "boot/root disk"
3412        fi
3413        count=1
3414        for i in `find $imagesdir | fgrep mindi-data` ; do
3415            CopyImageToDisk $i $FDDEVICE "data disk #$count"
3416            count=$(($count+1))
3417        done
3418    fi
3419    OfferToMakeBootableISO $imagesdir
3420    LogIt "Finished.\n"
3421elif [ "$TAPEDEV" ] ; then
3422    rm -f $CACHEDIR/{*img,*gz,*iso}
3423    OfferToMakeBootableISO $imagesdir
3424    if [ -e "$imagesdir/all.tar.gz" ] ; then
3425        cp -f $imagesdir/all.tar.gz $MONDO_TMP/
3426    else
3427    Die "Cannot find all.tar.gz, to be written to tape"
3428    fi
3429else
3430    OfferToMakeBootableISO $imagesdir
3431fi
3432[ "$TMP_ROOT" != "/tmp" ] && rm -Rf $TMP_ROOT
3433# cleanup
3434rm -f /tmp/mountlist.txt.$$ $FDISKLOG /tmp/mindilinux
3435LogIt "$FRIENDLY_OUTSTRING\n"
3436#ListUnsavedKernelModules
3437for mtpt in $FLOPPY_WAS_MOUNTED ; do
3438    mount $mtpt
3439done
3440echo "Mindi is exiting" >> $LOGFILE
3441exit 0
Note: See TracBrowser for help on using the repository browser.