source: branches/stable/mindi/mindi @ 744

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

With that version mindi --makemountlist works for RHEL4 + LVMv2 + LABEL

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