source: branches/stable/mindi/mindi @ 523

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

Improvement of the LABEL + swap patch by Michel Loiseleur (<mloiseleur_at_linagora.com>)

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