source: branches/stable/mindi/mindi @ 789

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

Fix a bug for swap labelled partition created by Altiris RDP (reported by michael.shapiro_at_hp.com)

  • Property svn:keywords set to Rev Id
File size: 111.3 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 789 2006-09-13 13:27:17Z 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 bnx2 e1000 eepro100 ne2k-pci tg3 pcnet32 8139cp 8139too 8390 vmxnet"
77EXTRA_MODS="$CDROM_MODS vfat fat loop md-mod linear raid0 raid1 xor raid5 lvm-mod dm-mod jfs xfs xfs_support pagebuf reiserfs ext2 ext3 minix nfs nfs_acl nfsd lockd sunrpc jbd"
78LOGFILE=/var/log/mindi.log
79FDDEVICE=/dev/fd0             ; # 1.44MB floppy #0
80CACHE_LOC=/var/cache/mondo-archive
81FORCE_DUAL_FLOPPIES=no
82
83BOOT_MEDIA_MESSAGE="\
84To format and restore all files automatically, type 'nuke' <enter>.\n\
85To restore some/all files interactively, type 'interactive' <enter>.\n\
86To compare the archives with your filesystem, type 'compare' <enter>.\n\
87To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
88You may add one or more of the following parameters as well:-\n\n\
89        donteject - mondorestore will not eject the CD; this is useful if, for\n\
90                    instance, your PC's case has a concealed CD-ROM drive\n\
91        noresize  - your mountlist will not be adjusted to use your unallocated\n\
92                    hard disk space\n\
93        textonly  - do not call any Newt library routines; this is unattractive\n\
94                    but valuable if you find your Newt library has bugs in it\n\n\
95e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
96a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
97"
98
99# ----------------------------------------------------------------------------
100
101
102
103
104
105AbortHere() {
106    [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
107    Die "Program is terminating in response to signal received from OS/user"
108}
109
110
111
112HackSyslinuxFile() {
113    local incoming
114    incoming=`ReadLine`
115    while [ "$incoming" ] ; do
116        echo -en "$incoming" | sed s/24000/$1/
117        if [ "`echo "$incoming" | grep append`" ] ; then
118            echo -en " $ADDITIONAL_BOOT_PARAMS"
119        fi
120        echo -en "\n"
121        incoming=`ReadLine`
122    done
123    if [ -e "$MINDI_LIB/memtest.img" ] ; then
124#        echo -en "label memtest\n  kernel memtest.bin\n\n"
125        echo -en "label memtest\n  kernel memdisk\n  append initrd=memtest.img\n\n"
126#        echo "Yep, this is a multi-function CD" > $2/MULTIFUNC
127    fi
128}
129
130
131
132AbortIfYourDistroIsAPieceOfStercus() {
133    which which > /dev/null 2> /dev/null || Die "Please install 'which'."
134    which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
135    which gawk > /dev/null 2> /dev/null || Die "Gawk is missing from your computer. Please install gawk. You may find the package on Debian's website. How did I know you're running Debian? Because only Debian would be stupid enough not to include gawk in your distribution."
136    which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
137    if which awk &> /dev/null ; then
138    if ! which gawk &> /dev/null ; then
139        LogIt "You have awk but not gawk.\nPlease note that mindi works fine with a _sane_ awk binary.\nIf your awk binary misbehaves then please contact your vendor\nor distribution's mailing list for technical support.\n"
140    fi
141    fi
142    which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
143    which afio > /dev/null 2> /dev/null || LogIt "afio not found... mindi doesn't need afio but Mondo does... Be aware...\n"
144    [ ! -e "/etc/issue.net" ] && > /etc/issue.net
145    FDISK=$MINDI_SBIN/parted2fdisk
146    FDISKLOG=/tmp/parted2fdisk.log
147    touch $FDISKLOG
148    [ ! -e "$FDISK" ] && Die "Cannot find (s)fdisk"
149}
150
151
152
153AbortIfMkfsVfatMissing() {
154    #if grep -F "vfat" /etc/fstab &> /dev/null ; then
155        if ! which mkfs.vfat &> /dev/null ; then
156            Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
157        fi
158    #fi
159}
160
161
162
163
164
165Aborted() {
166    trap SIGHUP SIGTERM SIGTRAP SIGINT
167    [ "$imagesdir" != "" ] && rm -f $imagesdir/mindi*img $imagesdir/*gz $imagesdir/mindi.iso
168    [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
169    Die "User abort."
170}
171
172
173AddFileToCfgIfExists() {
174    [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
175}
176
177
178
179AddFileToDir() {
180    local filename minidir_root noof_disks diskno res filesize disksize would_occupy zipsize complevel cutoff compressed_fname siz
181    filename=$1
182    minidir_root=$2
183    noof_disks=$3
184
185#    diskno=1
186    diskno=$noof_disks
187    mkdir -p $minidir_root/$diskno
188    [ "$LAST_COMPRESSED_SIZE" = "" ] && LAST_COMPRESSED_SIZE=0
189    if [ ! -e "$filename" ] ; then
190    if [ -h "$filename" ] ; then
191        cp --parents -pRdf $filename $minidir_root/$diskno
192        return $noof_disks
193    else
194        Die "AddFileToDir asked me to add $filename, which does not exist. Oops! Did you run out of disk space or is your Linux distro severely broken?"
195    fi
196    fi
197# move to the disk that has room on it (or end up using the last, if all full)
198    while [ "$diskno" -lt "40" ] ; do
199    mkdir -p $minidir_root/$diskno
200        filesize=`du -sk $filename | cut -f1`
201    cp --parents -Rdf $filename $minidir_root/$diskno
202        if [ "$filesize" -le "4" ] ; then
203            siz=$filesize
204        elif [ ! -f "$filename" ] ; then
205            siz=0
206        else
207            siz=`grep -m 1 "$filename.gz$" $minidir_root/compressed/compressed.txt | cut -f1`
208            [ "$siz" = "" ] && Die "FIXME - can't find $filename's size."
209            siz=$(($siz-2));# to allow for sectors & the fact that they round up
210        fi
211    [ ! "$siz" ] && siz=4
212    [ "$siz" -lt "0" ] && siz=0
213        LAST_COMPRESSED_SIZE=$(($LAST_COMPRESSED_SIZE+$siz))
214    [ "$LAST_COMPRESSED_SIZE" -le "$MAX_COMPRESSED_SIZE" ] &&return $diskno
215    echo "disk=$diskno siz=$LAST_COMPRESSED_SIZE" >> $LOGFILE
216    LAST_COMPRESSED_SIZE=0
217    rm -f $minidir_root/$diskno/$filename
218        diskno=$(($diskno+1))
219    done
220    return 0 ; # failed
221}
222
223
224
225
226AddKeyboardMappingFile() {
227    local mappath r included_list included_item i res ii sss
228    mappath=$1
229    KBDEPTH=$(($KBDEPTH+1))
230    [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
231    if [ -e "$bigdir/$mappath" ] ; then
232        echo "$mappath already added" >> $LOGFILE
233        return
234    elif [ -d "$bigdir/$mappath" ] ; then
235        echo "Cannot add $mappath: it's a directory. Sorry."
236        return
237    fi
238    echo "Added kbd map $mappath" >> $LOGFILE
239    if [ ! -e "$mappath" ] ; then
240        mappath=`find $KEYDIR/keymaps | grep "i[3-8]86" | grep "$locale[^r][^/]" | grep -vx " *#.*"`
241        if [ ! -e "$mappath" ] ; then
242            LogIt "Cannot add $mappath: kbd map file not found\n"
243            return
244        fi
245    else
246        echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
247    fi
248
249    mkdir -p $bigdir/etc
250    cp --parents -pRdf $mappath $bigdir || LogIt "AKMF -- Could not copy $mappath to $bigdir\n"
251    if [ "`echo $mappath | grep -F ".gz"`" ] ; then
252        included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
253    else
254        included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
255    fi
256    for included_item in $included_list ; do
257    if [ ! -e "$included_item" ] ; then
258            sss=`find $KEYDIR/keymaps | grep -F "${included_item}.inc"`
259        [ "$sss" = "" ] && sss=`find $KEYDIR/keymaps | grep -F "$included_item"`
260        for ii in $sss ; do
261                [ -e "$ii" ] && AddKeyboardMappingFile $ii
262        done
263    else
264        AddKeyboardMappingFile $included_item
265    fi
266    done
267}
268
269
270
271
272
273
274
275ChopUpAndCopyFile() {
276    local filename slicesize outdir res biggienumber filesize sliceno noof_slices testfile scratchfile
277    filename=$1
278    outdir=$2
279    slicesize=$3
280    biggienumber=$4
281
282    [ -d "$filename" ] && Die "Cannot chop up $filename: it's a directory. Please amend deplist.txt accordingly."
283    mkdir -p $outdir
284
285    sliceno=0
286    scratchfile=$TMP_ROOT/blah.$$.dat
287    cp -f $filename $scratchfile || Die "CUACF -- cannot copy $filename to $scratchfile - did you run out of disk space?"
288    [ "`head $scratchfile -n1 | grep -F "bin/sh"`" != "" ] && StripComments $scratchfile "-$filename-"
289    [ "`echo "$filename" | grep -F "etc/termcap"`" != "" ] && StripComments $scratchfile "-$filename-"
290    if [ "`echo "$filename" | grep -F "lib/modules/" | grep "\.*o\.gz"`" != "" ] ; then
291    mv $scratchfile $scratchfile.gz
292    gunzip -f $scratchfile || LogIt "Cannot gunzip $scratchfile.gz\n"
293    filename=`echo "$filename" | tr '.' '#' | sed s/#o#gz/#o/ | sed s/#ko#gz/#ko/ | tr '#' '.'`
294    fi
295    filesize=`du -sk $scratchfile | cut -f1`
296    noof_slices=$(($filesize/$slicesize))
297    echo "$filename" > $outdir/slice-$biggienumber.name
298    echo "$filesize" > $outdir/slice-$biggienumber.size
299    [ -x "$scratchfile" ] && StripExecutable $scratchfile "-$filename-"
300    while [ "$sliceno" -le "$noof_slices" ] ; do
301        dd if=$scratchfile skip=$(($sliceno*$slicesize)) of=$outdir/slice-$biggienumber.`printf "%03d" $sliceno` bs=1k count=$slicesize 2> /dev/null
302        sliceno=$(($sliceno+1))
303    done
304    rm -f $scratchfile
305}
306
307
308CopyBootBFile() {
309    local copy_to copy_from possible_locations liloc
310    copy_to=$1
311    copy_from=/boot/boot.b
312    liloc=`which lilo.real 2>/dev/null`
313    [ $liloc ] || liloc=`which lilo 2>/dev/null`
314    if [ $liloc ]; then
315        if ! [ `strings $liloc | grep "boot\.b"` ]; then
316            LogIt "boot.b files built into lilo; I'll create a dummy.\n"
317            > $copy_to
318            return 0
319        fi
320    fi
321    if [ ! -f "$copy_from" ] ; then
322        LogIt "OK, you don't have a /boot/boot.b file, which is odd because\n most _good_ Linux distributions come with one, even if it's only a softlink"
323        copy_from=`grep install= /etc/lilo.conf | grep "\.b" | cut -d'=' -f2`
324        if [ ! -f "$copy_from" ] ; then
325            LogIt "Nor can I find it from your /etc/lilo.conf file. This is very odd.\n"
326            copy_from=`FindSensibleBootBFile`
327            LogIt "I'm going to use '$copy_from'\n"
328        fi
329    fi
330    cp -f $copy_from $copy_to || LogIt "CBBF -- warning -- cannot find your boot.b file. That's it, I quit... (j/k)\n"
331}
332
333
334
335
336CopyDependenciesToDirectory() {
337    local outdir incoming fname filesize counter
338    outdir=$1
339    mkdir -p $outdir
340    incoming=`ReadLine`
341    counter=0
342    while [ "$incoming" != "" ] ; do
343    if [ -d "$incoming" ] ; then
344            find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
345        elif [ -e "$incoming" ] ; then
346            filesize=`du -sk $incoming | cut -f1`
347            if [ "$filesize" -gt "$(($CHOPSIZE*2))" ] && [ ! -h "$incoming" ] ; then
348                ChopUpAndCopyFile $incoming $outdir $CHOPSIZE $BIGNO
349                BIGNO=$(($BIGNO+1))
350            else
351                cp --parents -Rdf $incoming $outdir || Die "Cannot copy $incoming to $outdir - did you run out of disk space?"
352        if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] ; then
353            gunzip -f $outdir/$incoming || LogIt "Cannot gunzip $outdir/$incoming\n"
354        fi
355        [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
356            fi
357        counter=$(($counter+1))
358        if [ "$counter" -ge "5" ] ; then
359        counter=0
360            echo -en "."
361        fi
362        fi
363        incoming=`ReadLine`
364    done
365}
366
367
368
369CopyImageToDisk() {
370    local image dev procno res comment
371    image=$1
372    dev=$2
373    comment=$3
374    [ ! -f "$image" ] && [ ! -b "$image" ] && Die "Image $image does not exist. Did you run out of disk space?"
375    Prompt "About to write $comment. Please press ENTER."
376    echo -en "Formatting disk..."
377    if which fdformat > /dev/null ; then
378    fdformat -n $dev > /dev/null 2> /dev/null || Die "Cannot format $dev - is your Linux distro broken?"
379    elif which superformat > /dev/null ; then
380    superformat $dev > /dev/null 2> /dev/null || Die "Cannot format $dev - is your Linux distro broken?"
381    else
382    Die "Please install either fdformat or superformat."
383    fi
384    echo -en "\rWriting $comment"
385    if echo $image | grep "mindi-[r|b]oot\.1440" &> /dev/null ; then
386    cat $image > $dev &
387    else
388    dd if=$image of=$dev &> /dev/null &
389    fi
390    procno=$!
391    ps $procno > /dev/null 2> /dev/null
392    while [ "$?" -eq "0" ] ; do
393        sleep 3
394        echo -en "."
395        ps $procno > /dev/null 2> /dev/null
396    done
397    echo -e "$DONE"
398    LogIt "$comment has been written.\n"
399}
400
401
402
403
404
405CountItemsIn() {
406    local r
407    r=0
408    for q in $1 ; do
409        r=$(($r+1))
410    done
411    echo $r
412}
413
414
415
416
417
418
419CreateDataDiskImagesFromTarballs() {
420    local tardir outdir diskno noof_disks kp
421    tardir=$1
422    outdir=$2
423    noof_disks=$3
424
425    mkdir -p $outdir
426    diskno=1
427    echo -en "Creating data disk "
428    while [ "$diskno" -le "$noof_disks" ] ; do
429    echo -en "#$diskno..."
430    cp -f $tardir/$diskno.tar.gz $outdir || LogIt "[line 424] Cannot copy $tardir/$diskno.tar.gz to $outdir\n"
431        CreateOneDataDiskImage $tardir/$diskno.tar.gz $outdir/mindi-data-$diskno.img $diskno $noof_disks
432        diskno=$(($diskno+1))
433    done
434    mv -f $tardir/all.tar.gz $outdir
435    du -sk $outdir/*gz >> $LOGFILE
436    echo -e "$DONE"
437}
438
439
440
441CreateOneDataDiskImage() {
442    local tarball imagefile dev diskno noof_disks mountpoint
443    tarball=$1
444    imagefile=$2
445    diskno=$3
446    noof_disks=$4
447
448    mountpoint=$TMP_ROOT/mountpoint.$$
449    mkdir -p $mountpoint
450    dd if=/dev/zero of=$imagefile bs=1k count=1440 &> /dev/null || LogIt "Cannot dd (CODI)\n"
451    mke2fs -N 12 -F $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
452    [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
453    rm -f /tmp/mke2fs.$$
454    mount -t ext2 -o loop $imagefile $mountpoint || Die "Can't loopmount $imagefile to $mountpoint! The reason may be missing support for loopfs or ext2 (or both) in the running kernel."
455    mv $tarball $mountpoint/
456    if [ "$?" -ne "0" ] ; then
457    umount $mountpoint
458    Die "Tarball $tarball is too big for disk! (CODI)\nTell Dev Team to adjust MAX_COMPRESSED_SIZE"
459    fi
460    [ "$diskno" -eq "$noof_disks" ] && echo "This is the last disk ($diskno=$noof_disks)" >> $mountpoint/LAST-DISK
461    umount $mountpoint || LogIt "Cannot umount (CODI)\n"
462    rmdir $mountpoint || LogIt "Cannot rmdir (CODI)\n"
463}
464
465
466
467DidMondoCallMe() {
468    local res
469
470    res=0
471    [ "`ps ax | grep -F "mondoarchive" | grep -v "grep"`" ] && res=$(($res+1))
472    [ -f "/var/run/monitas-mondo.pid" ] && res=$(($res+1))
473    [ "$res" -gt "1" ] && echo "yes"
474}
475
476
477
478
479Die() {
480    local my_partitions i
481    echo "MINDI_VERSION is $MINDI_VERSION" >> $LOGFILE
482    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 or SW-mydevice. e.g. : LABEL=SWAP-hda5
1410            # LABEL=SW-cciss/c0d0p3 (RDP)
1411            # SWAP only
1412            if [ "x$actual_dev" = "x" -a  _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1413                try_dev="`echo "$redhat_label" | /bin/cut -d '-' -f2`"
1414                present_dev="`/bin/cat /proc/swaps | /bin/grep -w /dev/$try_dev`"
1415                if [ "x$present_dev" != "x" ] ; then
1416                    actual_dev="/dev/$try_dev"
1417                fi
1418            fi
1419
1420            # Check if one of all those tries has known success
1421            if [ "x$actual_dev" != "x" ]; then
1422                current_partition=$actual_dev
1423            else
1424                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"
1425            fi
1426        else
1427            str_to_find_fmt_with=$current_partition
1428        fi
1429
1430        partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1431        # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1432        # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1433        # the former is then a link to the latter, so we test whether
1434        # $current_partition is actually such a link or not and set
1435        # $current_lvolume accordingly. On Debian you may find more than one answer
1436        # so we remove the one corresponding to /dev/.static
1437        # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1438        # principle is the same and we need to find the link to it as well.
1439        # Note that $current_lvolume may well be an
1440        # ordinary device. It is just to make sure that we feed the right value
1441        # into any of the LVM tools if possible.
1442
1443        current_lvolume="$current_partition"
1444        if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1445            # .static dir are a Debian specificity
1446            current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1447            echo $current_lvolume | grep -q ' '
1448            if [ $? -eq 0 ]; then
1449                echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE 
1450            fi
1451        fi
1452        #
1453        # End of LVM device style variation code (other than $current_lvolume).
1454
1455        if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1456            # Size computed via LVM not directly
1457            partition_size="lvm"
1458        else
1459            partition_size=`SizeOfPartition $current_partition`
1460            [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1461            [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1462            if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1463                partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1464                [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1465                [ "$partition_format" != "swap" ] && partition_format="swap"
1466                if [ "$partition_size" = "" ] ; then
1467                    totalsize=0
1468                    items=0
1469                    for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1470                        totalsize=$(($totalsize+$i))
1471                        items=$(($items+1))
1472                    done
1473                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1474                    [ "$partition_size" -lt "125000" ] && partition_size=125000
1475                    echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1476                fi
1477            fi
1478        fi
1479        [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1480        [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1481        if [ "$partition_mountpt" = "" ] ; then
1482            if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1483                if  [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1484                    partition_mountpt="raid"
1485                    partition_format="raid"
1486                else
1487                    partition_mountpt="lvm"
1488                    partition_format="lvm"
1489                fi
1490            fi
1491        fi
1492        psz=$partition_size
1493        echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1494        [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1495        if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1496            partition_mountpt="image"
1497            old_partition_fmt=$partition_format
1498#           partition_format="`$FDISK -l 2>> $LOGFILE | tr -s '\t' ' ' | grep -w "$absolute_partition" | $AWK 'x=$(NF-1}'`"
1499            partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1500            echo "------- $FDISK -l log ------------" >> $LOGFILE
1501            cat $FDISKLOG >> $LOGFILE
1502            echo "------- $FDISK log end ------------" >> $LOGFILE
1503            partition_size=$(($partition_size+1)); # just in case
1504            if [ "$partition_format" = "Linux" ] ; then
1505                echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1506                echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1507                partition_format=$old_partition_fmt
1508            fi
1509        fi
1510        if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1511            echo "Excluding $current_partition from mountlist" >> $LOGFILE
1512            continue
1513        fi
1514        if [ ! "$partition_mountpt" ] ; then
1515            for qq in "" `find /dev/ida/c*d* ! -name '*p*'` ; do
1516                partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1517                echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1518                cat $FDISKLOG >> $LOGFILE
1519                echo "------- $FDISK log end ------------" >> $LOGFILE
1520                [ "$partition_format" ] && break
1521            done
1522            if [ "$partition_format" = "Compaq diagnostics" ] ; then
1523                partition_format="compaq"
1524            elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1525                LogIt "Unable to find mountpoint of $current_partition - ignoring\n"
1526                continue
1527            fi
1528        fi
1529        partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1530        [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | awk '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1531        unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s\n" $current_partition $partition_mountpt $partition_format $psz`
1532        if [ "$current_partition" = "" ] ; then
1533            echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1534        elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1535            if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1536                partition_mountpt=raid
1537                partition_format=raid
1538                printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1539                printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1540            else
1541                echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1542            fi
1543        elif [ "$partition_format" = "" ] ; then
1544            echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1545        elif [ "$partition_size" = "" ] ; then
1546            echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1547        elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1548            continue
1549        else
1550            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1551                echo "Stupid bastard..." >> $LOGFILE
1552                partition_format="vfat"
1553            fi
1554            printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1555            printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1556        fi
1557    done
1558}
1559
1560
1561
1562
1563
1564
1565MakeSureNumberIsInteger() {
1566    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1567    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1568    echo "result = '$res'"
1569        Die "$1 should be an integer"
1570    fi
1571}
1572
1573
1574
1575
1576
1577MakeSyslinuxMessageFile() {
1578    mkdir -p $1
1579    rmdir $1
1580    echo -en "  " > $1
1581    if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1582        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
1583    else
1584        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
1585    fi
1586    sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1587    rm -f $1.tmp
1588    if [ "$CDRECOVERY" != "yes" ] ; then
1589        if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1590            echo -en "Press <enter> to continue.\n" >> $1
1591        elif [ ! "$MONDO_TMP" ] ; then
1592            echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1593            if [ -e "$MINDI_LIB/memtest.img" ] ; then
1594                echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1595            fi
1596        else
1597            echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1598        fi
1599    else
1600        echo -en " \
1601To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1602CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1603    fi
1604}
1605
1606
1607
1608
1609MoveHyperlinkSensibly() {
1610    local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1611    filename=$1
1612    minidir_root=$2
1613    resides_on_diskno=$3
1614    noof_disks=$4
1615
1616    [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1617
1618    old_diskno=$resides_on_diskno
1619    d=1
1620    while [ "$d" -le "$noof_disks" ] ; do
1621        if [ "$d" -ne "$old_diskno" ] ; then
1622            old_pwd=`pwd`
1623            cd $minidir_root/$old_diskno
1624            cp --parents -Rdf $filename $minidir_root/$d/ || Die "Can't move $filename (sensibly) from $old_diskno to $d"
1625            rm -f $filename
1626            cd $old_pwd
1627        fi
1628# when the softlink is resolvable, our work here is done
1629        [ -e "$minidir_root/$d/$filename" ] && return 0
1630        old_diskno=$d
1631        d=$(($d+1))
1632    done
1633    return 1
1634}
1635
1636
1637
1638OfferToCopyImagesToDisks() {
1639    local imagesdir i imagename dev count boot_dev data_dev
1640    imagesdir=$1
1641    boot_dev=$2
1642    data_dev=$3
1643    echo -en "Would you like to create boot+data floppy disks now (y/n) ?"
1644    read i
1645    [ "$i" != "y" ] && [ "$i" != "Y" ] && return
1646    mount | grep -F /dev/fd > /dev/null && Die "Please unmount your floppies first."
1647    echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
1648    [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
1649    [ ! -e "$data_dev" ] && Die "Cannot find $data_dev - is your Linux distro broken?"
1650    i=`find $imagesdir -type f | grep -F "/mindi-root.1" 2> /dev/null`
1651    j=`find $imagesdir -type f | grep -F "/mindi-boot" | grep -Ev '2880|5760'`
1652#    echo "i=$i"
1653#    echo "j=$j"
1654    if [ "$i" ] ; then
1655        CopyImageToDisk $j $data_dev "boot disk"
1656        CopyImageToDisk $i $data_dev "root disk"
1657    else
1658        CopyImageToDisk $j $boot_dev "boot/root disk"
1659    fi
1660    count=1
1661    for i in `find $imagesdir | grep -F mindi-data` ; do
1662        CopyImageToDisk $i $data_dev "data disk #$count"
1663        count=$(($count+1))
1664    done
1665}
1666
1667
1668
1669OfferToMakeBootableISO() {
1670    local i old_pwd
1671    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ ! "`DidMondoCallMe`" ] ; then
1672        echo -en "Shall I make a bootable CD image? (y/n) "
1673        read i
1674        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1675    fi
1676    if [ ! "$MONDO_TMP" ] ; then
1677        LogIt "NB: Mindi's bootable CD always uses isolinux.\n"
1678        LogIt "For a bootable CD w/LILO, please use Mondo.\n"
1679    fi
1680    rm -Rf $TMP_ROOT/iso
1681    mkdir -p $TMP_ROOT/iso/{images,archives,isolinux}
1682    cp -f $1/*.img $1/*.gz $TMP_ROOT/iso/images || LogIt "OfferToMakeBootableISO: Cannot copy $i to $TMP_ROOT/iso/images\n"
1683    old_pwd=`pwd`
1684    cd $TMP_ROOT/iso
1685    mkdir -p $MONDO_ROOT/iso/isolinux
1686    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1687    cp $MINDI_LIB/mem{test,disk}* $MONDO_ROOT 2>> $LOGFILE
1688    for i in memdisk memtest.bin memtest.img ; do
1689    j=$MINDI_LIB/$i
1690    k=$TMP_ROOT/iso/isolinux
1691    if [ -e "$j" ] ; then
1692        LogIt "Copying $j to $k\n"
1693        cp -f $j $k || Die "Failed to copy $j to $k"
1694        cp -f $j $TMP_ROOT || Die "Failed to copy $j to $k"
1695    fi
1696    done
1697    MakeSyslinuxMessageFile $TMP_ROOT/iso/isolinux/message.txt
1698    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?"
1699    cp $TMP_ROOT/mindi.rdz $TMP_ROOT/iso/isolinux/initrd.img
1700    cp $TMP_ROOT/mindi.rdz $imagesdir/initrd.img
1701    [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1702    cd $TMP_ROOT/iso/isolinux
1703    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?"
1704    if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1705        mv isolinux.cfg isolinux.cfg.old
1706        sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1707    fi
1708    if [ "$ARCH" != "ia64" ] ; then
1709        cp $ISOLINUX isolinux.bin || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
1710        cp $ISOLINUX ../
1711    fi
1712    cd $TMP_ROOT/iso
1713    if [ "$ARCH" != "ia64" ] ; then
1714        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?"
1715    fi
1716    [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun .   
1717    if [ -d "/home/MondoCD" ] ; then
1718        cp -pRdu /home/MondoCD/* .
1719    fi
1720    if [ "$ARCH" != "ia64" ] ; then
1721        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
1722    else
1723        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
1724    fi
1725    if [ "$?" -ne "0" ] ; then
1726    echo "----------- mkisofs's errors --------------" >> $LOGFILE
1727    cat /tmp/$$.mk >> $LOGFILE
1728    echo "mkisofs returned the following errors:-"
1729    cat /tmp/$$.mk
1730    LogIt "Failed to create ISO image.\n"
1731    else
1732    echo "Created bootable ISO image at $imagesdir/mindi.iso" >> $LOGFILE
1733    fi
1734    rm -f /tmp/$$.mk
1735    cd $old_pwd
1736}
1737
1738
1739
1740PluralOrNot() {
1741    [ "$1" -gt "1" ] && echo -en "s"
1742}
1743
1744
1745
1746
1747MakeMessageFile() {
1748    local disksize
1749    disksize=$1
1750    if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1751        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`"/
1752    else
1753        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`/
1754    fi
1755    if [ "$disksize" -gt "2880" ] ; then
1756    if [ "`DidMondoCallMe`" ] ; then
1757        if [ "$CDRECOVERY" != "yes" ] ; then
1758            if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1759                echo -en "Press <enter> to continue.\n"
1760            elif [ ! "$MONDO_TMP" ] ; then
1761                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1762            else
1763                echo -en "$BOOT_MEDIA_MESSAGE"
1764            fi
1765        fi
1766    fi
1767    fi
1768    if [ "$CDRECOVERY" = "yes" ] ; then
1769        echo -en "\
1770To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1771CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1772    fi
1773    echo -en "\n\n\n"
1774}
1775
1776
1777
1778
1779write_full_floppy_of_kernel() {
1780    local mtpt image old_pwd res disksize
1781
1782    res=0
1783    old_pwd=`pwd`
1784    KERN_DISK_MADE=1
1785    disksize=$3
1786    rand1=$RANDOM
1787    rand2=$RANDOM
1788    image=/tmp/$rand1.$rand2.img
1789    mtpt=/tmp/$rand1.$rand2.mtpt
1790    dd if=/dev/zero of=$image bs=1k count=$disksize
1791    mke2fs -N 26 -F $image > /dev/null
1792    mkdir -p $mtpt
1793    mount -o loop $image $mtpt
1794    cd $mtpt
1795    mkdir -p {dev,tmp,boot}
1796    cp -f $1 vmlinuz
1797    if [ "$?" -ne "0" ] ; then
1798        LogIt "Failed to copy $1 to ramdisk\n"
1799        cd $old_pwd
1800        umount $mtpt
1801        rmdir $mtpt
1802        rm $image
1803        return 1
1804    fi
1805
1806    rdev vmlinuz 2,0
1807    rdev -R vmlinuz 0
1808    rdev -r vmlinuz 49152
1809
1810    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1811    losetup /dev/loop0 > /dev/null 2> /dev/null
1812    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1813    CopyBootBFile $mtpt/boot.b
1814
1815#    echo "root=/dev/loop0" > bdlilo.conf
1816    MakeLiloConfFile $disksize >> bdlilo.conf
1817
1818#    cat bdlilo.conf > /tmp/bdlilo.conf
1819
1820#    cat /home/mondostuff/bdlc > bdlilo.conf
1821
1822    chmod 644 bdlilo.conf
1823    MakeMessageFile $disksize > message
1824    lilo -v -C bdlilo.conf -r $mtpt
1825    res=$?
1826
1827#echo "lilo -v -C bdlilo.conf -r $mtpt"
1828#echo -en "Press enter"; read line
1829
1830    cd $old_pwd
1831    umount $mtpt
1832    mv -f $image $2
1833    rmdir $mtpt
1834
1835    return $res
1836
1837# --- the kernel-only method NO LONGER WORKS. Not since Apr 2002.
1838# It should work, according to the Boot Disk HOWTO, but it doesn't.
1839# It works for my failsafe kernel & for RH7.2 but not RH7.3, 8.0, etc.
1840# -Hugo, Apr 19th 2004
1841#   dd if=$1 of=$2 bs=1k &> /dev/null || Die "Cannot dd blank file"
1842#   dd if=/dev/zero bs=1k count=$3 >> $2 2> /dev/null || Die "Cannot dd blank file"
1843#   mv -f $2 $2.old
1844#   dd if=$2.old bs=1k count=$3 of=$2 &> /dev/null || Die "Cannot dd blank file"
1845#   rm -f $2.old
1846#   if [ "$3" = "1440" ] ; then
1847#       rdev $2 "/dev/fd0H"$3
1848#   else
1849#       rdev $2 "/dev/fd0u"$3
1850#   fi
1851#   rdev -R $2 0
1852#   rdev -r $2 49152
1853}
1854
1855
1856
1857
1858
1859
1860MakeLiloConfFile() {
1861    local disksize options i ooo
1862    disksize=$1
1863    options=""
1864        if [ "$ARCH" != "ia64" ] ; then
1865            echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1866        fi
1867        if [ "$disksize" -eq "2880" ] ; then
1868            echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1869        elif [ "$disksize" -eq "1722" ] ; then
1870            echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1871        elif [ "$disksize" -gt "2880" ] ; then
1872            /bin/true
1873        else
1874            echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1875        fi
1876        if [ "$ARCH" != "ia64" ] ; then
1877            echo -en "install=/boot.b\nmap=/boot.map\n"
1878        fi
1879    if [ "$CDRECOVERY" = "yes" ] ; then
1880        echo -en "default=RESTORE\n"
1881    elif [ "$disksize" -gt "2880" ] && [ "`DidMondoCallMe`" ] ; then
1882        if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1883            echo -en "default=iso\n"
1884        else
1885            echo -en "default=interactive\n"
1886        fi
1887    else
1888        echo -en "default=expert\n"
1889    fi
1890
1891    echo -en "prompt\n"
1892    if [ "$ARCH" != "ia64" ] ; then
1893        echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1894    fi
1895    if [ "$CDRECOVERY" != "yes" ] ; then
1896    echo -en "timeout=300\n"
1897    fi
1898    echo -en "\n"
1899    if [ "$CDRECOVERY" = "yes" ] ; then
1900    options="RESTORE expert"
1901    elif [ "$disksize" -gt "2880" ] ; then
1902        if [ "`DidMondoCallMe`" ] ; then
1903            if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
1904                options="iso"
1905            else
1906                options="interactive expert compare iso nuke isonuke"
1907# hda hdb hdc hdd"
1908            fi
1909        else
1910            options="expert"
1911    fi
1912    else
1913        options="expert"
1914    fi
1915    for i in $options ; do
1916    ooo=$i
1917    [ "$ooo" = "RESTORE" ] && ooo="nuke"
1918    if [ "$ARCH" = "ia64" ] ; then
1919        rootpart="root=/dev/ram0\n\t"
1920    else
1921        rootpart=""
1922    fi
1923    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"
1924   
1925    outstr=$outstr" $ooo_mode"
1926    outstr=$outstr"\"\n"
1927    if [ "$disksize" = "1440" ] ; then
1928        echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1929    else
1930        echo -en "$outstr"
1931    fi
1932    done
1933}
1934
1935
1936
1937
1938PrepareBootDiskImage_LILO() {
1939    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1940    imagesdir=$1
1941    disksize=$2
1942    kernelpath=$3
1943    ramdisksize=$4
1944
1945    retval=0
1946    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1947    echo -en "Making "$disksize"KB boot disk..."
1948    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?"
1949    if [ "$ARCH" != "ia64" ] ; then
1950        [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1951    fi
1952    echo -en "..."
1953    imagefile=$imagesdir/mindi-bootroot.$disksize.img
1954    mountpoint=$TMP_ROOT/mountpoint.$$
1955    mkdir -p $mountpoint
1956    dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1957    if [ "$ARCH" = "ia64" ] ; then
1958        mkdosfs $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1959    t=vfat
1960    else
1961        mke2fs -N 26 -m 0 -F $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1962    t=ext2
1963    fi
1964    [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
1965    rm -f /tmp/mke2fs.$$
1966    mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
1967# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1968    mkdir -p $mountpoint/etc
1969    if [ "$ARCH" != "ia64" ] ; then
1970        liloconf=$mountpoint/etc/lilo.conf
1971    else
1972    liloconf=$mountpoint/elilo.conf
1973    fi
1974    old_pwd=`pwd`
1975    cd $mountpoint
1976    if [ "$ARCH" != "ia64" ] ; then
1977        tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1978    fi
1979    cd $old_pwd
1980    losetup /dev/loop0 > /dev/null 2> /dev/null
1981    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing   'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1982    CopyBootBFile $mountpoint/boot.b
1983
1984    MakeLiloConfFile $disksize > $liloconf
1985
1986    echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint..." >> $LOGFILE
1987    cp -f $TMP_ROOT/mindi.rdz $mountpoint 2>> $LOGFILE
1988    if [ "$?" -ne "0" ] ; then
1989    LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
1990    cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
1991    LogIt "Please unload some of your modules and try again.\n"
1992    rm -f $TMP_ROOT/mtpt.$$
1993    LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
1994        retval=$(($retval+1))
1995    fi
1996    MakeMessageFile $disksize > $mountpoint/message
1997
1998    mkdir -p $mountpoint/tmp
1999    cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2000    if [ -e "$MINDI_LIB/memtest.img" ] ; then
2001        echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
2002        echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
2003#        echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
2004    fi
2005    if [ -d "/home/MondoCD" ] ; then
2006    cp -pRdu /home/MondoCD/* . || Die "Cannot do kung pow"
2007    fi
2008
2009# copy the kernel across
2010    rm -Rf $mountpoint/lost+found
2011    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2012    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2013    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
2014    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2015    echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2016    du -sk $mountpoint/* >> $LOGFILE
2017    echo "--- end of list of files ---" >> $LOGFILE
2018    echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2019Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2020        rm -f $mountpoint/vmlinuz
2021    cd $old_pwd
2022        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2023        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2024#   losetup /dev/loop0 -d
2025    res=0
2026        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2027    res=$(($res+$?))
2028        cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
2029    res=$(($res+$?))
2030    rm -f $imagefile
2031    if [ "$res" -ne "0" ]; then
2032        LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2033        rm -f $imagesdir/mindi-*.1440.img
2034    fi
2035    return $res
2036    fi
2037    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2038    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2039    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2040    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2041# make it bootable
2042    rm -f $mountpoint/zero
2043    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2044    if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
2045        if [ "$ARCH" != "ia64" ] ; then
2046        $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2047        else
2048            /bin/true
2049        fi
2050    elif [ ! "$KERN_DISK_MADE" ] ; then
2051# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
2052    $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2053    else
2054    echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
2055    fi
2056    if [ $? -ne "0" ] ; then
2057    if [ "`grep -F "/tmp/dev.0" $LOGFILE`" ] ; then
2058        LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's.\n"
2059        LogIt "Please reboot your PC as a workaround.\n"
2060        Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ.\n"
2061    fi
2062    echo "$LILO_EXE -r $mountpoint ...failed."
2063    echo -en "Press ENTER to continue."; read line
2064    LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug.\n"
2065    retval=$(($retval+1))
2066    fi
2067    cp -f $liloconf /tmp/lilo.conf
2068    if [ "$ARCH" = "ia64" ] ; then
2069        cp `dirname $kernelpath`/*.efi $mountpoint
2070    fi
2071    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2072    echo -en "..."
2073    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2074    if [ "$retval" -eq "0" ] ; then
2075        echo -en "...$DONE\r"
2076        if [ "$KERN_DISK_MADE" ] ; then
2077            LogIt "... $disksize KB boot disks were created OK\r"
2078        fi
2079    else
2080        echo -en "...failed\r"
2081        LogIt $disksize"KB boot disk was NOT created\r"
2082        rm -f $imagefile
2083    fi
2084    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2085    return $retval
2086}
2087
2088
2089
2090
2091PrepareBootDiskImage_SYSLINUX() {
2092    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
2093    imagesdir=$1
2094    disksize=$2
2095    kernelpath=$3
2096    ramdisksize=$4
2097    do_boot_root_thingy=""
2098    local retval old_pwd
2099    retval=0
2100    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2101    echo -en "Making "$disksize"KB boot disk..."
2102    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?"
2103    [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
2104    echo -en "..."
2105    imagefile=$imagesdir/mindi-bootroot.$disksize.img
2106    mountpoint=$TMP_ROOT/mountpoint.$$
2107    mkdir -p $mountpoint
2108# If I format a 1722KB data file & run syslinux on it, the resultant image
2109# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
2110# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
2111# If I extract it, mount it, copy my files to it, etc. then the resultant
2112# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
2113# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
2114    if [ "$disksize" = "1722" ] ; then
2115        gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
2116    else
2117        dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
2118        mkfs.vfat $imagefile
2119        syslinux $imagefile
2120    fi
2121    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
2122# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
2123    old_pwd=`pwd`
2124    MakeSyslinuxMessageFile $mountpoint/message.txt
2125    cd $mountpoint
2126    [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
2127#    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n" <--- present for LILO; is it nec. for SYSLINUX too?
2128    cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
2129    if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
2130        mv syslinux.cfg syslinux.cfg.orig
2131        sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
2132    fi
2133    cd $old_pwd
2134    echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
2135    cp -f $TMP_ROOT/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
2136    if [ "$?" -ne "0" ] ; then
2137        LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
2138        cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
2139        LogIt "Please unload some of your modules and try again.\n"
2140        rm -f $TMP_ROOT/mtpt.$$
2141        LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
2142        retval=$(($retval+1))
2143    fi
2144
2145    mkdir -p $mountpoint/tmp
2146    cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2147
2148# copy the kernel across
2149    rm -Rf $mountpoint/lost+found
2150    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2151    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2152    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2153    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2154        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2155        du -sk $mountpoint/* >> $LOGFILE
2156        echo "--- end of list of files ---" >> $LOGFILE
2157        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2158Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2159        rm -f $mountpoint/vmlinuz
2160        cd $old_pwd
2161        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2162        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2163#   losetup /dev/loop0 -d
2164
2165        res=0
2166        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2167        res=$(($res+$?))
2168        cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
2169        res=$(($res+$?))
2170        rm -f $imagefile
2171        if [ "$res" -ne "0" ]; then
2172            LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2173            rm -f $imagesdir/mindi-*.1440.img
2174        fi
2175        return $res
2176    fi
2177    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2178    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2179    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2180    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2181# make it bootable
2182    rm -f $mountpoint/zero
2183    mkdir -p $mountpoint/etc
2184    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2185    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2186    echo -en "..."
2187    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2188
2189    if [ "$retval" -eq "0" ] ; then
2190        echo -en "...$DONE\r"
2191        if [ "$KERN_DISK_MADE" ] ; then
2192            rm -f $imagefile
2193            LogIt "... $disksize KB boot disks were created OK\r"
2194        fi
2195    else
2196        echo -en "...failed\r"
2197        LogIt $disksize"KB boot disk was NOT created\r"
2198        rm -f $imagefile
2199    fi
2200    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2201    return $retval
2202}
2203
2204
2205
2206
2207PrepareDataDiskImages() {
2208    local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2209
2210    imagesdir=$1
2211    rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
2212    needlist=$TMP_ROOT/what-we-need.txt
2213    bigdir=$TMP_ROOT/bigdir
2214    minidir_root=$TMP_ROOT/minidir
2215    mkdir -p $minidir_root
2216    mkdir -p $bigdir/usr/bin
2217    tardir=$TMP_ROOT/tardir
2218
2219    lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt | grep -vx "" | wc -l`
2220    cat $MINDI_CONF/deplist.txt | GenerateGiantDependencyList $needlist $lines
2221    res=$?
2222    if [ "$YOUR_KERNEL_SUCKS" ]; then
2223    pwd=`pwd`
2224    cd $TMP_ROOT
2225        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2226        cp --parents -pRdf ./$i $bigdir || Die "PDDI can't cp $i->$bigdir"
2227        if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
2228        cp --parents -pRdf $i $bigdir
2229        else
2230        ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2231        BIGNO=$(($BIGNO+1))
2232        fi
2233    done
2234    for i in $EXTRA_MODS ; do
2235        j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
2236        [ ! "$j" ] && echo "Warning - cannot find failsafe module $i.o" >> $LOGFILE
2237        for k in $j ; do
2238        if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
2239            cp --parents -pRdf $k $bigdir
2240        else
2241            ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2242            BIGNO=$(($BIGNO+1))
2243        fi
2244        echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2245        done
2246    done
2247    cd $pwd
2248    else
2249    ListKernelModulePaths >> $needlist
2250    fi
2251    if [ "$res" -ne "0" ] ; then
2252        Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2253    fi
2254    FindAndAddUserKeyboardMappingFile
2255    mkdir -p $bigdir/tmp
2256    if [ "`DidMondoCallMe`" ] ; then
2257        MakeMondoConfigFile $TMP_ROOT/mondo-restore.cfg
2258        cp -f $TMP_ROOT/mondo-restore.cfg $bigdir/tmp &> /dev/null
2259        cp -f $TMP_ROOT/mondo-restore.cfg $CACHE_LOC &> /dev/null
2260    fi
2261    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2262    DropOptimizedLibraries $needlist $bigdir
2263    echo -en "Assembling dependency files"
2264    CopyDependenciesToDirectory < $needlist $bigdir
2265
2266# also copy io.sys and msdos.sys, if we can find them
2267    for i in `mount | cut -d' ' -f3` ; do
2268    for j in io.sys msdos.sys ; do
2269        [ -e "$i/$j" ] && cp -f $i/$j $bigdir
2270    done
2271    done
2272
2273# master boot record, too
2274    i=`cat $MONDO_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2275    if [ "$i" ] ; then
2276    LogIt "Backing up $i's MBR\n"
2277    dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2278# < < E O F
2279    sleep 1
2280    sync
2281#        [ "$?" -ne "0" ] && echo "Failed to save $i's MBR to bigdir" >> $LOGFILE
2282    j=$i
2283    [ -h "$j" ] && j=`ResolveSoftlink $j`
2284    LogIt "Creating /dev/boot_device ($j)\n"
2285    mkdir -p $bigdir/dev
2286    cp -pRdf $j $bigdir/dev/boot_device || Die "Unable to create /dev/boot_device on ramdisk"
2287    fi
2288
2289# more stuff
2290#    cp -f $MINDI_LIB/embleer* $bigdir
2291    old_pwd=`pwd`
2292    cd $bigdir
2293
2294    [ -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'."
2295    cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping aux-tools\n"
2296    if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
2297    tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping x11-tools.tgz\n"
2298    fi
2299    if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2300        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2301        [ "$?" -ne "0" ] && [ "`DidMondoCallMe`" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2302    fi
2303    [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state .
2304    cd $old_pwd
2305    echo -e "$DONE"
2306    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2307    SplitDirectoryIntoMinidirs $bigdir $minidir_root
2308    noof_disks=$?
2309    [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2310#    if [ "$noof_disks" -ge "8" ] ; then
2311#        LogIt "You are putting a ludicrously large amount of data on these disks."
2312#        LogIt "I shall therefore double EXTRA_SPACE, just in case your ramdisk is too small."
2313#        EXTRA_SPACE=$(($EXTRA_SPACE*2))
2314#    fi
2315    MakeMountlist $TMP_ROOT/mountlist.txt
2316    mkdir -p $minidir_root/$noof_disks/tmp
2317    cp -f $TMP_ROOT/mountlist.txt $minidir_root/$noof_disks/tmp/mountlist.txt || Die "Cannot copy mountlist.txt from $TMP_ROOT to data disk"
2318    cp -f $TMP_ROOT/mountlist.txt $CACHE_LOC
2319    [ "`DidMondoCallMe`" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MONDO_TMP/.
2320    [ $LVM != "false" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2321    cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2322    ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2323    CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2324    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2325# One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
2326    rmdir $tardir $bigdir
2327    rm -f $needlist
2328    return $noof_disks
2329}
2330
2331
2332ProcessLDD() {
2333    local main_fname incoming j i fname f newf
2334    main_fname=$1
2335    read incoming
2336    while [ "$incoming" != "" ] ; do
2337        incoming=`echo "$incoming" | sed '/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*(.*/d ; s/[[:blank:]]*\(.*\)[[:blank:]]*=>[[:blank:]]*\/.*/\1/ ; s/[[:blank:]]*\(\/.*\)[[:blank:]]*(.*/\1/'`
2338        for fname in `echo "$incoming"` ; do
2339            fname=`LocateFile $fname`
2340            for f in $fname ; do
2341                [ -e "$f" ] && echo $f
2342            done
2343        done
2344        read incoming
2345    done
2346}
2347
2348
2349
2350Prompt() {
2351    echo -en "$1"
2352    read line
2353}
2354
2355
2356
2357ReadLine() {
2358    local i incoming
2359    read incoming
2360    i=0
2361    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2362    i=$(($i+1))
2363    read incoming
2364    done
2365    echo "$incoming"
2366}
2367
2368
2369
2370RejigHyperlinks() {
2371    local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2372    minidir_root=$1
2373    noof_disks=$2
2374
2375    old_pwd=`pwd`
2376    diskno=1
2377    while [ "$diskno" -le "$noof_disks" ] ; do
2378    mkdir -p $minidir_root/$diskno
2379        cd $minidir_root/$diskno
2380        for fname in `find -type d -o -print` ; do
2381            [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2382        done
2383    diskno=$(($diskno+1))
2384    done
2385
2386
2387    cd $old_pwd
2388    return
2389
2390
2391
2392# do some awk/gawk stuff
2393    cd $minidir_root
2394    awk_loc=`find -name awk`
2395    gawk_loc=`find -name gawk`
2396    if [ "$awk_loc" = "" ] && [ "$gawk_loc" != "" ] ; then
2397        for i in $gawk_loc ; do HackAwk $i gawk ; done
2398    elif [ "$gawk_loc" = "" ] && [ "$awk_loc" != "" ] ; then
2399        for i in $awk_loc ; do HackAwk $i awk ; done
2400    elif [ "$gawk_loc" != "" ] && [ "$awk_loc" != "" ] ; then
2401        echo -en "Gawk/awk found. Good.\r"
2402    else
2403        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? :-)"
2404    fi
2405    cd $old_pwd
2406}
2407
2408
2409
2410EliminateRelatives() {
2411# eliminate /../../..... from path string
2412    local orig i old_i newo
2413    newo=$1
2414    while [ "`echo "$newo" | grep "\.\."`" ] ; do
2415        orig="`echo "$newo" | tr -s '/' '/'`"
2416#        echo "orig=$orig"
2417        newo="/"
2418        old_i=""
2419        for i in `echo "$orig" | tr '/' ' '` ; do
2420            if [ ! "$old_i" ] ; then
2421                old_i=$i
2422                continue
2423            fi
2424            if [ "$old_i" ] && [ "$i" = ".." ] ; then
2425                if [ "$old_i" = ".." ] ; then
2426                    newo="$newo"$old_i/
2427#                    echo "two --- $old_i $i"
2428                    old_i="$i"
2429                    continue
2430#                else
2431#                    echo "swallowing ($old_i $i)"
2432                fi
2433            elif [ "$old_i" != ".." ] ; then
2434                newo="$newo"$old_i/
2435            fi
2436            old_i=$i
2437        done
2438        newo="$newo"$i
2439    done
2440    echo "$newo"
2441}
2442
2443
2444WhatSoftlinkPointsTo() {
2445    local orig new resolved
2446        orig=$1
2447        new=`ls -l $orig | tr -s ' ' '\t' | $AWK '{printf $NF;}'`
2448        if [ "`echo "$new" | cut -d'/' -f1`" ] ; then
2449            resolved=`dirname $orig`/$new
2450        else
2451            resolved=$new
2452        fi
2453    EliminateRelatives $resolved
2454}
2455
2456
2457
2458
2459
2460ReplaceIndividualLine() {
2461    local orig_file new_file lino newstring lines_total lines_remaining
2462    orig_file=$1.orig
2463    mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2464    new_file=$1
2465    lino=$2
2466    newstring="$3"
2467    if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
2468    echo "Can't find string" >> $LOGFILE
2469    return 1
2470    fi
2471    lines_total=`wc -l $orig_file | gawk '{print $1;}'`
2472    lines_remaining=$(($lines_total-$lino))
2473    head -n$(($lino-1)) $orig_file > $new_file
2474    echo "$newstring" >> $new_file
2475    echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2476    tail -n$lines_remaining $orig_file >> $new_file
2477    echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2478#    cp -f $new_file /tmp/init.new
2479    [ -x "$orig_file" ] && chmod +x $new_file
2480    rm -f $orig_file
2481    return 0
2482}
2483
2484
2485
2486
2487ResolveSoftlink() {
2488    local resolved new
2489    resolved=$1
2490    while [ -h "$resolved" ] ; do
2491        resolved=`WhatSoftlinkPointsTo $resolved`
2492    done
2493    echo "$resolved"
2494}
2495
2496
2497
2498
2499ScanCDandTape() {
2500    local i
2501
2502    for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2503        dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2504    done
2505}
2506
2507
2508
2509SizeOfPartition() {
2510    local devpath drive res stub
2511    device=$1
2512    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2513    res=`SizeOfRaidPartition $device`
2514    [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2515    echo "$res"
2516    return 0
2517    fi
2518#    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/-//`
2519# patch from Bill <bill@iwizard.biz> - 2003/08/25
2520    res=`$FDISK -s $device`
2521    echo "------- $FDISK -l $device log ------------" >> $LOGFILE
2522    cat $FDISKLOG >> $LOGFILE
2523    echo "------- $FDISK log end ------------" >> $LOGFILE
2524# end patch
2525    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2526    [ "$res" = "" ] && res="-1"
2527    echo $res
2528    return 0
2529}
2530
2531
2532SizeOfRaidPartition() {
2533    local real_dev smallest_size silly tmp
2534
2535    silly=999999999
2536    smallest_size=$silly
2537
2538    for real_dev in `GetRaidDevMembers $1` ; do
2539    tmp=`SizeOfPartition $real_dev`
2540    [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2541    done
2542
2543    if [ "$smallest_size" = "$silly" ] ; then
2544    echo "-1"
2545    return 1
2546    else
2547    echo "$smallest_size"
2548    return 0
2549    fi
2550}
2551
2552
2553
2554
2555
2556
2557StripComments()
2558{
2559    local tempfile
2560    tempfile=$TMP_ROOT/$$.strip.txt
2561    cp -f $1 $tempfile
2562    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2563    rm -f $tempfile
2564    echo "Stripped comments from $2" >> $LOGFILE
2565}
2566
2567
2568
2569
2570
2571
2572SplitDirectoryIntoMinidirs() {
2573    local bigdir minidir_root i noof_disks old_pwd res
2574    bigdir=$1
2575    minidir_root=$2
2576    rm -Rf $minidir_root/*
2577
2578    TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2579    noof_disks=$?
2580    if [ "$noof_disks" -eq "0" ] ; then
2581    echo "Failed to fit data into several dirs."
2582        return 0
2583    fi
2584    RejigHyperlinks $minidir_root $noof_disks
2585    rm -Rf $bigdir/*
2586   return $noof_disks
2587}
2588
2589
2590
2591StripExecutable()
2592{
2593    local tmpfile
2594    tmpfile=$TMP_ROOT/stripped.$$.dat
2595    [ -d "$1" ] || [ -h "$1" ] && return
2596    cp -f $1 $tmpfile
2597    strip $tmpfile 2> /dev/null
2598    if [ "$?" -eq "0" ] ; then
2599    cp -f $tmpfile $1
2600    echo "Stripped binary $2" >> $LOGFILE
2601    fi
2602    rm -f $tmpfile
2603}
2604
2605
2606TemporarilyCompressAllFiles() {
2607    local i orig_fname out_fname out_list
2608
2609    i=0
2610    out_list=$2/compressed/compressed.txt
2611    mkdir -p $2/compressed
2612    > $out_list
2613    for orig_fname in $1 ; do
2614        out_fname=$2/compressed/$orig_fname.gz
2615        mkdir -p $out_fname 2> /dev/null
2616        rmdir $out_fname 2> /dev/null
2617        gzip -c6 $orig_fname > $out_fname 2> /dev/null
2618        i=$(((($i+1))%15))
2619        [ "$i" -eq "0" ] && echo -en "."
2620        du -sk $out_fname >> $out_list
2621    done
2622}
2623
2624
2625
2626TryToFindKernelPath() {
2627    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2628    we_want_version=`uname -r`
2629    possible_kernels=""
2630    duff_kernels=""
2631   
2632    if [ "$ARCH" = "ia64" ] ; then
2633       root="/boot/efi/efi"
2634    else
2635       root="/"
2636    fi
2637    for fname in `find $root -maxdepth 2 -type f | grep -F lin | grep -Ev '^/proc/|^/net/'` ; do
2638    [ ! -e "$fname" ] && continue
2639        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2640    file $fname | grep -q gzip
2641    if [ "$?" -eq "0" ] ; then
2642        # Used by ia64
2643            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2644    else
2645            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2646    fi
2647        [ "$fkern_ver" = "" ] && continue
2648#   echo "$fname --> $fkern_ver (but we want $we_want_version)" >> /dev/stderr
2649        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2650    [ -f "$fname" ] || continue
2651    [ -h "$fname" ] && continue
2652    kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2653    file $fname | grep -q gzip
2654    if [ "$?" -eq "0" ] ; then
2655        # Used by ia64
2656        if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2657            LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it...\n"
2658            duff_kernels="$fname $duff_kernels"
2659        else
2660                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2661                possible_kernels="$fname $possible_kernels"
2662        fi
2663    else
2664        if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2665            LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it...\n"
2666            duff_kernels="$fname $duff_kernels"
2667        else
2668                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2669                possible_kernels="$fname $possible_kernels"
2670        fi
2671    fi
2672    done
2673    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2674    possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2675    fi
2676    if [ ! "$possible_kernels" ] ; then
2677        LogIt "No kernel matches exactly. Are there any duff kernels?\n"
2678        possible_kernels="$duff_kernels"
2679        if [ ! "$possible_kernels" ] ; then
2680            LogIt "Sorry, no duff kernels either\n"
2681        else
2682            LogIt "I bet you're running Debian or Gentoo, aren't you?\n"
2683            LogIt "Your kernel doesn't have a sane builddate. Oh well...\n"
2684        fi
2685    fi
2686    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2687    noof_kernels=`CountItemsIn "$possible_kernels"`
2688    if [ "$noof_kernels" -eq "0" ] ; then
2689        LogIt "Could not find your kernel.\n"
2690    if [ -e "/boot/vmlinuz" ] ; then
2691        LogIt "Using /boot/vmlinuz as a last resort.\n"
2692        output=/boot/vmlinuz
2693        else
2694        output=""
2695    fi
2696    elif [ "$noof_kernels" -eq "1" ] ; then
2697        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2698        echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2699        output="$kernelpath"
2700    else
2701        for i in $possible_kernels ; do
2702            if echo $i | grep "`uname -r`" ; then
2703        LogIt "OK, I used my initiative and found that "
2704                LogIt "$i is probably your kernel.\n "
2705        output="$i"
2706        return
2707        fi
2708        done
2709    if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2710        output=/boot/vmlinuz
2711        echo "Schlomo, this one's for you." >> $LOGFILE
2712    else
2713            LogIt "Two or more possible kernels found. You may specify any one of them and the \n"
2714        LogIt "boot disks will still work, probably. If one does not work, try another.\n"
2715            LogIt "$possible_kernels\n"
2716            echo ""
2717    fi
2718    fi
2719    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2720}
2721
2722
2723
2724
2725
2726TryToFitDataIntoSeveralDirs() {
2727    local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2728    local i retval noof_disks total_files list_of_devs
2729    bigdir=$1
2730    minidir_root=$2
2731    BIG_CLUNKY_SIZE_COUNTER=0
2732    retval=0
2733    noof_disks=1
2734
2735    echo -en "\r                                                                            \rDividing data into several groups..."
2736    old_pwd=`pwd`
2737    cd $bigdir
2738    list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | grep -Fv "/dev/"`
2739    progress=0
2740    total_files=`CountItemsIn "$list_of_files"`
2741    if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2742        filesize=1
2743    fi
2744    mkdir -p $minidir_root/$noof_disks
2745    if [ -e "dev" ] ; then
2746        echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
2747        cp --parents -pRdf dev $minidir_root/$noof_disks
2748    fi
2749    TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2750    for filename in $list_of_files ; do
2751        AddFileToDir $filename $minidir_root $noof_disks
2752    i=$?
2753    if [ "$i" -gt "$noof_disks" ] ; then
2754        noof_disks=$i
2755        echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2756    fi
2757    if [ "$i" -eq "0" ] ; then
2758        LogIt "Cannot add file $filename to minidir $minidir_root\n"
2759        retval=$(($retval+1))
2760    fi
2761        progress=$(($progress+1))
2762    echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
2763    done
2764    cd $old_pwd
2765    echo -en "\rThe files have been subdivided into $noof_disks directories.                                                            \r"
2766    rm -Rf $minidir_root/compressed
2767    if [ "$retval" -gt "0" ] ; then
2768    return 0
2769    else
2770    return $noof_disks
2771    fi
2772}
2773
2774
2775
2776TurnTgzIntoRdz() {
2777    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
2778    tgz_dir_fname=$1
2779    rdz_fname=$2
2780    ramdisksize=$3
2781    disksize=$4
2782    kernelsize=$5
2783    maxsize=$(($disksize-$kernelsize))
2784    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2785    tempfile=$TMP_ROOT/temp.rd
2786    mountpoint=$TMP_ROOT/mnt1
2787    res=0
2788    echo -en "..."
2789    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2790    echo -en "..."
2791    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2792
2793    [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
2794    rm -f /tmp/mke2fs.$$
2795    echo -en "..."
2796    mkdir -p $mountpoint
2797    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."
2798    echo -en "..."
2799    old_pwd=`pwd`
2800    cd $mountpoint
2801#    [ -e "$MINDI_LIB/memtest.img" ] && echo "Yep, this is a multi-function CD" > MULTIFUNC
2802    cp -Rdf $tgz_dir_fname/* . 2>> $LOGFILE >> $LOGFILE
2803    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2804    cd dev || Die "Can't cd to dev"
2805    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2806    rm -f dev-entries.tgz
2807    cd ..
2808
2809# add insmod.static and insmod.static.old if (a) they exist and (b) this is a 64-bit distro
2810#    if [ "`uname -a | grep x86`" ] || [ "`uname -a | grep amd64`" ] ; then
2811
2812    for w in insmod.static insmod.static.old ; do
2813    s=`which $w 2> /dev/null`
2814    if [ -e "$s" ] ; then
2815        cp --parents -af $s .
2816#       LogIt "Copying $s to initrd"
2817    fi
2818    done
2819
2820#    fi
2821
2822    mkdir -p tmp
2823    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2824    for w in cdrom floppy groovy-stuff ; do
2825        mkdir -p mnt/$w
2826    done
2827    if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2828    ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2829    fi
2830    if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
2831    ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
2832    fi
2833
2834    lsmod > tmp/original-lsmod.txt
2835   
2836    cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
2837    cd $old_pwd
2838    echo -en "..."
2839    MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2840    echo -en "..."
2841    old_pwd=`pwd`
2842    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2843        cd $TMP_ROOT
2844        floppy_modules_path=lib/modules/$FAILSAFE_KVER
2845    else
2846        cd /
2847###
2848### Sq-Modification... Use kernel name in module path if specified.
2849###
2850        #floppy_modules_path=lib/modules/`uname -r`
2851        if [ "${kernelname}" != "" ]
2852        then
2853            floppy_modules_path=lib/modules/${kernelname}
2854        else
2855            floppy_modules_path=lib/modules/`uname -r`
2856        fi
2857###
2858### Sq-Modification end
2859###
2860    fi
2861    floppy_modules=""
2862    if [ "$disksize" -lt "2880" ] ; then
2863        list_of_groovy_mods="$FLOPPY_MODS $IDE_MODS ide-scsi sr_mod cdrom isocd isofs `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2864    else
2865        list_of_groovy_mods="$CDROM_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2866    fi
2867    if [ -e "$MONDO_TMP/NFS-DEV" ] ; then
2868        # For PXE boot
2869        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2870        # Here we need the net busybox
2871        mv $mountpoint/bin/busybox.net $mountpoint/bin/busybox
2872    else
2873        rm -f $mountpoint/bin/busybox.net
2874    fi
2875    [ -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"
2876    for i in $list_of_groovy_mods ; do
2877        floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2878    done
2879    for i in $floppy_modules ; do
2880        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2881        [ "$YOUR_KERNEL_SUCKS" ] && i=$TMP_ROOT/$i
2882        echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2883        cp -df $i $mountpoint/ || LogIt "Unable to copy $i to $mountpoint\n"
2884        [ "`echo "$i" | grep -F ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2885    done
2886#    if [ -e "/dev/.devfsd" ] ; then
2887#   echo "Copying devfs stuff to ramdisk" >> $LOGFILE
2888#   for i in /dev /etc/devfsd.conf /etc/modules.devfs /lib/dev-state ; do
2889#       cp --parents -pRdf $i $mountpoint/ 2>> $LOGFILE
2890#   done
2891#    fi
2892    if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2893        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2894        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2895        [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2896        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2897#        ls -l $mountpoint/sbin/devfsd &> /dev/null || Die "Can't find devfsd daemon on ramdisk"
2898        rm -f $mountpoint/sbin/devfsd
2899    fi
2900    cd $old_pwd
2901    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2902    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2903    rm -f $mountpoint/zero
2904    if [ "`DidMondoCallMe`" ] ; then
2905        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2906        cp -f $mountpoint/tmp/mondo-restore.cfg $MONDO_TMP &> /dev/null
2907        cp -f $TMP_ROOT/mountlist.txt $mountpoint/tmp/ || Die "Cannot copy mountlist to ramdisk"
2908        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2909        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2910        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2911        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2912        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2913    fi
2914    mkdir -p $mountpoint/tmp
2915    mkdir -p $mountpoint/proc
2916    echo "$disksize" > $mountpoint/tmp/$disksize.siz
2917    find $mountpoint -name CVS -exec rm -rf '{}' \;
2918    umount $mountpoint || Die "Cannot unmount $tempfile"
2919    dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2920#    gzip -9 $tempfile
2921#    mv $tempfile.gz $rdz_fname
2922    if [ "$res" -eq "0" ] ; then
2923        echo -en "..."
2924    else
2925        echo -en "\rMade an rdz WITH ERRORS.           \n"
2926    fi
2927    return 0
2928}
2929
2930
2931
2932WhichOfTheseModulesAreLoaded() {
2933    local modname loaded_modules
2934    loaded_modules=" `lsmod | tr -s ' ' '\t' | cut -f1 | grep -Fvx "Modules" | tr '\n' ' '` "
2935    for modname in $1 ; do
2936    [ "`echo "$loaded_modules" | grep -F " $modname "`" ] && echo "$modname"
2937    done
2938}
2939
2940
2941
2942
2943ZipMinidirsIntoTarballs() {
2944    local minidir_root tardir noof_disks diskno old_pwd i
2945    minidir_root=$1
2946    tardir=$2
2947    noof_disks=$3
2948
2949    echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2950    mkdir -p $tardir
2951    mkdir -p $minidir_root/all
2952    old_pwd=`pwd`
2953    diskno=1
2954    while [ "$diskno" -le "$noof_disks" ] ; do
2955        cd $minidir_root/$diskno || LogIt "Warning - cannot cd to $minidir_root/$diskno\n"
2956        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."
2957        diskno=$(($diskno+1))
2958        echo -n "..."
2959    cp -pRdf * $minidir_root/all
2960    done
2961    mkdir -p $minidir_root/all/tmp
2962    cd $minidir_root/all
2963    size_of_all_tools=`du -sk . | cut -f1`
2964    if [ "`DidMondoCallMe`" ] ; then
2965        for q in filelist.full.gz biggielist.txt ; do
2966            [ ! -e "$MONDO_TMP/$q" ] && Die "Cannot find $MONDO_TMP/$q"
2967            cp -pRdf $MONDO_TMP/$q tmp/
2968        done
2969        mkdir -p $minidir_root/all/tmp
2970        echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
2971        echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
2972    fi
2973    tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
2974    dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
2975    [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
2976    cd $old_pwd
2977    rm -Rf $minidir_root
2978    echo -e "$DONE"
2979}
2980
2981
2982
2983# BERLIOS: This function is wrong
2984# Should be recoded. Desactivated in between
2985
2986#ListUnsavedKernelModules() {
2987    #local fname modules
2988    #fname=/tmp/$RANDOM.$$.$RANDOM
2989    #lsmod | sed -n '2,$s/ .*//p' > $fname
2990    #modules=`sort $fname | uniq -d2 | tr '\n' ' '`
2991    #rm -f $fname
2992    #[ "$modules" ] && echo "Unsaved kernel modules: $modules" >> $LOGFILE
2993#}
2994
2995
2996
2997
2998
2999##############################################################################
3000#----------------------------------- main -----------------------------------#
3001##############################################################################
3002
3003
3004#AWK=`which gawk`
3005#LocateDeps $1
3006#MakeModuleLoadingScript /tmp/load-modules.sh
3007#exit 0
3008
3009
3010#cat /etc/mindi/deplist.txt | GenerateGiantDependencyList /tmp/deplist.old 200
3011#exit 0
3012
3013
3014
3015if [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3016    echo "mindi v$MINDI_VERSION"
3017    exit 0
3018fi
3019
3020> $LOGFILE
3021echo "mindi v$MINDI_VERSION" >> $LOGFILE
3022echo "$ARCH architecture detected" >> $LOGFILE
3023echo "mindi called with the following arguments:" >> $LOGFILE
3024echo "$@" >> $LOGFILE
3025
3026if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
3027    LogIt "Warning - Ancient distro detected.\n" 1
3028    ln -sf /etc/conf.modules /etc/modules.conf
3029fi
3030[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
3031
3032FindHomeOfMindiAndMondo
3033trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
3034AbortIfYourDistroIsAPieceOfStercus
3035[ "`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"
3036# If we have a 2.6 kernel, the system uses module-init-tools which means that we
3037# may have the modprobe configuration spread out across multiple files in
3038# directory /etc/modprobe.d. If this is the case we concatenate these files into
3039# a temporary file for further processing. Otherwise we continue in the standard
3040# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
3041# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
3042# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
3043if [ -d "/etc/modprobe.d" ] && [ `uname -r | cut -c1-3` == "2.6" ] ; then
3044  TMPMODPROBE_FLAG="Y"
3045else
3046  TMPMODPROBE_FLAG="N"
3047  [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
3048  [ ! -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..."
3049fi
3050FixPathIfBroken
3051[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
3052AbortIfMkfsVfatMissing
3053### BCO
3054### Fix as it's not mandatory on ia64
3055if [ "$ARCH" = "ia64" ] ; then
3056    FindELiloBinary
3057else
3058    FindIsolinuxBinary
3059    FindLiloBinary
3060fi
3061grep -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
3062rm -f /tmp/mindi_lo
3063trap "Aborted" SIGTERM
3064DONE="\r\t\t\t\t\t\t\t\tDone.         "
3065CHOPSIZE=240
3066BIGNO=0
3067MAX_COMPRESSED_SIZE=1300
3068imagesdir=/root/images/mindi
3069mkdir -p $imagesdir
3070kernelpath=""
3071MONDO_ROOT=/tmp/mindilinux/mondo-root
3072mkdir -p $MONDO_ROOT
3073
3074if [ -d "/proc/lvm" ]; then
3075    # LVM v1
3076    LVMCMD=""
3077    LVM="v1"
3078elif [ -d "/dev/mapper" ]; then
3079    # LVM v2
3080    LVMCMD="lvm"
3081    LVM="v2"
3082else
3083    LVM="false"
3084fi
3085
3086if [ "$#" -ge "2" ] ; then
3087    if [ "$1" = "--max-compressed-size" ] ; then
3088        MAX_COMPRESSED_SIZE=$2
3089        shift; shift
3090    fi
3091fi
3092
3093FLOPPY_WAS_MOUNTED=""
3094for mtpt in /media/floppy /mnt/floppy /floppy ; do
3095    if mount | grep -w $mtpt &> /dev/null ; then
3096        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3097        umount $mtpt
3098    fi
3099done
3100
3101if [ "$#" -ne "0" ] ; then
3102    if [ "$1" = "--findkernel" ] ; then
3103        res=`TryToFindKernelPath`
3104#    2> /dev/null`
3105        if [ "$res" = "" ] ; then
3106            exit 1
3107        else
3108            echo "$res"
3109            exit 0
3110        fi
3111    elif [ "$1" = "--makemountlist" ] ; then
3112        [ ! "$2" ] && Die "Please specify the output file"
3113        MakeMountlist $2
3114        exit $?
3115    elif [ "$1" = " --version" ] || [ "$1" = "-v" ] ; then
3116    echo "Mindi v$MINDI_VERSION"
3117        exit 0
3118    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3119    TMP_ROOT=$2
3120    MONDO_TMP=$2
3121    imagesdir=$3
3122    kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3123###
3124### Sq-Modification...
3125### Attempt to locate kernel specific module path
3126### if module path is found then use it other wise use uname -r to set it...
3127###
3128        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3129    LogIt "kernelname = $kernelname\n"
3130    LogIt "kernelpath = $kernelpath\n"
3131        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3132        then
3133           LogIt "Module path for ${kernelpath} not found...\n"
3134           LogIt "using running kernel\'s modules.\n"
3135           kernelname=`uname -r`
3136        else
3137           LogIt "Using modules for kernel: ${kernelname}\n"
3138        fi
3139###
3140### end of Sq-Modification
3141###
3142    TAPEDEV=$5
3143    TAPESIZE=$6
3144    FILES_IN_FILELIST=$7
3145    USE_LZO=$8
3146    CDRECOVERY=$9
3147        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3148            IMAGE_DEVS=""
3149        else
3150            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3151        fi
3152    if [ "${11}" ] ; then
3153        LILO_OPTIONS=""
3154#       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3155    fi
3156    LAST_FILELIST_NUMBER=${12}
3157        ESTIMATED_TOTAL_NOOF_SLICES=${13}
3158        EXCLUDE_DEVS="${14}"
3159        USE_COMP="${15}"
3160        USE_LILO="${16}"
3161    USE_STAR="${17}"
3162    INTERNAL_TAPE_BLOCK_SIZE="${18}"
3163        DIFFERENTIAL="${19}"
3164        NOT_BOOT="${20}"
3165        [ "$USE_COMP" = "" ] && USE_COMP=yes
3166        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3167    [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine.\n"
3168    [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3169        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3170        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3171        then
3172           LogIt "Module path for ${kernelpath} not found...\n"
3173           LogIt "using running kernel\'s modules.\n"
3174           kernelname=`uname -r`
3175        else
3176           LogIt "Using modules for kernel: ${kernelname}\n"
3177        fi
3178    [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
3179        MONDO_ROOT=`echo $imagesdir | sed 's/\(.*\)\/.*/\1/'`
3180    [ "$MONDO_ROOT" = "" ] && Die "MONDO_ROOT is undefined"
3181    else
3182    echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3183    exit 1
3184    fi
3185fi
3186#ScanCDandTape
3187[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3188if [ "$CDRECOVERY" = "yes" ] ; then
3189    iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
3190    sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
3191else
3192    iso_cfg_file=$MINDI_LIB/isolinux.cfg
3193    sys_cfg_file=$MINDI_LIB/syslinux.cfg
3194fi
3195
3196
3197
3198
3199#ReplaceIndividualLine /tmp/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" /tmp/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
3200#exit 0
3201
3202
3203#ListKernelModules
3204#exit 0
3205
3206
3207
3208
3209[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
3210rm -Rf $TMP_ROOT/mindilinux/*
3211TMP_ROOT=$TMP_ROOT/mindilinux/$$
3212mkdir -p $TMP_ROOT
3213mkdir -p $imagesdir
3214if [ ! "`DidMondoCallMe`" ] ; then
3215    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION\n"
3216    LogIt "Latest Mindi is available from http://www.mondorescue.org\n"
3217    LogIt "BusyBox sources are available from http://www.busybox.net\n"
3218    LogIt "------------------------------------------------------------------------------"
3219else
3220    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> /var/log/mondo-archive.log
3221fi
3222
3223# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
3224insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
3225for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3226    insmod $i >> $LOGFILE 2>> $LOGFILE
3227done
3228
3229FILE_CACHE=$TMP_ROOT/mindi-file-loc-cache
3230KERN_DISK_MADE=""
3231
3232echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3233echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3234echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3235if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3236    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else.\n"
3237    MakeMondoConfigFile $MONDO_TMP/mondo-restore.cfg
3238    MakeMountlist $MONDO_TMP/mountlist.txt
3239    mkdir -p $MONDO_TMP/small-all/tmp
3240    cd $MONDO_TMP/small-all
3241    cp -f $MONDO_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp || Die "Cannot copy small all.tar.gz"
3242    tar -cv tmp | gzip -9 > $MONDO_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
3243    sleep 2
3244    LogIt "Done. Exiting.\n"
3245    exit 0
3246fi
3247
3248if [ "$kernelpath" = "" ] ; then
3249    [ "`DidMondoCallMe`" ] && Die "Please use -k <path> to specify kernel."
3250    if [ $USE_OWN_KERNEL != "yes" ]; then
3251        echo -en "Do you want to use your own kernel to build the boot disk (y/n) ?"
3252        read ch
3253        if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3254            USE_OWN_KERNEL="yes"
3255        fi
3256    fi
3257    if [ "$USE_OWN_KERNEL" = "yes" ]; then
3258    YOUR_KERNEL_SUCKS=""
3259    kernelpath=`TryToFindKernelPath`
3260    if [ "$kernelpath" = "" ] ; then
3261        echo -n "Please enter kernel path : "
3262        read kernelpath
3263    fi
3264    else
3265    YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3266    fi
3267fi
3268if [ ! "`DidMondoCallMe`" ] ; then
3269    echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/n) ?"
3270    read ch
3271    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3272        USE_LILO=yes
3273    else
3274        USE_LILO=no
3275    fi
3276fi
3277if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3278    kernelpath=$MINDI_LIB/vmlinuz
3279    LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks.\n"
3280    LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
3281    LogIt "disks then it may still be a result of a problem with your kernel.\n"
3282    pwd=`pwd`
3283    cd $TMP_ROOT
3284    bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3285    cd $pwd
3286    YOUR_KERNEL_SUCKS="Your kernel sucks"
3287fi
3288echo -e "Mindi's temp dir = $TMP_ROOT \nMindi's output dir=$imagesdir" >> $LOGFILE
3289[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty...\n"
3290rm -f /tmp/mindi.err.*.tgz
3291
3292[ "$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."
3293
3294rm -f /root/images/mindi/{*img,*gz,*iso}
3295
3296PrepareDataDiskImages $imagesdir
3297noof_disks=$?
3298ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3299rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3300ramdisk_size=$rds
3301
3302echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
3303if [ "$USE_LILO" = "yes" ] ; then
3304    if [ "$ARCH" = "ia64" ] ; then
3305        PrepareBootDiskImage_LILO $imagesdir $IA64_BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
3306    else
3307        if ! PrepareBootDiskImage_LILO $imagesdir 1722 $kernelpath $ramdisk_size ; then
3308            LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3309            LogIt "if you want to make a 1.72MB floppy disk.\n"
3310        fi
3311        if ! PrepareBootDiskImage_LILO $imagesdir 2880 $kernelpath $ramdisk_size ;  then
3312            LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3313            LogIt "Please reduce your kernel's size\n"
3314            LogIt "if you want to make a 2.88MB floppy disk.\n"
3315            PrepareBootDiskImage_LILO $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
3316        fi
3317    fi
3318else
3319    if ! PrepareBootDiskImage_SYSLINUX $imagesdir 1722 $kernelpath $ramdisk_size ; then
3320        LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3321        LogIt "if you want to make a 1.72MB floppy disk.\n"
3322        if ! PrepareBootDiskImage_SYSLINUX $imagesdir 2880 $kernelpath $ramdisk_size ; then
3323            LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3324            LogIt "Please reduce your kernel's size\n"
3325            LogIt "if you want to make a 2.88MB floppy disk.\n"
3326            PrepareBootDiskImage_SYSLINUX $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
3327        fi
3328    fi
3329fi
3330
3331
3332
3333[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3334...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3335
3336
3337if [ ! "`DidMondoCallMe`" ] ; then
3338    ListImagesForUser $imagesdir
3339    boot_dev=/dev/fd0u1722
3340    [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3341    [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3342    [ ! -e "$boot_dev" ] && Die "Oh Lord, will you PLEASE tell the vendor to create the 1.72MB devices in /dev?"
3343    if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
3344        OfferToCopyImagesToDisks $imagesdir $boot_dev $FDDEVICE
3345    fi
3346    OfferToMakeBootableISO $imagesdir
3347    LogIt "Finished.\n"
3348elif [ "$TAPEDEV" ] ; then
3349    mkdir -p /root/images/mindi
3350    rm -f /root/images/mindi/{*img,*gz,*iso}
3351    OfferToMakeBootableISO $imagesdir
3352    if [ -e "$imagesdir/all.tar.gz" ] ; then
3353        cp -f $imagesdir/all.tar.gz $MONDO_TMP/
3354    else
3355    Die "Cannot find all.tar.gz, to be written to tape"
3356    fi
3357else
3358    OfferToMakeBootableISO $imagesdir
3359fi
3360if [ "$imagesdir" != "/root/images/mindi" ] ; then
3361    for i in `find $imagesdir -maxdepth 1 -name "*.iso" -o -name "*.img"` ; do
3362    cp -f $i /root/images/mindi || LogIt "[line 3260] Cannot copy $i to /root/images/mindi\n"
3363    done
3364fi
3365[ "$TMP_ROOT" != "/tmp" ] && rm -Rf $TMP_ROOT
3366# cleanup
3367rm -fR /tmp/mountlist.txt.$$ $FDISKLOG /tmp/mindilinux
3368LogIt "$FRIENDLY_OUTSTRING\n"
3369#ListUnsavedKernelModules
3370for mtpt in $FLOPPY_WAS_MOUNTED ; do
3371    mount $mtpt
3372done
3373echo "Mindi is exiting" >> $LOGFILE
3374exit 0
Note: See TracBrowser for help on using the repository browser.