diff options
Diffstat (limited to 'displayconfig/displayconfig-hwprobe.py')
-rwxr-xr-x | displayconfig/displayconfig-hwprobe.py | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/displayconfig/displayconfig-hwprobe.py b/displayconfig/displayconfig-hwprobe.py new file mode 100755 index 0000000..7ba5c69 --- /dev/null +++ b/displayconfig/displayconfig-hwprobe.py @@ -0,0 +1,132 @@ +#!/usr/bin/python +########################################################################### +# displayconfig-hwprobe.py - description # +# ------------------------------ # +# begin : Sun Jan 22 2006 # +# copyright : (C) 2006 by Simon Edwards # +# email : simon@simonzone.com # +# # +########################################################################### +# # +# This program is free software; you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +########################################################################### + +# This program should be run during boot time. It quickly examines the +# graphics cards (read: PCI devices) in the computer and compares they to +# the list in the file $hardware_info_filename. If the two lists differ +# then the Debian package manager is automatically called to regenerate +# /etc/X11/xorg.conf. This hopefully should mean that people can swap gfx +# cards in and out and always have a system that will run Xorg. (even +# though the config will be most likely be suboptimal. Suboptimal is better +# than no X server). + +import ScanPCI +import os +import syslog +import select + +hardware_info_filename = "/var/lib/guidance/guidance-gfxhardware-snapshot" +data_file_dir = "/usr/share/apps/guidance/" + +def main(): + # Scan the PCI bus. + pci_bus = ScanPCI.PCIBus(data_file_dir) + pci_bus.detect() + + # Stuff our device info in to a string. + hardware_config = "" + for pci_device in pci_bus.devices: + if pci_device.isGfxCard(): + hardware_config += "PCI:%i:%i:%i Vendor:%x Device:%x Subvendor:%x Subdevice:%x\n" % \ + (pci_device.pci_bus, pci_device.pci_device, pci_device.pci_function, + pci_device.vendor, pci_device.device, + pci_device.subvendor, pci_device.subdevice) + + # Read in the old gfx hardware info in. + previous_hardware = None + try: + fhandle = open(hardware_info_filename) + previous_hardware = fhandle.read() + fhandle.close() + except IOError: + previous_hardware = None + + if previous_hardware is not None and previous_hardware!=hardware_config: + # Run dpkg and configure the new hardware. + syslog.syslog(syslog.LOG_INFO, "Graphics card hardware has changed. Reconfiguring xorg.conf using 'dpkg-reconfigure xserver-xorg'.") + cmd = ['dpkg-reconfigure','xserver-xorg'] + environ = os.environ.copy() + environ['DEBIAN_FRONTEND'] = 'noninteractive' + #os.spawnvpe(os.P_WAIT, 'dpkg-reconfigure', cmd, environ) + result = ExecWithCapture('/usr/sbin/dpkg-reconfigure', cmd, 0, '/', 0,1, -1, environ) + for line in result.split('\n'): + syslog.syslog(syslog.LOG_INFO,"dpkg-reconfigure:"+line) + + # [21:18] <Riddell> you are brave indeed + # [21:21] <Sime> I figured some kind of non-interactive "dpkg-reconfigure xorg" might be enough. + # [21:22] <Riddell> yep + + if previous_hardware is None or previous_hardware!=hardware_config: + syslog.syslog(syslog.LOG_INFO, "Writing graphics card hardware list to "+hardware_info_filename) + # Write out the gfx hardware info + tmp_filename = hardware_info_filename + ".tmp" + fhandle = open(tmp_filename,'w') + fhandle.write(hardware_config) + fhandle.close() + os.rename(tmp_filename, hardware_info_filename) + + +############################################################################ +def ExecWithCapture(command, argv, searchPath = 0, root = '/', stdin = 0, + catchfd = 1, closefd = -1, environ = None): + + if not os.access(root + command, os.X_OK) and not searchPath: + raise RuntimeError, command + " can not be run" + + (read, write) = os.pipe() + childpid = os.fork() + if (not childpid): + if (root and root != '/'): os.chroot(root) + os.dup2(write, catchfd) + os.close(write) + os.close(read) + + if closefd != -1: + os.close(closefd) + if stdin: + os.dup2(stdin, 0) + os.close(stdin) + + # Replace the environment + if environ is not None: + os.environ.clear() + os.environ.update(environ) + + if searchPath: + os.execvp(command, argv) + else: + os.execv(command, argv) + sys.exit(1) + os.close(write) + + rc = "" + s = "1" + while s: + select.select([read], [], []) + s = os.read(read, 1000) + rc = rc + s + + os.close(read) + + try: + os.waitpid(childpid, 0) + except OSError, (errno, msg): + print __name__, "waitpid:", msg + + return rc + +main() |