source: branches/2.2.9/mindi/mindi @ 2625

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