source: branches/2.0.9/mindi/mindi

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

merge -r754:755 $SVN_M/branches/stable

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