source: branches/stable/mindi/mindi @ 745

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

Still on LVM !!

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