source: branches/2.2.0/mindi/mindi @ 885

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

merge -r881:884 $SVN_M/branches/stable

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