source: branches/2.2.10/mindi/mindi @ 2598

Last change on this file since 2598 was 2598, checked in by bruno, 9 years ago

r3742@localhost: bruno | 2010-03-15 01:52:11 +0100

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