Re: Storage device enumeration script

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Great tool, thanks for sharing.

I had to add some error handling to get it to work properly.
Currently it runs on Ubuntu 10.04, 10.10 and 11.04.

Added the check John Robinson asked for as well.

Attached patch for those interested.


--
Thanks
TorbjÃrn

On Wed, 2011-05-25 at 23:03 -0400, Phil Turmel wrote:
> Hi All,
> 
> Last November, I shared a shell script that helped me keep track of the specific hot-swap drives I had in the various slots of my servers.  Although encouraged by Roman and John, I declined to make a project out of it.
> 
> I've since kicked it around some more, and thought a bit about supporting more than just the SCSI subsystem.  The latest and greatest is still built around some standard executables:  blkid, lspci, lsusb, sginfo, and smartctl.  The original was similar to "lsscsi", but with controller details and device serial numbers.
> 
> New features:
> 	Supports non-SCSI storage devices
> 	Describes layered block devices
> 		MD raid
> 		LVM
> 		generic device mapper
> 		loop (partial)
> 	Shows UUIDs
> 	Shows mountpoints
> 	Avoids repeating subtrees when enumerating raid devices
> 
> I struggled with the last item, until I gave up on bash.  I needed to pass data to subroutines by reference, and bash is sorely lacking in that area.  The new script is in python.  I'm releasing this one under the GPL version 2.
> 
> Please give it a whirl.
> 
> Phil

-- 
TorbjÃrn Skagestad
Idà Til Produkt AS
torborn@xxxxxxxx
--- lsdrv	2011-05-26 11:06:44.000000000 +0200
+++ lsdrv.py	2011-05-26 11:34:50.000000000 +0200
@@ -47,7 +47,12 @@
 def runx(*args, **kwargs):
 	kwargs['stdout'] = PIPE
 	kwargs['stderr'] = PIPE
-	sub = Popen(*args, **kwargs)
+	try:
+		sub = Popen(*args, **kwargs)
+	except OSError as e:
+		print "Unable to execute " + str(args[0][0])
+		print e
+		exit()
 	out, err = sub.communicate()
 	return out
 
@@ -166,9 +171,12 @@
 	devpath = os.path.realpath(devpathlink)
 	if devpath in phydevs:
 		return phydevs[devpath]
-	phy = Struct(dpath=devpath, node=nodestr,
-		vendor=io.FileIO(devpath+'/vendor').read().split("\n",1)[0].strip(),
-		model=io.FileIO(devpath+'/model').read().split("\n",1)[0].strip())
+	try:
+		phy = Struct(dpath=devpath, node=nodestr,
+			vendor=io.FileIO(devpath+'/vendor').read().split("\n",1)[0].strip(),
+			model=io.FileIO(devpath+'/model').read().split("\n",1)[0].strip())
+	except IOError:
+		return None
 	if os.path.exists(devpath+'/unique_id'):
 		phy.serial = io.FileIO(devpath+'/unique_id').read().split("\n",1)[0].strip()
 	if not phy.serial:
@@ -189,6 +197,8 @@
 blockbyname=dict()
 blockbynode=dict()
 sysclassblock="/sys/class/block/"
+if(not os.path.exists(sysclassblock)):
+	sysclassblock = "/sys/block/"
 for x in os.listdir(sysclassblock):
 	nodestr=io.FileIO(sysclassblock+x+'/dev').read().split("\n")[0]
 	sizestr=sect2size(io.FileIO(sysclassblock+x+'/size').read().split("\n")[0])
@@ -250,7 +260,10 @@
 		devstat = os.stat(mdev)
 		nodestr="%d:%d" % (os.major(devstat.st_rdev), os.minor(devstat.st_rdev))
 		if nodestr in blockbynode:
-			mntstat = os.statvfs(mnt)
+			try:
+				mntstat = os.statvfs(mnt)
+			except OSError:
+				mntstat = None
 			dev = blockbynode[nodestr]
 			dev.mountdev = mdev
 			dev.mountpoint = mnt

Attachment: signature.asc
Description: This is a digitally signed message part


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux