Seite 1 von 1

download_driver_pack.py

Verfasst: 07 Nov 2008, 14:24
von Sven.Beierlein
Hallo,

wenn mein OPSI-Server keinen Internetzugang hat, wo muss ich dann die heruntergeladenen 7z-Driver-Packs der Seite www.driverpacks.net ablegen?

Gibt es auch eine etwas genauere Erklärung der Skripte:
extract_driver_pack.py
create_driver_pack.py
create_driver_links.py
download_driver_pack.py
show_drivers.py
und wie genau mit winxppro.py zusammenspielen?

Re: download_driver_pack.py

Verfasst: 07 Nov 2008, 14:27
von j.schneider
extract_driver_pack.py sucht die 7z-Archive im Verzeichnis /tmp/dpdl.

Re: download_driver_pack.py

Verfasst: 10 Nov 2008, 09:18
von Sven.Beierlein
Ich habe die 7z-Archive nun ins Verzeichnis /tmp/dpdl kopiert, konnte aber keine Verbesserung bzgl. der Treiberintegration auf meinem Testclient feststellen.
Wird das extract_driver_pack.py automatisch von winxppro.py aufgerufen? :?

Re: download_driver_pack.py

Verfasst: 10 Nov 2008, 10:45
von j.schneider
Hallo,

extract_driver_pack.py muss manuell aufgerufen werden.
Danach sollte auch create_driver_links.py gestartet werden.

Gruß
Jan Schneider

Re: download_driver_pack.py

Verfasst: 10 Nov 2008, 12:42
von Sven.Beierlein
Im winxppro.py gibt es doch die Stelle "Integarte drivers"
muss da das extract_driver_pack.py mit eingebaut bzw. der Aufruf an einer bestimmten Stelle aufgerufen werden?
Oder wie gehe ich vor wenn ich die Treiber aus /tmp/dpdl in das winxppro.py einbinden möchte?

Code: Alles auswählen

# Integrate drivers
if os.path.exists(srcDriversDir):
	ui.getMessageBox().addText("Treiber-Verzeichnis gefunden, versuche Treiber einbzubinden.\n")
	oemPnpDriversPath = ''
	massStorageDrivers = []
	oemBootFiles = []
	driverNumber = 0
	integratedFiles = []
	
	for dirname in productProperties.get('additional_drivers','').split(','):
		if not dirname:
			continue
		dirname = dirname.strip()
		logger.info("Adding additional driver dir '%s'" % dirname)
		ui.getMessageBox().addText(" * Binde Treiberverzeichnis '%s' ein.\n" % dirname)
		srcDriverPath = os.path.join(srcDriversDir, 'drivers', 'additional', dirname)
		if not os.path.exists(srcDriverPath):
			logger.error("Driver directory '%s' not found" % srcDriverPath)
			ui.getMessageBox().addText("   [Fehler] Treiber-Verzeichnis '%s' nicht gefunden.\n" % dirname)
			continue
		logger.notice("Found additional driver dir '%s'" % dirname)
		ui.getMessageBox().addText("   [OK] Treiber gefunden, wird eingebunden.\n")
		dstDriverPath = os.path.join(target, 'drv')
		if not os.path.exists( dstDriverPath ):
			os.mkdir( dstDriverPath )
		driverNumber += 1
		dstDriverPath = os.path.join(dstDriverPath, str(driverNumber))
		if not os.path.exists( dstDriverPath ):
			os.mkdir( dstDriverPath )
		copy( srcDriverPath + '/*', dstDriverPath )
		if oemPnpDriversPath:
			oemPnpDriversPath += ';'
		oemPnpDriversPath += '\\'.join(['drv', str(driverNumber)])
		
	for info in hardware.get("PCI_DEVICE", []):
		name = info.get('name', '???')
		name = name.replace('/', '_')
		vendorId = info.get('vendorId', '').upper()
		deviceId = info.get('deviceId', '').upper()
		if not vendorId or not deviceId:
			continue
		logger.info("Searching driver for device '%s', id '%s:%s'" % (name, vendorId, deviceId))
		ui.getMessageBox().addText(" * Suche Treiber fuer '%s'.\n" % name)
		srcDriverPath = os.path.join(srcDriversDir, 'pciids', vendorId)
		if not os.path.exists(srcDriverPath):
			logger.error("Vendor directory '%s' not found" % srcDriverPath)
			ui.getMessageBox().addText("   [Fehler] Hersteller-Verzeichnis '%s' nicht gefunden.\n" % vendorId)
			continue
		srcDriverPath = os.path.join(srcDriverPath, deviceId)
		if not os.path.exists(srcDriverPath):
			logger.error("Device directory '%s' not found" % srcDriverPath)
			ui.getMessageBox().addText("   [Fehler] Geraete-Verzeichnis '%s' nicht gefunden.\n" % deviceId)
			continue
		if os.path.exists( os.path.join(srcDriverPath, 'WINDOWS_BUILDIN') ):
			logger.notice("Using build-in windows driver")
			ui.getMessageBox().addText("   [OK] Verwende mitgelieferten Windows-Treiber.\n")
			continue
		logger.notice("Found driver for device '%s', in dir '%s'" % (name, srcDriverPath))
		files = ','.join(os.listdir(srcDriverPath))
		if files in integratedFiles:
			logger.notice("Driver for device '%s' already integrated" % name)
			ui.getMessageBox().addText("   [OK] Treiber ist bereits eingebunden.\n")
			continue
		
		logger.notice("Integrating driver for device '%s' (driver directory content: %s)" % (name, files))
		ui.getMessageBox().addText("   [OK] Treiber gefunden, wird eingebunden.\n")
		integratedFiles.append(files)
		
		dstDriverPath = os.path.join(target, 'drv')
		if not os.path.exists( dstDriverPath ):
			os.mkdir( dstDriverPath )
		driverNumber += 1
		dstDriverPath = os.path.join(dstDriverPath, str(driverNumber))
		if not os.path.exists( dstDriverPath ):
			os.mkdir( dstDriverPath )
		copy( srcDriverPath + '/*', dstDriverPath )
		if oemPnpDriversPath:
			oemPnpDriversPath += ';'
		oemPnpDriversPath += '\\'.join(['drv', str(driverNumber)])
		
		### Textmode driver ###
		txtSetupOem = None
		logger.info("Searching for txtsetup.oem in '%s'" % dstDriverPath)
		for fn in os.listdir(dstDriverPath):
			if (fn.lower() == 'txtsetup.oem'):
				txtSetupOem = os.path.join(dstDriverPath, fn)
				break
		
		if not txtSetupOem:
			logger.info("txtsetup.oem not found")
			continue
		
		logger.notice("'%s' found, integrating textmode driver" % txtSetupOem)
		ui.getMessageBox().addText(" * Integriere textmode Treiber.\n")
		
		# Parse txtsetup.oem
		logger.info("Parsing txtsetup.oem")
		sections = {}
		sectionRegex = re.compile('\[\s*([^\]]+)\s*\]')
		deviceRegex = re.compile('VEN_([\da-fA-F]+)(&DEV_([\da-fA-F]+))?')
		f = open(txtSetupOem)
		section = None
		for line in f.readlines():
			line = line.strip()
			if not line or line.startswith('#') or line.startswith(';'):
				continue
			logger.debug("txtsetup.oem: %s" % line)
			match = re.search(sectionRegex, line)
			if match:
				section = match.group(1)
				sections[section] = []
			elif section:
				sections[section].append(line)
		f.close()
		
		# Search for default id
		defaultHwComponentId = ''
		logger.info("Searching for default hardware component id")
		for (section, lines) in sections.items():
			if (section.lower() != 'defaults'):
				continue
			for line in lines:
				(key, value) = line.split('=', 1)
				if (key.strip().lower() == 'scsi'):
					defaultHwComponentId = value.strip()
		if not defaultHwComponentId:
			logger.error("Default hardware component id not found in txtsetup.oem, failed to integrate textmode driver.")
			ui.getMessageBox().addText("   [Fehler] Default hardware component id in txtsetup.oem nicht gefunden.\n")
			continue
		logger.notice("Found default hardware component id '%s'" % defaultHwComponentId)
		
		# Search for hardware id
		logger.info("Searching for hardware id and tagfile")
		tagfiles = {}
		for (section, lines) in sections.items():
			if not section.lower().startswith('hardwareids.'):
				continue
			logger.info("Found hardwareIds section %s" % section)
			for line in lines:
				if not re.search('[iI][dD]\s*=', line):
					continue
				(device, tf) = line.split('=', 1)[1].strip().split(',', 1)
				device = device.strip()
				if device.startswith('"') and device.endswith('"'):
					device = device[1:-1]
				tf = tf.strip()
				if tf.startswith('"') and tf.endswith('"'):
					tf = tf[1:-1]
				match = re.search(deviceRegex, device)
				if not match:
					logger.error("Parsing error: =>%s<=" % device)
					continue
				if (match.group(1).upper() == vendorId.upper()) and (not match.group(2) or (match.group(3).upper() == deviceId.upper())):
					hwComponentId = section.split('.', 2)[2].lower()
					tagfiles[hwComponentId] = tf
		if not tagfiles:
			logger.error("Hardware component id not found in txtsetup.oem, failed to integrate textmode driver.")
			continue
		logger.debug("Found tagfiles: %s" % tagfiles)
		
		hwComponentId = tagfiles.keys()[0]
		if (len(tagfiles.keys()) > 0) and tagfiles.has_key(defaultHwComponentId.lower()):
			hwComponentId = defaultHwComponentId.lower()
		tagfile = tagfiles[hwComponentId]
		logger.notice("Using component id '%s' and tagfile '%s'" % (hwComponentId, tagfile))
		
		# Search for disks
		logger.info("Searching for disks")
		driverDisks = {}
		for (section, lines) in sections.items():
			if (section.lower() != 'disks'):
				continue
			for line in lines:
				if (line.find('=') == -1):
					continue
				(driverDisk, value) = line.split('=', 1)
				driverDisk = driverDisk.strip()
				(dn, tf, dd) = value.split(',', 2)
				tf = tf.strip()
				if tf.startswith('\\'): tf = tf[1:]
				dd = dd.strip()
				if dd.startswith('\\'): dd = dd[1:]
				driverDisks[driverDisk] = { "displayName": dn, "tagfile": tf, "driverDir": dd }
		if not driverDisks:
			logger.error("No disks found in txtsetup.oem, failed to integrate textmode driver.")
			ui.getMessageBox().addText("   [Fehler] Keine disks in txtsetup.oem gefunden.\n")
			continue
		
		# Search for needed files
		logger.info("Searching for needed files")
		driver = []
		inf = []
		catalog = []
		filesRegex = re.compile('Files\.scsi\.%s' % hwComponentId, re.IGNORECASE)
		for (section, lines) in sections.items():
			match = re.search(filesRegex, section)
			if not match:
				continue
			for line in lines:
				(key, value) = line.split('=', 1)
				key = key.strip()
				driverDisk = value.split(',')[0].strip()
				filename = value.split(',')[1].strip()
				if   (key.lower() == 'driver'):
					driver.append( os.path.join(driverDisks[driverDisk]['driverDir'], filename) )
				elif (key.lower() == 'inf'):
					inf.append( os.path.join(driverDisks[driverDisk]['driverDir'], filename) )
				elif (key.lower() == 'catalog'):
					catalog.append( os.path.join(driverDisks[driverDisk]['driverDir'], filename) )
			break
		
		logger.notice("Needed files: %s, %s, %s" % (', '.join(driver), ', '.join(inf), ', '.join(catalog) ))
		if not (driver and inf and catalog):
			logger.error("Failed to find needed info")
			ui.getMessageBox().addText("   [Fehler] Es wurden nicht alle benoetigten Informationen gefunden.\n")
			continue
		
		# Search for hardware description
		logger.info("Searching for hardware description")
		description = ''
		for (section, lines) in sections.items():
			if (section.lower() == 'scsi'):
				for line in lines:
					(key, value) = line.split('=', 1)
					if (key.strip().lower() == hwComponentId.lower()):
						description = value.split(',')[0].strip()
						if description.startswith('"') and description.endswith('"'):
							description = description[1:-1]
		if not description:
			logger.error("Hardware description not found in txtsetup.oem, failed to integrate textmode driver.")
			ui.getMessageBox().addText("   [Fehler] Hardware-Beschreibung nicht in txtsetup.oem gefunden.\n")
			continue
		logger.notice("Hardware description is '%s'" % description)
		
		# Copy files
		oemBootFiles.append( os.path.basename(txtSetupOem) )
		for textmodePath in ( 	os.path.join(target, '$', 'textmode'), \
					os.path.join(target, '$win_nt$.~bt', '$oem$') ):
			if not os.path.exists(textmodePath):
				os.mkdir(textmodePath)
			copy(txtSetupOem, textmodePath)
		
		for one in inf, driver, catalog:
			for fn in one:
				copy(os.path.join(dstDriverPath, fn), os.path.join(target, '$', 'textmode', os.path.basename(fn)))
				copy(os.path.join(dstDriverPath, fn), os.path.join(target, '$win_nt$.~bt', '$oem$',fn))
				oemBootFiles.append(fn)
		
		massStorageDrivers.append(description)
	
	if massStorageDrivers:
		winntsif = open(target + '/$win_nt$.~bt/winnt.sif', 'a')
		print >> winntsif, '\r\n[MassStorageDrivers]\r'
		for msd in massStorageDrivers:
			print >> winntsif, '"%s" = OEM\r' % msd
		print >> winntsif, '\r\n[OEMBootFiles]\r'
		for obf in oemBootFiles:
			print >> winntsif, '%s\r' % obf
		winntsif.close()
		
	pi = open(PATCHA_IN, 'a')
	print >> pi, "oempnpdriverspath=%s" % oemPnpDriversPath
	pi.close()

Re: download_driver_pack.py

Verfasst: 10 Nov 2008, 12:50
von j.schneider
An winxppro.py muss nicht geändert werden.
Die vorhandenen Treiber werden automatisch eingebunden.