source: branches/stable/mindi/mindi @ 860

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

Create function ReadAllLink? in mindi used by LocateFile? now to try to optimize it. Hope mindi will now get all libraries correctly

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