source: branches/stable/mindi/mindi @ 735

Last change on this file since 735 was 735, checked in by bruno, 13 years ago

Attempt to fix for Bug #8

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