Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1001773 Signed-off-by: Giuseppe Scrivano <gscrivan@xxxxxxxxxx> --- ui/addhardware.ui | 177 ++++++++++++++++++++++++++++++++++----------- virtManager/addhardware.py | 99 +++++++++++++++++++------ 2 files changed, 208 insertions(+), 68 deletions(-) diff --git a/ui/addhardware.ui b/ui/addhardware.ui index f799d86..eee0128 100644 --- a/ui/addhardware.ui +++ b/ui/addhardware.ui @@ -1,5 +1,4 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.16.0 on Sat Oct 5 13:36:37 2013 --> <interface> <!-- interface-requires gtk+ 3.0 --> <object class="GtkAdjustment" id="adjustment1"> @@ -2278,63 +2277,67 @@ <property name="row_spacing">6</property> <property name="column_spacing">6</property> <child> - <object class="GtkEntry" id="rng-device"> + <object class="GtkLabel" id="label4"> <property name="visible">True</property> - <property name="can_focus">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">_Type:</property> + <property name="use_underline">True</property> + <property name="mnemonic_widget">tpm-type</property> </object> <packing> - <property name="left_attach">1</property> - <property name="top_attach">5</property> + <property name="left_attach">0</property> + <property name="top_attach">0</property> <property name="width">1</property> <property name="height">1</property> </packing> </child> <child> - <object class="GtkLabel" id="label5"> + <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="left_attach">0</property> - <property name="top_attach">5</property> + <property name="left_attach">1</property> + <property name="top_attach">0</property> <property name="width">1</property> <property name="height">1</property> </packing> </child> <child> - <object class="GtkLabel" id="label12"> + <object class="GtkLabel" id="label8"> <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="xalign">0</property> + <property name="label" translatable="yes">Backend Type:</property> </object> <packing> <property name="left_attach">0</property> - <property name="top_attach">4</property> + <property name="top_attach">1</property> <property name="width">1</property> <property name="height">1</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="top_attach">1</property> <property name="width">1</property> <property name="height">1</property> </packing> </child> <child> - <object class="GtkLabel" id="label8"> + <object class="GtkLabel" id="label12"> <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="xalign">0</property> + <property name="label" translatable="yes">Backend Mode:</property> </object> <packing> <property name="left_attach">0</property> @@ -2344,9 +2347,10 @@ </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> @@ -2356,84 +2360,169 @@ </packing> </child> <child> - <object class="GtkLabel" id="label19"> + <object class="GtkLabel" id="label17"> <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="xalign">0</property> + <property name="label" translatable="yes">Host:</property> <property name="use_underline">True</property> </object> <packing> <property name="left_attach">0</property> - <property name="top_attach">2</property> + <property name="top_attach">4</property> <property name="width">1</property> <property name="height">1</property> </packing> </child> <child> - <object class="GtkEntry" id="rng-service"> + <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">2</property> + <property name="top_attach">4</property> <property name="width">1</property> <property name="height">1</property> </packing> </child> <child> - <object class="GtkLabel" id="label17"> + <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">Host:</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Bind Host:</property> <property name="use_underline">True</property> </object> <packing> <property name="left_attach">0</property> - <property name="top_attach">1</property> + <property name="top_attach">5</property> <property name="width">1</property> <property name="height">1</property> </packing> </child> <child> - <object class="GtkEntry" id="rng-host"> + <object class="GtkHBox" id="rng-bind-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-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="top_attach">1</property> + <property name="top_attach">5</property> <property name="width">1</property> <property name="height">1</property> </packing> </child> <child> - <object class="GtkLabel" id="label4"> + <object class="GtkLabel" id="label5"> <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="use_underline">True</property> - <property name="mnemonic_widget">tpm-type</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Device:</property> </object> <packing> <property name="left_attach">0</property> - <property name="top_attach">0</property> + <property name="top_attach">2</property> <property name="width">1</property> <property name="height">1</property> </packing> </child> <child> - <object class="GtkComboBox" id="rng-type"> + <object class="GtkEntry" id="rng-device"> <property name="visible">True</property> - <property name="can_focus">False</property> - <signal name="changed" handler="on_rng_type_changed" swapped="no"/> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + <property name="invisible_char_set">True</property> </object> <packing> <property name="left_attach">1</property> - <property name="top_attach">0</property> + <property name="top_attach">2</property> <property name="width">1</property> <property name="height">1</property> </packing> diff --git a/virtManager/addhardware.py b/virtManager/addhardware.py index 11bd87c..3c1148f 100644 --- a/virtManager/addhardware.py +++ b/virtManager/addhardware.py @@ -95,7 +95,9 @@ class vmmAddHardware(vmmGObjectUI): "on_usbredir_type_changed": self.change_usbredir_type, - "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() @@ -496,8 +498,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) @@ -895,26 +900,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] ################ @@ -1179,18 +1203,29 @@ class vmmAddHardware(vmmGObjectUI): uihelpers.set_grid_row_visible(self.widget("usbredir-host-box"), showhost) - 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 uihelpers.set_grid_row_visible(self.widget("rng-device"), not is_egd) - uihelpers.set_grid_row_visible(self.widget("rng-host"), is_egd) - uihelpers.set_grid_row_visible(self.widget("rng-service"), is_egd) - uihelpers.set_grid_row_visible(self.widget("rng-backend-mode"), is_egd) uihelpers.set_grid_row_visible(self.widget("rng-backend-type"), 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) + uihelpers.set_grid_row_visible(self.widget("rng-bind-host-box"), v) + + v = is_egd and (udp or not bind) + uihelpers.set_grid_row_visible(self.widget("rng-connect-host-box"), v) + + v = is_egd and not udp + uihelpers.set_grid_row_visible(self.widget("rng-backend-mode"), v) + # FS listeners def browse_fs_source(self, ignore1): self._browse_file(self.widget("fs-source"), isdir=True) @@ -1730,31 +1765,47 @@ class vmmAddHardware(vmmGObjectUI): return self.err.val_err(_("TPM device parameter error"), e) def validate_page_rng(self): - conn = self.conn.get_backend() + 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.")) + conn = self.get_config_rng_backend_mode() == \ + virtinst.VirtualRNGDevice.BACKEND_MODE_CONNECT + + 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.")) value_mappings = { - "backend_mode" : "connect", "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(), } -- 1.8.3.1 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list