source: MondoRescue/branches/2.2.5/mindi/mindi@ 1815

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