source: branches/stable/mindi/mindi @ 703

Last change on this file since 703 was 703, checked in by bcornec, 13 years ago

Some tabs for mindi

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