From 13161450e1c0314cd001d050b14e80c1d8877f03 Mon Sep 17 00:00:00 2001
From: Giuseppe Scrivano <gscrivan@redhat.com>
Date: Wed, 30 Oct 2013 14:55:58 +0100
Subject: [RHEL-7.0 virt-manager PATCH] virt-manager: fix adding EGD RNG
devices in UDP mode
Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1001773
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
(cherry picked from commit a7519dc1e97f6f6ef25733375c34103a4acfb7b6)
Conflicts:
ui/addhardware.ui
virtManager/addhardware.py
---
ui/vmm-add-hardware.ui | 176 ++++++++++++++++++++++++++++++++++++---------
virtManager/addhardware.py | 97 ++++++++++++++++++-------
2 files changed, 214 insertions(+), 59 deletions(-)
diff --git a/ui/vmm-add-hardware.ui b/ui/vmm-add-hardware.ui
index 4ade547..875b4d7 100644
--- a/ui/vmm-add-hardware.ui
+++ b/ui/vmm-add-hardware.ui
@@ -2943,6 +2943,7 @@ access in the guest.</property>
<object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="valign">start</property>
<property name="spacing">12</property>
<child>
<object class="GtkLabel" id="label34">
@@ -2963,91 +2964,101 @@ access in the guest.</property>
<object class="GtkTable" id="rng-table">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="n_rows">6</property>
<property name="column_spacing">6</property>
<property name="row_spacing">6</property>
<child>
- <object class="GtkEntry" id="rng-device">
+ <object class="GtkLabel" id="label40">
<property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Type:</property>
+ <property name="use_underline">True</property>
</object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">5</property>
- </packing>
</child>
<child>
- <object class="GtkLabel" id="label35">
+ <object class="GtkComboBox" id="rng-type">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Device:</property>
+ <signal name="changed" handler="on_rng_type_changed" swapped="no"/>
</object>
<packing>
- <property name="top_attach">5</property>
+ <property name="left_attach">1</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="label36">
+ <object class="GtkLabel" id="label37">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
- <property name="label" translatable="yes">Backend Mode:</property>
+ <property name="label" translatable="yes">Backend Type:</property>
</object>
<packing>
- <property name="top_attach">4</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
</packing>
</child>
<child>
- <object class="GtkComboBox" id="rng-backend-mode">
+ <object class="GtkComboBox" id="rng-backend-type">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <signal name="changed" handler="on_rng_backend_type_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
- <property name="top_attach">4</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="label37">
+ <object class="GtkLabel" id="label36">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
- <property name="label" translatable="yes">Backend Type:</property>
+ <property name="label" translatable="yes">Backend Mode:</property>
</object>
<packing>
- <property name="top_attach">3</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
</packing>
</child>
<child>
- <object class="GtkComboBox" id="rng-backend-type">
+ <object class="GtkComboBox" id="rng-backend-mode">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <signal name="changed" handler="on_rng_backend_mode_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
- <property name="top_attach">3</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="label38">
+ <object class="GtkLabel" id="label35">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
- <property name="label" translatable="yes">Service:</property>
- <property name="use_underline">True</property>
+ <property name="label" translatable="yes">Device:</property>
</object>
<packing>
- <property name="top_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
</packing>
</child>
<child>
- <object class="GtkEntry" id="rng-service">
+ <object class="GtkEntry" id="rng-device">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
</object>
<packing>
<property name="left_attach">1</property>
- <property name="top_attach">2</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
</packing>
</child>
<child>
@@ -3059,42 +3070,137 @@ access in the guest.</property>
<property name="use_underline">True</property>
</object>
<packing>
- <property name="top_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
</packing>
</child>
<child>
- <object class="GtkEntry" id="rng-host">
+ <object class="GtkHBox" id="rng-connect-host-box">
<property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="can_focus">False</property>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkEntry" id="rng-connect-host">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="char-port-label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Port:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">char-port</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="rng-connect-service">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="adjustment">adjustment3</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="left_attach">1</property>
- <property name="top_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="label40">
+ <object class="GtkLabel" id="rng-bind-host-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
- <property name="label" translatable="yes">_Type:</property>
+ <property name="label" translatable="yes">Bind Host:</property>
<property name="use_underline">True</property>
</object>
+ <packing>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
+ </packing>
</child>
<child>
- <object class="GtkComboBox" id="rng-type">
+ <object class="GtkHBox" id="rng-bind-host-box">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <signal name="changed" handler="on_rng_type_changed" swapped="no"/>
+ <property name="spacing">6</property>
+ <child>
+ <object class="GtkEntry" id="rng-bind-host">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="char-port-label2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Port:</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">char-port</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="rng-bind-service">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="adjustment">adjustment2</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
</object>
<packing>
<property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
- <property name="fill">True</property>
+ <property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py
index 26597a3..f66e493 100644
--- a/virtManager/addhardware.py
+++ b/virtManager/addhardware.py
@@ -111,7 +111,9 @@ class vmmAddHardware(vmmGObjectUI):
"char_bind_host_focus_in": self.update_doc_char_bind_host,
"char_telnet_focus_in": self.update_doc_char_protocol,
"char_name_focus_in": self.update_doc_char_target_name,
- "on_rng_type_changed": self.change_rng_type,
+ "on_rng_type_changed": self.change_rng,
+ "on_rng_backend_mode_changed": self.change_rng,
+ "on_rng_backend_type_changed": self.change_rng,
})
self.bind_escape_key_close()
@@ -515,8 +517,11 @@ class vmmAddHardware(vmmGObjectUI):
# RNG params
self.widget("rng-device").set_text("/dev/random")
- self.widget("rng-host").set_text("localhost")
- self.widget("rng-service").set_text("708")
+ for i in ["rng-bind-host", "rng-connect-host"]:
+ self.widget(i).set_text("localhost")
+
+ for i in ["rng-bind-service", "rng-connect-service"]:
+ self.widget(i).set_text("708")
self.set_hw_selection(0)
@@ -899,26 +904,45 @@ class vmmAddHardware(vmmGObjectUI):
return None
- def get_config_rng_host(self):
- if self.get_config_rng_type() == virtinst.VirtualRNGDevice.TYPE_EGD:
- return self.widget("rng-host").get_text()
+ def get_config_rng_host(self, is_connect=False):
+ connect_mode = virtinst.VirtualRNGDevice.BACKEND_MODE_CONNECT in \
+ self.get_config_rng_backend_mode()
+ is_udp = self.get_config_rng_backend_type() == \
+ virtinst.VirtualRNGDevice.BACKEND_TYPE_UDP
+
+ if connect_mode == is_connect or is_udp:
+ widget_name = "rng-connect-host" if is_connect else "rng-bind-host"
+ return self.widget(widget_name).get_text()
return None
- def get_config_rng_service(self):
- if self.get_config_rng_type() == virtinst.VirtualRNGDevice.TYPE_EGD:
- return self.widget("rng-service").get_text()
+ def get_config_rng_service(self, is_connect=False):
+ connect_mode = virtinst.VirtualRNGDevice.BACKEND_MODE_CONNECT in \
+ self.get_config_rng_backend_mode()
+ is_udp = self.get_config_rng_backend_type() == \
+ virtinst.VirtualRNGDevice.BACKEND_TYPE_UDP
+
+ if connect_mode == is_connect or is_udp:
+ if is_connect:
+ widget_name = "rng-connect-service"
+ else:
+ widget_name = "rng-bind-service"
+ return self.widget(widget_name).get_text()
return None
def get_config_rng_backend_type(self):
active = self.widget("rng-backend-type").get_active()
model = self.widget("rng-backend-type").get_model()
+ if active < 0:
+ return None
return model[active][0]
def get_config_rng_backend_mode(self):
active = self.widget("rng-backend-mode").get_active()
model = self.widget("rng-backend-mode").get_model()
+ if active < 0:
+ return None
return model[active][0]
################
@@ -1175,18 +1199,29 @@ class vmmAddHardware(vmmGObjectUI):
self.widget("usbredir-host").set_sensitive(hostdetails)
self.widget("usbredir-service").set_sensitive(hostdetails)
- def change_rng_type(self, ignore1):
+ def change_rng(self, ignore1):
model = self.get_config_rng_type()
if model is None:
return
is_egd = model == virtinst.VirtualRNGDevice.TYPE_EGD
self.widget("rng-device").set_sensitive(not is_egd)
- self.widget("rng-host").set_sensitive(is_egd)
- self.widget("rng-service").set_sensitive(is_egd)
- self.widget("rng-backend-mode").set_sensitive(is_egd)
self.widget("rng-backend-type").set_sensitive(is_egd)
+ backend_type = self.get_config_rng_backend_type()
+ backend_mode = self.get_config_rng_backend_mode()
+ udp = backend_type == virtinst.VirtualRNGDevice.BACKEND_TYPE_UDP
+ bind = backend_mode == virtinst.VirtualRNGDevice.BACKEND_MODE_BIND
+
+ v = is_egd and (udp or bind)
+ self.widget("rng-bind-host-box").set_sensitive(v)
+
+ v = is_egd and (udp or not bind)
+ self.widget("rng-connect-host-box").set_sensitive(v)
+
+ v = is_egd and not udp
+ self.widget("rng-backend-mode").set_sensitive(v)
+
# FS listeners
def browse_fs_source(self, ignore1):
self._browse_file(self.widget("fs-source"), isdir=True)
@@ -1709,21 +1744,33 @@ class vmmAddHardware(vmmGObjectUI):
def validate_page_rng(self):
- conn = self.conn.vmm
+ conn = virtinst.VirtualRNGDevice.BACKEND_MODE_CONNECT in \
+ self.get_config_rng_backend_mode()
model = self.get_config_rng_type()
+ is_udp = self.get_config_rng_backend_type() == \
+ virtinst.VirtualRNGDevice.BACKEND_TYPE_UDP
if model == virtinst.VirtualRNGDevice.TYPE_RANDOM:
if not self.get_config_rng_device():
return self.err.val_err(_("RNG selection error."),
_("A device must be specified."))
elif model == virtinst.VirtualRNGDevice.TYPE_EGD:
- if not self.get_config_rng_host():
- return self.err.val_err(_("RNG selection error."),
- _("The EGD host must be specified."))
-
- if not self.get_config_rng_service():
- return self.err.val_err(_("RNG selection error."),
- _("The EGD service must be specified."))
+ if is_udp:
+ if not self.get_config_rng_host(is_connect=conn) or \
+ not self.get_config_rng_host(is_connect=not conn):
+ return self.err.val_err(_("RNG selection error."),
+ _("Please specify both bind and connect host"))
+ if not int(self.get_config_rng_service(is_connect=conn)) or \
+ not int(self.get_config_rng_service(is_connect=not conn)):
+ return self.err.val_err(_("RNG selection error."),
+ _("Please specify both bind and connect service"))
+ else:
+ if not self.get_config_rng_host(is_connect=conn):
+ return self.err.val_err(_("RNG selection error."),
+ _("The EGD host must be specified."))
+ if not int(self.get_config_rng_service(is_connect=conn)):
+ return self.err.val_err(_("RNG selection error."),
+ _("The EGD service must be specified."))
else:
return self.err.val_err(_("RNG selection error."),
_("Invalid RNG type."))
@@ -1731,13 +1778,15 @@ class vmmAddHardware(vmmGObjectUI):
value_mappings = {
"backend_type" : self.get_config_rng_backend_type(),
"backend_source_mode" : self.get_config_rng_backend_mode(),
- "backend_source_host" : self.get_config_rng_host(),
- "backend_source_service" : self.get_config_rng_service(),
+ "connect_host" : self.get_config_rng_host(is_connect=True),
+ "connect_service" : self.get_config_rng_service(is_connect=True),
+ "bind_host" : self.get_config_rng_host(),
+ "bind_service" : self.get_config_rng_service(),
"device" : self.get_config_rng_device(),
}
try:
- self._dev = virtinst.VirtualRNGDevice(conn)
+ self._dev = virtinst.VirtualRNGDevice(self.conn.vmm)
self._dev.type = self.get_config_rng_type()
for param_name, val in value_mappings.items():
if self._dev.supports_property(param_name):
--
1.8.4.2