Portál AbcLinuxu, 9. června 2024 06:34


Dotaz: python a ... zase disky

23.7.2014 12:12 Milan
python a ... zase disky
Přečteno: 451×
Odpovědět | Admin

Zdravím všechny ..

nedávno jsem se tady dotazoval, jak oddělím zrno od plév (soubory a /*teď už vím, že se to jmenuje */ nody ). Dalším googlením jsem se dostal až ke knihovně pylibparted (stará, neudržovaná, ale dobře se s tím pracuje, no, a hlavně, je v opensuse repu.

Nicméně ... knihovna má problém ( spíše to bude vlastnost ) s CDROMkou, některé funkce na tom padají, a pro mnou zamýšlený program stejně o práci s CDROMkou neuvažuju.

Ok, takže zase odděluji zrno od plév. Otázka zní, jak poznám, že nod patří CDROMce ?.

Jedna možnost se nabízí načíst si /proc/partitions a pylibparted se dotázat na path (pylibparted.PedDevice.getPath() ) k zařízení a tuto cestu najít v partitions, kde máme major minor, podle http://lxr.free-electrons.com/source/include/uapi/linux/major.h?v=3.14 tohoto nějak určit, že dané zařízení je CD, a loopnout se na další zařízení v pořadí (tj, nepokračovat dalším očucháváním CDčka ).

Tato konstrukce může fungovat, ale pak jsem si uvědomil, že mc a dokonce i ls -l mi prásknou major minor u nodu, tak proč to takto zdaleka obcházet?

Hm, ale teď nemůžu přijít na to, jak se k major minor v pythonu dostanu.

os.stat sice vrací st_dev, ale u těch nodů je to míněno asi jako device, kde leží (možná ani to ne, protože to, co se mi vrací, není stejné číslo jako v partitions ... moc o tom nevím).

Prolézal jsem další možnosti, zkusil jsem googlit, ale rozmanitost ( a nepoužitelnost )  nalezených výsledků mne opět zahnala tam "kde mi rozumějí " :-D ) tak snad jste to pochopili,

předem díky za nápovědu.

Milan


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

23.7.2014 14:42 Sten
Rozbalit Rozbalit vše Re: python a ... zase disky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Otázka je, jestli opravdu potřebujete zjistit, že je to CD-ROM, nebo stačí zjistit, že tam není médium (můj odhad, proč to padá).

To první lze zjistit tak, že tomu zařízení pošlete nějaký příkaz pro CD-ROM (doporučuji nějaký informační příkaz, třeba CDROM_GET_CAPABILITY). Pokud to CD-ROM není, tak řekne, že to neumí.

To druhé je ještě jednodušší. Při pokusu to zařízení otevřít dostanete chybu “No medium found” (ENOMEDIUM).
23.7.2014 20:44 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: python a ... zase disky
Aha, no ono to právě kiksuje, když je zasunutý disk .. jinak ta enumerace mechaniku přeskočí. To jsem měl napsat ..

V pylibparted jsem nenašel žádnou funkci, která by mi řekla : toto je harddisk, toto je CD ... toto je páska a podobně. Atributy major minor jména zařízení by mi to řeklo, ale nevím, jak je získat.
23.7.2014 15:26 graviton
Rozbalit Rozbalit vše Re: python a ... zase disky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Takhle?

os.stat("/dev/sr0").st_rdev >> 8
23.7.2014 21:06 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: python a ... zase disky
ááááá ... teď jste mne dostal ...

st_rdev je ta kouzelná formulka .. jak jsem to mohl přehlídnout, když jsem koukal na os.stat .. nechápu a vám díky ..

Milan
24.7.2014 10:47 graviton
Rozbalit Rozbalit vše Re: python a ... zase disky
Ono to ve výsledku z os.stat na rozdíl od ostatních věcí není vidět jako datová položka (asi metoda?), člověk musí zabloudit do dokumentace, aby se dozvěděl, na co že se to má zeptat.
29.7.2014 14:45 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: python a ... zase disky
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nakonec jsem to zmastil takto :
import pylibparted, os (a možná ještě něco)
def collect_disks( ):
	result = { }

	devs = pylibparted.probeAllDevices()

	for p in devs :
		# Device
		d = pylibparted.PedDevice(p)
		devpath = d.getPath()
		devpath_stat = os.stat(devpath)
		d_mode = devpath_stat.st_mode
		if (  d_mode & 24576  <> 24576 ) :
			#print 'Device:', devpath,  ' is not block'
			continue
		d_major = devpath_stat.st_rdev >> 8
		#print d_major
		if ( not d_major in (8, 3, 22 ) ):
			#print "Device ",  devpath, ' is not a disk'
			continue
		result[ devpath ] = {}
		model = d.getModel()
		#print 'Model: ',  model
		result[ devpath ][ 'model' ] = model
		result[ devpath ][ 'type' ] = 'D'
		#print 'Device type :',  d.getType()
		size = d.getLength()
		#print 'Size:', size
		result[ devpath ][ 'size' ] = size
		ssize =  d.getSectorSize()
		#print 'Sector size: ', ssize
		result[ devpath ][ 'ssize' ] = ssize
		disktype = d.diskProbe()
		subtype = disktype.getName()
		#print'Name: ',  subtype
		result[ devpath ][ 'subtype' ] = subtype
		c,h,s = d.getBiosCHS()
		chs = str(c) + '/' + str(h) + '/' + str(s)
		#print 'BIOS CHS:', chs

		c,h,s = d.getHwCHS()
		chs = str(c) + '/' + str(h) + '/' + str(s)
		#print 'HW CHS:', chs

		# Partition table
		pt = d.diskNew()
		parts = pt.getPartitions()

		for part in parts :
			if part.isActive() :
				part_path = part.getPath()
				#print ' Partition:', part_path
				result[ part_path ] = {}
				result[ part_path ]['type'] = 'P'

				parttype = part.getTypeName()
				#print ' Type Name:', parttype
				#print ' ID:', part.getId()
				result[ part_path ][ 'model' ] = parttype
				geom = part.getGeometry()

				#print '  Start:', geom.getStart()
				#print '  End:', geom.getEnd()
				size = geom.getLength()
				#print '  Length:', size
				result[ part_path ][ 'ssize' ] = ssize
				result[ part_path ][ 'size' ] = size
				fs = part.getFsType()
				if fs :
					#print '  FS:', fs.getName()
					result[ part_path ]['subtype'] = fs.getName()
	    # parts
	# devs
	return result

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.