source: branches/stable/mindi/mindi @ 718

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

Some tabs for mindi (also test for new SVN repository on mondorescue.org)

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