source: MondoRescue/branches/stable/mindi/mindi @ 859

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

remove a partial patch for x86_64: ldconfig is not needed. What is missing are the library files (symlinks). So rewrite of ProcessLDD.
deplost.txt updated accordingly.
LocateFile? in mindi has been replaced by readlink for all the usages linked to symlinks.

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