source: branches/stable/mindi/mindi @ 692

Last change on this file since 692 was 692, checked in by bcornec, 13 years ago

Tries to fix bug on RHEL4 with Adaptec Zero-Channel RAID Cards
(Bug #6455 https://developer.berlios.de/bugs/?func=detailbug&bug_id=6455&group_id=2524)

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