download_driver_pack.py

Antworten
Benutzeravatar
Sven.Beierlein
Beiträge: 36
Registriert: 01 Okt 2008, 16:20

download_driver_pack.py

Beitrag 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?
Benutzeravatar
j.schneider
uib-Team
Beiträge: 2045
Registriert: 29 Mai 2008, 15:14

Re: download_driver_pack.py

Beitrag von j.schneider »

extract_driver_pack.py sucht die 7z-Archive im Verzeichnis /tmp/dpdl.


Vielen Dank für die Nutzung von opsi. Im Forum ist unser Support begrenzt.

Für den professionellen Einsatz und individuelle Beratung empfehlen wir einen Support-Vertrag und eine Schulung.
Gerne informieren wir Sie zu unserem Angebot.

uib GmbH
Telefon: +49 6131 27561 0
E-Mail: sales@uib.de


Benutzeravatar
Sven.Beierlein
Beiträge: 36
Registriert: 01 Okt 2008, 16:20

Re: download_driver_pack.py

Beitrag 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? :?
Benutzeravatar
j.schneider
uib-Team
Beiträge: 2045
Registriert: 29 Mai 2008, 15:14

Re: download_driver_pack.py

Beitrag von j.schneider »

Hallo,

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

Gruß
Jan Schneider


Vielen Dank für die Nutzung von opsi. Im Forum ist unser Support begrenzt.

Für den professionellen Einsatz und individuelle Beratung empfehlen wir einen Support-Vertrag und eine Schulung.
Gerne informieren wir Sie zu unserem Angebot.

uib GmbH
Telefon: +49 6131 27561 0
E-Mail: sales@uib.de


Benutzeravatar
Sven.Beierlein
Beiträge: 36
Registriert: 01 Okt 2008, 16:20

Re: download_driver_pack.py

Beitrag 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()
Benutzeravatar
j.schneider
uib-Team
Beiträge: 2045
Registriert: 29 Mai 2008, 15:14

Re: download_driver_pack.py

Beitrag von j.schneider »

An winxppro.py muss nicht geändert werden.
Die vorhandenen Treiber werden automatisch eingebunden.


Vielen Dank für die Nutzung von opsi. Im Forum ist unser Support begrenzt.

Für den professionellen Einsatz und individuelle Beratung empfehlen wir einen Support-Vertrag und eine Schulung.
Gerne informieren wir Sie zu unserem Angebot.

uib GmbH
Telefon: +49 6131 27561 0
E-Mail: sales@uib.de


Antworten