source: branches/stable/mindi/mindi @ 862

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

Try again to fix the ReadAllLink? issue (libs do not go in the archive now as reported by Andree)

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