summaryrefslogtreecommitdiff
path: root/disk-details
diff options
context:
space:
mode:
Diffstat (limited to 'disk-details')
-rwxr-xr-xdisk-details141
1 files changed, 64 insertions, 77 deletions
diff --git a/disk-details b/disk-details
index 03dbf3b..978c4ce 100755
--- a/disk-details
+++ b/disk-details
@@ -1,88 +1,75 @@
-#!/bin/sh
+#!/usr/bin/perl
-PATH=/usr/sbin:$PATH
-export PATH
+use strict;
+use warnings;
-if [ "$1"x != ""x ] ; then
- DEVICES="$@"
-else
- DEVICES="/dev/sd? /dev/nvme?n1"
-fi
+$ENV{"PATH"} = "/usr/sbin:" . $ENV{"PATH"};
-print_capacity () {
- DEVICE=$1
- sg_readcap ${DEVICE} | perl -e '
- while (<STDIN>) {
- chomp;
- m/Device size:.*\s+(\S+\s+GB)/ and printf("%11.11s\n", $1);
- }'
+sub print_capacity ($) {
+ my $device = shift;
+
+ open(IN, "sg_readcap $device |");
+ if ($? != 0) {
+ print "[READCAP ERROR]\n";
+ return;
+ }
+ while (<IN>) {
+ chomp;
+ m/Device size:.*\s+(\S+\s+GB)/ and printf("%11.11s\n", $1);
+ }
+ close IN;
}
# Parse the output of sg_inq
-sg_data () {
- DEVICE=$1
+sub sg_data ($) {
+ my $device = shift;
+ my ($vendor, $product, $fw, $serial, $vendor_prod);
- if [ ! -e "$DEVICE" ]; then
- return
- fi
+ open(IN, "sg_inq $device |");
+ if ($? != 0) {
+ printf("%-14.14s [ERRORS]\n", "$device:");
+ return;
+ }
- sg_inq ${DEVICE} >/dev/null 2>&1
- if [ $? -ne 0 ]; then
- echo " [ERRORS]"
- else
- sg_inq ${DEVICE} | perl -e '
- while (<STDIN>) {
- chomp;
- m/Vendor identification:\s+(.*)/ and $vendor = $1;
- m/Product identification:\s+(.*)/ and $product = $1;
- m/Product revision level:\s+(.*)/ and $fw = $1;
- m/Unit serial number:\s+(.*)/ and $serial = $1;
- }
- printf("%-8.8s %-16.16s %-8.8s %-24s ", $vendor, $product, $fw, $serial)'
- if [ $? -ne 0 ]; then
- echo " [ERRORS]"
- fi
- print_capacity ${DEVICE}
- fi
-# smartctl -a $DEVICE | grep -e "Start_Stop_Count" -e "Load_Cycle_Count"
+ # Sigh, different device types output different formats
+ if ($device =~ m,^/dev/sd,) {
+ while (<IN>) {
+ chomp;
+ m/Vendor identification:\s+(.*)/ and $vendor = $1;
+ m/Product identification:\s+(.*)/ and $product = $1;
+ m/Product revision level:\s+(.*)/ and $fw = $1;
+ m/Unit serial number:\s+(.*)/ and $serial = $1;
+ }
+ printf("%-14.14s %-8.8s %-16.16s %-8.8s %-24s ", "$device:", $vendor, $product, $fw, $serial);
+ }
+ elsif ($device =~ m,^/dev/nvme,) {
+ while (<IN>) {
+ chomp;
+ m/Model number:\s+(.*)/ and $vendor_prod = $1;
+ m/Serial number:\s+(.*)/ and $serial = $1;
+ m/Firmware revision:\s+(.*)/ and $fw = $1;
+ m/Unit serial number:\s+(.*)/ and $serial = $1;
+ }
+ printf("%-14.14s %-25.25s %-8.8s %-24s ", "$device:", $vendor_prod, $fw, $serial)
+ } else {
+ print "Unknown device type $device\n";
+ close IN;
+ return;
+ }
+
+ close IN;
+ print_capacity($device);
}
-# Sigh, NVME devices output a different format
-nvme_data () {
- DEVICE=$1
-
- sg_inq ${DEVICE} >/dev/null 2>&1
- if [ $? -ne 0 ]; then
- echo " [ERRORS]"
- else
- sg_inq ${DEVICE} | perl -e '
- while (<STDIN>) {
- chomp;
- m/Model number:\s+(.*)/ and $vendor_prod = $1;
- m/Serial number:\s+(.*)/ and $serial = $1;
- m/Firmware revision:\s+(.*)/ and $fw = $1;
- m/Unit serial number:\s+(.*)/ and $serial = $1;
- }
- printf("%-25.25s %-8.8s %-24s ", $vendor_prod, $fw, $serial)'
- if [ $? -ne 0 ]; then
- echo " [ERRORS]"
- fi
- print_capacity ${DEVICE}
- fi
-# smartctl -a $DEVICE | grep -e "Start_Stop_Count" -e "Load_Cycle_Count"
-}
+my @devices;
+if (scalar(@ARGV) > 0) {
+ @devices = @ARGV;
+} else {
+ @devices = glob "/dev/sd? /dev/nvme?n1";
+}
-for DEVICE in ${DEVICES}; do
- if [ -e "$DEVICE" ]; then
- printf "%-15.15s" "${DEVICE}:"
- case $DEVICE in
- /dev/sd*)
- sg_data $DEVICE;;
- /dev/nvme*)
- nvme_data $DEVICE;;
- *)
- echo "Unknown device type $DEVICE"
- ;;
- esac
- fi
-done
+foreach my $device (@devices) {
+ if (-e $device) {
+ sg_data($device);
+ }
+}