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

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

The fix for SWAP LABEL wasn't complete. Now mindi --makemountlist is working on RHEL4 x86_64

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