virt-manager: Yet more fixes for DISPLAY unset error

Since these days we have to import Gtk _after_ forking, _and_ Gtk
doesn't raise a nice error for us, we need to postpone dropping stdio
so the user has any chance of seeing the error. Also try to add an
explicit error about DISPLAY again, since we don't get it from Gtk
these days.
This commit is contained in:
Cole Robinson 2013-11-01 09:44:14 -04:00
parent 30c33ea5cd
commit 395a20edd8
1 changed files with 18 additions and 5 deletions

View File

@ -187,15 +187,16 @@ def main():
virtManager.module_trace.wrap_module(libvirt) virtManager.module_trace.wrap_module(libvirt)
# Now we've got basic environment up & running we can fork # Now we've got basic environment up & running we can fork
do_drop_stdio = False
if not options.nofork and not options.debug: if not options.nofork and not options.debug:
drop_tty() drop_tty()
drop_stdio() do_drop_stdio = True
# Ignore SIGHUP, otherwise a serial console closing drops the whole app # Ignore SIGHUP, otherwise a serial console closing drops the whole app
signal.signal(signal.SIGHUP, signal.SIG_IGN) signal.signal(signal.SIGHUP, signal.SIG_IGN)
# The never ending fork+gconf/gsettings problems now require # The never ending fork+gconf/gsettings problems now require
# us to import Gtk before the fork. This creates a funny race, # us to import Gtk _after_ the fork. This creates a funny race,
# since we need to parse the command line arguments to know if # since we need to parse the command line arguments to know if
# we need to fork, but need to import Gtk before cli processing # we need to fork, but need to import Gtk before cli processing
# so it can handle --g-fatal-args. We strip out our flags first # so it can handle --g-fatal-args. We strip out our flags first
@ -204,19 +205,31 @@ def main():
try: try:
sys.argv = origargv[:1] + leftovers[:] sys.argv = origargv[:1] + leftovers[:]
from gi.repository import Gtk # pylint: disable=E0611 from gi.repository import Gtk # pylint: disable=E0611
globals()["Gtk"] = Gtk
leftovers = sys.argv[1:] leftovers = sys.argv[1:]
# This will error if Gtk wasn't correctly initialized
Gtk.Window()
globals()["Gtk"] = Gtk
import virtManager.config import virtManager.config
except: except Exception, e:
# Don't just let the exception raise here. abrt reports bugs # Don't just let the exception raise here. abrt reports bugs
# when users mess up su/sudo and DISPLAY isn't set. Printing # when users mess up su/sudo and DISPLAY isn't set. Printing
# it avoids the issue # it avoids the issue
print "".join(traceback.format_exc()) display = os.environ.get("DISPLAY", "")
msg = str(e)
if not display:
msg += ": Could not open display: %s" % display
logging.debug("".join(traceback.format_exc()))
print msg
return 1 return 1
finally: finally:
sys.argv = origargv sys.argv = origargv
# Do this after the Gtk import so the user has a chance of seeing any error
if do_drop_stdio:
drop_stdio()
if leftovers: if leftovers:
raise RuntimeError("Unhandled command line options '%s'" % leftovers) raise RuntimeError("Unhandled command line options '%s'" % leftovers)