mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
virt-manager: Properly handle errors when --show-* options are used.
crobinso: Fix some pylint
This commit is contained in:
parent
e1be39d986
commit
40cff67836
@ -277,7 +277,9 @@ def main():
|
|||||||
|
|
||||||
if options.show:
|
if options.show:
|
||||||
def cb(conn):
|
def cb(conn):
|
||||||
launch_specific_window(engine, options.show, options.uri, options.uuid)
|
ignore = conn
|
||||||
|
launch_specific_window(engine,
|
||||||
|
options.show, options.uri, options.uuid)
|
||||||
return True
|
return True
|
||||||
engine.uri_cb = cb
|
engine.uri_cb = cb
|
||||||
engine.show_manager_window = False
|
engine.show_manager_window = False
|
||||||
|
@ -141,13 +141,13 @@ class vmmGObject(GObject.GObject):
|
|||||||
|
|
||||||
self.idle_add(emitwrap, signal, *args)
|
self.idle_add(emitwrap, signal, *args)
|
||||||
|
|
||||||
def idle_add(self, func, *args):
|
def idle_add(self, func, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Make sure idle functions are run thread safe
|
Make sure idle functions are run thread safe
|
||||||
"""
|
"""
|
||||||
def cb():
|
def cb():
|
||||||
try:
|
try:
|
||||||
return func(*args)
|
return func(*args, **kwargs)
|
||||||
except:
|
except:
|
||||||
print traceback.format_exc()
|
print traceback.format_exc()
|
||||||
return False
|
return False
|
||||||
|
@ -25,6 +25,7 @@ from gi.repository import Gtk
|
|||||||
# pylint: enable=E0611
|
# pylint: enable=E0611
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import re
|
||||||
import Queue
|
import Queue
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
@ -333,14 +334,17 @@ class vmmEngine(vmmGObject):
|
|||||||
self.windows -= 1
|
self.windows -= 1
|
||||||
logging.debug("window counter decremented to %s", self.windows)
|
logging.debug("window counter decremented to %s", self.windows)
|
||||||
|
|
||||||
# Don't exit if system tray is enabled
|
if self._can_exit():
|
||||||
if (self.windows <= 0 and
|
|
||||||
self.systray and
|
|
||||||
not self.systray.is_visible()):
|
|
||||||
# Defer this to an idle callback, since we can race with
|
# Defer this to an idle callback, since we can race with
|
||||||
# a vmmDetails window being deleted.
|
# a vmmDetails window being deleted.
|
||||||
self.idle_add(self.exit_app, src)
|
self.idle_add(self.exit_app, src)
|
||||||
|
|
||||||
|
def _can_exit(self):
|
||||||
|
# Don't exit if system tray is enabled
|
||||||
|
return (self.windows <= 0 and
|
||||||
|
self.systray and
|
||||||
|
not self.systray.is_visible())
|
||||||
|
|
||||||
def _cleanup(self):
|
def _cleanup(self):
|
||||||
self.err = None
|
self.err = None
|
||||||
|
|
||||||
@ -451,6 +455,7 @@ class vmmEngine(vmmGObject):
|
|||||||
|
|
||||||
conn.connect("vm-removed", self._do_vm_removed)
|
conn.connect("vm-removed", self._do_vm_removed)
|
||||||
conn.connect("state-changed", self._do_conn_changed)
|
conn.connect("state-changed", self._do_conn_changed)
|
||||||
|
conn.connect("connect-error", self._connect_error)
|
||||||
conn.connect("priority-tick", self._schedule_priority_tick)
|
conn.connect("priority-tick", self._schedule_priority_tick)
|
||||||
self.emit("conn-added", conn)
|
self.emit("conn-added", conn)
|
||||||
|
|
||||||
@ -521,6 +526,73 @@ class vmmEngine(vmmGObject):
|
|||||||
raise RuntimeError(_("Unknown connection URI %s") % uri)
|
raise RuntimeError(_("Unknown connection URI %s") % uri)
|
||||||
return conn
|
return conn
|
||||||
|
|
||||||
|
def _connect_error(self, conn, errmsg, tb, warnconsole):
|
||||||
|
errmsg = errmsg.strip(" \n")
|
||||||
|
tb = tb.strip(" \n")
|
||||||
|
hint = ""
|
||||||
|
show_errmsg = True
|
||||||
|
|
||||||
|
if conn.is_remote():
|
||||||
|
logging.debug(conn.get_transport())
|
||||||
|
if re.search(r"nc: .* -- 'U'", tb):
|
||||||
|
hint += _("The remote host requires a version of netcat/nc\n"
|
||||||
|
"which supports the -U option.")
|
||||||
|
show_errmsg = False
|
||||||
|
elif (conn.get_transport()[0] == "ssh" and
|
||||||
|
re.search(r"ssh-askpass", tb)):
|
||||||
|
|
||||||
|
if self.config.askpass_package:
|
||||||
|
ret = packageutils.check_packagekit(
|
||||||
|
self.err,
|
||||||
|
self.config.askpass_package,
|
||||||
|
False)
|
||||||
|
if ret:
|
||||||
|
conn.open()
|
||||||
|
return
|
||||||
|
|
||||||
|
hint += _("You need to install openssh-askpass or "
|
||||||
|
"similar\nto connect to this host.")
|
||||||
|
show_errmsg = False
|
||||||
|
else:
|
||||||
|
hint += _("Verify that the 'libvirtd' daemon is running\n"
|
||||||
|
"on the remote host.")
|
||||||
|
|
||||||
|
elif conn.is_xen():
|
||||||
|
hint += _("Verify that:\n"
|
||||||
|
" - A Xen host kernel was booted\n"
|
||||||
|
" - The Xen service has been started")
|
||||||
|
|
||||||
|
else:
|
||||||
|
if warnconsole:
|
||||||
|
hint += _("Could not detect a local session: if you are \n"
|
||||||
|
"running virt-manager over ssh -X or VNC, you \n"
|
||||||
|
"may not be able to connect to libvirt as a \n"
|
||||||
|
"regular user. Try running as root.")
|
||||||
|
show_errmsg = False
|
||||||
|
elif re.search(r"libvirt-sock", tb):
|
||||||
|
hint += _("Verify that the 'libvirtd' daemon is running.")
|
||||||
|
show_errmsg = False
|
||||||
|
|
||||||
|
msg = _("Unable to connect to libvirt.")
|
||||||
|
if show_errmsg:
|
||||||
|
msg += "\n\n%s" % errmsg
|
||||||
|
if hint:
|
||||||
|
msg += "\n\n%s" % hint
|
||||||
|
|
||||||
|
msg = msg.strip("\n")
|
||||||
|
details = msg
|
||||||
|
details += "\n\n"
|
||||||
|
details += "Libvirt URI is: %s\n\n" % conn.get_uri()
|
||||||
|
details += tb
|
||||||
|
|
||||||
|
title = _("Virtual Machine Manager Connection Failure")
|
||||||
|
|
||||||
|
if self._can_exit():
|
||||||
|
self.err.show_err(msg, details, title, async=False)
|
||||||
|
self.idle_add(self.exit_app, conn)
|
||||||
|
else:
|
||||||
|
self.err.show_err(msg, details, title)
|
||||||
|
|
||||||
####################
|
####################
|
||||||
# Dialog launchers #
|
# Dialog launchers #
|
||||||
####################
|
####################
|
||||||
@ -623,6 +695,15 @@ class vmmEngine(vmmGObject):
|
|||||||
|
|
||||||
def _show_vm_helper(self, src, uri, uuid, page=None, forcepage=False):
|
def _show_vm_helper(self, src, uri, uuid, page=None, forcepage=False):
|
||||||
try:
|
try:
|
||||||
|
if uuid not in self.conns[uri]["conn"].vms:
|
||||||
|
# This will only happen if --show-* option was used during
|
||||||
|
# virt-manager launch and an invalid UUID is passed.
|
||||||
|
# The error message must be sync otherwise the user will not
|
||||||
|
# know why the application ended.
|
||||||
|
self.err.show_err("%s does not have VM with UUID %s" %
|
||||||
|
(uri, uuid), async=False)
|
||||||
|
return
|
||||||
|
|
||||||
details = self._get_details_dialog(uri, uuid)
|
details = self._get_details_dialog(uri, uuid)
|
||||||
|
|
||||||
if forcepage or not details.is_visible():
|
if forcepage or not details.is_visible():
|
||||||
@ -636,9 +717,11 @@ class vmmEngine(vmmGObject):
|
|||||||
details.activate_default_page()
|
details.activate_default_page()
|
||||||
|
|
||||||
details.show()
|
details.show()
|
||||||
return details
|
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
src.err.show_err(_("Error launching details: %s") % str(e))
|
src.err.show_err(_("Error launching details: %s") % str(e))
|
||||||
|
finally:
|
||||||
|
if self._can_exit():
|
||||||
|
self.idle_add(self.exit_app, src)
|
||||||
|
|
||||||
def _do_show_vm(self, src, uri, uuid):
|
def _do_show_vm(self, src, uri, uuid):
|
||||||
self._show_vm_helper(src, uri, uuid)
|
self._show_vm_helper(src, uri, uuid)
|
||||||
@ -751,16 +834,16 @@ class vmmEngine(vmmGObject):
|
|||||||
self._do_show_create(self.get_manager(), uri)
|
self._do_show_create(self.get_manager(), uri)
|
||||||
|
|
||||||
def show_domain_console(self, uri, uuid):
|
def show_domain_console(self, uri, uuid):
|
||||||
self._show_vm_helper(self.get_manager(), uri, uuid,
|
self.idle_add(self._show_vm_helper, self.get_manager(), uri, uuid,
|
||||||
page=DETAILS_CONSOLE, forcepage=True)
|
page=DETAILS_CONSOLE, forcepage=True)
|
||||||
|
|
||||||
def show_domain_editor(self, uri, uuid):
|
def show_domain_editor(self, uri, uuid):
|
||||||
self._show_vm_helper(self.get_manager(), uri, uuid,
|
self.idle_add(self._show_vm_helper, self.get_manager(), uri, uuid,
|
||||||
page=DETAILS_CONFIG, forcepage=True)
|
page=DETAILS_CONFIG, forcepage=True)
|
||||||
|
|
||||||
def show_domain_performance(self, uri, uuid):
|
def show_domain_performance(self, uri, uuid):
|
||||||
self._show_vm_helper(self.get_manager(), uri, uuid,
|
self.idle_add(self._show_vm_helper, self.get_manager(), uri, uuid,
|
||||||
page=DETAILS_PERF, forcepage=True)
|
page=DETAILS_PERF, forcepage=True)
|
||||||
|
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import re
|
|
||||||
|
|
||||||
# pylint: disable=E0611
|
# pylint: disable=E0611
|
||||||
from gi.repository import GObject
|
from gi.repository import GObject
|
||||||
@ -28,7 +27,6 @@ from gi.repository import Gdk
|
|||||||
from gi.repository import GdkPixbuf
|
from gi.repository import GdkPixbuf
|
||||||
# pylint: enable=E0611
|
# pylint: enable=E0611
|
||||||
|
|
||||||
from virtManager import packageutils
|
|
||||||
from virtManager import uihelpers
|
from virtManager import uihelpers
|
||||||
from virtManager.connection import vmmConnection
|
from virtManager.connection import vmmConnection
|
||||||
from virtManager.baseclass import vmmGObjectUI
|
from virtManager.baseclass import vmmGObjectUI
|
||||||
@ -682,67 +680,6 @@ class vmmManager(vmmGObjectUI):
|
|||||||
conn.open()
|
conn.open()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _connect_error(self, conn, errmsg, tb, warnconsole):
|
|
||||||
errmsg = errmsg.strip(" \n")
|
|
||||||
tb = tb.strip(" \n")
|
|
||||||
hint = ""
|
|
||||||
show_errmsg = True
|
|
||||||
|
|
||||||
if conn.is_remote():
|
|
||||||
logging.debug(conn.get_transport())
|
|
||||||
if re.search(r"nc: .* -- 'U'", tb):
|
|
||||||
hint += _("The remote host requires a version of netcat/nc\n"
|
|
||||||
"which supports the -U option.")
|
|
||||||
show_errmsg = False
|
|
||||||
elif (conn.get_transport()[0] == "ssh" and
|
|
||||||
re.search(r"ssh-askpass", tb)):
|
|
||||||
|
|
||||||
if self.config.askpass_package:
|
|
||||||
ret = packageutils.check_packagekit(
|
|
||||||
self.err,
|
|
||||||
self.config.askpass_package,
|
|
||||||
False)
|
|
||||||
if ret:
|
|
||||||
conn.open()
|
|
||||||
return
|
|
||||||
|
|
||||||
hint += _("You need to install openssh-askpass or "
|
|
||||||
"similar\nto connect to this host.")
|
|
||||||
show_errmsg = False
|
|
||||||
else:
|
|
||||||
hint += _("Verify that the 'libvirtd' daemon is running\n"
|
|
||||||
"on the remote host.")
|
|
||||||
|
|
||||||
elif conn.is_xen():
|
|
||||||
hint += _("Verify that:\n"
|
|
||||||
" - A Xen host kernel was booted\n"
|
|
||||||
" - The Xen service has been started")
|
|
||||||
|
|
||||||
else:
|
|
||||||
if warnconsole:
|
|
||||||
hint += _("Could not detect a local session: if you are \n"
|
|
||||||
"running virt-manager over ssh -X or VNC, you \n"
|
|
||||||
"may not be able to connect to libvirt as a \n"
|
|
||||||
"regular user. Try running as root.")
|
|
||||||
show_errmsg = False
|
|
||||||
elif re.search(r"libvirt-sock", tb):
|
|
||||||
hint += _("Verify that the 'libvirtd' daemon is running.")
|
|
||||||
show_errmsg = False
|
|
||||||
|
|
||||||
msg = _("Unable to connect to libvirt.")
|
|
||||||
if show_errmsg:
|
|
||||||
msg += "\n\n%s" % errmsg
|
|
||||||
if hint:
|
|
||||||
msg += "\n\n%s" % hint
|
|
||||||
|
|
||||||
msg = msg.strip("\n")
|
|
||||||
details = msg
|
|
||||||
details += "\n\n"
|
|
||||||
details += "Libvirt URI is: %s\n\n" % conn.get_uri()
|
|
||||||
details += tb
|
|
||||||
|
|
||||||
self.err.show_err(msg, details, title=_("Virtual Machine Manager Connection Failure"))
|
|
||||||
|
|
||||||
|
|
||||||
####################################
|
####################################
|
||||||
# VM add/remove management methods #
|
# VM add/remove management methods #
|
||||||
@ -880,7 +817,6 @@ class vmmManager(vmmGObjectUI):
|
|||||||
conn.connect("vm-removed", self.vm_removed)
|
conn.connect("vm-removed", self.vm_removed)
|
||||||
conn.connect("resources-sampled", self.conn_resources_sampled)
|
conn.connect("resources-sampled", self.conn_resources_sampled)
|
||||||
conn.connect("state-changed", self.conn_state_changed)
|
conn.connect("state-changed", self.conn_state_changed)
|
||||||
conn.connect("connect-error", self._connect_error)
|
|
||||||
|
|
||||||
# add the connection to the treeModel
|
# add the connection to the treeModel
|
||||||
vmlist = self.widget("vm-list")
|
vmlist = self.widget("vm-list")
|
||||||
|
Loading…
Reference in New Issue
Block a user