source: trunk/mindi/mindi @ 518

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

merge -r 506:516 $SVN_M/branches/stable

  • Property svn:keywords set to Rev Id
File size: 108.3 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 518 2006-04-30 23:42:39Z 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_SBIN/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 | grep -w "$current_partition" | 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    redhat_label=""
1397    if [ "`echo "$current_partition" | /bin/grep -f -i "LABEL="`" != "" ] ; then
1398        str_to_find_fmt_with=$current_partition
1399        redhat_label=`echo "$current_partition" | /bin/cut -d'=' -f2`
1400        actual_dev=""
1401
1402        # 1st try : blkid, the good way
1403        if [ -x "/sbin/blkid" ] ; then
1404            actual_dev=`/sbin/blkid | grep "$current_partition" | /bin/cut -d':' -f1`
1405        fi
1406        # 2nd try, which works on a standard partition (ext2/3), but not on swap
1407        if [ $actual_dev="" ] ; then
1408            actual_dev=`/bin/mount -l | /bin/grep " [$redhat_label]" | /bin/cut -d' ' -f1`
1409        fi
1410        # 3rd try, with vol_id (which works with swap)
1411        if [ $actual_dev="" -a -x "/sbin/vol_id" ] ; then
1412                list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | /bin/awk '{ print $1 }' `
1413                for dev_swap in $list_swaps ; do
1414                    dev_exists=`/sbin/vol_id $dev_swap | /bin/grep -f "$redhat_label"`
1415                    if [ -n "$dev_exists" ] ; then
1416                        actual_dev=$dev_swap
1417                        break;
1418                    fi
1419                done
1420        fi
1421        # 4th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice. e.g. : LABEL=SWAP-hda5
1422        if [ $actual_dev="" -a  "`echo "$current_partition" | /bin/grep -f -i "LABEL=SWAP"`" != ""] ; then
1423                actual_dev="/dev/`echo "$redhat_label" | /bin/cut -d '-' -f2`"
1424        fi
1425        # Check if one of all those tries has known success
1426        if [  $actual_dev != "" ] ; then
1427                current_partition=$actual_dev
1428        else
1429            Die "Your system uses a labelled swap partition, but you lack the tool to su
1430pport it.\nPlease replace swap labels with their correct devices in /etc/fstab\n"
1431        fi
1432    else
1433        str_to_find_fmt_with=$current_partition
1434    fi
1435
1436    partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1437    if [ -d "/proc/lvm" ] && [ "`lvdisplay $current_partition 2> /dev/null`" ] ; then
1438        partition_size="lvm"
1439    elif [ -d "/dev/mapper" ] && [ "`lvm lvdisplay $current_partition 2> /dev/null`" ] ; then
1440        partition_size="lvm"
1441    else
1442        partition_size=`SizeOfPartition $current_partition`
1443        [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1444        [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1445        if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1446        partition_size=`fgrep -v "Priority" /proc/swaps | tr -s '\t' ' ' | fgrep "$current_partition" | $AWK '{print $3}'`
1447        [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1448                [ "$partition_format" != "swap" ] && partition_format="swap"
1449        if [ "$partition_size" = "" ] ; then
1450            totalsize=0
1451            items=0
1452            for i in `tr -s ' ' '\t' < /proc/swaps | fgrep -v "Filename" | cut -f3` ; do
1453            totalsize=$(($totalsize+$i))
1454            items=$(($items+1))
1455            done
1456                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1457            [ "$partition_size" -lt "125000" ] && partition_size=125000
1458            echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1459        fi
1460        fi
1461    fi
1462    [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1463    [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1464    if [ "$partition_mountpt" = "" ] ; then
1465        if [ "`pvdisplay $current_partition 2> /dev/null`" != "" ] || [ "`lvm pvdisplay $current_partition 2> /dev/null`" != "" ] ; then
1466        if  [ "`fgrep device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1467            partition_mountpt="raid"
1468            partition_format="raid"
1469        else
1470#           lvm_dev="`pvdisplay $current_partition | grep -i "VG N" | head -n1 | tr -s ' ' ' ' | cut -d' ' -f3`"
1471            partition_mountpt="lvm"
1472            partition_format="lvm"
1473        fi
1474        fi
1475    fi
1476    psz=$partition_size
1477    echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1478    [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1479    if [ "`echo " $IMAGE_DEVS " | fgrep " $current_partition "`" != "" ] ; then
1480        partition_mountpt="image"
1481            old_partition_fmt=$partition_format
1482#       partition_format="`$FDISK -l 2>> $LOGFILE | tr -s '\t' ' ' | grep -w "$absolute_partition" | $AWK 'x=$(NF-1}'`"
1483        partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1484            echo "------- $FDISK -l log ------------" >> $LOGFILE
1485            cat $FDISKLOG >> $LOGFILE
1486            echo "------- $FDISK log end ------------" >> $LOGFILE
1487        partition_size=$(($partition_size+1)); # just in case
1488            if [ "$partition_format" = "Linux" ] ; then
1489                echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1490                echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1491                partition_format=$old_partition_fmt
1492            fi
1493    fi
1494        if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | fgrep " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1495            echo "Excluding $current_partition from mountlist" >> $LOGFILE
1496            continue
1497        fi
1498        if [ ! "$partition_mountpt" ] ; then
1499        for qq in "" `find /dev/ida/c*d* ! -name '*p*'` ; do
1500        partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1501                echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1502                cat $FDISKLOG >> $LOGFILE
1503                echo "------- $FDISK log end ------------" >> $LOGFILE
1504        [ "$partition_format" ] && break
1505        done
1506        if [ "$partition_format" = "Compaq diagnostics" ] ; then
1507        partition_format="compaq"
1508        elif [ ! "`fgrep device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1509        LogIt "Unable to find mountpoint of $current_partition - ignoring\n"
1510        continue
1511        fi
1512    fi
1513    partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1514    [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | awk '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1515    unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s\n" $current_partition $partition_mountpt $partition_format $psz`
1516    if [ "$current_partition" = "" ] ; then
1517        echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1518    elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1519        if [ "`fgrep device /etc/raidtab 2>/dev/null | fgrep $current_partition`" ] ; then
1520        partition_mountpt=raid
1521        partition_format=raid
1522            printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1523                printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1524        else
1525        echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1526        fi
1527        elif [ "$partition_format" = "" ] ; then
1528        echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1529    elif [ "$partition_size" = "" ] ; then
1530        echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1531    elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1532        continue
1533    else
1534            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1535                echo "Stupid bastard..." >> $LOGFILE
1536                partition_format="vfat"
1537            fi
1538        printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label"
1539        printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" >> $mountlist
1540    fi
1541    done
1542}
1543
1544
1545
1546
1547
1548
1549MakeSureNumberIsInteger() {
1550    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1551    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1552    echo "result = '$res'"
1553        Die "$1 should be an integer"
1554    fi
1555}
1556
1557
1558
1559
1560
1561MakeSyslinuxMessageFile() {
1562    mkdir -p $1
1563    rmdir $1
1564    echo -en "  " > $1
1565    if [ "`fgrep -i "debian" /etc/issue.net 2> /dev/null`" ] ; then
1566        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
1567    else
1568        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
1569    fi
1570    sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1571    rm -f $1.tmp
1572    if [ "$CDRECOVERY" != "yes" ] ; then
1573        if [ -e "$MONDO_TMP/start-nfs" ] ; then
1574            echo -en "Press <enter> to continue.\n" >> $1
1575        elif [ ! "$MONDO_TMP" ] ; then
1576            echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1577            if [ -e "$MINDI_LIB/memtest.img" ] ; then
1578                echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1579            fi
1580        else
1581            echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1582        fi
1583    else
1584        echo -en " \
1585To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1586CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1587    fi
1588}
1589
1590
1591
1592
1593MoveHyperlinkSensibly() {
1594    local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1595    filename=$1
1596    minidir_root=$2
1597    resides_on_diskno=$3
1598    noof_disks=$4
1599
1600    [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1601
1602    old_diskno=$resides_on_diskno
1603    d=1
1604    while [ "$d" -le "$noof_disks" ] ; do
1605        if [ "$d" -ne "$old_diskno" ] ; then
1606            old_pwd=`pwd`
1607            cd $minidir_root/$old_diskno
1608            cp --parents -Rdf $filename $minidir_root/$d/ || Die "Can't move $filename (sensibly) from $old_diskno to $d"
1609            rm -f $filename
1610            cd $old_pwd
1611        fi
1612# when the softlink is resolvable, our work here is done
1613        [ -e "$minidir_root/$d/$filename" ] && return 0
1614        old_diskno=$d
1615        d=$(($d+1))
1616    done
1617    return 1
1618}
1619
1620
1621
1622OfferToCopyImagesToDisks() {
1623    local imagesdir i imagename dev count boot_dev data_dev
1624    imagesdir=$1
1625    boot_dev=$2
1626    data_dev=$3
1627    echo -en "Would you like to create boot+data floppy disks now (y/n) ?"
1628    read i
1629    [ "$i" != "y" ] && [ "$i" != "Y" ] && return
1630    mount | fgrep /dev/fd > /dev/null && Die "Please unmount your floppies first."
1631    echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
1632    [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
1633    [ ! -e "$data_dev" ] && Die "Cannot find $data_dev - is your Linux distro broken?"
1634    i=`find $imagesdir -type f | fgrep "/mindi-root.1" 2> /dev/null`
1635    j=`find $imagesdir -type f | fgrep "/mindi-boot" | egrep -v '2880|5760'`
1636#    echo "i=$i"
1637#    echo "j=$j"
1638    if [ "$i" ] ; then
1639        CopyImageToDisk $j $data_dev "boot disk"
1640        CopyImageToDisk $i $data_dev "root disk"
1641    else
1642        CopyImageToDisk $j $boot_dev "boot/root disk"
1643    fi
1644    count=1
1645    for i in `find $imagesdir | fgrep mindi-data` ; do
1646        CopyImageToDisk $i $data_dev "data disk #$count"
1647        count=$(($count+1))
1648    done
1649}
1650
1651
1652
1653OfferToMakeBootableISO() {
1654    local i old_pwd
1655    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ ! "`DidMondoCallMe`" ] ; then
1656        echo -en "Shall I make a bootable CD image? (y/n) "
1657        read i
1658        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1659    fi
1660    if [ ! "$MONDO_TMP" ] ; then
1661        LogIt "NB: Mindi's bootable CD always uses isolinux.\n"
1662        LogIt "For a bootable CD w/LILO, please use Mondo.\n"
1663    fi
1664    rm -Rf $TMP_ROOT/iso
1665    mkdir -p $TMP_ROOT/iso/{images,archives,isolinux}
1666    cp -f $1/*.img $1/*.gz $TMP_ROOT/iso/images || LogIt "OfferToMakeBootableISO: Cannot copy $i to $TMP_ROOT/iso/images\n"
1667    old_pwd=`pwd`
1668    cd $TMP_ROOT/iso
1669    mkdir -p $MONDO_ROOT/iso/isolinux
1670    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1671    cp $MINDI_LIB/mem{test,disk}* $MONDO_ROOT 2>> $LOGFILE
1672    for i in memdisk memtest.bin memtest.img ; do
1673    j=$MINDI_LIB/$i
1674    k=$TMP_ROOT/iso/isolinux
1675    if [ -e "$j" ] ; then
1676        LogIt "Copying $j to $k\n"
1677        cp -f $j $k || Die "Failed to copy $j to $k"
1678        cp -f $j $TMP_ROOT || Die "Failed to copy $j to $k"
1679    fi
1680    done
1681    MakeSyslinuxMessageFile $TMP_ROOT/iso/isolinux/message.txt
1682    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?"
1683    cp $TMP_ROOT/mindi.rdz $TMP_ROOT/iso/isolinux/initrd.img
1684    cp $TMP_ROOT/mindi.rdz $imagesdir/initrd.img
1685    [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1686    cd $TMP_ROOT/iso/isolinux
1687    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?"
1688    if [ -e "$MONDO_TMP/start-nfs" ] ; then
1689    mv isolinux.cfg isolinux.cfg.old
1690    sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1691    fi
1692    if [ "$ARCH" != "ia64" ] ; then
1693        cp $ISOLINUX isolinux.bin || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
1694    cp $ISOLINUX ../
1695    fi
1696    cd $TMP_ROOT/iso
1697    if [ "$ARCH" != "ia64" ] ; then
1698        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?"
1699    fi
1700    [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun .   
1701    if [ -d "/home/MondoCD" ] ; then
1702    cp -pRdu /home/MondoCD/* .
1703    fi
1704    if [ "$ARCH" != "ia64" ] ; then
1705        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
1706    else
1707        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
1708    fi
1709    if [ "$?" -ne "0" ] ; then
1710    echo "----------- mkisofs's errors --------------" >> $LOGFILE
1711    cat /tmp/$$.mk >> $LOGFILE
1712    echo "mkisofs returned the following errors:-"
1713    cat /tmp/$$.mk
1714    LogIt "Failed to create ISO image.\n"
1715    else
1716    echo "Created bootable ISO image at $imagesdir/mindi.iso" >> $LOGFILE
1717    fi
1718    rm -f /tmp/$$.mk
1719    cd $old_pwd
1720}
1721
1722
1723
1724PluralOrNot() {
1725    [ "$1" -gt "1" ] && echo -en "s"
1726}
1727
1728
1729
1730
1731MakeMessageFile() {
1732    local disksize
1733    disksize=$1
1734    if [ "`fgrep -i "debian" /etc/issue.net 2> /dev/null`" ] ; then
1735        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`"/
1736    else
1737        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`/
1738    fi
1739    if [ "$disksize" -gt "2880" ] ; then
1740    if [ "`DidMondoCallMe`" ] ; then
1741        if [ "$CDRECOVERY" != "yes" ] ; then
1742            if [ -e "$MONDO_TMP/start-nfs" ] ; then
1743                echo -en "Press <enter> to continue.\n"
1744            elif [ ! "$MONDO_TMP" ] ; then
1745                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1746            else
1747                echo -en "$BOOT_MEDIA_MESSAGE"
1748            fi
1749        fi
1750    fi
1751    fi
1752    if [ "$CDRECOVERY" = "yes" ] ; then
1753        echo -en "\
1754To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1755CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1756    fi
1757    echo -en "\n\n\n"
1758}
1759
1760
1761
1762
1763write_full_floppy_of_kernel() {
1764    local mtpt image old_pwd res disksize
1765
1766    res=0
1767    old_pwd=`pwd`
1768    KERN_DISK_MADE=1
1769    disksize=$3
1770    rand1=$RANDOM
1771    rand2=$RANDOM
1772    image=/tmp/$rand1.$rand2.img
1773    mtpt=/tmp/$rand1.$rand2.mtpt
1774    dd if=/dev/zero of=$image bs=1k count=$disksize
1775    mke2fs -N 26 -F $image > /dev/null
1776    mkdir -p $mtpt
1777    mount -o loop $image $mtpt
1778    cd $mtpt
1779    mkdir -p {dev,tmp,boot}
1780    cp -f $1 vmlinuz
1781    if [ "$?" -ne "0" ] ; then
1782        LogIt "Failed to copy $1 to ramdisk\n"
1783        cd $old_pwd
1784        umount $mtpt
1785        rmdir $mtpt
1786        rm $image
1787        return 1
1788    fi
1789
1790    rdev vmlinuz 2,0
1791    rdev -R vmlinuz 0
1792    rdev -r vmlinuz 49152
1793
1794    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1795    losetup /dev/loop0 > /dev/null 2> /dev/null
1796    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1797    CopyBootBFile $mtpt/boot.b
1798
1799#    echo "root=/dev/loop0" > bdlilo.conf
1800    MakeLiloConfFile $disksize >> bdlilo.conf
1801
1802#    cat bdlilo.conf > /tmp/bdlilo.conf
1803
1804#    cat /home/mondostuff/bdlc > bdlilo.conf
1805
1806    chmod 644 bdlilo.conf
1807    MakeMessageFile $disksize > message
1808    lilo -v -C bdlilo.conf -r $mtpt
1809    res=$?
1810
1811#echo "lilo -v -C bdlilo.conf -r $mtpt"
1812#echo -en "Press enter"; read line
1813
1814    cd $old_pwd
1815    umount $mtpt
1816    mv -f $image $2
1817    rmdir $mtpt
1818
1819    return $res
1820
1821}
1822
1823
1824
1825
1826
1827
1828MakeLiloConfFile() {
1829    local disksize options i ooo
1830    disksize=$1
1831    options=""
1832        if [ "$ARCH" != "ia64" ] ; then
1833            echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1834        fi
1835        if [ "$disksize" -eq "2880" ] ; then
1836            echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1837        elif [ "$disksize" -eq "1722" ] ; then
1838            echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1839        elif [ "$disksize" -gt "2880" ] ; then
1840            /bin/true
1841        else
1842            echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1843        fi
1844        if [ "$ARCH" != "ia64" ] ; then
1845            echo -en "install=/boot.b\nmap=/boot.map\n"
1846        fi
1847    if [ "$CDRECOVERY" = "yes" ] ; then
1848        echo -en "default=RESTORE\n"
1849    elif [ "$disksize" -gt "2880" ] && [ "`DidMondoCallMe`" ] ; then
1850        if [ -e "$MONDO_TMP/start-nfs" ] ; then
1851            echo -en "default=iso\n"
1852        else
1853            echo -en "default=interactive\n"
1854        fi
1855    else
1856        echo -en "default=expert\n"
1857    fi
1858
1859    echo -en "prompt\n"
1860    if [ "$ARCH" != "ia64" ] ; then
1861        echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1862    fi
1863    if [ "$CDRECOVERY" != "yes" ] ; then
1864    echo -en "timeout=300\n"
1865    fi
1866    echo -en "\n"
1867    if [ "$CDRECOVERY" = "yes" ] ; then
1868    options="RESTORE expert"
1869    elif [ "$disksize" -gt "2880" ] ; then
1870        if [ "`DidMondoCallMe`" ] ; then
1871            if [ -e "$MONDO_TMP/start-nfs" ] ; then
1872                options="iso"
1873            else
1874                options="interactive expert compare iso nuke isonuke"
1875# hda hdb hdc hdd"
1876            fi
1877        else
1878            options="expert"
1879    fi
1880    else
1881        options="expert"
1882    fi
1883    for i in $options ; do
1884    ooo=$i
1885    [ "$ooo" = "RESTORE" ] && ooo="nuke"
1886    if [ "$ARCH" = "ia64" ] ; then
1887        rootpart="root=/dev/ram0\n\t"
1888    else
1889        rootpart=""
1890    fi
1891    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"
1892   
1893    outstr=$outstr" $ooo_mode"
1894    outstr=$outstr"\"\n"
1895    if [ "$disksize" = "1440" ] ; then
1896        echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1897    else
1898        echo -en "$outstr"
1899    fi
1900    done
1901}
1902
1903
1904
1905
1906PrepareBootDiskImage_LILO() {
1907    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1908    imagesdir=$1
1909    disksize=$2
1910    kernelpath=$3
1911    ramdisksize=$4
1912
1913    retval=0
1914    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1915    echo -en "Making "$disksize"KB boot disk..."
1916    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?"
1917    if [ "$ARCH" != "ia64" ] ; then
1918        [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
1919    fi
1920    echo -en "..."
1921    imagefile=$imagesdir/mindi-bootroot.$disksize.img
1922    mountpoint=$TMP_ROOT/mountpoint.$$
1923    mkdir -p $mountpoint
1924    dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
1925    if [ "$ARCH" = "ia64" ] ; then
1926        mkdosfs $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1927    t=vfat
1928    else
1929        mke2fs -N 26 -m 0 -F $imagefile > /tmp/mke2fs.$$ 2>> /tmp/mke2fs.$$
1930    t=ext2
1931    fi
1932    [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
1933    rm -f /tmp/mke2fs.$$
1934    mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
1935# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1936    mkdir -p $mountpoint/etc
1937    if [ "$ARCH" != "ia64" ] ; then
1938        liloconf=$mountpoint/etc/lilo.conf
1939    else
1940    liloconf=$mountpoint/elilo.conf
1941    fi
1942    old_pwd=`pwd`
1943    cd $mountpoint
1944    if [ "$ARCH" != "ia64" ] ; then
1945        tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n"
1946    fi
1947    cd $old_pwd
1948    losetup /dev/loop0 > /dev/null 2> /dev/null
1949    [ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing   'losetup /dev/loop0 -d'.\nReboot if necessary.\n"
1950    CopyBootBFile $mountpoint/boot.b
1951
1952    MakeLiloConfFile $disksize > $liloconf
1953
1954    echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint..." >> $LOGFILE
1955    cp -f $TMP_ROOT/mindi.rdz $mountpoint 2>> $LOGFILE
1956    if [ "$?" -ne "0" ] ; then
1957    LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
1958    cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
1959    LogIt "Please unload some of your modules and try again.\n"
1960    rm -f $TMP_ROOT/mtpt.$$
1961    LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
1962        retval=$(($retval+1))
1963    fi
1964    MakeMessageFile $disksize > $mountpoint/message
1965
1966    mkdir -p $mountpoint/tmp
1967    cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
1968    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1969        echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
1970        echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
1971#        echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
1972    fi
1973    if [ -d "/home/MondoCD" ] ; then
1974    cp -pRdu /home/MondoCD/* . || Die "Cannot do kung pow"
1975    fi
1976
1977# copy the kernel across
1978    rm -Rf $mountpoint/lost+found
1979    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1980    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1981    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
1982    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
1983    echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1984    du -sk $mountpoint/* >> $LOGFILE
1985    echo "--- end of list of files ---" >> $LOGFILE
1986    echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1987Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
1988        rm -f $mountpoint/vmlinuz
1989    cd $old_pwd
1990        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1991        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
1992#   losetup /dev/loop0 -d
1993    res=0
1994        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
1995    res=$(($res+$?))
1996        cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
1997    res=$(($res+$?))
1998    rm -f $imagefile
1999    if [ "$res" -ne "0" ]; then
2000        LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2001        rm -f $imagesdir/mindi-*.1440.img
2002    fi
2003    return $res
2004    fi
2005    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2006    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2007    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2008    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2009# make it bootable
2010    rm -f $mountpoint/zero
2011    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2012    if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
2013        if [ "$ARCH" != "ia64" ] ; then
2014        $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2015        else
2016            /bin/true
2017        fi
2018    elif [ ! "$KERN_DISK_MADE" ] ; then
2019# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
2020    $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2021    else
2022    echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
2023    fi
2024    if [ $? -ne "0" ] ; then
2025    if [ "`fgrep "/tmp/dev.0" $LOGFILE`" ] ; then
2026        LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's.\n"
2027        LogIt "Please reboot your PC as a workaround.\n"
2028        Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ.\n"
2029    fi
2030    echo "$LILO_EXE -r $mountpoint ...failed."
2031    echo -en "Press ENTER to continue."; read line
2032    LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug.\n"
2033    retval=$(($retval+1))
2034    fi
2035    cp -f $liloconf /tmp/lilo.conf
2036    if [ "$ARCH" = "ia64" ] ; then
2037        cp `dirname $kernelpath`/*.efi $mountpoint
2038    fi
2039    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2040    echo -en "..."
2041    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2042    if [ "$retval" -eq "0" ] ; then
2043        echo -en "...$DONE\r"
2044        if [ "$KERN_DISK_MADE" ] ; then
2045            LogIt "... $disksize KB boot disks were created OK\r"
2046        fi
2047    else
2048        echo -en "...failed\r"
2049        LogIt $disksize"KB boot disk was NOT created\r"
2050        rm -f $imagefile
2051    fi
2052    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2053    return $retval
2054}
2055
2056
2057
2058
2059PrepareBootDiskImage_SYSLINUX() {
2060    local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
2061    imagesdir=$1
2062    disksize=$2
2063    kernelpath=$3
2064    ramdisksize=$4
2065    do_boot_root_thingy=""
2066    local retval old_pwd
2067    retval=0
2068    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2069    echo -en "Making "$disksize"KB boot disk..."
2070    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?"
2071    [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "5760" ] && Die "PDBI - disksize is $disksize - bad size"
2072    echo -en "..."
2073    imagefile=$imagesdir/mindi-bootroot.$disksize.img
2074    mountpoint=$TMP_ROOT/mountpoint.$$
2075    mkdir -p $mountpoint
2076# If I format a 1722KB data file & run syslinux on it, the resultant image
2077# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
2078# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
2079# If I extract it, mount it, copy my files to it, etc. then the resultant
2080# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
2081# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
2082    if [ "$disksize" = "1722" ] ; then
2083        gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
2084    else
2085        dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
2086        mkfs.vfat $imagefile
2087        syslinux $imagefile
2088    fi
2089    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)\n\n"
2090# copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
2091    old_pwd=`pwd`
2092    MakeSyslinuxMessageFile $mountpoint/message.txt
2093    cd $mountpoint
2094    [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
2095#    tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz\n" <--- present for LILO; is it nec. for SYSLINUX too?
2096    cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
2097    if [ -e "$MONDO_TMP/start-nfs" ] ; then
2098        mv syslinux.cfg syslinux.cfg.orig
2099        sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
2100    fi
2101    cd $old_pwd
2102    echo "Copying $TMP_ROOT/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
2103    cp -f $TMP_ROOT/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
2104    if [ "$?" -ne "0" ] ; then
2105        LogIt "Failed to copy $TMP_ROOT/mindi.rdz to $mountpoint\n"
2106        cat $TMP_ROOT/mtpt.$$ >> $LOGFILE
2107        LogIt "Please unload some of your modules and try again.\n"
2108        rm -f $TMP_ROOT/mtpt.$$
2109        LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)\n"
2110        retval=$(($retval+1))
2111    fi
2112
2113    mkdir -p $mountpoint/tmp
2114    cp -f $TMP_ROOT/mondo-restore.cfg $mountpoint/tmp &> /dev/null
2115
2116# copy the kernel across
2117    rm -Rf $mountpoint/lost+found
2118    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2119    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2120    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2121    if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2122        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2123        du -sk $mountpoint/* >> $LOGFILE
2124        echo "--- end of list of files ---" >> $LOGFILE
2125        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2126Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2127        rm -f $mountpoint/vmlinuz
2128        cd $old_pwd
2129        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2130        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2131#   losetup /dev/loop0 -d
2132
2133        res=0
2134        write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2135        res=$(($res+$?))
2136        cp -f $TMP_ROOT/mindi.rdz $imagesdir/mindi-root.1440.img
2137        res=$(($res+$?))
2138        rm -f $imagefile
2139        if [ "$res" -ne "0" ]; then
2140            LogIt "Warning - failed to create 1.44MB boot/root floppies\n"
2141            rm -f $imagesdir/mindi-*.1440.img
2142        fi
2143        return $res
2144    fi
2145    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2146    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2147    echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2148    echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2149# make it bootable
2150    rm -f $mountpoint/zero
2151    mkdir -p $mountpoint/etc
2152    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint
2153    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2154    echo -en "..."
2155    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)\n"
2156
2157    if [ "$retval" -eq "0" ] ; then
2158        echo -en "...$DONE\r"
2159        if [ "$KERN_DISK_MADE" ] ; then
2160            rm -f $imagefile
2161            LogIt "... $disksize KB boot disks were created OK\r"
2162        fi
2163    else
2164        echo -en "...failed\r"
2165        LogIt $disksize"KB boot disk was NOT created\r"
2166        rm -f $imagefile
2167    fi
2168    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero\n"
2169    return $retval
2170}
2171
2172
2173
2174
2175PrepareDataDiskImages() {
2176    local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2177
2178    imagesdir=$1
2179    rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
2180    needlist=$TMP_ROOT/what-we-need.txt
2181    bigdir=$TMP_ROOT/bigdir
2182    minidir_root=$TMP_ROOT/minidir
2183    mkdir -p $minidir_root
2184    mkdir -p $bigdir/usr/bin
2185    tardir=$TMP_ROOT/tardir
2186
2187    lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt $DEPLIST_DIR/* | grep -vx "" | wc -l`
2188    cat $MINDI_CONF/deplist.txt $DEPLIST_DIR/* | GenerateGiantDependencyList $needlist $lines
2189    res=$?
2190    if [ "$YOUR_KERNEL_SUCKS" ]; then
2191    pwd=`pwd`
2192    cd $TMP_ROOT
2193        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2194        cp --parents -pRdf ./$i $bigdir || Die "PDDI can't cp $i->$bigdir"
2195        if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
2196        cp --parents -pRdf $i $bigdir
2197        else
2198        ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2199        BIGNO=$(($BIGNO+1))
2200        fi
2201    done
2202    for i in $EXTRA_MODS ; do
2203        j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
2204        [ ! "$j" ] && echo "Warning - cannot find failsafe module $i.o" >> $LOGFILE
2205        for k in $j ; do
2206        if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
2207            cp --parents -pRdf $k $bigdir
2208        else
2209            ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2210            BIGNO=$(($BIGNO+1))
2211        fi
2212        echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2213        done
2214    done
2215    cd $pwd
2216    else
2217    ListKernelModulePaths >> $needlist
2218    fi
2219    if [ "$res" -ne "0" ] ; then
2220        Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2221    fi
2222    FindAndAddUserKeyboardMappingFile
2223    mkdir -p $bigdir/tmp
2224    if [ "`DidMondoCallMe`" ] ; then
2225        MakeMondoConfigFile $TMP_ROOT/mondo-restore.cfg
2226        cp -f $TMP_ROOT/mondo-restore.cfg $bigdir/tmp &> /dev/null
2227        cp -f $TMP_ROOT/mondo-restore.cfg $CACHE_LOC &> /dev/null
2228    fi
2229    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2230    DropOptimizedLibraries $needlist $bigdir
2231    echo -en "Assembling dependency files"
2232    CopyDependenciesToDirectory < $needlist $bigdir
2233
2234# also copy io.sys and msdos.sys, if we can find them
2235    for i in `mount | cut -d' ' -f3` ; do
2236    for j in io.sys msdos.sys ; do
2237        [ -e "$i/$j" ] && cp -f $i/$j $bigdir
2238    done
2239    done
2240
2241# master boot record, too
2242    i=`cat $MONDO_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2243    if [ "$i" ] ; then
2244    LogIt "Backing up $i's MBR\n"
2245    dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2246# < < E O F
2247    sleep 1
2248    sync
2249#        [ "$?" -ne "0" ] && echo "Failed to save $i's MBR to bigdir" >> $LOGFILE
2250    j=$i
2251    [ -h "$j" ] && j=`ResolveSoftlink $j`
2252    LogIt "Creating /dev/boot_device ($j)\n"
2253    mkdir -p $bigdir/dev
2254    cp -pRdf $j $bigdir/dev/boot_device || Die "Unable to create /dev/boot_device on ramdisk"
2255    fi
2256
2257# more stuff
2258#    cp -f $MINDI_LIB/embleer* $bigdir
2259    old_pwd=`pwd`
2260    cd $bigdir
2261
2262    [ -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'."
2263    cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping aux-tools\n"
2264    if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
2265    tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "Warning - error occurred while unzipping x11-tools.tgz\n"
2266    fi
2267    if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2268        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2269        [ "$?" -ne "0" ] && [ "`DidMondoCallMe`" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2270    fi
2271    [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state .
2272    cd $old_pwd
2273    echo -e "$DONE"
2274    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2275    SplitDirectoryIntoMinidirs $bigdir $minidir_root
2276    noof_disks=$?
2277    [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2278    MakeMountlist $TMP_ROOT/mountlist.txt
2279    mkdir -p $minidir_root/$noof_disks/tmp
2280    cp -f $TMP_ROOT/mountlist.txt $minidir_root/$noof_disks/tmp/mountlist.txt || Die "Cannot copy mountlist.txt from $TMP_ROOT to data disk"
2281    cp -f $TMP_ROOT/mountlist.txt $CACHE_LOC
2282    [ "`DidMondoCallMe`" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MONDO_TMP/.
2283    [ -d "/proc/lvm" ] && $MINDI_SBIN/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2284    [ -d "/dev/mapper" ] && $MINDI_SBIN/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm
2285    cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2286    ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2287    CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2288    FRIENDLY_OUTSTRING="Boot and data disk images were created."
2289# One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
2290    rmdir $tardir $bigdir
2291    rm -f $needlist
2292    return $noof_disks
2293}
2294
2295
2296ProcessLDD() {
2297    local main_fname incoming j i fname f newf
2298    main_fname=$1
2299    read incoming
2300    while [ "$incoming" != "" ] ; do
2301        incoming=`echo "$incoming" | sed '/[[:blank:]]*.*[[:blank:]]*=>[[:blank:]]*(.*/d ; s/[[:blank:]]*\(.*\)[[:blank:]]*=>[[:blank:]]*\/.*/\1/ ; s/[[:blank:]]*\(\/.*\)[[:blank:]]*(.*/\1/'`
2302        for fname in `echo "$incoming"` ; do
2303            fname=`LocateFile $fname`
2304            for f in $fname ; do
2305                [ -e "$f" ] && echo $f
2306            done
2307        done
2308        read incoming
2309    done
2310}
2311
2312
2313
2314Prompt() {
2315    echo -en "$1"
2316    read line
2317}
2318
2319
2320
2321ReadLine() {
2322    local i incoming
2323    read incoming
2324    i=0
2325    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2326    i=$(($i+1))
2327    read incoming
2328    done
2329    echo "$incoming"
2330}
2331
2332
2333
2334RejigHyperlinks() {
2335    local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2336    minidir_root=$1
2337    noof_disks=$2
2338
2339    old_pwd=`pwd`
2340    diskno=1
2341    while [ "$diskno" -le "$noof_disks" ] ; do
2342    mkdir -p $minidir_root/$diskno
2343        cd $minidir_root/$diskno
2344        for fname in `find -type d -o -print` ; do
2345            [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2346        done
2347    diskno=$(($diskno+1))
2348    done
2349
2350
2351    cd $old_pwd
2352    return
2353
2354
2355
2356# do some awk/gawk stuff
2357    cd $minidir_root
2358    awk_loc=`find -name awk`
2359    gawk_loc=`find -name gawk`
2360    if [ "$awk_loc" = "" ] && [ "$gawk_loc" != "" ] ; then
2361        for i in $gawk_loc ; do HackAwk $i gawk ; done
2362    elif [ "$gawk_loc" = "" ] && [ "$awk_loc" != "" ] ; then
2363        for i in $awk_loc ; do HackAwk $i awk ; done
2364    elif [ "$gawk_loc" != "" ] && [ "$awk_loc" != "" ] ; then
2365        echo -en "Gawk/awk found. Good.\r"
2366    else
2367        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? :-)"
2368    fi
2369    cd $old_pwd
2370}
2371
2372
2373
2374EliminateRelatives() {
2375# eliminate /../../..... from path string
2376    local orig i old_i newo
2377    newo=$1
2378    while [ "`echo "$newo" | grep "\.\."`" ] ; do
2379        orig="`echo "$newo" | tr -s '/' '/'`"
2380#        echo "orig=$orig"
2381        newo="/"
2382        old_i=""
2383        for i in `echo "$orig" | tr '/' ' '` ; do
2384            if [ ! "$old_i" ] ; then
2385                old_i=$i
2386                continue
2387            fi
2388            if [ "$old_i" ] && [ "$i" = ".." ] ; then
2389                if [ "$old_i" = ".." ] ; then
2390                    newo="$newo"$old_i/
2391#                    echo "two --- $old_i $i"
2392                    old_i="$i"
2393                    continue
2394#                else
2395#                    echo "swallowing ($old_i $i)"
2396                fi
2397            elif [ "$old_i" != ".." ] ; then
2398                newo="$newo"$old_i/
2399            fi
2400            old_i=$i
2401        done
2402        newo="$newo"$i
2403    done
2404    echo "$newo"
2405}
2406
2407
2408WhatSoftlinkPointsTo() {
2409    local orig new resolved
2410        orig=$1
2411        new=`ls -l $orig | tr -s ' ' '\t' | $AWK '{printf $NF;}'`
2412        if [ "`echo "$new" | cut -d'/' -f1`" ] ; then
2413            resolved=`dirname $orig`/$new
2414        else
2415            resolved=$new
2416        fi
2417    EliminateRelatives $resolved
2418}
2419
2420
2421
2422
2423
2424ReplaceIndividualLine() {
2425    local orig_file new_file lino newstring lines_total lines_remaining
2426    orig_file=$1.orig
2427    mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2428    new_file=$1
2429    lino=$2
2430    newstring="$3"
2431    if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
2432    echo "Can't find string" >> $LOGFILE
2433    return 1
2434    fi
2435    lines_total=`wc -l $orig_file | gawk '{print $1;}'`
2436    lines_remaining=$(($lines_total-$lino))
2437    head -n$(($lino-1)) $orig_file > $new_file
2438    echo "$newstring" >> $new_file
2439    echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2440    tail -n$lines_remaining $orig_file >> $new_file
2441    echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2442#    cp -f $new_file /tmp/init.new
2443    [ -x "$orig_file" ] && chmod +x $new_file
2444    rm -f $orig_file
2445    return 0
2446}
2447
2448
2449
2450
2451ResolveSoftlink() {
2452    local resolved new
2453    resolved=$1
2454    while [ -h "$resolved" ] ; do
2455        resolved=`WhatSoftlinkPointsTo $resolved`
2456    done
2457    echo "$resolved"
2458}
2459
2460
2461
2462
2463ScanCDandTape() {
2464    local i
2465
2466    for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2467        dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2468    done
2469}
2470
2471
2472
2473SizeOfPartition() {
2474    local devpath drive res stub
2475    device=$1
2476    if [ "`echo "$device" | fgrep "/dev/md"`" != "" ] ; then
2477    res=`SizeOfRaidPartition $device`
2478    [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2479    echo "$res"
2480    return 0
2481    fi
2482#    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/-//`
2483# patch from Bill <bill@iwizard.biz> - 2003/08/25
2484    res=`$FDISK -s $device`
2485    echo "------- $FDISK -l $device log ------------" >> $LOGFILE
2486    cat $FDISKLOG >> $LOGFILE
2487    echo "------- $FDISK log end ------------" >> $LOGFILE
2488# end patch
2489    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | fgrep "$device " | cut -d' ' -f2`
2490    [ "$res" = "" ] && res="-1"
2491    echo $res
2492    return 0
2493}
2494
2495
2496SizeOfRaidPartition() {
2497    local real_dev smallest_size silly tmp
2498
2499    silly=999999999
2500    smallest_size=$silly
2501
2502    for real_dev in `GetRaidDevMembers $1` ; do
2503    tmp=`SizeOfPartition $real_dev`
2504    [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2505    done
2506
2507    if [ "$smallest_size" = "$silly" ] ; then
2508    echo "-1"
2509    return 1
2510    else
2511    echo "$smallest_size"
2512    return 0
2513    fi
2514}
2515
2516
2517
2518
2519
2520
2521StripComments()
2522{
2523    local tempfile
2524    tempfile=$TMP_ROOT/$$.strip.txt
2525    cp -f $1 $tempfile
2526    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2527    rm -f $tempfile
2528    echo "Stripped comments from $2" >> $LOGFILE
2529}
2530
2531
2532
2533
2534
2535
2536SplitDirectoryIntoMinidirs() {
2537    local bigdir minidir_root i noof_disks old_pwd res
2538    bigdir=$1
2539    minidir_root=$2
2540    rm -Rf $minidir_root/*
2541
2542    TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2543    noof_disks=$?
2544    if [ "$noof_disks" -eq "0" ] ; then
2545    echo "Failed to fit data into several dirs."
2546        return 0
2547    fi
2548    RejigHyperlinks $minidir_root $noof_disks
2549    rm -Rf $bigdir/*
2550   return $noof_disks
2551}
2552
2553
2554
2555StripExecutable()
2556{
2557    local tmpfile
2558    tmpfile=$TMP_ROOT/stripped.$$.dat
2559    [ -d "$1" ] || [ -h "$1" ] && return
2560    cp -f $1 $tmpfile
2561    strip $tmpfile 2> /dev/null
2562    if [ "$?" -eq "0" ] ; then
2563    cp -f $tmpfile $1
2564    echo "Stripped binary $2" >> $LOGFILE
2565    fi
2566    rm -f $tmpfile
2567}
2568
2569
2570TemporarilyCompressAllFiles() {
2571    local i orig_fname out_fname out_list
2572
2573    i=0
2574    out_list=$2/compressed/compressed.txt
2575    mkdir -p $2/compressed
2576    > $out_list
2577    for orig_fname in $1 ; do
2578        out_fname=$2/compressed/$orig_fname.gz
2579        mkdir -p $out_fname 2> /dev/null
2580        rmdir $out_fname 2> /dev/null
2581        gzip -c6 $orig_fname > $out_fname 2> /dev/null
2582        i=$(((($i+1))%15))
2583        [ "$i" -eq "0" ] && echo -en "."
2584        du -sk $out_fname >> $out_list
2585    done
2586}
2587
2588
2589
2590TryToFindKernelPath() {
2591    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2592    we_want_version=`uname -r`
2593    possible_kernels=""
2594    duff_kernels=""
2595   
2596    if [ "$ARCH" = "ia64" ] ; then
2597       root="/boot/efi/efi"
2598    else
2599       root="/"
2600    fi
2601    for fname in `find $root -maxdepth 2 -type f | fgrep lin | egrep -v '^/proc/|^/net/'` ; do
2602    [ ! -e "$fname" ] && continue
2603        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2604    file $fname | grep -q gzip
2605    if [ "$?" -eq "0" ] ; then
2606        # Used by ia64
2607            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2608    else
2609            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2610    fi
2611        [ "$fkern_ver" = "" ] && continue
2612#   echo "$fname --> $fkern_ver (but we want $we_want_version)" >> /dev/stderr
2613        [ "`echo "$fkern_ver" |fgrep "$we_want_version "`" = "" ] && continue
2614    [ -f "$fname" ] || continue
2615    [ -h "$fname" ] && continue
2616    kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2617    file $fname | grep -q gzip
2618    if [ "$?" -eq "0" ] ; then
2619        # Used by ia64
2620        if [ "`gzip -cd $fname | strings 2> /dev/null | fgrep "$kdate"`" = "" ] ; then
2621            LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it...\n"
2622            duff_kernels="$fname $duff_kernels"
2623        else
2624                [ "`echo "$fname" | fgrep "vmlinux"`" ] && continue
2625                possible_kernels="$fname $possible_kernels"
2626        fi
2627    else
2628        if [ "`strings $fname 2> /dev/null | fgrep "$kdate"`" = "" ] ; then
2629            LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it...\n"
2630            duff_kernels="$fname $duff_kernels"
2631        else
2632                [ "`echo "$fname" | fgrep "vmlinux"`" ] && continue
2633                possible_kernels="$fname $possible_kernels"
2634        fi
2635    fi
2636    done
2637    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2638    possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2639    fi
2640    if [ ! "$possible_kernels" ] ; then
2641        LogIt "No kernel matches exactly. Are there any duff kernels?\n"
2642        possible_kernels="$duff_kernels"
2643        if [ ! "$possible_kernels" ] ; then
2644            LogIt "Sorry, no duff kernels either\n"
2645        else
2646            LogIt "I bet you're running Debian or Gentoo, aren't you?\n"
2647            LogIt "Your kernel doesn't have a sane builddate. Oh well...\n"
2648        fi
2649    fi
2650    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2651    noof_kernels=`CountItemsIn "$possible_kernels"`
2652    if [ "$noof_kernels" -eq "0" ] ; then
2653        LogIt "Could not find your kernel.\n"
2654    if [ -e "/boot/vmlinuz" ] ; then
2655        LogIt "Using /boot/vmlinuz as a last resort.\n"
2656        output=/boot/vmlinuz
2657        else
2658        output=""
2659    fi
2660    elif [ "$noof_kernels" -eq "1" ] ; then
2661        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2662        echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2663        output="$kernelpath"
2664    else
2665        for i in $possible_kernels ; do
2666            if echo $i | grep "`uname -r`" ; then
2667        LogIt "OK, I used my initiative and found that "
2668                LogIt "$i is probably your kernel.\n "
2669        output="$i"
2670        return
2671        fi
2672        done
2673    if echo " $possible_kernels " | fgrep "/boot/vmlinuz " &> /dev/null ; then
2674        output=/boot/vmlinuz
2675        echo "Schlomo, this one's for you." >> $LOGFILE
2676    else
2677            LogIt "Two or more possible kernels found. You may specify any one of them and the \n"
2678        LogIt "boot disks will still work, probably. If one does not work, try another.\n"
2679            LogIt "$possible_kernels\n"
2680            echo ""
2681    fi
2682    fi
2683    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2684}
2685
2686
2687
2688
2689
2690TryToFitDataIntoSeveralDirs() {
2691    local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2692    local i retval noof_disks total_files list_of_devs
2693    bigdir=$1
2694    minidir_root=$2
2695    BIG_CLUNKY_SIZE_COUNTER=0
2696    retval=0
2697    noof_disks=1
2698
2699    echo -en "\r                                                                            \rDividing data into several groups..."
2700    old_pwd=`pwd`
2701    cd $bigdir
2702    list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | fgrep -v "/dev/"`
2703    progress=0
2704    total_files=`CountItemsIn "$list_of_files"`
2705    if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2706        filesize=1
2707    fi
2708    mkdir -p $minidir_root/$noof_disks
2709    if [ -e "dev" ] ; then
2710        echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
2711        cp --parents -pRdf dev $minidir_root/$noof_disks
2712    fi
2713    TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2714    for filename in $list_of_files ; do
2715        AddFileToDir $filename $minidir_root $noof_disks
2716    i=$?
2717    if [ "$i" -gt "$noof_disks" ] ; then
2718        noof_disks=$i
2719        echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2720    fi
2721    if [ "$i" -eq "0" ] ; then
2722        LogIt "Cannot add file $filename to minidir $minidir_root\n"
2723        retval=$(($retval+1))
2724    fi
2725        progress=$(($progress+1))
2726    echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
2727    done
2728    cd $old_pwd
2729    echo -en "\rThe files have been subdivided into $noof_disks directories.                                                            \r"
2730    rm -Rf $minidir_root/compressed
2731    if [ "$retval" -gt "0" ] ; then
2732    return 0
2733    else
2734    return $noof_disks
2735    fi
2736}
2737
2738
2739
2740TurnTgzIntoRdz() {
2741    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
2742    tgz_dir_fname=$1
2743    rdz_fname=$2
2744    ramdisksize=$3
2745    disksize=$4
2746    kernelsize=$5
2747    maxsize=$(($disksize-$kernelsize))
2748    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2749    tempfile=$TMP_ROOT/temp.rd
2750    mountpoint=$TMP_ROOT/mnt1
2751    res=0
2752    echo -en "..."
2753    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2754    echo -en "..."
2755    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2756
2757    [ "$?" -ne "0" ] && cat /tmp/mke2fs.$$
2758    rm -f /tmp/mke2fs.$$
2759    echo -en "..."
2760    mkdir -p $mountpoint
2761    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."
2762    echo -en "..."
2763    old_pwd=`pwd`
2764    cd $mountpoint
2765#    [ -e "$MINDI_LIB/memtest.img" ] && echo "Yep, this is a multi-function CD" > MULTIFUNC
2766    cp -Rdf $tgz_dir_fname/* . 2>> $LOGFILE >> $LOGFILE
2767    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2768    cd dev || Die "Can't cd to dev"
2769    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2770    rm -f dev-entries.tgz
2771    cd ..
2772
2773# add insmod.static and insmod.static.old if (a) they exist and (b) this is a 64-bit distro
2774#    if [ "`uname -a | grep x86`" ] || [ "`uname -a | grep amd64`" ] ; then
2775
2776    for w in insmod.static insmod.static.old ; do
2777    s=`which $w 2> /dev/null`
2778    if [ -e "$s" ] ; then
2779        cp --parents -af $s .
2780#       LogIt "Copying $s to initrd"
2781    fi
2782    done
2783
2784#    fi
2785
2786    mkdir -p tmp
2787    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2788    for w in cdrom floppy groovy-stuff ; do
2789        mkdir -p mnt/$w
2790    done
2791    if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2792    ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2793    fi
2794    if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
2795    ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
2796    fi
2797
2798    lsmod > tmp/original-lsmod.txt
2799   
2800    cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
2801    cd $old_pwd
2802    echo -en "..."
2803    MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2804    echo -en "..."
2805    old_pwd=`pwd`
2806    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2807    cd $TMP_ROOT
2808    floppy_modules_path=lib/modules/$FAILSAFE_KVER
2809    else
2810    cd /
2811###
2812### Sq-Modification... Use kernel name in module path if specified.
2813###
2814        #floppy_modules_path=lib/modules/`uname -r`
2815        if [ "${kernelname}" != "" ]
2816        then
2817          floppy_modules_path=lib/modules/${kernelname}
2818        else
2819          floppy_modules_path=lib/modules/`uname -r`
2820        fi
2821###
2822### Sq-Modification end
2823###
2824    fi
2825    floppy_modules=""
2826    if [ "$disksize" -lt "2880" ] ; then
2827        list_of_groovy_mods="$FLOPPY_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2828    else
2829        list_of_groovy_mods="$CDROM_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
2830    fi
2831    if [ -e "$MONDO_TMP/start-nfs" ] ; then
2832        cp -a $MONDO_TMP/start-nfs $mountpoint/sbin
2833        # For PXE boot
2834        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2835        # Here we need the net busybox
2836        mv $mountpoint/bin/busybox.net $mountpoint/bin/busybox
2837    else
2838        rm -f $mountpoint/bin/busybox.net
2839    fi
2840    [ -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"
2841    for i in $list_of_groovy_mods ; do
2842    floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2843    done
2844    for i in $floppy_modules ; do
2845        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2846    [ "$YOUR_KERNEL_SUCKS" ] && i=$TMP_ROOT/$i
2847    echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2848    cp -df $i $mountpoint/ || LogIt "Unable to copy $i to $mountpoint\n"
2849    [ "`echo "$i" | fgrep ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2850    done
2851#    if [ -e "/dev/.devfsd" ] ; then
2852#   echo "Copying devfs stuff to ramdisk" >> $LOGFILE
2853#   for i in /dev /etc/devfsd.conf /etc/modules.devfs /lib/dev-state ; do
2854#       cp --parents -pRdf $i $mountpoint/ 2>> $LOGFILE
2855#   done
2856#    fi
2857    if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2858        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2859        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2860        [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2861        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2862#        ls -l $mountpoint/sbin/devfsd &> /dev/null || Die "Can't find devfsd daemon on ramdisk"
2863        rm -f $mountpoint/sbin/devfsd
2864    fi
2865    cd $old_pwd
2866    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2867    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2868    rm -f $mountpoint/zero
2869    if [ "`DidMondoCallMe`" ] ; then
2870        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2871        cp -f $mountpoint/tmp/mondo-restore.cfg $MONDO_TMP &> /dev/null
2872        cp -f $TMP_ROOT/mountlist.txt $mountpoint/tmp/ || Die "Cannot copy mountlist to ramdisk"
2873        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2874        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2875        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2876        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2877        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2878    fi
2879    mkdir -p $mountpoint/tmp
2880    mkdir -p $mountpoint/proc
2881    echo "$disksize" > $mountpoint/tmp/$disksize.siz
2882    find $mountpoint -name CVS -exec rm -rf '{}' \;
2883    umount $mountpoint || Die "Cannot unmount $tempfile"
2884    dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2885#    gzip -9 $tempfile
2886#    mv $tempfile.gz $rdz_fname
2887    if [ "$res" -eq "0" ] ; then
2888        echo -en "..."
2889    else
2890        echo -en "\rMade an rdz WITH ERRORS.           \n"
2891    fi
2892    return 0
2893}
2894
2895
2896
2897WhichOfTheseModulesAreLoaded() {
2898    local modname loaded_modules
2899    loaded_modules=" `lsmod | tr -s ' ' '\t' | cut -f1 | fgrep -vx "Modules" | tr '\n' ' '` "
2900    for modname in $1 ; do
2901    [ "`echo "$loaded_modules" | fgrep " $modname "`" ] && echo "$modname"
2902    done
2903}
2904
2905
2906
2907
2908ZipMinidirsIntoTarballs() {
2909    local minidir_root tardir noof_disks diskno old_pwd i
2910    minidir_root=$1
2911    tardir=$2
2912    noof_disks=$3
2913
2914    echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2915    mkdir -p $tardir
2916    mkdir -p $minidir_root/all
2917    old_pwd=`pwd`
2918    diskno=1
2919    while [ "$diskno" -le "$noof_disks" ] ; do
2920        cd $minidir_root/$diskno || LogIt "Warning - cannot cd to $minidir_root/$diskno\n"
2921        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."
2922        diskno=$(($diskno+1))
2923        echo -n "..."
2924    cp -pRdf * $minidir_root/all
2925    done
2926    mkdir -p $minidir_root/all/tmp
2927    cd $minidir_root/all
2928    size_of_all_tools=`du -sk . | cut -f1`
2929    if [ "`DidMondoCallMe`" ] ; then
2930        for q in filelist.full.gz biggielist.txt ; do
2931            [ ! -e "$MONDO_TMP/$q" ] && Die "Cannot find $MONDO_TMP/$q"
2932            cp -pRdf $MONDO_TMP/$q tmp/
2933        done
2934        mkdir -p $minidir_root/all/tmp
2935        echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
2936        echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
2937    fi
2938    tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
2939    dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
2940    [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
2941    cd $old_pwd
2942    rm -Rf $minidir_root
2943    echo -e "$DONE"
2944}
2945
2946
2947
2948# BERLIOS: This function is wrong
2949# Should be recoded. Desactivated in between
2950
2951#ListUnsavedKernelModules() {
2952    #local fname modules
2953    #fname=/tmp/$RANDOM.$$.$RANDOM
2954    #lsmod | sed -n '2,$s/ .*//p' > $fname
2955    #modules=`sort $fname | uniq -d2 | tr '\n' ' '`
2956    #rm -f $fname
2957    #[ "$modules" ] && echo "Unsaved kernel modules: $modules" >> $LOGFILE
2958#}
2959
2960
2961
2962
2963
2964##############################################################################
2965#----------------------------------- main -----------------------------------#
2966##############################################################################
2967
2968
2969if [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2970    echo "mindi v$MINDI_VERSION"
2971    exit 0
2972fi
2973
2974> $LOGFILE
2975echo "mindi v$MINDI_VERSION" >> $LOGFILE
2976echo "$ARCH architecture detected" >> $LOGFILE
2977echo "mindi called with the following arguments:" >> $LOGFILE
2978echo "$@" >> $LOGFILE
2979
2980if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
2981    LogIt "Warning - Ancient distro detected.\n" 1
2982    ln -sf /etc/conf.modules /etc/modules.conf
2983fi
2984[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2985
2986FindHomeOfMindiAndMondo
2987trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2988AbortIfYourDistroIsAPieceOfStercus
2989[ "`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"
2990# If we have a 2.6 kernel, the system uses module-init-tools which means that we
2991# may have the modprobe configuration spread out across multiple files in
2992# directory /etc/modprobe.d. If this is the case we concatenate these files into
2993# a temporary file for further processing. Otherwise we continue in the standard
2994# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
2995# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
2996# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
2997if [ -d "/etc/modprobe.d" ] && [ `uname -r | cut -c1-3` == "2.6" ] ; then
2998  TMPMODPROBE_FLAG="Y"
2999else
3000  TMPMODPROBE_FLAG="N"
3001  [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
3002  [ ! -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..."
3003fi
3004FixPathIfBroken
3005[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | egrep "2\.[46]" | cut -d' ' -f1`
3006AbortIfMkfsVfatMissing
3007### BCO
3008### Fix as it's not mandatory on ia64
3009if [ "$ARCH" = "ia64" ] ; then
3010    FindELiloBinary
3011else
3012    FindIsolinuxBinary
3013    FindLiloBinary
3014fi
3015fgrep " $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
3016rm -f /tmp/mindi_lo
3017trap "Aborted" SIGTERM
3018DONE="\r\t\t\t\t\t\t\t\tDone.         "
3019CHOPSIZE=240
3020BIGNO=0
3021MAX_COMPRESSED_SIZE=1300
3022imagesdir=/root/images/mindi
3023mkdir -p $imagesdir
3024kernelpath=""
3025MONDO_ROOT=/tmp/mindilinux/mondo-root
3026mkdir -p $MONDO_ROOT
3027
3028if [ "$#" -ge "2" ] ; then
3029    if [ "$1" = "--max-compressed-size" ] ; then
3030        MAX_COMPRESSED_SIZE=$2
3031        shift; shift
3032    fi
3033fi
3034
3035FLOPPY_WAS_MOUNTED=""
3036for mtpt in /media/floppy /mnt/floppy /floppy ; do
3037    if mount | grep -w $mtpt &> /dev/null ; then
3038        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3039        umount $mtpt
3040    fi
3041done
3042
3043if [ "$#" -ne "0" ] ; then
3044    if [ "$1" = "--findkernel" ] ; then
3045        res=`TryToFindKernelPath`
3046#    2> /dev/null`
3047        if [ "$res" = "" ] ; then
3048            exit 1
3049        else
3050            echo "$res"
3051            exit 0
3052        fi
3053    elif [ "$1" = "--makemountlist" ] ; then
3054        [ ! "$2" ] && Die "Please specify the output file"
3055        MakeMountlist $2
3056        exit $?
3057    elif [ "$1" = " --version" ] || [ "$1" = "-v" ] ; then
3058    echo "Mindi v$MINDI_VERSION"
3059        exit 0
3060    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3061    TMP_ROOT=$2
3062    MONDO_TMP=$2
3063    imagesdir=$3
3064    kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3065###
3066### Sq-Modification...
3067### Attempt to locate kernel specific module path
3068### if module path is found then use it other wise use uname -r to set it...
3069###
3070        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3071    LogIt "kernelname = $kernelname\n"
3072    LogIt "kernelpath = $kernelpath\n"
3073        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3074        then
3075           LogIt "Module path for ${kernelpath} not found...\n"
3076           LogIt "using running kernel\'s modules.\n"
3077           kernelname=`uname -r`
3078        else
3079           LogIt "Using modules for kernel: ${kernelname}\n"
3080        fi
3081###
3082### end of Sq-Modification
3083###
3084    TAPEDEV=$5
3085    TAPESIZE=$6
3086    FILES_IN_FILELIST=$7
3087    USE_LZO=$8
3088    CDRECOVERY=$9
3089        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3090            IMAGE_DEVS=""
3091        else
3092            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3093        fi
3094    if [ "${11}" ] ; then
3095        LILO_OPTIONS=""
3096#       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3097    fi
3098    LAST_FILELIST_NUMBER=${12}
3099        ESTIMATED_TOTAL_NOOF_SLICES=${13}
3100        EXCLUDE_DEVS="${14}"
3101        USE_COMP="${15}"
3102        USE_LILO="${16}"
3103    USE_STAR="${17}"
3104    INTERNAL_TAPE_BLOCK_SIZE="${18}"
3105        DIFFERENTIAL="${19}"
3106        NOT_BOOT="${20}"
3107        [ "$USE_COMP" = "" ] && USE_COMP=yes
3108        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3109    [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine.\n"
3110    [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3111        kernelname=`echo $kernelpath | cut -d'-' -f2-`
3112        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3113        then
3114           LogIt "Module path for ${kernelpath} not found...\n"
3115           LogIt "using running kernel\'s modules.\n"
3116           kernelname=`uname -r`
3117        else
3118           LogIt "Using modules for kernel: ${kernelname}\n"
3119        fi
3120    [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
3121        MONDO_ROOT=`echo $imagesdir | sed 's/\(.*\)\/.*/\1/'`
3122    [ "$MONDO_ROOT" = "" ] && Die "MONDO_ROOT is undefined"
3123    else
3124    echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3125    exit 1
3126    fi
3127fi
3128#ScanCDandTape
3129[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3130if [ "$CDRECOVERY" = "yes" ] ; then
3131    iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
3132    sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
3133else
3134    iso_cfg_file=$MINDI_LIB/isolinux.cfg
3135    sys_cfg_file=$MINDI_LIB/syslinux.cfg
3136fi
3137
3138
3139
3140
3141#ReplaceIndividualLine /tmp/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" /tmp/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
3142#exit 0
3143
3144
3145#ListKernelModules
3146#exit 0
3147
3148
3149
3150
3151[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
3152rm -Rf $TMP_ROOT/mindilinux/*
3153TMP_ROOT=$TMP_ROOT/mindilinux/$$
3154mkdir -p $TMP_ROOT
3155mkdir -p $imagesdir
3156if [ ! "`DidMondoCallMe`" ] ; then
3157    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION\n"
3158    LogIt "Latest Mindi is available from http://mondorescue.berlios.de\n"
3159    LogIt "BusyBox sources are available from http://www.busybox.net\n"
3160    LogIt "------------------------------------------------------------------------------"
3161else
3162    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> /var/log/mondo-archive.log
3163fi
3164
3165# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
3166insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
3167for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3168    insmod $i >> $LOGFILE 2>> $LOGFILE
3169done
3170
3171FILE_CACHE=$TMP_ROOT/mindi-file-loc-cache
3172KERN_DISK_MADE=""
3173
3174echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3175echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3176echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3177if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3178    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else.\n"
3179    MakeMondoConfigFile $MONDO_TMP/mondo-restore.cfg
3180    MakeMountlist $MONDO_TMP/mountlist.txt
3181    mkdir -p $MONDO_TMP/small-all/tmp
3182    cd $MONDO_TMP/small-all
3183    cp -f $MONDO_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp || Die "Cannot copy small all.tar.gz"
3184    tar -cv tmp | gzip -9 > $MONDO_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
3185    sleep 2
3186    LogIt "Done. Exiting.\n"
3187    exit 0
3188fi
3189
3190if [ "$kernelpath" = "" ] ; then
3191    [ "`DidMondoCallMe`" ] && Die "Please use -k <path> to specify kernel."
3192    if [ $USE_OWN_KERNEL != "yes" ]; then
3193        echo -en "Do you want to use your own kernel to build the boot disk (y/n) ?"
3194        read ch
3195        if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3196            USE_OWN_KERNEL="yes"
3197        fi
3198    fi
3199    if [ "$USE_OWN_KERNEL" = "yes" ]; then
3200    YOUR_KERNEL_SUCKS=""
3201    kernelpath=`TryToFindKernelPath`
3202    if [ "$kernelpath" = "" ] ; then
3203        echo -n "Please enter kernel path : "
3204        read kernelpath
3205    fi
3206    else
3207    YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3208    fi
3209fi
3210if [ ! "`DidMondoCallMe`" ] ; then
3211    echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/n) ?"
3212    read ch
3213    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3214        USE_LILO=yes
3215    else
3216        USE_LILO=no
3217    fi
3218fi
3219if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3220    kernelpath=$MINDI_LIB/vmlinuz
3221    LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks.\n"
3222    LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
3223    LogIt "disks then it may still be a result of a problem with your kernel.\n"
3224    pwd=`pwd`
3225    cd $TMP_ROOT
3226    bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3227    cd $pwd
3228    YOUR_KERNEL_SUCKS="Your kernel sucks"
3229fi
3230echo -e "Mindi's temp dir = $TMP_ROOT \nMindi's output dir=$imagesdir" >> $LOGFILE
3231[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty...\n"
3232rm -f /tmp/mindi.err.*.tgz
3233
3234[ "$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."
3235
3236rm -f /root/images/mindi/{*img,*gz,*iso}
3237
3238PrepareDataDiskImages $imagesdir
3239noof_disks=$?
3240ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3241rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3242ramdisk_size=$rds
3243
3244echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
3245if [ "$USE_LILO" = "yes" ] ; then
3246    if [ "$ARCH" = "ia64" ] ; then
3247        PrepareBootDiskImage_LILO $imagesdir $IA64_BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
3248    else
3249        if ! PrepareBootDiskImage_LILO $imagesdir 1722 $kernelpath $ramdisk_size ; then
3250            LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3251            LogIt "if you want to make a 1.72MB floppy disk.\n"
3252        fi
3253        if ! PrepareBootDiskImage_LILO $imagesdir 2880 $kernelpath $ramdisk_size ;  then
3254            LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3255            LogIt "Please reduce your kernel's size\n"
3256            LogIt "if you want to make a 2.88MB floppy disk.\n"
3257            PrepareBootDiskImage_LILO $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
3258        fi
3259    fi
3260else
3261    if ! PrepareBootDiskImage_SYSLINUX $imagesdir 1722 $kernelpath $ramdisk_size ; then
3262        LogIt "Warning - failed to create 1.72MB boot image. Please reduce your kernel's size\n"
3263        LogIt "if you want to make a 1.72MB floppy disk.\n"
3264        if ! PrepareBootDiskImage_SYSLINUX $imagesdir 2880 $kernelpath $ramdisk_size ; then
3265            LogIt "Warning - failed to create 2.88MB floppy disk image.\n"
3266            LogIt "Please reduce your kernel's size\n"
3267            LogIt "if you want to make a 2.88MB floppy disk.\n"
3268            PrepareBootDiskImage_SYSLINUX $imagesdir 5760 $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
3269        fi
3270    fi
3271fi
3272
3273
3274
3275[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3276...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3277
3278
3279if [ ! "`DidMondoCallMe`" ] ; then
3280    ListImagesForUser $imagesdir
3281    boot_dev=/dev/fd0u1722
3282    [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3283    [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3284    [ ! -e "$boot_dev" ] && Die "Oh Lord, will you PLEASE tell the vendor to create the 1.72MB devices in /dev?"
3285    if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
3286        OfferToCopyImagesToDisks $imagesdir $boot_dev $FDDEVICE
3287    fi
3288    OfferToMakeBootableISO $imagesdir
3289    LogIt "Finished.\n"
3290elif [ "$TAPEDEV" ] ; then
3291    mkdir -p /root/images/mindi
3292    rm -f /root/images/mindi/{*img,*gz,*iso}
3293    OfferToMakeBootableISO $imagesdir
3294    if [ -e "$imagesdir/all.tar.gz" ] ; then
3295        cp -f $imagesdir/all.tar.gz $MONDO_TMP/
3296    else
3297    Die "Cannot find all.tar.gz, to be written to tape"
3298    fi
3299else
3300    OfferToMakeBootableISO $imagesdir
3301fi
3302if [ "$imagesdir" != "/root/images/mindi" ] ; then
3303    for i in `find $imagesdir -maxdepth 1 -name "*.iso" -o -name "*.img"` ; do
3304    cp -f $i /root/images/mindi || LogIt "[line 3260] Cannot copy $i to /root/images/mindi\n"
3305    done
3306fi
3307[ "$TMP_ROOT" != "/tmp" ] && rm -Rf $TMP_ROOT
3308# cleanup
3309rm -f /tmp/mountlist.txt.$$ $FDISKLOG /tmp/mindilinux
3310LogIt "$FRIENDLY_OUTSTRING\n"
3311#ListUnsavedKernelModules
3312for mtpt in $FLOPPY_WAS_MOUNTED ; do
3313    mount $mtpt
3314done
3315echo "Mindi is exiting" >> $LOGFILE
3316exit 0
Note: See TracBrowser for help on using the repository browser.