@@ -1484,71 +1484,80 @@ normalize() {
1484
1484
input=$( cat)
1485
1485
fi
1486
1486
1487
- echo " $input " | xargs | tr ' [:upper:]' ' [:lower:]'
1487
+ echo $( trim " $input " | xargs | tr ' [:upper:]' ' [:lower:]' )
1488
+ }
1489
+ resolve_path () {
1490
+ local input=" $* "
1491
+
1492
+ # If no arguments, read from stdin
1493
+ if [[ -z " $input " ]]; then
1494
+ input=$( cat)
1495
+ fi
1496
+
1497
+ echo $( readlink -f " $input " 2> /dev/null || echo " $input " )
1488
1498
}
1489
1499
# Gets the hard drive on the host
1490
1500
# Note: This function makes a best guess
1491
1501
getHardDisk () {
1492
1502
hd=" "
1493
1503
disks=" "
1494
- local devs=$( lsblk -dpno KNAME,SIZE -I 3,8,9,179,202,253,259 | awk ' $2 != "0B" { print $1 }' | sort -uV)
1504
+ # Get valid devices (filter out 0B disks) once
1505
+ local devs
1506
+ devs=$( lsblk -dpno KNAME,SIZE -I 3,8,9,179,202,253,259 | awk ' $2 != "0B" { print $1 }' | sort -uV)
1495
1507
1496
1508
if [[ -n $fdrive ]]; then
1497
- found_match=0
1498
- for spec in $( echo " $fdrive " | tr " ," " \n" ) ; do
1499
- matched=0
1509
+ local found_match=0
1510
+ for spec in ${fdrive// ,/ } ; do
1511
+ local spec_resolved
1512
+ spec_resolved=$( resolve_path " $spec " )
1513
+ local spec_norm
1514
+ spec_norm=$( normalize " $spec_resolved " )
1515
+ local matched=0
1516
+ local spec_normalized
1517
+ spec_normalized=$( normalize " $spec " )
1518
+
1500
1519
for dev in $devs ; do
1501
- dev_trimmed=$( echo " $dev " | xargs)
1502
- spec_resolved=$( realpath " $spec " 2> /dev/null || echo " $spec " )
1503
- spec_lc=$( normalize " $spec_resolved " )
1520
+ local size uuid serial wwn
1504
1521
size=$( blockdev --getsize64 " $dev " | normalize)
1505
- uuid=$( blkid -s UUID -o value " $dev_trimmed " 2> /dev/null | normalize)
1506
- read -r serial wwn <<< " $(lsblk -pdno SERIAL,WWN " $dev_trimmed " 2>/dev/null | normalize)"
1507
- if [[ -n $isdebug ]]; then
1508
- echo " Comparing spec='$spec_lc ' with:"
1509
- echo " dev=$dev "
1510
- echo " size=$size "
1511
- echo " serial=$serial "
1512
- echo " wwn=$wwn "
1513
- echo " uuid=$uuid "
1514
- fi
1515
- if [[ " x$spec_resolved " = " x$dev_trimmed " ||
1516
- " x$spec_lc " = " x$dev_trimmed " ||
1517
- " x$spec_lc " = " x$( trim $( blockdev --getsize64 " $dev_trimmed " ) ) " ||
1518
- " x$spec_lc " = " x$wwn " ||
1519
- " x$spec_lc " = " x$serial " ||
1520
- " x$spec_lc " = " x$uuid " ]]; then
1522
+ uuid=$( blkid -s UUID -o value " $dev " 2> /dev/null | normalize)
1523
+ read -r serial wwn <<< " $(lsblk -pdno SERIAL,WWN " $dev " 2>/dev/null | normalize)"
1524
+
1525
+ [[ -n $isdebug ]] && {
1526
+ echo " Comparing spec='$spec ' (resolved: '$spec_resolved ') with dev=$dev "
1527
+ echo " size=$size serial=$serial wwn=$wwn uuid=$uuid "
1528
+ }
1529
+ if [[ " x$spec_resolved " == " x$dev " || " x$spec_normalized " == " x$size " ||
1530
+ " x$spec_normalized " == " x$wwn " || " x$spec_normalized " == " x$serial " ||
1531
+ " x$spec_normalized " == " x$uuid " ]]; then
1532
+ [[ -n $isdebug ]] && echo " Matched spec '$spec ' to device '$dev ' (size=$size , serial=$serial , wwn=$wwn , uuid=$uuid )"
1521
1533
matched=1
1522
1534
found_match=1
1523
- disks=" ${disks} $dev "
1524
- # Remove matched dev from devs to avoid duplicates
1525
- escaped_dev=$( echo " $dev " | sed -e ' s/[]\/"$&*.^|[]/\\&/g' )
1526
- devs=$( echo " $devs " | sed " s/[[:space:]]*${escaped_dev} [[:space:]]*/ /" )
1535
+ disks=" $disks $dev "
1536
+ devs=${devs// $dev / } # remove matched dev
1527
1537
break
1528
1538
fi
1529
1539
done
1530
- if [[ $matched -eq 0 ]]; then
1531
- echo " WARNING: Drive spec '$spec ' does not match any available device. Ignoring." >&2
1532
- fi
1540
+
1541
+ [[ $matched -eq 0 ]] && echo " WARNING: Drive spec '$spec ' does not match any available device." >&2
1533
1542
done
1534
1543
1535
- if [[ $found_match -eq 0 ]]; then
1536
- handleError " Fatal Error: No valid drives found from 'Host Primary Disk'=' $fdrive '. Please ensure the device exists and is not 0 bytes. ( $0 ) "
1537
- fi
1544
+ [[ $found_match -eq 0 ]] && handleError " Fatal: No valid drives found for 'Host Primary Disk'=' $fdrive '. "
1545
+
1546
+ disks= $( echo " $disks $devs " | xargs ) # add unmatched devices for completeness
1538
1547
1539
- disks=$( echo " ${disks} ${devs} " | xargs)
1540
1548
elif [[ -r ${imagePath} /d1.size && -r ${imagePath} /d2.size ]]; then
1541
- disks=$( echo " $devs " )
1549
+ disks=" $devs "
1542
1550
else
1543
- # Auto-select the largest available drive if no fdrive and no imagePath match
1544
- hd=$( echo " $devs " | while read line ; do echo " $( blockdev --getsize64 " $line " ) $line " ; done | sort -n | tail -1 | cut -d' ' -f2)
1545
- [[ -z $hd ]] && handleError " Could not determine a suitable disk automatically. No drives available? ( $0 ) "
1551
+ # Auto-select largest available drive
1552
+ hd=$( for d in $devs ; do echo " $( blockdev --getsize64 " $d " ) $d " ; done | sort -n | tail -1 | cut -d' ' -f2)
1553
+ [[ -z $hd ]] && handleError " Could not determine a suitable disk automatically."
1546
1554
disks=" $hd "
1547
1555
fi
1548
1556
1549
1557
# Set primary hard disk
1550
- hd=$( echo " $disks " | awk ' {print $1}' )
1558
+ hd=$( awk ' {print $1}' <<< " $disks " )
1551
1559
}
1560
+
1552
1561
# Finds the hard drive info and set's up the type
1553
1562
findHDDInfo () {
1554
1563
dots " Looking for Hard Disk(s)"
0 commit comments