source: branches/2.2.9/mindi/mindi @ 2169

Last change on this file since 2169 was 2169, checked in by Bruno Cornec, 11 years ago
  • Fix ide-gd_mod
  • Adds support for additional Intel Network driver e1000e
  • Property svn:keywords set to Rev Id
File size: 103.6 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 2169 2009-03-25 00:05:43Z bruno $
4#
5#-----------------------------------------------------------------------------
6# mindi - mini-Linux distro based on the user's filesystem & distribution
7#
8# Mindi can create a multi-image boot/root kit. The first image 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)
16ARCH=`/bin/uname -m`
17
18ADDITIONAL_BOOT_PARAMS="devfs=nomount noresume selinux=0 barrier=off"
19
20MINDI_REV=PBREV
21MINDI_VER=PBVER
22
23MINDI_VERSION=${MINDI_VER}-r$MINDI_REV
24MINDI_PREFIX=XXX
25MINDI_CONF=YYY
26MINDI_SBIN=${MINDI_PREFIX}/sbin
27MINDI_LIB=LLL
28
29# Temporary directory for mindi
30TMPDIR=/tmp
31
32EXTRA_SPACE=49152       # increase if you run out of ramdisk space
33BOOT_SIZE=16384         # size of the boot disk
34
35PROMPT_MAKE_CD_IMAGE="yes"
36    # Ask if you want to make a CD Image to be written?
37    # if this is set to 'no', then the image will be created automatically
38
39PROMPT_MAKE_USB_IMAGE="yes"
40    # Ask if you want to make a USB Image to be written?
41    # if this is set to 'no', then the image will be created automatically
42
43USE_OWN_KERNEL="yes"
44    # If set to "no", you will be prompted for whether or not
45    # you want to use your own kernel, or the supplied default.
46    # If "yes" mindi will automatically use your own kernel.
47
48MY_FSTAB=/etc/fstab
49TAPE_MODS="ht st osst ide-tape ide_tape"
50SCSI_MODS="3w-xxxx 3w_xxxx 3w_9xxx 3w-9xxx 53c7,8xx a100u2w a320raid aacraid adpahci advansys aha152x aha1542 aha1740 aic79xx aic79xx_mod aic7xxx aic7xxx_mod aic7xxx_old AM53C974 atp870u BusLogic cciss cpqfc dmx3191d dpt_i2o dtc eata eata_dma eata_pio fdomain gdth g_NCR5380 i2o_block i2o_core ide-scsi ieee1394 imm in2000 initio ips iscsi iscsi_tcp libiscsi scsi_transport_iscsi isp megaraid megaraid_mm megaraid_mbox megaraid_sas mptbase mptscsih mptsas mptspi mptfc mptscsi mptctl NCR53c406a ncr53c8xx nsp32 pas16 pci2000 pci2220i pcmcia ppa psi240i qla1280 qla2200 qla2300 qla2400 qla2xxx qla2xxx_conf qlogicfas qlogicfc qlogicisp qlogicfas qlogicfas408 raw1394 scsi_mod scsi_transport_sas scsi_transport_spi scsi_transport_fc sd_mod crc_t10dif crc-t10dif seagate sg sim710 sr_mod sym53c416 sym53c8xx sym53c8xx_2 t128 tmscsim u14-34f ultrastor wd7000 vmhgfs intermodule scsi_dh scsi_tgt emcpdm emcpgpx emcpmpx emcp dc395x"
51
52# ide-probe-mod
53IDE_MODS="ide ide-floppy floppy ide-generic ide-detect ide-mod ide-disk ide_disk ide-cd ide_cd ide_cd_mod ide-cd_mod ide-cs ide-core ide_core ide-gd_mod edd paride ata_generic ata_piix libata dock via82cxxx generic nvidia ahci sata_nv cmd64x pata_amd pata_marvell pata_serverworks pata_sis amd74xx sis5513 jmicron sata_promise sata_via serverworks"
54PCMCIA_MODS="pcmcia_core ds yenta_socket"
55USB_MODS="usb-storage usb-ohci usb-uhci usbcore usb_storage input hid uhci_hcd ehci_hcd uhci-hcd ehci-hcd ohci-hcd ohci_hcd usbkbd usbhid keybdev mousedev libusual scsi_mod ff-memless"
56NET_MODS="sunrpc nfs nfs_acl lockd fscache loop mii 3c59x e100 bcm5700 bnx2 e1000 e1000e eepro100 ne2k-pci tg3 libphy pcnet32 8139cp 8139too 8390 forcedeth vmxnet vmnet exportfs"
57CDROM_MODS="$TAPE_MODS $IDE_MODS $USB_MODS $PCMCIA_MODS $SCSI_MODS $NET_MODS af_packet cdrom isocd isofs inflate_fs nls_iso8859-1 nls_base nls_cp437 nls_utf8 sg sr_mod zlib_inflate iso9660"
58# Those modules will only go on the backup media, not the boot media.
59EXTRA_MODS="$CDROM_MODS vfat fat loop md-mod linear raid0 raid1 xor raid10 raid5 raid456 lvm-mod dm-mod dm_mod dm-snapshot dm_snapshot dm-zero dm_zero dm-mirror dm_mirror dm-multipath dm-round-robin dm-emc dm-hp-sw dm-rdac multipath jfs xfs xfs_support pagebuf reiserfs ext2 ext3 minix nfs nfs_acl nfsd lockd sunrpc jbd mbcache ext4 jbd2 crc16 fuse"
60# Replace with that line for HP OCMP e.g.
61#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
62DENY_MODS="kqemu"
63# Force some modules to be included
64FORCE_MODS=""
65
66LOGFILE=/var/log/mindi.log
67MINDI_CACHE=/var/cache/mindi
68BOOT_MEDIA_MESSAGE="\
69To format and restore all files automatically, type 'nuke' <enter>.\n\
70To restore some/all files interactively, type 'interactive' <enter>.\n\
71To compare the archives with your filesystem, type 'compare' <enter>.\n\
72To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
73You may add one or more of the following parameters as well:-\n\n\
74        donteject - mondorestore will not eject the CD; this is useful if, for\n\
75                    instance, your PC's case has a concealed CD-ROM drive\n\
76        noresize  - your mountlist will not be adjusted to use your unallocated\n\
77                    hard disk space\n\
78        textonly  - do not call any Newt library routines; this is unattractive\n\
79                    but valuable if you find your Newt library has bugs in it\n\n\
80e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
81a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
82"
83FDISK=$MINDI_SBIN/parted2fdisk
84
85# Using a config file allow to overwrite some values
86MINDI_CONFIG="$MINDI_CONF/mindi.conf"
87if [ -f $MINDI_CONFIG ]; then
88    . $MINDI_CONFIG
89fi
90DEPLIST_FILE="$MINDI_CONF/deplist.txt"
91ISO_CMD="/usr/bin/mkisofs"
92ISO_OPT="-J -r -v -p Mindi -publisher http://www.mondorescue.org -A Mindi"
93
94# Now we can create what we need
95MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
96if [ $? -ne 0 ]; then
97    df $TMPDIR
98    Die "Unable to create a temporary directory ! Check space on $TMPDIR"
99fi
100if [ _"$MINDI_TMP" = _"" ]; then
101    Die "MINDI_TMP is empty, aborting"
102fi
103if [ _"$MINDI_TMP" = _"/" ]; then
104    Die "MINDI_TMP is /, aborting"
105fi
106export MINDI_TMP
107
108# ----------------------------------------------------------------------------
109
110
111AbortHere() {
112    [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
113    Die "Program is terminating in response to signal received from OS/user"
114}
115
116
117Aborted() {
118    trap SIGHUP SIGTERM SIGTRAP SIGINT
119    [ "$MINDI_CACHE" != "" ] && rm -f $MINDI_CACHE/mindi*img $MINDI_CACHE/*gz $MINDI_CACHE/mindi.iso
120    [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
121    Die "User abort."
122}
123
124
125AddFileToCfgIfExists() {
126    [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
127}
128
129
130AddKeyboardMappingFile() {
131    local mappath r included_list included_item i res ii sss
132    mappath=$1
133    KBDEPTH=$(($KBDEPTH+1))
134    [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
135    if [ -e "$bigdir/$mappath" ] ; then
136        echo "$mappath already added" >> $LOGFILE
137        return
138    elif [ -d "$bigdir/$mappath" ] ; then
139        echo "Cannot add $mappath: it's a directory. Sorry."
140        return
141    fi
142    echo "Added kbd map $mappath" >> $LOGFILE
143    if [ ! -e "$mappath" ] ; then
144            mappath=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
145        if [ ! -e "$mappath" ] ; then
146            LogIt "Cannot add $mappath: kbd map file not found"
147            return
148        fi
149    else
150        echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
151    fi
152
153    mkdir -p $bigdir/etc
154    tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogIt "AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
155    if [ "`echo $mappath | grep -F ".gz"`" ] ; then
156        included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
157    else
158        included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
159    fi
160    for included_item in $included_list ; do
161        if [ ! -e "$included_item" ] ; then
162                sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
163            [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
164            for ii in $sss ; do
165                [ -e "$ii" ] && AddKeyboardMappingFile $ii
166            done
167        else
168            AddKeyboardMappingFile $included_item
169        fi
170    done
171}
172
173
174CopyDependenciesToDirectory() {
175    local outdir incoming fname counter d found
176    outdir=$1
177    mkdir -p $outdir
178    incoming=`ReadLine`
179    counter=0
180    while [ "$incoming" != "" ] ; do
181        # Non absolute file names should not arrive till here => skipped
182        if [ `echo "$incoming" | cut -c1` != '/' ]; then
183            LogIt "Unable to handle $incoming"
184            incoming=`ReadLine`
185            continue
186        fi
187        # no parent directory of incoming should be a link, copy is not possible in that case
188        d=`dirname "$incoming"`
189        found="false"
190        while [ $d != "/" -a $found = "false" ]; do
191            [ -h "$d" ] && found="true"
192            d=`dirname "$d"`
193        done
194        if [ -d "$incoming" ] && [ ! -h "$incoming" ]; then
195            find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
196        elif [ -e "$incoming" ] && [ $found = "false" ]; then
197            tar cf - -C / $incoming 2>> $MINDI_TMP/$$.log | (cd $outdir ; tar xf -) || Die "Cannot copy $incoming to $outdir - did you run out of disk space?" $MINDI_TMP/$$.log
198
199            # Only uncompress modules if not using udevd
200            if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
201                gunzip -f $outdir/$incoming || LogIt "Cannot gunzip $outdir/$incoming"
202            fi
203            [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
204            counter=$(($counter+1))
205            if [ "$counter" -ge "5" ] ; then
206                counter=0
207                echo -en "."
208            fi
209        fi
210        incoming=`ReadLine`
211    done
212}
213
214
215CountItemsIn() {
216    local r
217    r=0
218    for q in $1 ; do
219        r=$(($r+1))
220    done
221    echo $r
222}
223
224
225# Last function called before exiting
226# Parameter is exit code value
227MindiExit() {
228    local my_partitions
229
230    echo "Mindi $MINDI_VERSION is exiting" >> $LOGFILE
231    echo "End date : `date`" >> $LOGFILE
232    if [ _"$MONDO_SHARE" != _"" ] ; then
233        echo "------------- mindi logfile included -------------------------" >> /var/log/mondoarchive.log
234        cat $LOGFILE >> /var/log/mondoarchive.log
235        echo "--------------------------------------------------------------">> /var/log/mondoarchive.log
236    fi
237
238    cd /
239    sync&
240
241    # Unmount what could remain mounted
242    my_partitions=`mount | grep -F $$ | cut -f1 -d' '`
243    [ "$my_partitions" != "" ] && umount $my_partitions
244    # Clean temporary files only when standalone mindi
245    if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
246        rm -Rf $MINDI_TMP
247    fi
248    exit $1
249}
250
251Die() {
252    local i
253    if [ "$1" = "" ] ; then
254        LogIt "FATAL ERROR"
255    else
256        LogIt "FATAL ERROR. $1"
257    fi
258    if [ _"$2" != _"" ]; then
259        grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
260    fi
261    rm -f "$2"
262
263    LogIt "Please e-mail a copy of $LOGFILE to the mailing list."
264    LogIt "See http://www.mondorescue.org for more information."
265    LogIt "WE CANNOT HELP unless you enclose that file.\n"
266    MindiExit -1
267}
268
269
270DropOptimizedLibraries() {
271    local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
272    filelist=$1
273    outdir=$2
274
275    list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
276    if [ "$list_of_optimized_libraries" = "" ] ; then
277        return 0
278    fi
279    echo -en "Dropping i686-optimized libraries if appropriate"
280    for optimized_lib_name in $list_of_optimized_libraries ; do
281        echo -en "."
282        reason=""
283        vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
284        echo "$vanilla_lib_name" >> $filelist
285        echo "Adding $vanilla_lib_name to filelist" >> $LOGFILE
286        mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
287        rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
288
289        # This may return multiple files
290        for resolved in `ReadAllLink $vanilla_lib_name`; do
291            echo "Adding as deps $resolved to filelist" >> $LOGFILE
292            vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
293            mkdir -p $outdir$resolved> /dev/null 2> /dev/null
294            rmdir $outdir$resolved > /dev/null 2> /dev/null
295            ln -sf $vanilla_resolved_name $outdir$resolved
296            echo "Excluding deps $resolved" >> $LOGFILE
297            grep -Fvx "$resolved" "$filelist" > $filelist.tmp
298            echo "Replacing it with $vanilla_resolved_name" >> $LOGFILE
299            echo "$vanilla_resolved_name" >> $filelist.tmp
300            mv -f $filelist.tmp $filelist
301        done
302    done
303    $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
304    mv -f $filelist.tmp $filelist
305    echo -e "$DONE"
306}
307
308
309FindAndAddUserKeyboardMappingFile() {
310    local r res mapfile mappath included_item included_list keyfile mp locale
311    LogIt "Analyzing your keyboard's configuration."
312    KEYDIR=/lib/kbd
313    [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd     # Slackware
314    [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
315    [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
316    [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole
317    [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole-setup
318    if [ ! -e "$KEYDIR" ] ; then
319        LogIt "Keyboard mapping directory not found. I shall use default map at boot-time."
320        return 0
321    fi
322    if [ -e "/etc/sysconfig/keyboard" ] ; then
323        echo "Red Hat-style config detected." >> $LOGFILE
324        keyfile=/etc/sysconfig/keyboard
325    elif [ -e "/etc/rc.d/rc.keymap" ] ; then
326        echo "Slackware-style config detected." >> $LOGFILE
327        keyfile=/etc/rc.d/rc.keymap
328    elif [ -e "/etc/rc.config" ] ; then
329        echo "Debian-style config detected." >> $LOGFILE
330        keyfile=/etc/rc.config
331    elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
332        echo "Debian-style config detected." >> $LOGFILE
333        echo -en "Adding the following keyboard mapping tables: "
334        mkdir -p $bigdir/tmp
335        echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
336        KBDEPTH=0
337        mkdir -p $bigdir/etc/console
338        cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
339        echo -e "$DONE"
340        return 0
341    elif [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
342        echo "Ubuntu-style config detected." >> $LOGFILE
343        echo -en "Adding the following keyboard mapping tables: "
344        mkdir -p $bigdir/tmp
345        echo "/etc/console-setup/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
346        KBDEPTH=0
347        mkdir -p $bigdir/etc/console-setup
348        cp /etc/console-setup/boottime.kmap.gz $bigdir/etc/console-setup 2>> $LOGFILE
349        echo -e "$DONE"
350        return 0
351    elif [ -e "/etc/conf.d/keymaps" ] ; then
352        echo "Gentoo-style config detected." >> $LOGFILE
353        keyfile=/etc/conf.d/keymaps
354    else
355        echo -en "Searching for rc.config ..."
356        keyfile=`find /etc -name rc.config | head -n1`
357        if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
358            LogIt "Unknown config detected. Default keyboard map will be used."
359            return
360        else
361            echo "Found $keyfile" >> $LOGFILE
362        fi
363    fi
364    if [ ! -e "$KEYDIR/keymaps" ] ; then
365        LogIt "Keyboard mapping directory not found. Default keyboard map will be used."
366        return
367    fi
368    echo "keyfile=$keyfile" >> $LOGFILE
369    locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
370    [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'`        # Slackware
371    [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | tr -d '"' |cut -d'=' -f2`        # Gentoo
372    echo "locale=$locale" >> $LOGFILE
373    #
374    # Process the keymaps dir once for all
375    # AddKeyboardMappingFile will use it recursively
376    #
377    find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
378    mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
379    [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
380    # If we have multiple keymaps then log it !!
381    echo "$mp" | grep -q " "
382    if [ $? -eq 0 ]; then
383        echo "WARNING: Multiple keymaps found: $mp" | tee -a $LOGFILE
384        echo "The following one will be used" >> $LOGFILE
385    fi
386    for i in $mp ; do
387        mappath=$i
388        [ -e "$i" ] && [ ! -d "$i" ] && break
389    done
390    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
391            mappath=$(find / -name "*/kbd/keymaps/*/$locale")
392    fi
393    echo "mappath = $mappath" >> $LOGFILE
394    if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
395        LogIt "Keyboard mapping file not found. Default keyboard map will be used."
396        return
397    fi
398    echo -en "Adding the following keyboard mapping tables: "
399    mkdir -p $bigdir/tmp
400    echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
401    KBDEPTH=0
402    AddKeyboardMappingFile $mappath
403    echo -e "$DONE"
404    rm -f $MINDI_TMP/keymaps.find
405    return 0
406}
407
408
409FindIsolinuxBinary() {
410    ISOLINUX=/usr/lib/isolinux.bin
411    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
412    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
413    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
414    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
415    [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
416    [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
417    [ ! -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'"
418    echo "Found isolinux.bin at $ISOLINUX" >> $LOGFILE
419}
420
421
422FindSpecificModuleInPath() {
423    local modpaths pwd line
424    pwd=`pwd`
425    if [ "$YOUR_KERNEL_SUCKS" ] ; then
426        cd $MINDI_TMP
427    else
428        cd /
429    fi
430    if [ ! -e "$1" ] ; then
431        LogIt "WARNING - cannot search specific path '$1'"
432        return 1
433    fi
434    modpaths=`find $1 -name $2.*o -type f`
435    #[ "$?" -ne "0" ] && Die "find $1 -name $2.o -type f --- failed"
436    [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.o.gz -type f`
437    [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.ko.gz -type f`
438    [ "$modpaths" = "" ] && modpaths=`find $1 -name $2 -type f`
439    echo "$modpaths"
440    cd $pwd
441}
442
443
444GenerateGiantDependencyList() {
445    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
446
447    echo -en "Analyzing dependency requirements"
448    outfile=$1
449    tempfile=$MINDI_TMP/$$.txt
450    incoming=`ReadLine`
451
452    > $tempfile
453    progress=0
454    res=0
455    noof_lines=$2
456    while [ "$incoming" != "" ] ; do
457        if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
458            incoming=`ReadLine`
459            continue
460        fi
461        if [ "$incoming" = "LVMFILES:" ] ; then
462            break
463        fi
464        filelist=`GenerateListForFile "$incoming"`
465        r=$?
466        [ "$r" -ne "0" ] && LogIt "$incoming not found"
467        res=$(($res+$r))
468#       echo "'$incoming' generates filelist '$filelist'" >> $LOGFILE
469        for fname in $filelist ; do
470            [ "$fname" != "" ] && echo "$fname" >> $tempfile
471        done
472        progress=$(($progress+1))
473        echo -en "\r\t\t\t\t\t\t\t\t"
474        i=$(($progress*100))
475        i=$(($i/$noof_lines))
476        echo -en "$i"
477        echo -en "%"
478        modres=$(($progress%4))
479        [ "$modres" -eq "0" ] && echo -en "\t/"
480        [ "$modres" -eq "1" ] && echo -en "\t-"
481        [ "$modres" -eq "2" ] && echo -en "\t\\"
482        [ "$modres" -eq "3" ] && echo -en "\t|"
483        incoming=`ReadLine`
484    done
485    if  [ "$incoming" = "LVMFILES:" ] ; then
486        incoming=`ReadLine`
487        lvmversion=""
488        while [ "$incoming" != "" ] ; do
489            if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
490                incoming=`ReadLine`
491                continue
492            fi
493            filelist=`GenerateListForFile "$incoming"`
494            for tool in $filelist ; do
495                lvmresolved=`readlink -f $tool`
496                if [ "$tool" = "$lvmresolved" ]; then
497                    echo "$tool" >> $tempfile
498                elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
499                    if [ "$lvmversion" = "" ] ; then
500                        lvmversion=`$lvmresolved`
501                        echo "$lvmresolved" >> $tempfile
502                    fi
503                    toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
504                    if [ "$lvmversion" = "200" ]; then
505                        # pvdata and lvmcreate_initrd don't exist in LVM2
506                        case "$toolstripped" in
507                        "pvdata")
508                            continue
509                            ;;
510                        "lvmcreate_initrd")
511                            continue
512                            ;;
513                        esac
514                    fi
515                    toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
516                    if [ -e "$toolpath" ] ; then
517                        echo "$toolpath" >> $tempfile
518                        echo "$tool" >> $tempfile
519                    else
520                        toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
521                    fi
522                    if [ -e "$toolpath" ] ; then
523                        echo "$toolpath" >> $tempfile
524                        echo "$tool" >> $tempfile
525                    else
526                        echo "Where are your LVM-Tools? Couldn't find $tool"
527                    fi
528                else
529                    echo "$tool" >> $tempfile
530                fi
531            done
532            progress=$(($progress+1))
533            echo -en "\r\t\t\t\t\t\t\t\t"
534            i=$(($progress*100))
535            i=$(($i/$noof_lines))
536            echo -en "$i"
537            echo -en "%"
538            modres=$(($progress%4))
539            [ "$modres" -eq "0" ] && echo -en "\t/"
540            [ "$modres" -eq "1" ] && echo -en "\t-"
541            [ "$modres" -eq "2" ] && echo -en "\t\\"
542            [ "$modres" -eq "3" ] && echo -en "\t|"
543            incoming=`ReadLine`
544        done
545    fi
546    echo -en "$DONE\nMaking complete dependency list"
547
548    tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
549    mv -f $tempfile.new $tempfile
550    > $outfile.pre
551    progress=0
552    noof_lines=`cat $tempfile | wc -l`
553    echo "---------------------------------" >> $LOGFILE
554    echo "List of dependencies:             " >> $LOGFILE
555    echo "---------------------------------" >> $LOGFILE
556    for fname in `cat $tempfile` ; do
557        echo "$fname" | tee -a $LOGFILE >> $outfile.pre
558        LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
559        progress=$(($progress+1))
560        echo -en "\r\t\t\t\t\t\t\t\t"
561        i=$(($progress*100))
562        i=$(($i/$noof_lines))
563        echo -en "$i"
564        echo -en "%"
565        modres=$(($progress%4))
566        [ "$modres" -eq "0" ] && echo -en "\t/"
567        [ "$modres" -eq "1" ] && echo -en "\t-"
568        [ "$modres" -eq "2" ] && echo -en "\t\\"
569        [ "$modres" -eq "3" ] && echo -en "\t|"
570    done
571    if [ _"$MONDO_SHARE" != _"" ]; then
572        mkdir -p $bigdir/tmp
573        mkdir -p $bigdir/sbin
574        mkdir -p $bigdir/bin
575        if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
576            LogIt "\nIncorporating post-nuke tarball"
577            old_pwd=`pwd`
578            cd $bigdir
579            tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogIt "Error occurred when untarring post-nuke tarball" $MINDI_TMP/$$.log
580            cd $old_pwd
581        fi
582        if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin 2>> $LOGFILE ; then
583            LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
584        else
585            LogIt "Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP"
586            LogIt "I bet you've got a spare copy of Mondo or Mindi floating around on your system."
587            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."
588            Die "Odd."
589        fi
590        cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogIt "\nMondo v1.2x defaults to LILO as the bootloader, BTW."
591        if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
592            LogIt "\nIncorporating NFS-related settings"
593            for r in NFS-* ISO-PREFIX ; do
594                cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
595                echo "Copying $r to ramdisk" >> $LOGFILE
596            done
597        fi
598    fi
599    tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
600    rm -f $tempfile $outfile.pre
601    [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
602    return $res
603}
604
605
606GenerateListForFile() {
607    local files_found loc fname incoming i res
608    incoming="$1"
609    files_found=""
610    res=0
611
612    for fname in $incoming ; do
613        files_found="$files_found `LocateFile $fname`"
614    done
615
616    echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
617}
618
619
620# Returns all disk devices which are part of a raid array
621GetAllRaidMembers() {
622    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
623}
624
625
626GetFileSizeList() {
627    local i
628    for i in `find $1 -type d -o -print` ; do
629        du -sk $i
630    done
631}
632
633
634GetHomeDir() {
635    local res loc
636    loc=`which $1 2>/dev/null`
637    res=`file $loc | $AWK '{print $NF;}'`
638    dirname $res
639}
640
641
642# Check kernel filesystem capabilites for accessing initrd image
643#
644# Interface definition:
645# param #1: absolute path to kernel image
646GetInitrdFilesystemToUse() {
647
648    # interface test: make sure we have one parameter
649    if [ $# -ne 1 ]; then
650        Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
651    fi
652
653    # interface parameters
654    local lvKernelImage=$1
655
656    # local constants (filesystem magic strings)
657    local lcMagicCramfs="<3>cramfs: wrong magic"
658    local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
659    local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs..."
660
661    # local variables
662    local lvOffset
663    local lvScanRes
664    local lvUseFilesystem
665
666    # say where we are.
667    echo "  GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage.\n" >> $LOGFILE
668
669    # verify that file exists
670    [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
671
672    # Kernel may be gzip compressed
673    file $lvKernelImage 2>&1 | grep -q gzip
674    if [ $? -eq 0 ]; then
675        lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicInitfs"`
676    else
677        # get offet of gzip magic "1f8b0800" in file
678        lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "1f8b0800")}'`
679        [ $lvOffset -eq 0 ] && Die "gzip magic not found in file $lvKernelImage. Terminating."
680        lvOffset=`expr $lvOffset / 2`
681        echo "  GetInitrdFilesystemToUse(): gzip magic found at lvOffset $lvOffset.\n" >> $LOGFILE
682
683        # scan kernel image for initrd filessystem support
684        lvScanRes=`dd ibs=1 skip=$lvOffset if=$lvKernelImage obs=1M 2>/dev/null | gunzip -c 2> /dev/null | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicInitfs"`
685    fi
686
687    # determine which filesystem to use for initrd image: ext2fs, gzip'ed cpio (initramfs ) or cramfs
688    if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
689        lvUseFilesystem="ext2fs"
690    elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
691        lvUseFilesystem="initramfs"
692    elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
693        lvUseFilesystem="cramfs"
694    else
695        lvUseFilesystem="UNSUPPORTED"
696    fi
697
698    # say what we are using
699    echo "  GetInitrdFilesystemToUse(): Filesytem to use for initrd is $lvUseFilesystem.\n" >> $LOGFILE
700
701    # return file system to use
702    echo "$lvUseFilesystem"
703
704}
705
706# Searches parent raid device of given disk device
707# $1: disk device (i.e. /dev/hda1)
708GetParentRaidDev() {
709    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
710}
711
712
713# Searches members of raid device
714# $1: raid device (/dev/md...)
715GetRaidDevMembers() {
716    $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
717}
718
719
720HackPathsToFailsafe() {
721    local incoming newpath kver stub i pwd
722    kver=`uname -r`
723    incoming=`ReadLine`
724    pwd=`pwd`
725    cd $MINDI_TMP
726    while [ "$incoming" != "" ] ; do
727        stub=`basename $incoming`
728        newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
729        for i in $newpath ; do
730            echo "$i"
731        done
732        read incoming
733    done
734    cd $pwd
735}
736
737
738ListAllPartitions() {
739    local res currline partition all_partitions ap_orig remaining i j
740
741    grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
742    [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
743    if [ -e "/vmfs/volumes" ]; then
744        # For VMWare ESX 3 get the device names of these volumes
745        vdf -P | grep -E '/vmfs/volumes' | awk '{print $1}'
746    fi
747    return
748}
749
750
751ListImagesForUser() {
752    local path fname
753    path=$MINDI_CACHE
754    echo -en "In the directory '$path' you will find the images:-\n"
755    for fname in `ls $path | grep -F mindi-` ; do
756        printf "%19s " $fname
757    done
758    echo " "
759}
760
761
762ListKernelModulePaths() {
763    local module_list module fname oss r kern
764    oss="/root/oss/modules"
765    module_list="$MODULES"
766    # Remove unwanted modules from list
767    for i in $DENY_MODS; do
768        module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
769        EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
770    done
771###
772### Sq-Modification ... Use kernelname for module search path if specified
773###
774    # kern="`uname -r`"
775    if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
776    then
777        kern=${kernelname}
778    else
779        kern="`uname -r`"
780    fi
781###
782### Sq-Mod End
783###
784    for module in $module_list $EXTRA_MODS ; do
785        r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
786        echo "module $module --> $r" >> $LOGFILE
787        [ "$r" ] && echo "$r"
788        [ -f "$oss" ] && find $oss | grep -F $module
789    done
790    find /lib/modules/$kern/modules.* -type f 2> /dev/null
791    [ -f "$oss" ] && find $oss.* 2> /dev/null
792}
793
794#
795# Critical function which computes all dependencies (dyn. lib.)
796# for a list of binaries
797#
798LocateDeps() {
799    local incoming fname deps
800    incoming="$*"
801    for fname in $incoming ; do
802        if [ ! -e "$fname" ] ; then
803            echo "WARNING - $fname does not exist; cannot be LDD'd." >> $LOGFILE
804            if echo $fname | grep lvm &> /dev/null ; then
805                echo "This warning only affects you if you are using LVM." >> $LOGFILE
806                if echo "$MODULES" | grep lvm &> /dev/null ; then
807                    echo "I think you are, so please take heed!" >> $LOGFILE
808                else
809                    echo "I don't think you are, so don't worry about it." >> $LOGFILE
810                fi
811            fi
812        elif [ -h "$fname" ] && [ -x "$fname" ] ; then
813            echo "$fname is softlink" >> $LOGFILE
814        else
815            ldd $fname 2> /dev/null | ProcessLDD
816        fi
817    done
818}
819
820
821# Give all symlinks recursively of a full path name
822ReadAllLink() {
823    file="$1"
824
825    echo "$file"
826    if [ ! -h $file ]; then
827        return 0
828    fi
829
830    link=`readlink $file`
831    d=`dirname $file`
832    fchar=`echo $link | cut -c1`
833    # If mother dir is a link print it
834    if [ -h "$d" ]; then
835        echo "$d"
836        d=`readlink $d`
837    fi
838    if [ "$fchar" != "/" ]; then
839        # Relative or local link
840        ReadAllLink "$d/$link" 
841    else
842        # Absolute path
843        ReadAllLink $link 
844    fi
845}
846
847
848LocateFile() {
849    local i path fname_to_find location output resolved tmp stub cache_id loclist
850    fname_to_find="$1"
851    # It's an absolute path
852    if echo "$fname_to_find" | grep -x "/.*" ; then
853        output="$fname_to_find"
854        if [ -h "$output" ] ; then
855            output="`ReadAllLink $output` $output"
856        fi
857        echo "$output"
858        return 0
859    fi
860    # It's not an absolute path
861    output=""
862    for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin `find /usr/lib /lib /usr/local/lib /usr/X11R6/lib /usr/lib64 /lib64 /usr/local/lib64 /usr/X11R6/lib64 -type d -maxdepth 1 2> /dev/null` ; do
863    #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
864        [ -h "$path" ] && continue
865        [ ! -e "$path/$fname_to_find" ] && continue
866        output="$path/$fname_to_find $output"
867        if [ -h "$path/$fname_to_find" ] ; then
868            output="`ReadAllLink $path/$fname_to_find` $output"
869        fi
870    done
871    if [ "$output" = "" ] ; then
872        return 1
873    fi
874    echo "$output"
875    return 0
876}
877
878
879LogIt() {
880    if [ -e /dev/stderr ] ; then
881        echo -e "$1" >> /dev/stderr
882    elif [ -e /usr/bin/logger ] ; then
883        /usr/bin/logger -s $1
884    fi
885    echo -e "$1" >> $LOGFILE
886    if [ _"$2" != _"" ]; then
887        grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
888    fi
889    rm -f "$2"
890}
891
892
893# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
894MakeMondoConfigFile() {
895    local outfile use_lzo use_comp use_star
896    outfile=$1
897    > $outfile
898    [ "$TAPESIZE" ]     && echo "media-size $TAPESIZE" >> $outfile
899    [ "$TAPEDEV" ]          && echo "media-dev $TAPEDEV" >> $outfile
900    [ "$USBDEVICE" ]            && echo "usb-dev $USBDEVICE" >> $outfile
901    [ "$FILES_IN_FILELIST" ]    && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
902    [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
903    [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
904    use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
905    use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
906    use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
907    use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
908    echo "use-lzo $use_lzo" >> $outfile
909    echo "use-gzip $use_gzip" >> $outfile
910    echo "use-star $use_star" >> $outfile
911    echo "use-comp $use_comp" >> $outfile
912    echo "datestamp `date`" >> $outfile
913    [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
914    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-IPADDR nfs-client-ipaddr $outfile
915    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-NETMASK nfs-client-netmask $outfile
916    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-BROADCAST nfs-client-broadcast $outfile
917    AddFileToCfgIfExists $MINDI_TMP/NFS-CLIENT-DEFGW  nfs-client-defgw  $outfile
918    AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-MOUNT  nfs-server-mount  $outfile
919    AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-PATH   nfs-server-path   $outfile
920    AddFileToCfgIfExists $MINDI_TMP/NFS-DEV           nfs-dev           $outfile
921    AddFileToCfgIfExists $MINDI_TMP/NFS-SERVER-IPADDR nfs-server-ipaddr $outfile
922    AddFileToCfgIfExists $MINDI_TMP/ISO-DEV           iso-dev           $outfile
923    AddFileToCfgIfExists $MINDI_TMP/ISO-MNT           iso-mnt           $outfile
924    AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX        iso-prefix        $outfile
925    AddFileToCfgIfExists $MINDI_TMP/ISODIR            isodir            $outfile
926    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
927    AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME   bootloader.name   $outfile
928    AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
929    AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
930    AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
931    AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL      differential      $outfile
932    AddFileToCfgIfExists $MINDI_TMP/ACL      acl      $outfile
933    AddFileToCfgIfExists $MINDI_TMP/XATTR      xattr      $outfile
934    AddFileToCfgIfExists $MINDI_TMP/OBDR      obdr      $outfile
935}
936
937
938MakeMountlist() {
939    local scratchdir mountlist all_partitions current_partition \
940partition_size partition_format outstring partition_number \
941partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
942absolute_partition old_partition_fmt current_lvolume uname skip
943
944    echo "Your raw fstab file looks like this:" >> $LOGFILE
945    echo "------------------------------------" >> $LOGFILE
946    cat $MY_FSTAB >> $LOGFILE
947    echo "Your mountlist will look like this:" | tee -a $LOGFILE
948    echo "-----------------------------------" >> $LOGFILE
949
950# scratchdir, mountlist(OUT)
951    scratchdir=$MINDI_TMP
952    mountlist=$1
953
954# NB: partition = device
955# NB: mountpt = where the device is mounted
956
957    [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
958
959    [ "$mountlist" != "" ] && rm -Rf $mountlist
960    > $mountlist
961    all_partitions=""
962   
963    if [ $LVM != "false" ]; then
964        echo -en "Analyzing LVM...\n"
965        $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
966        if [ $? -ne 0 ]; then
967            LVM="false"
968        fi
969        all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-32`
970    fi
971    all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
972#    echo "all partitions = $all_partitions" > /dev/stderr
973    for i in $IMAGE_DEVS ; do
974        mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
975    done
976    [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
977    printf "        %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
978    useless_dev="/dev/floppy /dev/fd0h1440 /dev/fd0H1440 /dev/cdrom /dev/cdrom/cdrom /dev/cdrom/cdrom1 /dev/cdrom/cdrom2 /dev/cdrom0 /dev/cdrom1 /dev/cdrom2 /dev/cdrom3 /dev/cdrw /dev/scd /dev/ram :/ /dev/sr0 /dev/sr1 /dev/cdrom1"
979    for c_p in $all_partitions ; do
980        [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] && continue
981        [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
982        if [ -h "$c_p" ] && [ "`echo "$c_p" | grep -F "/dev/hd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/sd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/md"`" = "" ] ; then
983            current_partition=`readlink -f $c_p`
984            [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
985            [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
986        else
987            current_partition="$c_p"
988        fi
989        [ "$c_p" = "none" ] && continue
990        redhat_label=""
991        label=""
992        uuid=""
993        absolute_partition=`readlink -f $c_p`
994        partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
995
996        # Detects noauto partitions not mounted and exclude them
997        partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
998        if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" =  "" ] ; then
999            continue
1000        fi
1001
1002        # set default in case we dont't find it
1003        str_to_find_fmt_with=$current_partition
1004
1005        # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1006        # current_partition contains only first column of /etc/fstab
1007        if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1008            redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1009            actual_dev=""
1010
1011            # 1st try, findfs - the RHEL way of finding labels and their partitions
1012            if [ -x "/sbin/findfs" ]; then
1013                actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
1014            fi
1015   
1016            # 2nd try : blkid, the good way for all LABEL except swap
1017            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1018                actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1019                # For LVM FS it will give a /dev/dm-# which should then be converted
1020                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1021                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1022                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1023                    for dev in `ls /dev/mapper/*`; do
1024                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1025                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1026                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1027                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1028                            break
1029                        fi
1030                    done
1031                fi
1032            fi
1033   
1034            # 3rd try, which works on a standard partition (ext2/3), but not on swap
1035            # For LVM gives a /dev/mapper entry
1036            if [ "x$actual_dev" = "x" ]; then
1037                actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
1038            fi
1039   
1040            # 4th try, with vol_id
1041            # SWAP only
1042            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1043                list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
1044                for dev_swap in $list_swaps ; do
1045                    dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1046                    if [ "x$dev_exists" != "x" ]; then
1047                        actual_dev=$dev_swap
1048                        break;
1049                    fi
1050                done
1051            fi
1052
1053            # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1054            # LABEL=SW-cciss/c0d0p3 (RDP)
1055            # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1056            # SWAP only
1057            if [ "x$actual_dev" = "x" -a  _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1058                    skip=""
1059                    uname="`uname -r`"
1060                    [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1061                    # 2.6.12 needs 16 (FC3)
1062                    [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1063                    # 2.6.19 and upper needs 1052
1064                    [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1065                    [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1066                    if [ $skip = "" ]; then
1067                        Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1068                    fi
1069                    for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1070                    do
1071                        # Location of the swap label for kernel 2.6
1072                        try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1073                        if [ "x$try_dev_label" = "x$redhat_label" ]; then
1074                            actual_dev=$try_dev
1075                        fi
1076                    done
1077            fi
1078
1079            # Check if one of all those tries has known success
1080            if [ "x$actual_dev" != "x" ]; then
1081                current_partition=$actual_dev
1082            else
1083                Die "Your system uses a LABEL partition ($current_partition), but you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or install findfs|blkid|vol_id"
1084            fi
1085        # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1086        # current_partition contains only first column of /etc/fstab
1087        elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1088            uuid=`echo "$current_partition" | cut -d'=' -f2`
1089            actual_dev=""
1090
1091            # 1st try, findfs - the RHEL way of finding labels and their partitions
1092            if [ -x "/sbin/findfs" ]; then
1093                actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1094            fi
1095   
1096            # 2nd try : blkid, the good way for all UUID except swap
1097            if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1098                actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
1099                # For LVM FS it will give a /dev/dm-# which should then be converted
1100                if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1101                    major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1102                    minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1103                    for dev in `ls /dev/mapper/*`; do
1104                        major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1105                        minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1106                        if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1107                            actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1108                            break
1109                        fi
1110                    done
1111                fi
1112            fi
1113   
1114            # 3th try, with vol_id
1115            if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1116                list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1117                for dev in $list_dev ; do
1118                    dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1119                    if [ "x$dev_exists" != "x" ]; then
1120                        actual_dev=$dev
1121                        break;
1122                    fi
1123                done
1124            fi
1125
1126            # 4th try, with dumpuuid (VMWare only ?) for swap
1127            if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1128                list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1129                for dev in $list_dev ; do
1130                    dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1131                    if [ "x$dev_exists" != "x" ]; then
1132                        actual_dev=$dev
1133                        break;
1134                    fi
1135                done
1136            fi
1137
1138            # Check if one of all those tries has known success
1139            if [ "x$actual_dev" != "x" ]; then
1140                current_partition=$actual_dev
1141            else
1142                Die "Your system uses a UUID partition ($current_partition),\nbut you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or\ninstall findfs|blkid|vol_id or\nrelabel the partition with the correct UUID if it's a swap partition."
1143            fi
1144        else
1145            # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1146            # they use symlinks in fstab unrelated to what is shown in mount !
1147            if [ _"$partition_mountpt" = _"" ]; then
1148                # set default in case we dont't find it
1149                for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
1150                        if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
1151                            str_to_find_fmt_with=$tmpp
1152                            partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1153                            break;
1154                        fi
1155                done
1156            fi
1157        fi
1158
1159        partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1160        # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1161        # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1162        # the former is then a link to the latter, so we test whether
1163        # $current_partition is actually such a link or not and set
1164        # $current_lvolume accordingly. On Debian you may find more than one answer
1165        # so we remove the one corresponding to /dev/.static
1166        # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1167        # principle is the same and we need to find the link to it as well.
1168        # Note that $current_lvolume may well be an
1169        # ordinary device. It is just to make sure that we feed the right value
1170        # into any of the LVM tools if possible.
1171
1172        current_lvolume="$current_partition"
1173        if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1174            # .static dir are a Debian specificity
1175            current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1176            echo $current_lvolume | grep -q ' '
1177            if [ $? -eq 0 ]; then
1178                echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE 
1179            fi
1180            # if it's not found, it may well be a real device such as a multipath one
1181            # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1182            if [ _"$current_lvolume" = _"" ]; then
1183                current_lvolume="$current_partition"
1184            fi
1185        fi
1186        #
1187        # End of LVM device style variation code (other than $current_lvolume).
1188
1189        if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1190            # Size computed via LVM not directly
1191            partition_size="lvm"
1192        else
1193            partition_size=`SizeOfPartition $current_partition`
1194            [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1195            [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1196            if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1197                partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1198                [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1199                [ "$partition_format" != "swap" ] && partition_format="swap"
1200                if [ "$partition_size" = "" ] ; then
1201                    totalsize=0
1202                    items=0
1203                    for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1204                        totalsize=$(($totalsize+$i))
1205                        items=$(($items+1))
1206                    done
1207                    [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1208                    [ "$partition_size" -lt "125000" ] && partition_size=125000
1209                    echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1210                fi
1211            fi
1212        fi
1213        [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1214        [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1215        if [ "$partition_mountpt" = "" ] ; then
1216            if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1217                if  [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1218                    partition_mountpt="raid"
1219                    partition_format="raid"
1220                else
1221                    partition_mountpt="lvm"
1222                    partition_format="lvm"
1223                fi
1224            fi
1225        fi
1226        psz=$partition_size
1227        echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1228        [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1229        if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1230            partition_mountpt="image"
1231            old_partition_fmt=$partition_format
1232            partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1233            partition_size=$(($partition_size+1)); # just in case
1234            if [ "$partition_format" = "Linux" ] ; then
1235                echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1236                echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1237                partition_format=$old_partition_fmt
1238            fi
1239        fi
1240        if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1241            echo "Excluding $current_partition from mountlist" >> $LOGFILE
1242            continue
1243        fi
1244        if [ ! "$partition_mountpt" ] ; then
1245            echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
1246            for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1247                partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1248                [ "$partition_format" ] && break
1249            done
1250            echo "------- $FDISK log end ------------" >> $LOGFILE
1251            if [ "$partition_format" = "Compaq diagnostics" ] ; then
1252                partition_format="compaq"
1253            elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1254                LogIt "Unable to find mountpoint of $current_partition - ignoring"
1255                continue
1256            fi
1257        fi
1258        if [ "$redhat_label" ]; then
1259            label="$redhat_label"
1260        elif [ "$uuid" ]; then
1261            label="$uuid"
1262        fi
1263        partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1264        [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1265        unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1266        if [ "$current_partition" = "" ] ; then
1267            echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1268        elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1269            if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1270                partition_mountpt=raid
1271                partition_format=raid
1272                printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1273                printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1274            else
1275                echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1276            fi
1277        elif [ "$partition_format" = "" ] ; then
1278            echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1279        elif [ "$partition_size" = "" ] ; then
1280            echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1281        elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1282            continue
1283        else
1284            if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1285                echo "Stupid bastard..." >> $LOGFILE
1286                partition_format="vfat"
1287            fi
1288            printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1289            printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1290        fi
1291    done
1292}
1293
1294
1295MakeSureNumberIsInteger() {
1296    res=`echo "$1" | tr -s '\-[0-9]' ' '`
1297    if [ "$res" != " " ] && [ "$res" != "" ] ; then
1298    echo "result = '$res'"
1299        Die "$1 should be an integer"
1300    fi
1301}
1302
1303
1304OfferToMakeBootableISO() {
1305    local i old_pwd
1306    if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1307        echo -en "Shall I make a bootable CD image? (y/[n]) "
1308        read i
1309        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1310    fi
1311    rm -Rf $MINDI_TMP/iso
1312    mkdir -p $MINDI_TMP/iso/{images,archives}
1313    cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogIt "OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1314    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1315    for i in memdisk memtest.bin memtest.img ; do
1316        j=$MINDI_LIB/$i
1317        k=$MINDI_TMP/iso
1318        if [ -e "$j" ] ; then
1319            LogIt "Copying $j to $k"
1320            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1321            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1322            if [ _"$MONDO_SHARE" != _"" ]; then 
1323                cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1324            fi
1325        fi
1326    done
1327    MakeMessageFile > $MINDI_TMP/iso/message.txt
1328    cp $kernelpath $MINDI_TMP/iso/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/iso/vmlinuz). Did you run out of disk space?"
1329    cp $MINDI_TMP/initrd.img $MINDI_TMP/iso/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MINDI_TMP/iso/initrd.img. Did you run out of disk space?"
1330    if [ _"$MONDO_SHARE" != _"" ]; then 
1331        cp $kernelpath $MONDO_ROOT/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MONDO_ROOT/vmlinuz). Did you run out of disk space?"
1332        cp $MINDI_TMP/initrd.img $MONDO_ROOT/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MONDO_ROOT/initrd.img. Did you run out of disk space?"
1333    fi
1334    MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1335    if [ "$ARCH" != "ia64" ] ; then
1336        cp $ISOLINUX $MINDI_TMP/iso/isolinux.bin 2>> $LOGFILE || Die "Cannot copy isolinux.bin ($ISOLINUX) to $MINDI_TMP/iso - did you run out of disk space?"
1337    fi
1338    old_pwd=`pwd`
1339    cd $MINDI_TMP/iso
1340    if [ "$ARCH" != "ia64" ] ; then
1341        if [ _"$MONDO_SHARE" != _"" ]; then 
1342            cp -f $MINDI_TMP/iso/{isolinux.cfg,initrd.img,vmlinuz,isolinux.bin,message.txt} $MONDO_ROOT 2>> $LOGFILE || Die "Cannot copy core files to ramdisk for boot disk (under $MONDO_ROOT). Did you run out of disk space?"
1343            cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1344        fi
1345        $ISO_CMD -U $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table . > /dev/null 2> $MINDI_TMP/mkisofs.log
1346    else
1347        $ISO_CMD $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b images/mindi-bootroot.$BOOT_SIZE.img -c images/boot.cat -no-emul-boot . > /dev/null 2> $MINDI_TMP/mkisofs.log
1348        rm -f images/mindi-bootroot.$BOOT_SIZE.img
1349    fi
1350    if [ "$?" -ne "0" ] ; then
1351        echo "----------- $ISO_CMD's errors --------------" >> $LOGFILE
1352        cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1353        echo "$ISO_CMD returned the following errors:-"
1354        cat $MINDI_TMP/mkisofs.log
1355        LogIt "Failed to create ISO image."
1356    else
1357        echo "Created bootable ISO image at $MINDI_CACHE/mindi.iso" | tee -a $LOGFILE
1358    fi
1359    rm -f $MINDI_TMP/mkisofs.log
1360    cd $old_pwd
1361}
1362
1363
1364OfferToMakeBootableUSB() {
1365    local i
1366    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1367        echo -n "Shall I make a bootable USB image ? (y/[n]) "
1368        read i
1369        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1370        if [ "$USBDEVICE" = "" ]; then
1371            echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1372            read dev
1373            USBDEVICE=$dev
1374        fi
1375        echo "WARNING: This will erase all content on $USBDEVICE"
1376        echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1377        read i
1378        [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1379    fi
1380    rm -Rf $MINDI_TMP/usb
1381    mkdir -p $MINDI_TMP/usb
1382    USBPART="${USBDEVICE}1"
1383
1384    echo -en "Transforming $USBDEVICE in a Bootable device " 
1385    echo -en "."
1386    echo "Transforming $USBDEVICE in a Bootable device"  >> $LOGFILE
1387    echo "Checking $USBDEVICE" >> $LOGFILE
1388    $FDISK -l $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE
1389    if [ $? -ne 0 ]; then
1390        echo "Unable to access $USBDEVICE" | tee -a $LOGFILE
1391        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1392        exit -1
1393    fi
1394    echo -en "."
1395    echo "Unmounting $USBDEVICE just in case" >> $LOGFILE
1396    umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1397    # If your key has no MBR it may cause an issue
1398    # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1399    echo "Preparing $USBDEVICE" >> $LOGFILE
1400    $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
1401d
1402d
1403d
1404d
1405n
1406p
14071
1408
1409
1410t
1411b
1412a
14131
1414w
1415EOF
1416    if [ $? -ne 0 ]; then
1417        echo "Unable to create a vfat Filesystem on $USBDEVICE" | tee -a $LOGFILE
1418        echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1419        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1420        MindiExit -1
1421    fi
1422    echo -en "."
1423    echo "Creating a vfat filesystem on $USBPART" >> $LOGFILE
1424    mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1425    if [ $? -ne 0 ]; then
1426        echo "Unable to create a vfat filesystem on $USBPART" | tee -a $LOGFILE
1427        echo "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)" | tee -a $LOGFILE
1428        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1429        MindiExit -1
1430    fi
1431    echo -en "."
1432    echo "Mounting $USBPART on $MINDI_TMP/usb" >> $LOGFILE
1433    mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1434    if [ $? -ne 0 ]; then
1435        echo "Unable to mount $USBPART on $MINDI_TMP/usb" | tee -a $LOGFILE
1436        echo "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)" | tee -a $LOGFILE
1437        $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1438        MindiExit -1
1439    fi
1440    echo -en "."
1441    mkdir -p $MINDI_TMP/usb/images
1442    cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogIt "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1443    echo -en "."
1444    echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1445    for i in memdisk memtest.bin memtest.img ; do
1446        j=$MINDI_LIB/$i
1447        k=$MINDI_TMP/usb
1448        if [ -e "$j" ] ; then
1449            LogIt "Copying $j to $k"
1450            cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1451            cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1452        fi
1453    done
1454    echo -en "."
1455    MakeMessageFile > $MINDI_TMP/usb/message.txt
1456    echo -en "."
1457    cp $kernelpath $MINDI_TMP/usb/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/usb/vmlinuz). Did you run out of disk space?"
1458    echo -en "."
1459    cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1460    echo -en "."
1461    MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1462    echo -en "."
1463    umount $MINDI_TMP/usb
1464    if [ "$ARCH" != "ia64" ] ; then
1465        syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1466        if [ "$?" -ne "0" ] ; then
1467            echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1468            cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1469            LogIt "Failed to create USB image."
1470        else
1471            echo -e "$DONE"
1472            echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1473        fi
1474        rm -f $MINDI_TMP/syslinux.log
1475    else
1476        echo "No USB boot support for ia64" | tee -a $LOGFILE
1477        MindiExit -1
1478    fi
1479}
1480
1481
1482MakeMessageFile() {
1483    iss="/dev/null"
1484    [ -e /etc/issue ] && iss="/etc/issue"
1485    [ -e /etc/issue.net ] && iss="/etc/issue.net"
1486    if [ "`grep -Fi "debian" $iss 2> /dev/null`" ] ; then
1487        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 $iss` `hostname`"% | sed s/KKKKK/"Kernel `uname  -r` on a `uname -m`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ | sed s/%r/"`uname -r`"/ | sed s/%t/"`hostname`"/
1488    else
1489        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" $iss | sed s~/~~ | head -n1 | tr -s ' ' ' '`"/ | sed s/KKKKK/"`grep -i "kernel" $iss | sed s~/~~ | head -n1 | tr -s ' ' ' '`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ | sed s/' 'r' 'on' 'an' 'm/' '`uname -r`' 'on' 'an' '`uname -m`/ | sed s/%r/"`uname -r`"/ | sed s/%t/"`hostname`"/
1490    fi
1491    if [ _"$MONDO_SHARE" != _"" ]; then
1492        if [ "$CDRECOVERY" != "yes" ] ; then
1493            if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1494                echo -en "Press <enter> to continue.\n"
1495            elif [ ! "$MINDI_TMP" ] ; then
1496                echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1497                if [ -e "$MINDI_LIB/memtest.img" ] ; then
1498                 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1499                fi
1500            else
1501                echo -en "$BOOT_MEDIA_MESSAGE"
1502            fi
1503        else
1504            echo -en "\
1505To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1506CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1507        fi
1508    fi
1509    echo -en "\n\n\n"
1510}
1511
1512
1513MakeBootConfFile() {
1514    local options i ooo
1515    options=""
1516    # Type of boot file (elilo or syslinux/isolinux)
1517    type=$1
1518    if [ "$type" = "elilo" ]; then
1519        sep="="
1520    else
1521        sep=" "
1522    fi
1523
1524    # Generic header for conf file
1525    if [ "$type" != "elilo" ] ; then
1526        echo -en "prompt 1\ndisplay message.txt\n"
1527    else
1528        echo -en "prompt\n"
1529    fi
1530
1531    # Compute which default option to boot from
1532    if [ "$CDRECOVERY" = "yes" ] ; then
1533        echo -en "default${sep}RESTORE\n"
1534    # In case it's mondoarchive
1535    elif [ _"$MONDO_SHARE" != _"" ]; then
1536        if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1537            echo -en "default${sep}iso\n"
1538        else
1539            echo -en "default${sep}interactive\n"
1540        fi
1541    else
1542        echo -en "default${sep}expert\n"
1543    fi
1544
1545    # Handle timeout
1546    if [ "$CDRECOVERY" != "yes" ] ; then
1547        echo -en "timeout${sep}300\n"
1548    else
1549        echo -en "timeout${sep}10000\n"
1550    fi
1551    echo -en "\n"
1552
1553    # prepare which labels will be generated
1554    if [ "$CDRECOVERY" = "yes" ] ; then
1555        options="RESTORE expert"
1556    else
1557        if [ _"$MONDO_SHARE" != _"" ]; then
1558            if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
1559                options="iso"
1560            else
1561                options="interactive expert compare iso nuke isonuke"
1562            fi
1563        else
1564            options="expert"
1565        fi
1566    fi
1567
1568    # Generate rest of conf file
1569    for i in $options ; do
1570        ooo=$i
1571        [ "$ooo" = "RESTORE" ] && ooo="nuke"
1572        if [ "$type" = "elilo" ]; then
1573            outstr="image=/vmlinuz\n\tlabel=$i\n\tinitrd=/initrd.img\n\troot=/dev/ram0 append=\" rw ramdisk_size=$ramdisk_size $ooo $ADDITIONAL_BOOT_PARAMS \"\n"
1574        else
1575            ps="/"
1576            if [ "$type" = "syslinux" ]; then
1577                ps=""
1578            fi
1579            outstr="label $i\n\tkernel ${ps}vmlinuz\n\tappend initrd=${ps}initrd.img root=/dev/ram0 rw ramdisk_size=$ramdisk_size ${ooo} $ADDITIONAL_BOOT_PARAMS\n"
1580        fi
1581        echo -en "$outstr"
1582    done
1583
1584    if [ -e "$MINDI_LIB/memtest.img" ] ; then
1585        if [ "$type" = "elilo" ]; then
1586            echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1587            echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1588        else
1589            ps="/"
1590            if [ "$type" = "syslinux" ]; then
1591                ps=""
1592            fi
1593            echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1594            echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1595        fi
1596    fi
1597}
1598
1599
1600PrepareBootDiskImage_LILO() {
1601    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1602    imagesdir=$MINDI_CACHE
1603    kernelpath=$1
1604
1605    retval=0
1606    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1607    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1608    TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1609    echo -en "..."
1610    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1611    mountpoint=$MINDI_TMP/mountpoint.$$
1612    mkdir -p $mountpoint
1613    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1614    mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1615    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1616    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1617    mkdir -p $mountpoint/etc
1618    liloconf=$mountpoint/elilo.conf
1619
1620    MakeBootConfFile elilo > $liloconf
1621
1622    # Copy it so that CD-ROM menu entry is satisfied
1623    mountefi=0
1624    df -T | grep /boot/efi | grep -q vfat
1625    if [ $? -ne 0 ]; then
1626        mount /boot/efi
1627        if [ $? -ne 0 ]; then
1628            echo "You have to mount your EFI partition when using mindi"
1629            MindiExit -1
1630        fi
1631        mountefi=1
1632    fi
1633    el=`find /boot/efi -name elilo.efi`
1634    cp $el $mountpoint
1635    cp $liloconf $mountpoint
1636    if [ $mountefi -eq 1 ]; then
1637        umount /boot/efi 2>&1 > /dev/null
1638    fi
1639
1640    echo "Copying $MINDI_TMP/initrd.img to $mountpoint..." >> $LOGFILE
1641    cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1642    if [ "$?" -ne "0" ] ; then
1643        LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1644        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1645        LogIt "Please unload some of your modules and try again."
1646        rm -f $MINDI_TMP/mtpt.$$
1647        LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1648        retval=$(($retval+1))
1649    fi
1650    MakeMessageFile > $mountpoint/message.txt
1651
1652    mkdir -p $mountpoint/tmp
1653    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1654        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1655    fi
1656
1657    # copy the kernel across
1658    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1659    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1660    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1661    cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1662    if [ "$?" -ne "0" ] ; then
1663        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1664        du -sk $mountpoint/* >> $LOGFILE
1665        echo "--- end of list of files ---" >> $LOGFILE
1666        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1667Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1668        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1669        cd $old_pwd
1670        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1671        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1672    #   losetup /dev/loop0 -d
1673        [ "$imagefile" != "" ] && rm -f $imagefile
1674        return 0
1675    fi
1676    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1677    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1678    echo "Free space left on image = $free_space KB" >> $LOGFILE
1679    echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1680    # make it bootable
1681    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1682    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1683    if [ "$KERN_DISK_MADE" ] ; then
1684        echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
1685    fi
1686
1687    cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1688    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1689    echo -en "..."
1690    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1691    if [ "$retval" -eq "0" ] ; then
1692        echo -en "...$DONE\n"
1693        if [ "$KERN_DISK_MADE" ] ; then
1694            LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1695        fi
1696    else
1697        echo -en "...failed\n"
1698        LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1699        [ "$imagefile" != "" ] && rm -f $imagefile
1700    fi
1701    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1702    return $retval
1703}
1704
1705
1706PrepareBootDiskImage_ISOLINUX() {
1707    local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1708    imagesdir=$MINDI_CACHE
1709    kernelpath=$1
1710    do_boot_root_thingy=""
1711    local retval old_pwd
1712    retval=0
1713
1714    [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1715    echo -en "Making "$BOOT_SIZE"KB boot disk..."
1716    TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1717    echo -en "..."
1718    imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1719    mountpoint=$MINDI_TMP/mountpoint.$$
1720    mkdir -p $mountpoint
1721    dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1722    echo "Creating vfat filesystem on $imagefile" >> $LOGFILE
1723    mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1724    # syslinux should be run on a  local file (doen't work through NFS Cf: #297)
1725    syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1726
1727    # Only move it now to its final destination abd use it now
1728    mv $imagefile $imagesdir
1729    imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1730
1731    mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1732
1733    # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1734    MakeMessageFile > $mountpoint/message.txt
1735    MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1736    echo "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..." >> $LOGFILE
1737    cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1738    if [ "$?" -ne "0" ] ; then
1739        LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1740        cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1741        LogIt "Please unload some of your modules and try again."
1742        rm -f $MINDI_TMP/mtpt.$$
1743        LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1744        retval=$(($retval+1))
1745    fi
1746
1747    mkdir -p $mountpoint/tmp
1748    if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1749        cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1750    fi
1751
1752    # copy the kernel across
1753    [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1754    dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1755    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1756    cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1757    if [ "$?" -ne "0" ] ; then
1758        echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1759        du -sk $mountpoint/* >> $LOGFILE
1760        echo "--- end of list of files ---" >> $LOGFILE
1761        echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1762Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1763        [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1764        cd $old_pwd
1765        umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1766        rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1767
1768        [ "$imagefile" != "" ] && rm -f $imagefile
1769        return 0
1770    fi
1771    free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1772    max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1773    echo "Free space left on image = $free_space KB" >> $LOGFILE
1774    echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1775
1776    # make it bootable
1777    [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1778    mkdir -p $mountpoint/etc
1779    [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1780    umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1781    echo -en "..."
1782    rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1783
1784    if [ "$retval" -eq "0" ] ; then
1785        echo -en "...$DONE\n"
1786        if [ "$KERN_DISK_MADE" ] ; then
1787            [ "$imagefile" != "" ] && rm -f $imagefile
1788            LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1789        fi
1790    else
1791        echo -en "...failed\n"
1792        LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1793        [ "$imagefile" != "" ] && rm -f $imagefile
1794    fi
1795    [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1796    return $retval
1797}
1798
1799
1800ParseModprobeForIncludes() {
1801local MODPROBE_CONF mpincfile includes include
1802
1803MODPROBE_CONF=/etc/modprobe.conf
1804mpincfile=$1
1805touch $mpincfile
1806if [ -a $MODPROBE_CONF ]; then
1807    includes=$(awk '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
1808    if [ -n "$includes" ]; then
1809        for include in $includes
1810        do
1811            if [ -a "$include" ]; then
1812                echo $include >> $mpincfile
1813            fi
1814        done
1815    fi
1816fi
1817}
1818
1819
1820PrepareDataDiskImages() {
1821    local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
1822
1823    imagesdir=$MINDI_CACHE
1824    rm -f $imagesdir/mindi.iso
1825    needlist=$MINDI_TMP/what-we-need.txt
1826    bigdir=$MINDI_TMP/bigdir
1827    mkdir -p $bigdir/usr/bin
1828    mkdir -p $bigdir/usr/sbin
1829    includefile=$MINDI_TMP/$$.includefile.txt
1830
1831    lfiles="$DEPLIST_FILE"
1832    lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
1833    ParseModprobeForIncludes $includefile
1834    lines=$(($lines+`cat $includefile | wc -l`))
1835    cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
1836    res=$?
1837    rm -f $includefile
1838    if [ "$YOUR_KERNEL_SUCKS" ]; then
1839        pwd=`pwd`
1840        cd $MINDI_TMP
1841        for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
1842            tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
1843        done
1844        for i in $EXTRA_MODS ; do
1845            j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
1846            [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o.gz" >> $LOGFILE
1847            for k in $j ; do
1848                tar cf - $k 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogIt "ERROR on module $k" $MINDI_TMP/$$.log
1849                echo "Added failsafe module $k to ramdisk" >> $LOGFILE
1850            done
1851        done
1852        cd $pwd
1853    else
1854        ListKernelModulePaths >> $needlist
1855    fi
1856    if [ "$res" -ne "0" ] ; then
1857        Die "You have $res files present in dependency list\nbut absent from filesystem."
1858    fi
1859    FindAndAddUserKeyboardMappingFile
1860    mkdir -p $bigdir/tmp
1861    if [ _"$MONDO_SHARE" != _"" ]; then
1862        MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
1863        cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
1864    fi
1865    [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
1866    DropOptimizedLibraries $needlist $bigdir
1867    echo -en "Assembling dependency files"
1868    CopyDependenciesToDirectory < $needlist $bigdir
1869
1870    # also copy io.sys and msdos.sys, if we can find them
1871    for i in `mount | cut -d' ' -f3` ; do
1872        for j in io.sys msdos.sys ; do
1873            [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
1874        done
1875    done
1876
1877    # master boot record, too
1878    i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
1879    if [ "$i" ] ; then
1880        LogIt "Backing up $i's MBR"
1881        dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
1882        sleep 1
1883        sync
1884        j=$i
1885        [ -h "$j" ] && j=`readlink -f $j`
1886        LogIt "Creating /dev/boot_device ($j)"
1887        mkdir -p $bigdir/dev
1888        cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
1889    fi
1890
1891    old_pwd=`pwd`
1892    cd $bigdir
1893
1894    # Get terminfo content
1895    ti="usr/share/terminfo/l"
1896    if [ -d /$ti ]; then
1897        mkdir -p $ti
1898        cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "WARNING - error occurred while copying terminfo"
1899    fi
1900    if [ -e "$MONDO_SHARE/restore-scripts" ]; then
1901        cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
1902        [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
1903    fi
1904    [ -d "/lib/dev-state" ] && tar cf - -C / /lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
1905    cd $old_pwd
1906    echo -e "$DONE"
1907    TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
1908    MakeMountlist $MINDI_TMP/mountlist.txt
1909    mkdir -p $bigdir/tmp
1910    cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
1911    if [ _"$MONDO_SHARE" != _"" ]; then
1912        cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
1913    fi
1914    if [ $LVM != "false" ]; then
1915        $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
1916        if [ "$?" -ne "0" ]; then
1917            LVM="false"
1918            rm -f $bigdir/tmp/i-want-my-lvm
1919        fi
1920    fi
1921    cat $bigdir/tmp/mountlist.txt >> $LOGFILE
1922    echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
1923    echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
1924    if [ _"$MONDO_SHARE" != _"" ]; then
1925        for q in filelist.full.gz biggielist.txt ; do
1926            [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
1927            cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
1928        done
1929    fi
1930
1931    echo -en "Tarring and zipping the data content..."
1932    size_of_all_tools=`du -sk $bigdir | cut -f1`
1933    (cd $bigdir ; tar -b 4096 -cf - . 2>> $MINDI_TMP/$$.log | gzip -9 > $imagesdir/all.tar.gz || LogIt "Problem creating all.tar.gz" $MINDI_TMP/$$.log)
1934    du -sk $imagesdir/*gz >> $LOGFILE
1935    echo -e "$DONE"
1936
1937    FRIENDLY_OUTSTRING="Boot and data disk images were created."
1938    rm -rf $bigdir
1939    rm -f $needlist
1940}
1941
1942
1943ProcessLDD() {
1944    local incoming f d nd bd bnd
1945    read incoming
1946    while [ "$incoming" != "" ]; do
1947        # We take the full path name of the dyn. lib. we want
1948        incoming=`echo "$incoming" | awk '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
1949        for f in $incoming ; do
1950            # echo modified file name if one of the parent dir is a link
1951            # by replacing the original dirname by the destination of the link
1952            d="`dirname $f`"
1953            found="false"
1954            while [ "$d" != "/" ]; do
1955                if [ -h "$d" ]; then
1956                    nd=`readlink -f $d`
1957                    bd=`basename $d`
1958                    bnd=`basename $nd`
1959                    f=`echo $f | sed "s~/$bd/~/$bnd/~"`
1960                    echo $d
1961                fi
1962                d="`dirname $d`"
1963            done
1964
1965            echo "$f"
1966            echo "`ReadAllLink $f`"
1967        done
1968        read incoming
1969    done
1970}
1971
1972
1973Prompt() {
1974    echo -en "$1"
1975    read line
1976}
1977
1978
1979ReadLine() {
1980    local i incoming
1981    read incoming
1982    i=0
1983    while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
1984        i=$(($i+1))
1985        read incoming
1986    done
1987    echo "$incoming"
1988}
1989
1990
1991SizeOfPartition() {
1992    local devpath drive res stub
1993    device=$1
1994    if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
1995        res=`SizeOfRaidPartition $device`
1996        [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
1997        echo "$res"
1998        return 0
1999    fi
2000    # patch from Bill <bill@iwizard.biz> - 2003/08/25
2001    res=`$FDISK -s $device 2>> $LOGFILE`
2002    # end patch
2003    [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2004    [ "$res" = "" ] && res="-1"
2005    echo $res
2006    return 0
2007}
2008
2009
2010SizeOfRaidPartition() {
2011    local real_dev smallest_size silly tmp
2012
2013    silly=999999999
2014    smallest_size=$silly
2015
2016    for real_dev in `GetRaidDevMembers $1` ; do
2017        tmp=`SizeOfPartition $real_dev`
2018        [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2019    done
2020
2021    if [ "$smallest_size" = "$silly" ] ; then
2022        echo "-1"
2023        return 1
2024    else
2025        echo "$smallest_size"
2026        return 0
2027    fi
2028}
2029
2030
2031StripComments()
2032{
2033    local tempfile
2034
2035    tempfile=$MINDI_TMP/$$.strip.txt
2036    cp -f $1 $tempfile 2>> $LOGFILE
2037    $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2038    rm -f $tempfile
2039    echo "Stripped comments from $2" >> $LOGFILE
2040}
2041
2042
2043
2044StripExecutable()
2045{
2046    local tmpfile
2047
2048    tmpfile=$MINDI_TMP/stripped.$$.dat
2049    [ -d "$1" ] || [ -h "$1" ] && return
2050    cp -f $1 $tmpfile 2>> $LOGFILE
2051    strip $tmpfile 2> /dev/null
2052    if [ "$?" -eq "0" ] ; then
2053        cp -f $tmpfile $1 2>> $LOGFILE
2054        echo "Stripped binary $2" >> $LOGFILE
2055    fi
2056    rm -f $tmpfile
2057}
2058
2059
2060TryToFindKernelPath() {
2061    local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2062
2063    we_want_version=`uname -r`
2064    possible_kernels=""
2065    duff_kernels=""
2066   
2067    if [ "$ARCH" = "ia64" ] ; then
2068       root="/boot/efi/efi"
2069    else
2070       root="/"
2071    fi
2072    for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
2073        [ ! -e "$fname" ] && continue
2074        [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2075        file $fname | grep -q gzip
2076        if [ "$?" -eq "0" ] ; then
2077            # Used by ia64
2078            fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2079        else
2080            fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2081        fi
2082        [ "$fkern_ver" = "" ] && continue
2083        [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2084        [ -f "$fname" ] || continue
2085        [ -h "$fname" ] && continue
2086        kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2087        file $fname | grep -q gzip
2088        if [ "$?" -eq "0" ] ; then
2089            # Used by ia64
2090            if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2091                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2092                duff_kernels="$fname $duff_kernels"
2093            else
2094                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2095                possible_kernels="$fname $possible_kernels"
2096            fi
2097        else
2098            if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2099                LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2100                duff_kernels="$fname $duff_kernels"
2101            else
2102                [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2103                possible_kernels="$fname $possible_kernels"
2104            fi
2105        fi
2106    done
2107    if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2108        possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2109    fi
2110    if [ ! "$possible_kernels" ] ; then
2111        LogIt "No kernel matches exactly. Are there any duff kernels?"
2112        possible_kernels="$duff_kernels"
2113        if [ ! "$possible_kernels" ] ; then
2114            LogIt "Sorry, no duff kernels either"
2115        else
2116            LogIt "I bet you're running Debian or Gentoo, aren't you?"
2117            LogIt "Your kernel doesn't have a sane builddate. Oh well..."
2118        fi
2119    fi
2120    possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2121    noof_kernels=`CountItemsIn "$possible_kernels"`
2122    if [ "$noof_kernels" -eq "0" ] ; then
2123        LogIt "Could not find your kernel."
2124        if [ -e "/boot/vmlinuz" ] ; then
2125            LogIt "Using /boot/vmlinuz as a last resort."
2126            output=/boot/vmlinuz
2127        else
2128            output=""
2129        fi
2130    elif [ "$noof_kernels" -eq "1" ] ; then
2131        kernelpath=`echo "$possible_kernels" | sed s/' '//`
2132        echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2133        output="$kernelpath"
2134    else
2135        for i in $possible_kernels ; do
2136            if echo $i | grep "`uname -r`" ; then
2137                LogIt "OK, I used my initiative and found that "
2138                LogIt "$i is probably your kernel. "
2139                output="$i"
2140                return
2141            fi
2142        done
2143        if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2144            output=/boot/vmlinuz
2145            echo "Schlomo, this one's for you." >> $LOGFILE
2146        else
2147            LogIt "Two or more possible kernels found. You may specify any one of them and the "
2148            LogIt "boot disks will still work, probably. If one does not work, try another."
2149            LogIt "$possible_kernels"
2150            echo ""
2151        fi
2152    fi
2153    echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2154}
2155
2156
2157TurnTgzIntoRdz() {
2158    local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2159
2160    tgz_dir_fname=$1
2161    rdz_fname=$2
2162    kernelsize=$3
2163    maxsize=$(($BOOT_SIZE-$kernelsize))
2164    maxsize=$(($maxsize*2)); # to allow for compression of 50%
2165    tempfile=$MINDI_TMP/temp.rd
2166    mountpoint=$MINDI_TMP/mnt1
2167    res=0
2168    echo -en "..."
2169    dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2170    echo -en "..."
2171    echo "Creating ext2 filesystem on $tempfile" >> $LOGFILE
2172    mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2173    echo -en "..."
2174    mkdir -p $mountpoint
2175    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."
2176    echo -en "..."
2177    old_pwd=`pwd`
2178    cd $mountpoint
2179
2180    # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
2181    if [ -h "/lib64" ]; then
2182        mkdir -p lib || LogIt "Unable to create lib in $mountpoint."
2183        ln -s lib lib64 || LogIt "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2184    fi
2185
2186    cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2187    tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2188
2189    cd dev || Die "Can't cd to dev"
2190    tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2191    rm -f dev-entries.tgz
2192    cd ..
2193
2194    for w in insmod.static insmod.static.old ; do
2195        s=`which $w 2> /dev/null`
2196        if [ -e "$s" ] ; then
2197            tar cf - -C / $s 2> /dev/null | tar xf -
2198        fi
2199    done
2200
2201    [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2202
2203    # Handle the case where busybox and mount are dynamically linked
2204    file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically" 
2205    if [ $? -eq 0 ]; then
2206        # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2207        rm -f bin/mount $MINDI_TMP/busy.lis
2208        mountlis=`grep mount $DEPLIST_FILE`
2209        for f in $MINDI_LIB/rootfs/bin/busybox $mountlis ; do
2210            if [ -f $f ]; then
2211                LocateDeps $f >> $MINDI_TMP/busy.lis
2212            fi
2213        done
2214        tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in mount analysis" $MINDI_TMP/$$.log
2215        rm -f $MINDI_TMP/busy.lis
2216    fi
2217
2218    # Copy of files mandatory for ld.so
2219    cp -rp /etc/ld.so.c* $mountpoint/etc
2220
2221    # Avoid an issue on some distro (RHEL5)
2222    rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2223
2224    mkdir -p $mountpoint/tmp
2225    # Management of udev (which includes modprobe in rules)
2226    ps auxww | grep -v grep | grep -qw udevd
2227    if [ $? -eq 0 ]; then
2228        echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2229        LogIt "udev device manager found"
2230        tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2231        # This avoids NIC remapping if on another machine at restore time on Debian at least
2232        rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2233        # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2234        rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2235        tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2236        if [ -x /sbin/udevd ]; then
2237            lis2=`grep -Ev '^#' $MINDI_CONF/udev.files` 
2238            lis=""
2239            # Get only the files which exist in that list
2240            # and potentially their symlink structure
2241            for i in $lis2; do
2242                if [ -h $i ]; then
2243                    j=$i
2244                    while [ -h $j ]; do
2245                        lis="$lis $j"
2246                        j=`readlink $j`
2247                    done
2248                    lis="$lis $j"
2249                elif [ -f $i ]; then
2250                    lis="$lis $i"
2251                fi
2252            done
2253            # And their deps
2254            LocateDeps $lis > $MINDI_TMP/udev.lis
2255            for i in $lis; do
2256                if [ "`echo $i | cut -c1`" = "/" ]; then
2257                    j=`echo $i | cut -c2-`
2258                    [ "$j" != "" ] && rm -f $j
2259                fi
2260            done
2261            tar cf - -C / $lis `sort -u $MINDI_TMP/udev.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in udev.lis analysis" $MINDI_TMP/$$.log
2262            rm -f $MINDI_TMP/udev.lis
2263        else
2264            echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
2265            echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
2266            rm -f $mountpoint/tmp/USE-UDEV
2267        fi
2268    fi
2269
2270    # Management of potential HW info (Proliant only at the moment)
2271    rm -rf $MINDI_CACHE/bkphw
2272    mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2273    if [ -d $MINDI_CACHE/bkphw ]; then
2274        LogIt "Hardware Information found and saved ..."
2275        cp -rp $MINDI_CACHE/bkphw .
2276        if [ -f $MINDI_CACHE/tools.files ]; then
2277            lis=`grep -Ev '^#' $MINDI_CACHE/tools.files` 
2278            LocateDeps $lis > $MINDI_TMP/tools.lis
2279            tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in tools.lis analysis" $MINDI_TMP/$$.log
2280        fi
2281        if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2282            mv -f $MINDI_CACHE/mindi-rsthw .
2283            chmod 755 ./mindi-rsthw
2284        fi
2285        rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2286    fi
2287
2288    for w in cdrom groovy-stuff ; do
2289        mkdir -p mnt/$w
2290    done
2291
2292    tar cf - -C / /dev/fd0*[1,2][4,7,8]* 2>> $MINDI_TMP/$$.log | tar xf -  || LogIt "Problem in fd dev analysis" $MINDI_TMP/$$.log
2293
2294    cd $old_pwd
2295    echo -en "..."
2296    old_pwd=`pwd`
2297    if [ "$YOUR_KERNEL_SUCKS" ] ; then
2298        cd $MINDI_TMP
2299        needed_modules_path=lib/modules/$FAILSAFE_KVER
2300    else
2301        cd /
2302        if [ "${kernelname}" != "" ]
2303        then
2304            needed_modules_path=lib/modules/${kernelname}
2305        else
2306            needed_modules_path=lib/modules/`uname -r`
2307        fi
2308    fi
2309
2310    needed_modules=""
2311    list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2312
2313    if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
2314        # For PXE boot
2315        list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2316    fi
2317    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2318        list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2319    fi
2320    for i in $DENY_MODS; do
2321        echo "Removing $i from the list of modules to load" >> $LOGFILE
2322        list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2323    done
2324
2325    [ -e "$needed_modules_path" ] || LogIt "path $needed_modules_path does not exist.\n If you're not using a modular kernel then you're NUTS."
2326    for i in $list_of_groovy_mods ; do
2327        needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2328    done
2329
2330    for i in $needed_modules ; do
2331        [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2332        [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2333        echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2334        tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2335        # Uncompress modules if not using udev and native modprobe
2336        if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2337            if [ "`echo "$i" | grep -F ".gz"`" ]; then
2338                echo "Uncompressing $i" >> $LOGFILE
2339                gunzip -f $mountpoint/$i
2340            fi
2341        fi
2342    done
2343
2344    # Also copy modules.dep in case of udev so that normal modprobe works
2345    tar cf - -C / /$needed_modules_path/modules.dep 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy modules.dep to $mountpoint" $MINDI_TMP/$$.log
2346
2347    if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2348        echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2349        [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2350        [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2351        rm -f $mountpoint/sbin/devfsd
2352    fi
2353    cd $old_pwd
2354    [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2355    dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2356    rm -f $mountpoint/zero
2357    if [ _"$MONDO_SHARE" != _"" ]; then
2358        MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2359        cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2360        cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2361        echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2362        echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2363        [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2364        [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2365        [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2366        [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2367    fi
2368    mkdir -p $mountpoint/proc
2369    echo "$BOOT_SIZE" > $mountpoint/tmp/$BOOT_SIZE.siz
2370    # Determine what filesystem to use for initrd image
2371    echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2372    gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2373    [ -z  gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2374    case "$gvFileSystem" in
2375    "ext2fs")
2376        # say what will be used
2377        echo "Creating an ext2 initrd image..." >> $LOGFILE
2378        # kernel expects linuxrc in ext2 filesystem
2379        ( cd $mountpoint && ln -sf sbin/init linuxrc )
2380        # unmount loop filesystem and create image file using the standard approach
2381        umount $mountpoint || Die "Cannot unmount $tempfile"
2382        dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2383        bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2384        ADDITIONAL_BOOT_PARAMS="$ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2385        gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2386        rm -f ${rdz_fname}.tmp
2387        # log that we are done
2388        echo "...done." >> $LOGFILE
2389    ;;
2390    "initramfs")
2391        # say what will be used
2392        echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
2393        # make sure that cpio is there
2394        which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2395        # go into filesystem
2396        cd $mountpoint
2397        # kernel expects init in cpio filesystem
2398        ln -sf sbin/init init
2399        # create cpio image file and unmount loop filesystem
2400        find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2401        cd $old_pwd
2402        umount $mountpoint || Die "Cannot unmount $tempfile"
2403        # log that we are done
2404        echo "...done." >> $LOGFILE
2405    ;;
2406    *)
2407        Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2408    ;;
2409    esac
2410    if [ "$res" -eq "0" ] ; then
2411        echo -en "..."
2412    else
2413        echo -en "\rMade an rdz WITH ERRORS.           \n"
2414    fi
2415    return 0
2416}
2417
2418
2419##############################################################################
2420#----------------------------------- Main -----------------------------------#
2421##############################################################################
2422
2423# Now we can create what we need
2424mkdir -p $MINDI_TMP
2425
2426# Purge from potential old run
2427if [ _"$MINDI_CACHE" = _"" ]; then
2428    Die "MINDI_CACHE undefined"
2429fi
2430rm -rf $MINDI_CACHE/* 2> /dev/null
2431mkdir -p $MINDI_CACHE
2432
2433if [ "$1" = "--printvar" ] ; then
2434    shift
2435    if [ _"$1" != _"" ] ; then
2436        set | grep -Ew "^$1" | cut -d= -f2
2437    fi
2438    MindiExit 0
2439fi
2440
2441> $LOGFILE
2442echo "mindi v$MINDI_VERSION" >> $LOGFILE
2443echo "$ARCH architecture detected" >> $LOGFILE
2444echo "mindi called with the following arguments:" >> $LOGFILE
2445echo "$@" >> $LOGFILE
2446echo "Start date : `date`" >> $LOGFILE
2447echo "-----------------------------" >> $LOGFILE
2448
2449[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2450
2451# Log some capital variables
2452[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2453echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
2454echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
2455echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
2456[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2457echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
2458if [ -f $MINDI_CONFIG ]; then
2459    echo "-----------------------------" >> $LOGFILE
2460    echo " Mindi configuration file    " >> $LOGFILE
2461    echo "-----------------------------" >> $LOGFILE
2462    grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2463    echo "-----------------------------" >> $LOGFILE
2464fi
2465
2466
2467trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2468
2469# Sanity checks
2470which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2471which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2472which 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."
2473which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2474if which awk &> /dev/null ; then
2475    if ! which gawk &> /dev/null ; then
2476        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"
2477    fi
2478fi
2479which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2480[ ! -e "$FDISK" ] && Die "Cannot find (s)fdisk"
2481
2482[ "`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"
2483
2484# Update the PATH variable if incomplete
2485if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2486    PATH=$PATH:/sbin:/usr/sbin
2487    export PATH
2488    echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
2489    echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
2490    echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
2491fi
2492
2493# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2494if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2495    source $MINDI_LIB/FindDistroFailsafe
2496    # Log kernel image
2497    LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2498else
2499    [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2500fi
2501
2502if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2503    Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2504fi
2505
2506### BERLIOS
2507### Fix as it's not mandatory on ia64
2508if [ "$ARCH" = "ia64" ] ; then
2509    if which elilo &> /dev/null ; then
2510        LILO_EXE=elilo
2511    else
2512        LILO_EXE=`which false 2> /dev/null`
2513    fi
2514else
2515    FindIsolinuxBinary
2516fi
2517trap "Aborted" SIGTERM
2518DONE="\r\t\t\t\t\t\t\t\tDone.         "
2519kernelpath=""
2520MONDO_ROOT=/var/cache/mondo
2521mkdir -p $MONDO_ROOT
2522
2523if [ -d "/proc/lvm" ]; then
2524    # LVM v1
2525    LVMCMD=""
2526    LVM="v1"
2527elif [ -d "/dev/mapper" ]; then
2528    # LVM v2
2529    LVMCMD="lvm"
2530    LVM="v2"
2531else
2532    LVM="false"
2533fi
2534echo "LVM set to $LVM" >> $LOGFILE
2535echo "----------" >> $LOGFILE
2536echo "mount result:" >> $LOGFILE
2537echo "-------------" >> $LOGFILE
2538mount >> $LOGFILE
2539echo "-------------" >> $LOGFILE
2540if [ -e /etc/raidtab ]; then
2541    echo "-------------" >> $LOGFILE
2542    echo "/etc/raidtab content:" >> $LOGFILE
2543    echo "-------------" >> $LOGFILE
2544    cat /etc/raidtab >> $LOGFILE
2545fi
2546echo "-------------" >> $LOGFILE
2547echo "cat /proc/cmdline:" >> $LOGFILE
2548echo "-------------" >> $LOGFILE
2549cat /proc/cmdline >> $LOGFILE
2550echo "-------------" >> $LOGFILE
2551echo "cat /proc/swaps:" >> $LOGFILE
2552echo "-------------" >> $LOGFILE
2553cat /proc/swaps >> $LOGFILE
2554echo "-------------" >> $LOGFILE
2555echo "cat /proc/partitions:" >> $LOGFILE
2556echo "-------------" >> $LOGFILE
2557cat /proc/partitions >> $LOGFILE
2558echo "-------------" >> $LOGFILE
2559echo "cat /proc/filesystems:" >> $LOGFILE
2560echo "-------------" >> $LOGFILE
2561cat /proc/filesystems >> $LOGFILE
2562echo "-------------" >> $LOGFILE
2563echo "lsmod result:" >> $LOGFILE
2564echo "-------------" >> $LOGFILE
2565lsmod >> $LOGFILE
2566MODULES="`cat /proc/modules | awk '{print $1}'`"
2567if [ -x /usr/sbin/esxcfg-module ]; then
2568    echo "-------------" >> $LOGFILE
2569    echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
2570    echo "-------------" >> $LOGFILE
2571    echo "VMWare modules" >> $LOGFILE
2572    echo "-------------" >> $LOGFILE
2573    /usr/sbin/esxcfg-module -l >> $LOGFILE
2574    MODULES="$MODULES `/usr/sbin/esxcfg-module -l | awk '{print $1}'`"
2575fi
2576echo "FORCE_MODS:" >> $LOGFILE
2577echo "-------------" >> $LOGFILE
2578echo $FORCE_MODS >> $LOGFILE
2579echo "-------------" >> $LOGFILE
2580echo "DENY_MODS:" >> $LOGFILE
2581echo "-------------" >> $LOGFILE
2582echo $DENY_MODS >> $LOGFILE
2583echo "-------------" >> $LOGFILE
2584echo "df result:" >> $LOGFILE
2585echo "----------" >> $LOGFILE
2586df -T >> $LOGFILE
2587echo "-------------" >> $LOGFILE
2588echo "Liste of extra modules is:" >> $LOGFILE
2589echo "$EXTRA_MODS" >> $LOGFILE
2590echo "-------------" >> $LOGFILE
2591
2592# Compute libata version
2593laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/  *//g' 2> /dev/null`
2594# If libata v2 is used then remove ide-generic as it will perturbate boot
2595if [ "`echo $MODULES | grep libata`" ]; then
2596    if [ "$laver" = "2" ]; then
2597        DENY_MODS="$DENY_MODS ide-generic"
2598        echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
2599        echo "-------------" >> $LOGFILE
2600    fi
2601fi
2602
2603FLOPPY_WAS_MOUNTED=""
2604for mtpt in /media/floppy /mnt/floppy /floppy ; do
2605    if mount | grep -w $mtpt &> /dev/null ; then
2606        FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2607        umount $mtpt
2608    fi
2609done
2610
2611#
2612# If we have a USB device we need to store info
2613# and remove it from the parameters line
2614#
2615if [ "$#" -ne "0" ] ; then
2616    if [ "$1" = "--usb" ] ; then
2617        shift
2618        USBDEVICE=$1
2619        if [ _"$USBDEVICE" = _"" ]; then
2620            Die "No USB device specified"
2621        fi
2622        shift
2623    fi
2624fi
2625
2626if [ "$#" -ne "0" ] ; then
2627    if [ "$1" = "--findkernel" ] ; then
2628        res=`TryToFindKernelPath`
2629        # Avoids logfile content for mondo
2630        export MONDO_SHARE=""
2631        if [ "$res" = "" ] ; then
2632            MindiExit -1
2633        else
2634            echo "$res"
2635            MindiExit 0
2636        fi
2637    elif [ "$1" = "--locatedeps" ] ; then
2638        [ ! "$2" ] && Die "Please specify the binary to look at"
2639        LocateDeps $2
2640        # Avoids logfile content for mondo
2641        export MONDO_SHARE=""
2642        MindiExit $?
2643    elif [ "$1" = "--readalllink" ] ; then
2644        [ ! "$2" ] && Die "Please specify the binary to look at"
2645        ReadAllLink $2
2646        # Avoids logfile content for mondo
2647        export MONDO_SHARE=""
2648        MindiExit $?
2649    elif [ "$1" = "--makemountlist" ] ; then
2650        [ ! "$2" ] && Die "Please specify the output file"
2651        MakeMountlist $2
2652        # Avoids logfile content for mondo
2653        export MONDO_SHARE=""
2654        MindiExit $?
2655    elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2656        echo "Mindi v$MINDI_VERSION"
2657        # Avoids logfile content for mondo
2658        export MONDO_SHARE=""
2659        MindiExit 0
2660    elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2661        MONDO_TMP=$2
2662        # Change MINDI_TMP for the one provided by mondo
2663        # So that it can get back the built files
2664        if [ _"$MONDO_TMP" = _"" ]; then
2665            Die "MONDO_TMP is empty, aborting"
2666        fi
2667        if [ _"$MONDO_TMP" = _"/" ]; then
2668            Die "MONDO_TMP is /, aborting"
2669        fi
2670        mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
2671        rmdir $MINDI_TMP
2672        export MINDI_TMP=$MONDO_TMP
2673        mkdir -p $MINDI_TMP
2674        # This is the scratch dir in mondo - subdir images
2675        MINDI_CACHE=$3
2676        if [ _"$MINDI_CACHE" != _"" ]; then
2677            mkdir -p $MINDI_CACHE
2678        fi
2679        kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2680###
2681### Sq-Modification...
2682### Attempt to locate kernel specific module path
2683### if module path is found then use it other wise use uname -r to set it...
2684###
2685        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2686        LogIt "kernelname = $kernelname"
2687        LogIt "kernelpath = $kernelpath"
2688        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2689        then
2690           LogIt "Module path for ${kernelpath} not found..."
2691           LogIt "using running kernel\'s modules."
2692           kernelname=`uname -r`
2693        else
2694           LogIt "Using modules for kernel: ${kernelname}"
2695        fi
2696###
2697### end of Sq-Modification
2698###
2699        TAPEDEV=$5
2700        TAPESIZE=$6
2701        FILES_IN_FILELIST=$7
2702        USE_LZO=$8
2703        CDRECOVERY=$9
2704        if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2705            IMAGE_DEVS=""
2706        else
2707            IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2708        fi
2709        if [ "${11}" ] ; then
2710            LILO_OPTIONS=""
2711    #       LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
2712        fi
2713        LAST_FILELIST_NUMBER=${12}
2714        ESTIMATED_TOTAL_NOOF_SLICES=${13}
2715        EXCLUDE_DEVS="${14}"
2716        USE_COMP="${15}"
2717        USE_LILO="${16}"
2718        USE_STAR="${17}"
2719        INTERNAL_TAPE_BLOCK_SIZE="${18}"
2720        DIFFERENTIAL="${19}"
2721        USE_GZIP="${20}"
2722        NOT_BOOT="${21}"
2723        [ "$USE_COMP" = "" ] && USE_COMP=yes
2724        [ "$USE_GZIP" = "" ] && USE_GZIP=no
2725        [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
2726        [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
2727        [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2728        kernelname=`echo $kernelpath | cut -d'-' -f2-`
2729        if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2730        then
2731           LogIt "Module path for ${kernelpath} not found..."
2732           LogIt "using running kernel\'s modules."
2733           kernelname=`uname -r`
2734        else
2735           LogIt "Using modules for kernel: ${kernelname}"
2736        fi
2737        # MONDO_ROOT is the real scratchdir
2738        MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
2739        if [ _"$MONDO_ROOT" != _"" ]; then
2740            mkdir -p $MONDO_ROOT
2741        else
2742            Die "MONDO_ROOT is undefined"
2743        fi
2744    else
2745        echo "Syntax: mindi (--custom ....)" >> /dev/stderr
2746        MindiExit -1
2747    fi
2748fi
2749[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2750
2751if [ _"$MONDO_SHARE" = _"" ]; then
2752    LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
2753    LogIt "Latest Mindi is available from http://www.mondorescue.org"
2754    LogIt "BusyBox sources are available from http://www.busybox.net"
2755    LogIt "------------------------------------------------------------------------------"
2756else
2757    echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
2758fi
2759if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
2760    LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
2761else
2762    LogIt "Unable to find mindi-busybox, please install it"
2763    MindiExit -1
2764fi
2765
2766# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
2767insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
2768for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2769    insmod $i >> $LOGFILE 2>> $LOGFILE
2770done
2771
2772KERN_DISK_MADE=""
2773
2774echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
2775echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
2776echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
2777if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
2778    LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
2779    MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2780    MakeMountlist $MINDI_TMP/mountlist.txt
2781    mkdir -p $MINDI_TMP/small-all/tmp
2782    cd $MINDI_TMP/small-all
2783    cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
2784    tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
2785    sleep 2
2786    LogIt "Done. Exiting."
2787    MindiExit 0
2788fi
2789
2790if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2791    LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
2792fi
2793
2794if [ "$kernelpath" = "" ] ; then
2795    [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
2796    echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2797    read ch
2798    if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2799        USE_OWN_KERNEL="yes"
2800    else
2801        USE_OWN_KERNEL="no"
2802    fi
2803    if [ "$USE_OWN_KERNEL" = "yes" ]; then
2804        YOUR_KERNEL_SUCKS=""
2805        kernelpath=`TryToFindKernelPath`
2806        if [ "$kernelpath" = "" ] ; then
2807            echo -n "Please enter kernel path : "
2808            read kernelpath
2809        fi
2810    else
2811        YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
2812    fi
2813fi
2814if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
2815    # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2816    if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
2817        source $MINDI_LIB/FindDistroFailsafe
2818        # Log kernel image
2819        LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2820        kernelpath="$FAILSAFE_KBIN"
2821        LogIt "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
2822        LogIt "The failsafe kernel is $kernelpath.\n"
2823        LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
2824        LogIt "disks then it may still be a result of a problem with your kernel.\n"
2825        pwd=`pwd`
2826        cd $MINDI_TMP
2827        mkdir -p lib/modules
2828        cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
2829        cd $pwd
2830    else
2831        kernelpath=$MINDI_LIB/vmlinuz
2832        LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2833        LogIt "However, you are still running your kernel. If Mindi fails to create your"
2834        LogIt "disks then it may still be a result of a problem with your kernel."
2835        pwd=`pwd`
2836        cd $MINDI_TMP
2837        bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2838        cd $pwd
2839    fi
2840    YOUR_KERNEL_SUCKS="Your kernel sucks"
2841fi
2842echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
2843[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
2844
2845[ "$YOUR_KERNEL_SUCKS" ] && [ ! "$FAILSAFE_KVER" ] && Die "Please install mindi-kernel package. You need it.\nGo to http://www.mondorescue.org and download it, then install it."
2846
2847PrepareDataDiskImages
2848
2849ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2850rds=$(($ramdisk_size-$((ramdisk_size%4096))))
2851export ramdisk_size=$rds
2852
2853echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
2854if [ "$ARCH" = "ia64" ] ; then
2855    PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
2856else
2857    PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
2858fi
2859
2860[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2861...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2862
2863if [ _"$MONDO_SHARE" = _"" ]; then
2864    ListImagesForUser
2865    OfferToMakeBootableISO
2866    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
2867        OfferToMakeBootableUSB
2868    fi
2869    LogIt "Finished."
2870elif [ "$TAPEDEV" ] ; then
2871    if [ "$ARCH" != "ia64" ] ; then
2872        # We need to keep the img file as boot file for ia64 platform
2873        rm -f $MINDI_CACHE/{*img,*iso}
2874    else
2875        rm -f $MINDI_CACHE/*iso
2876    fi
2877    if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2878        OfferToMakeBootableUSB
2879    fi
2880    OfferToMakeBootableISO
2881    if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
2882        cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
2883    else
2884        Die "Cannot find all.tar.gz, to be written to tape"
2885    fi
2886elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2887    OfferToMakeBootableUSB
2888else
2889    OfferToMakeBootableISO
2890fi
2891# cleanup
2892LogIt "$FRIENDLY_OUTSTRING"
2893for mtpt in $FLOPPY_WAS_MOUNTED ; do
2894    mount $mtpt
2895done
2896MindiExit 0
Note: See TracBrowser for help on using the repository browser.