source: trunk/mindi/mindi @ 782

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

merge -r763:781 $SVN_M/branches/stable

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