[virt-tools-list] [PATCH] static route support
Cole Robinson
crobinso at redhat.com
Tue May 21 20:00:00 UTC 2013
On 05/14/2013 12:15 PM, Gene Czarcinski wrote:
> The syntax for static route support is defined by the
> new <route> subelement which has the form:
> <route family='xx' address='xx' prefix='n' gateway='gg' metric='m'/>
> This patch builds on the previous patches for adding IPv6 support and
> extending the virtual network support.
>
> The static route support code has been recently added to libvirt and will
> be included in libvirt 1.0.6.
> .
Looks fine, thanks for the work!
Couple pylint errors:
$ python setup.py pylint
running pylint
************* Module virtManager.createnet
W:506:vmmCreateNetwork.change_routev6_enable: Unused argument 'src'
W:580:vmmCreateNetwork.change_dhcpv6_enable: Unused argument 'src'
************* Module virtManager.network
W: 20: Unused import logging
running pep8
virtManager/createnet.py:551: [E271] multiple spaces after keyword
One thing though: looks like <domain name= is now unconditionally used for
new networks. Intentional? Are there downsides here that might cause someone
to complain?
- Cole
> Signed-off-by: Gene Czarcinski <gene at czarc.net>
> ---
> ui/vmm-create-net.ui | 991 +++++++++++++++++++++++++++++++++++------------
> ui/vmm-host.ui | 4 +-
> virtManager/createnet.py | 601 +++++++++++++++++++++++-----
> virtManager/host.py | 8 +-
> virtManager/network.py | 106 +++--
> 5 files changed, 1315 insertions(+), 395 deletions(-)
>
> diff --git a/ui/vmm-create-net.ui b/ui/vmm-create-net.ui
> index ef9fcaa..8d07c6c 100644
> --- a/ui/vmm-create-net.ui
> +++ b/ui/vmm-create-net.ui
> @@ -89,7 +89,7 @@
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> <property name="ypad">6</property>
> - <property name="label" translatable="yes"><small>●</small> A <b>name</b> for the new virtual network</property>
> + <property name="label" translatable="yes"><small>●</small> A <b>name</b> for the new virtual network interface</property>
> <property name="use_markup">True</property>
> </object>
> <packing>
> @@ -105,7 +105,7 @@
> <property name="xalign">0</property>
> <property name="yalign">0.47999998927116394</property>
> <property name="ypad">6</property>
> - <property name="label" translatable="yes"><small>●</small> An <b>IPv4</b> and/or <b>IPv6</b> network address and prefix (netmask) to assign</property>
> + <property name="label" translatable="yes"><small>●</small> An <b>IPv4</b> and/or <b>IPv6</b> network address and prefix (netmask) to assign to this network interface</property>
> <property name="use_markup">True</property>
> <property name="wrap">True</property>
> </object>
> @@ -121,7 +121,7 @@
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> <property name="ypad">6</property>
> - <property name="label" translatable="yes"><small>●</small> The network address range which the <b>DHCPv4</b> and/or <b>DHCPv6</b> server will assign addresses to virtual machines</property>
> + <property name="label" translatable="yes"><small>●</small> The network address range which the <b>DHCPv4</b> and/or <b>DHCPv6</b> server will use to assign addresses to virtual machines</property>
> <property name="use_markup">True</property>
> <property name="wrap">True</property>
> </object>
> @@ -152,7 +152,7 @@
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> <property name="ypad">6</property>
> - <property name="label" translatable="yes"><small>●</small> Optionally to specify an <b>IPv4</b> and/or <b>IPv6</b> network address. If neither is specified, this will be a valid definition for an isolated network with <b>no</b> DHCP or DNS support.</property>
> + <property name="label" translatable="yes"><small>●</small> Optionally, to not specify any <b>IPv4</b> or <b>IPv6</b> network address. If neither is specified, this will be a valid definition for an isolated network with <b>no</b> DHCP or DNS support.</property>
> <property name="use_markup">True</property>
> <property name="wrap">True</property>
> </object>
> @@ -162,6 +162,38 @@
> <property name="position">4</property>
> </packing>
> </child>
> + <child>
> + <object class="GtkLabel" id="label10">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="ypad">6</property>
> + <property name="label" translatable="yes"><small>●</small> By default, the <b>Domain</b> name will be the same as the network/interface name.</property>
> + <property name="use_markup">True</property>
> + <property name="wrap">True</property>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">5</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label22">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="ypad">6</property>
> + <property name="label" translatable="yes"><small>●</small> Optionally, a <b>static route</b> to a different network can be specified. This network traffic is routed to the specified <b>gateway</b> on the primary network.</property>
> + <property name="use_markup">True</property>
> + <property name="wrap">True</property>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">6</property>
> + </packing>
> + </child>
> </object>
> </child>
> </object>
> @@ -384,6 +416,130 @@
> <property name="position">3</property>
> </packing>
> </child>
> + <child>
> + <object class="GtkVBox" id="vbox11">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <child>
> + <object class="GtkLabel" id="label31">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="ypad">6</property>
> + <property name="label" translatable="yes">The following information may help you with defining your networks.</property>
> + <property name="use_markup">True</property>
> + <property name="wrap">True</property>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">0</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkAlignment" id="alignment27">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="left_padding">25</property>
> + <child>
> + <object class="GtkVBox" id="vbox12">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <child>
> + <object class="GtkLabel" id="label32">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="ypad">6</property>
> + <property name="label" translatable="yes"><small>●</small> A<b> network</b> must be specified as the network <b>address</b> and the <b>prefix</b> for that network.</property>
> + <property name="use_markup">True</property>
> + <property name="wrap">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="label33">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="ypad">6</property>
> + <property name="label" translatable="yes"><small>●</small> A network mask cannot be used for the network specification. Instead, the prefix must be used.</property>
> + <property name="use_markup">True</property>
> + <property name="wrap">True</property>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">1</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label34">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="label" translatable="yes"><small>●</small> A <b>host address</b> such as that used for the dhcp start, dhcp end, and the static route gateway address should not include a prefix. If included, this prefix must be the maximum. That is, for IPv4 prefix=32 and for IPv6 prefix=128.</property>
> + <property name="use_markup">True</property>
> + <property name="wrap">True</property>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">2</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label35">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="ypad">6</property>
> + <property name="label" translatable="yes"><small>●</small> If IPv6 is to be routed, some form of routing must be specified for the interface.</property>
> + <property name="use_markup">True</property>
> + <property name="wrap">True</property>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">3</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label36">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="ypad">6</property>
> + <property name="label" translatable="yes"><small>●</small> For the <b>primary network</b>, the prefix must be <b>64</b>. However, for the <b>static route network</b>, the prefix can be <b>64 or less</b>.</property>
> + <property name="use_markup">True</property>
> + <property name="wrap">True</property>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">4</property>
> + </packing>
> + </child>
> + </object>
> + </child>
> + </object>
> + <packing>
> + <property name="expand">False</property>
> + <property name="fill">True</property>
> + <property name="position">1</property>
> + </packing>
> + </child>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">4</property>
> + </packing>
> + </child>
> </object>
> <packing>
> <property name="expand">True</property>
> @@ -793,7 +949,7 @@
> <object class="GtkTable" id="table5">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="n_rows">3</property>
> + <property name="n_rows">6</property>
> <property name="n_columns">5</property>
> <property name="column_spacing">4</property>
> <property name="row_spacing">3</property>
> @@ -893,6 +1049,104 @@
> <property name="y_options"/>
> </packing>
> </child>
> + <child>
> + <object class="GtkAlignment" id="alignment25">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="left_padding">27</property>
> + <child>
> + <object class="GtkCheckButton" id="net-routev4-enable">
> + <property name="label" translatable="yes">Enable Static Route Definition</property>
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="receives_default">False</property>
> + <property name="draw_indicator">True</property>
> + <signal name="toggled" handler="on_net-routev4-enable_toggled" swapped="no"/>
> + </object>
> + </child>
> + </object>
> + <packing>
> + <property name="right_attach">5</property>
> + <property name="top_attach">3</property>
> + <property name="bottom_attach">4</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label14">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">1</property>
> + <property name="xpad">15</property>
> + <property name="label" translatable="yes"><b>to</b> Network:</property>
> + <property name="use_markup">True</property>
> + </object>
> + <packing>
> + <property name="top_attach">4</property>
> + <property name="bottom_attach">5</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label20">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">1</property>
> + <property name="xpad">15</property>
> + <property name="label" translatable="yes"><b>via</b> Gateway:</property>
> + <property name="use_markup">True</property>
> + </object>
> + <packing>
> + <property name="top_attach">5</property>
> + <property name="bottom_attach">6</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkEntry" id="net-routev4-network">
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="max_length">20</property>
> + <property name="invisible_char">●</property>
> + <property name="primary_icon_activatable">False</property>
> + <property name="secondary_icon_activatable">False</property>
> + <property name="primary_icon_sensitive">True</property>
> + <property name="secondary_icon_sensitive">True</property>
> + <signal name="changed" handler="on_net-routev4-network_changed" swapped="no"/>
> + </object>
> + <packing>
> + <property name="left_attach">1</property>
> + <property name="right_attach">5</property>
> + <property name="top_attach">4</property>
> + <property name="bottom_attach">5</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkEntry" id="net-routev4-gateway">
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="max_length">15</property>
> + <property name="invisible_char">●</property>
> + <property name="primary_icon_activatable">False</property>
> + <property name="secondary_icon_activatable">False</property>
> + <property name="primary_icon_sensitive">True</property>
> + <property name="secondary_icon_sensitive">True</property>
> + <signal name="changed" handler="on_net-routev4-gateway_changed" swapped="no"/>
> + </object>
> + <packing>
> + <property name="left_attach">1</property>
> + <property name="right_attach">5</property>
> + <property name="top_attach">5</property>
> + <property name="bottom_attach">6</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> </object>
> <packing>
> <property name="expand">True</property>
> @@ -1317,7 +1571,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <object class="GtkTable" id="table6">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="n_rows">3</property>
> + <property name="n_rows">6</property>
> <property name="n_columns">5</property>
> <property name="column_spacing">4</property>
> <property name="row_spacing">3</property>
> @@ -1355,7 +1609,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <object class="GtkEntry" id="net-dhcpv6-start">
> <property name="visible">True</property>
> <property name="can_focus">True</property>
> - <property name="max_length">45</property>
> + <property name="max_length">40</property>
> <property name="invisible_char">●</property>
> <property name="invisible_char_set">True</property>
> <property name="primary_icon_activatable">False</property>
> @@ -1377,7 +1631,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <object class="GtkEntry" id="net-dhcpv6-end">
> <property name="visible">True</property>
> <property name="can_focus">True</property>
> - <property name="max_length">45</property>
> + <property name="max_length">40</property>
> <property name="invisible_char">●</property>
> <property name="invisible_char_set">True</property>
> <property name="primary_icon_activatable">False</property>
> @@ -1417,53 +1671,151 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <property name="y_options"/>
> </packing>
> </child>
> - </object>
> - <packing>
> - <property name="expand">True</property>
> - <property name="fill">True</property>
> - <property name="position">1</property>
> - </packing>
> - </child>
> - </object>
> - <packing>
> - <property name="expand">True</property>
> - <property name="fill">True</property>
> - <property name="position">2</property>
> - </packing>
> - </child>
> - </object>
> - <packing>
> - <property name="expand">True</property>
> - <property name="fill">True</property>
> - <property name="position">1</property>
> - </packing>
> - </child>
> - </object>
> - <packing>
> - <property name="position">3</property>
> - </packing>
> - </child>
> - <child type="tab">
> - <object class="GtkLabel" id="label3">
> - <property name="visible">True</property>
> - <property name="can_focus">False</property>
> - <property name="label" translatable="yes">IPv6</property>
> - </object>
> - <packing>
> - <property name="position">3</property>
> - <property name="tab_fill">False</property>
> - </packing>
> - </child>
> - <child>
> - <object class="GtkVBox" id="vbox32">
> - <property name="visible">True</property>
> - <property name="can_focus">False</property>
> - <property name="border_width">1</property>
> - <child>
> - <object class="GtkAlignment" id="alignment69">
> - <property name="visible">True</property>
> - <property name="can_focus">False</property>
> - <child>
> + <child>
> + <object class="GtkAlignment" id="alignment26">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="left_padding">27</property>
> + <child>
> + <object class="GtkCheckButton" id="net-routev6-enable">
> + <property name="label" translatable="yes">Enable Static Route Definition</property>
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="receives_default">False</property>
> + <property name="draw_indicator">True</property>
> + <signal name="toggled" handler="on_net-routev6-enable_toggled" swapped="no"/>
> + </object>
> + </child>
> + </object>
> + <packing>
> + <property name="right_attach">5</property>
> + <property name="top_attach">3</property>
> + <property name="bottom_attach">4</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label24">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">1</property>
> + <property name="xpad">15</property>
> + <property name="label" translatable="yes"><b>to</b> Network:</property>
> + <property name="use_markup">True</property>
> + </object>
> + <packing>
> + <property name="top_attach">4</property>
> + <property name="bottom_attach">5</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label30">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">1</property>
> + <property name="xpad">15</property>
> + <property name="label" translatable="yes"><b>via</b> Gateway:</property>
> + <property name="use_markup">True</property>
> + </object>
> + <packing>
> + <property name="top_attach">5</property>
> + <property name="bottom_attach">6</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkEntry" id="net-routev6-network">
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="max_length">45</property>
> + <property name="invisible_char">●</property>
> + <property name="primary_icon_activatable">False</property>
> + <property name="secondary_icon_activatable">False</property>
> + <property name="primary_icon_sensitive">True</property>
> + <property name="secondary_icon_sensitive">True</property>
> + <signal name="changed" handler="on_net-routev6-network_changed" swapped="no"/>
> + </object>
> + <packing>
> + <property name="left_attach">1</property>
> + <property name="right_attach">5</property>
> + <property name="top_attach">4</property>
> + <property name="bottom_attach">5</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkEntry" id="net-routev6-gateway">
> + <property name="visible">True</property>
> + <property name="can_focus">True</property>
> + <property name="max_length">40</property>
> + <property name="invisible_char">●</property>
> + <property name="primary_icon_activatable">False</property>
> + <property name="secondary_icon_activatable">False</property>
> + <property name="primary_icon_sensitive">True</property>
> + <property name="secondary_icon_sensitive">True</property>
> + <signal name="changed" handler="on_net-routev6-gateway_changed" swapped="no"/>
> + </object>
> + <packing>
> + <property name="left_attach">1</property>
> + <property name="right_attach">5</property>
> + <property name="top_attach">5</property>
> + <property name="bottom_attach">6</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">1</property>
> + </packing>
> + </child>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">2</property>
> + </packing>
> + </child>
> + </object>
> + <packing>
> + <property name="expand">True</property>
> + <property name="fill">True</property>
> + <property name="position">1</property>
> + </packing>
> + </child>
> + </object>
> + <packing>
> + <property name="position">3</property>
> + </packing>
> + </child>
> + <child type="tab">
> + <object class="GtkLabel" id="label3">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="label" translatable="yes">IPv6</property>
> + </object>
> + <packing>
> + <property name="position">3</property>
> + <property name="tab_fill">False</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkVBox" id="vbox32">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="border_width">1</property>
> + <child>
> + <object class="GtkAlignment" id="alignment69">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <child>
> <object class="GtkEventBox" id="page4-title">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> @@ -1994,11 +2346,26 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="border_width">6</property>
> - <property name="n_rows">14</property>
> + <property name="n_rows">18</property>
> <property name="n_columns">3</property>
> <property name="column_spacing">3</property>
> <property name="row_spacing">3</property>
> <child>
> + <placeholder/>
> + </child>
> + <child>
> + <placeholder/>
> + </child>
> + <child>
> + <placeholder/>
> + </child>
> + <child>
> + <placeholder/>
> + </child>
> + <child>
> + <placeholder/>
> + </child>
> + <child>
> <object class="GtkLabel" id="label379">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> @@ -2018,7 +2385,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> <property name="ypad">5</property>
> - <property name="label" translatable="yes"><b>IPv4 network</b></property>
> + <property name="label" translatable="yes"><b>IPv4 Network</b></property>
> <property name="use_markup">True</property>
> </object>
> <packing>
> @@ -2050,7 +2417,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">1</property>
> - <property name="label" translatable="yes">Domain Name:</property>
> + <property name="label" translatable="yes"><b>Domain</b> Name:</property>
> <property name="use_markup">True</property>
> </object>
> <packing>
> @@ -2067,6 +2434,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> + <property name="xpad">2</property>
> <property name="label">192.168.10.254</property>
> <property name="ellipsize">middle</property>
> </object>
> @@ -2084,6 +2452,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> + <property name="xpad">2</property>
> <property name="label">192.168.10.1</property>
> <property name="ellipsize">middle</property>
> </object>
> @@ -2101,6 +2470,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> + <property name="xpad">2</property>
> <property name="label">192.168.10.0/24</property>
> </object>
> <packing>
> @@ -2117,6 +2487,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> + <property name="xpad">2</property>
> <property name="label">demonet</property>
> </object>
> <packing>
> @@ -2133,6 +2504,7 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> + <property name="xpad">2</property>
> <property name="label" translatable="yes">192.168.10.128</property>
> <property name="use_underline">True</property>
> </object>
> @@ -2146,183 +2518,216 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label21">
> + <object class="GtkLabel" id="label-ip4-network">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">0</property>
> - <property name="ypad">5</property>
> - <property name="label" translatable="yes"><b>IPv6 network</b></property>
> - <property name="use_markup">True</property>
> + <property name="xalign">1</property>
> + <property name="label" translatable="yes">Network Address / prefix:</property>
> </object>
> <packing>
> - <property name="top_attach">8</property>
> - <property name="bottom_attach">9</property>
> + <property name="left_attach">1</property>
> + <property name="right_attach">2</property>
> + <property name="top_attach">3</property>
> + <property name="bottom_attach">4</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="summary-ip6-network">
> + <object class="GtkLabel" id="label-dhcp-start">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">0</property>
> - <property name="label" translatable="yes">FD00:100::/64</property>
> - <property name="use_underline">True</property>
> + <property name="xalign">1</property>
> + <property name="label" translatable="yes">DHCPv4 Start Address:</property>
> + <property name="use_markup">True</property>
> </object>
> <packing>
> - <property name="left_attach">2</property>
> - <property name="right_attach">3</property>
> - <property name="top_attach">9</property>
> - <property name="bottom_attach">10</property>
> + <property name="left_attach">1</property>
> + <property name="right_attach">2</property>
> + <property name="top_attach">6</property>
> + <property name="bottom_attach">7</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="summary-ip6-gateway">
> + <object class="GtkLabel" id="label-dhcp-end">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">0</property>
> - <property name="label">FD00:100::1</property>
> - <property name="ellipsize">middle</property>
> + <property name="xalign">1</property>
> + <property name="label" translatable="yes">DHCPv4 End Address:</property>
> + <property name="use_markup">True</property>
> </object>
> <packing>
> - <property name="left_attach">2</property>
> - <property name="right_attach">3</property>
> - <property name="top_attach">10</property>
> - <property name="bottom_attach">11</property>
> + <property name="left_attach">1</property>
> + <property name="right_attach">2</property>
> + <property name="top_attach">7</property>
> + <property name="bottom_attach">8</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label-dhcpv6-end">
> + <object class="GtkLabel" id="label375">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">1</property>
> - <property name="label" translatable="yes">DHCPv6 End Address:</property>
> + <property name="xalign">0</property>
> + <property name="ypad">5</property>
> + <property name="label" translatable="yes"><b>Summary</b></property>
> <property name="use_markup">True</property>
> </object>
> <packing>
> - <property name="left_attach">1</property>
> - <property name="right_attach">2</property>
> - <property name="top_attach">13</property>
> - <property name="bottom_attach">14</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label-dhcpv6-start">
> + <object class="GtkLabel" id="label18">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">1</property>
> - <property name="label" translatable="yes">DHCPv6 Start Address:</property>
> + <property name="label" translatable="yes"><b>Network</b> Name:</property>
> <property name="use_markup">True</property>
> </object>
> <packing>
> <property name="left_attach">1</property>
> <property name="right_attach">2</property>
> - <property name="top_attach">12</property>
> - <property name="bottom_attach">13</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="summary-dhcpv6-start">
> + <object class="GtkLabel" id="summary-name">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> - <property name="label" translatable="yes">FD00:100::100</property>
> - <property name="use_underline">True</property>
> + <property name="xpad">2</property>
> + <property name="label" translatable="yes">demo</property>
> </object>
> <packing>
> <property name="left_attach">2</property>
> <property name="right_attach">3</property>
> - <property name="top_attach">12</property>
> - <property name="bottom_attach">13</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="summary-dhcpv6-end">
> - <property name="visible">True</property>
> - <property name="can_focus">False</property>
> - <property name="xalign">0</property>
> - <property name="label" translatable="yes">FD00:100::1FF</property>
> - <property name="use_underline">True</property>
> - </object>
> - <packing>
> - <property name="left_attach">2</property>
> - <property name="right_attach">3</property>
> - <property name="top_attach">13</property>
> - <property name="bottom_attach">14</property>
> - <property name="x_options">GTK_EXPAND | GTK_SHRINK | GTK_FILL</property>
> - <property name="y_options"/>
> - </packing>
> - </child>
> - <child>
> - <object class="GtkLabel" id="label-ip4-network">
> + <object class="GtkLabel" id="label9">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">1</property>
> - <property name="label" translatable="yes">Network:</property>
> + <property name="label" translatable="yes">Forwarding/Connectivity:</property>
> </object>
> <packing>
> <property name="left_attach">1</property>
> <property name="right_attach">2</property>
> - <property name="top_attach">3</property>
> - <property name="bottom_attach">4</property>
> + <property name="top_attach">5</property>
> + <property name="bottom_attach">6</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label-dhcp-start">
> + <object class="GtkLabel" id="summary-ipv4-forwarding">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">1</property>
> - <property name="label" translatable="yes">DHCPv4 Start Address:</property>
> - <property name="use_markup">True</property>
> + <property name="xalign">0</property>
> + <property name="xpad">2</property>
> + <property name="label" translatable="yes">NAT</property>
> </object>
> <packing>
> - <property name="left_attach">1</property>
> - <property name="right_attach">2</property>
> - <property name="top_attach">6</property>
> - <property name="bottom_attach">7</property>
> + <property name="left_attach">2</property>
> + <property name="right_attach">3</property>
> + <property name="top_attach">5</property>
> + <property name="bottom_attach">6</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label-dhcp-end">
> + <object class="GtkAlignment" id="alignment43">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">1</property>
> - <property name="label" translatable="yes">DHCPv4 End Address:</property>
> - <property name="use_markup">True</property>
> + <child>
> + <placeholder/>
> + </child>
> </object>
> <packing>
> - <property name="left_attach">1</property>
> - <property name="right_attach">2</property>
> - <property name="top_attach">7</property>
> - <property name="bottom_attach">8</property>
> + <property name="top_attach">3</property>
> + <property name="bottom_attach">4</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label-ip6-network">
> + <object class="GtkAlignment" id="alignment44">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">1</property>
> - <property name="label" translatable="yes">Network:</property>
> - </object>
> + <child>
> + <placeholder/>
> + </child>
> + </object>
> + <packing>
> + <property name="top_attach">4</property>
> + <property name="bottom_attach">5</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options">GTK_FILL</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkAlignment" id="alignment51">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <child>
> + <placeholder/>
> + </child>
> + </object>
> + <packing>
> + <property name="top_attach">5</property>
> + <property name="bottom_attach">6</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkAlignment" id="alignment52">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <child>
> + <placeholder/>
> + </child>
> + </object>
> + <packing>
> + <property name="top_attach">6</property>
> + <property name="bottom_attach">7</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkAlignment" id="alignment53">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <child>
> + <placeholder/>
> + </child>
> + </object>
> + <packing>
> + <property name="top_attach">7</property>
> + <property name="bottom_attach">8</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkAlignment" id="alignment54">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <child>
> + <placeholder/>
> + </child>
> + </object>
> <packing>
> - <property name="left_attach">1</property>
> - <property name="right_attach">2</property>
> <property name="top_attach">9</property>
> <property name="bottom_attach">10</property>
> <property name="x_options">GTK_FILL</property>
> @@ -2330,15 +2735,21 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label-ip6-gateway">
> + <object class="GtkAlignment" id="alignment55">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">1</property>
> - <property name="label" translatable="yes">Gateway:</property>
> + <child>
> + <object class="GtkLabel" id="label21">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="ypad">5</property>
> + <property name="label" translatable="yes"><b>IPv6 Network</b></property>
> + <property name="use_markup">True</property>
> + </object>
> + </child>
> </object>
> <packing>
> - <property name="left_attach">1</property>
> - <property name="right_attach">2</property>
> <property name="top_attach">10</property>
> <property name="bottom_attach">11</property>
> <property name="x_options">GTK_FILL</property>
> @@ -2346,49 +2757,99 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label375">
> + <object class="GtkAlignment" id="alignment56">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">0</property>
> - <property name="ypad">5</property>
> - <property name="label" translatable="yes"><b>Summary</b></property>
> - <property name="use_markup">True</property>
> + <child>
> + <placeholder/>
> + </child>
> </object>
> <packing>
> + <property name="top_attach">11</property>
> + <property name="bottom_attach">12</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label18">
> + <object class="GtkAlignment" id="alignment57">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <child>
> + <placeholder/>
> + </child>
> + </object>
> + <packing>
> + <property name="top_attach">12</property>
> + <property name="bottom_attach">13</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkAlignment" id="alignment58">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <child>
> + <placeholder/>
> + </child>
> + </object>
> + <packing>
> + <property name="top_attach">13</property>
> + <property name="bottom_attach">14</property>
> + <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkHSeparator" id="hseparator10">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + </object>
> + <packing>
> + <property name="left_attach">1</property>
> + <property name="right_attach">3</property>
> + <property name="top_attach">2</property>
> + <property name="bottom_attach">3</property>
> + <property name="x_options">GTK_FILL</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label-dhcpv6-end">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">1</property>
> - <property name="label" translatable="yes">Network Name:</property>
> + <property name="label" translatable="yes">DHCPv6 End Address:</property>
> + <property name="use_markup">True</property>
> </object>
> <packing>
> <property name="left_attach">1</property>
> <property name="right_attach">2</property>
> + <property name="top_attach">15</property>
> + <property name="bottom_attach">16</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="summary-name">
> + <object class="GtkLabel" id="label-dhcpv6-start">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">0</property>
> - <property name="label" translatable="yes">demo</property>
> + <property name="xalign">1</property>
> + <property name="label" translatable="yes">DHCPv6 Start Address:</property>
> + <property name="use_markup">True</property>
> </object>
> <packing>
> - <property name="left_attach">2</property>
> - <property name="right_attach">3</property>
> + <property name="left_attach">1</property>
> + <property name="right_attach">2</property>
> + <property name="top_attach">14</property>
> + <property name="bottom_attach">15</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label9">
> + <object class="GtkLabel" id="label23">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">1</property>
> @@ -2397,34 +2858,34 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> <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>
> + <property name="top_attach">13</property>
> + <property name="bottom_attach">14</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="summary-ipv4-forwarding">
> + <object class="GtkLabel" id="label-ip6-gateway">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <property name="xalign">0</property>
> - <property name="label" translatable="yes">NAT</property>
> + <property name="xalign">1</property>
> + <property name="label" translatable="yes">Gateway:</property>
> </object>
> <packing>
> - <property name="left_attach">2</property>
> - <property name="right_attach">3</property>
> - <property name="top_attach">5</property>
> - <property name="bottom_attach">6</property>
> + <property name="left_attach">1</property>
> + <property name="right_attach">2</property>
> + <property name="top_attach">12</property>
> + <property name="bottom_attach">13</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="label10">
> + <object class="GtkLabel" id="label-ip6-network">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">1</property>
> - <property name="label" translatable="yes">Forwarding/Connectivity:</property>
> + <property name="label" translatable="yes">Network Address / prefix:</property>
> </object>
> <packing>
> <property name="left_attach">1</property>
> @@ -2436,195 +2897,225 @@ A typical IPv6 network address will look something like: fd00:dead:beef:55::/64
> </packing>
> </child>
> <child>
> - <object class="GtkLabel" id="summary-ipv6-forwarding">
> + <object class="GtkLabel" id="summary-dhcpv6-start">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> - <property name="label" translatable="yes">Routed</property>
> + <property name="xpad">2</property>
> + <property name="label" translatable="yes">FD00:100::100</property>
> + <property name="use_underline">True</property>
> </object>
> <packing>
> <property name="left_attach">2</property>
> <property name="right_attach">3</property>
> - <property name="top_attach">11</property>
> - <property name="bottom_attach">12</property>
> - <property name="x_options">GTK_FILL</property>
> + <property name="top_attach">14</property>
> + <property name="bottom_attach">15</property>
> + <property name="x_options">GTK_EXPAND | GTK_SHRINK | GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment43">
> + <object class="GtkLabel" id="summary-dhcpv6-end">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> + <property name="xalign">0</property>
> + <property name="xpad">2</property>
> + <property name="label" translatable="yes">FD00:100::1FF</property>
> + <property name="use_underline">True</property>
> </object>
> <packing>
> - <property name="top_attach">3</property>
> - <property name="bottom_attach">4</property>
> - <property name="x_options">GTK_FILL</property>
> + <property name="left_attach">2</property>
> + <property name="right_attach">3</property>
> + <property name="top_attach">15</property>
> + <property name="bottom_attach">16</property>
> + <property name="x_options">GTK_EXPAND | GTK_SHRINK | GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment44">
> + <object class="GtkLabel" id="summary-ipv6-forwarding">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> + <property name="xalign">0</property>
> + <property name="xpad">2</property>
> + <property name="label" translatable="yes">Routed</property>
> </object>
> <packing>
> - <property name="top_attach">4</property>
> - <property name="bottom_attach">5</property>
> + <property name="left_attach">2</property>
> + <property name="right_attach">3</property>
> + <property name="top_attach">13</property>
> + <property name="bottom_attach">14</property>
> <property name="x_options">GTK_FILL</property>
> - <property name="y_options">GTK_FILL</property>
> + <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment51">
> + <object class="GtkLabel" id="summary-ip6-network">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> + <property name="xalign">0</property>
> + <property name="xpad">2</property>
> + <property name="label" translatable="yes">FD00:100::/64</property>
> </object>
> <packing>
> - <property name="top_attach">5</property>
> - <property name="bottom_attach">6</property>
> + <property name="left_attach">2</property>
> + <property name="right_attach">3</property>
> + <property name="top_attach">11</property>
> + <property name="bottom_attach">12</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment52">
> + <object class="GtkLabel" id="summary-ip6-gateway">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> + <property name="xalign">0</property>
> + <property name="xpad">2</property>
> + <property name="label" translatable="yes">FD00:100::1</property>
> </object>
> <packing>
> - <property name="top_attach">6</property>
> - <property name="bottom_attach">7</property>
> + <property name="left_attach">2</property>
> + <property name="right_attach">3</property>
> + <property name="top_attach">12</property>
> + <property name="bottom_attach">13</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment53">
> + <object class="GtkHSeparator" id="hseparator11">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> </object>
> <packing>
> - <property name="top_attach">7</property>
> - <property name="bottom_attach">8</property>
> + <property name="left_attach">1</property>
> + <property name="right_attach">3</property>
> + <property name="top_attach">10</property>
> + <property name="bottom_attach">11</property>
> <property name="x_options">GTK_FILL</property>
> - <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment54">
> + <object class="GtkLabel" id="label-routev4-network">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> + <property name="xalign">1</property>
> + <property name="label" translatable="yes">Static Route <b>to</b> network:</property>
> + <property name="use_markup">True</property>
> </object>
> <packing>
> + <property name="left_attach">1</property>
> + <property name="right_attach">2</property>
> + <property name="top_attach">8</property>
> + <property name="bottom_attach">9</property>
> + </packing>
> + </child>
> + <child>
> + <object class="GtkLabel" id="label-routev4-gateway">
> + <property name="visible">True</property>
> + <property name="can_focus">False</property>
> + <property name="xalign">1</property>
> + <property name="label" translatable="yes"><b>via</b> Gateway:</property>
> + <property name="use_markup">True</property>
> + </object>
> + <packing>
> + <property name="left_attach">1</property>
> + <property name="right_attach">2</property>
> <property name="top_attach">9</property>
> <property name="bottom_attach">10</property>
> - <property name="x_options">GTK_FILL</property>
> - <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment55">
> + <object class="GtkLabel" id="label-routev6-network">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> + <property name="xalign">1</property>
> + <property name="label" translatable="yes">Static Route <b>to</b> network:</property>
> + <property name="use_markup">True</property>
> </object>
> <packing>
> - <property name="top_attach">10</property>
> - <property name="bottom_attach">11</property>
> - <property name="x_options">GTK_FILL</property>
> - <property name="y_options"/>
> + <property name="left_attach">1</property>
> + <property name="right_attach">2</property>
> + <property name="top_attach">16</property>
> + <property name="bottom_attach">17</property>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment56">
> + <object class="GtkLabel" id="label-routev6-gateway">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> + <property name="xalign">1</property>
> + <property name="label" translatable="yes"><b>via</b> Gateway:</property>
> + <property name="use_markup">True</property>
> </object>
> <packing>
> - <property name="top_attach">11</property>
> - <property name="bottom_attach">12</property>
> - <property name="x_options">GTK_FILL</property>
> - <property name="y_options"/>
> + <property name="left_attach">1</property>
> + <property name="right_attach">2</property>
> + <property name="top_attach">17</property>
> + <property name="bottom_attach">18</property>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment57">
> + <object class="GtkLabel" id="summary-routev4-network">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> + <property name="xalign">0</property>
> + <property name="xpad">3</property>
> </object>
> <packing>
> - <property name="top_attach">12</property>
> - <property name="bottom_attach">13</property>
> + <property name="left_attach">2</property>
> + <property name="right_attach">3</property>
> + <property name="top_attach">8</property>
> + <property name="bottom_attach">9</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkAlignment" id="alignment58">
> + <object class="GtkLabel" id="summary-routev4-gateway">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> - <child>
> - <placeholder/>
> - </child>
> + <property name="xalign">0</property>
> + <property name="xpad">3</property>
> </object>
> <packing>
> - <property name="top_attach">13</property>
> - <property name="bottom_attach">14</property>
> + <property name="left_attach">2</property>
> + <property name="right_attach">3</property>
> + <property name="top_attach">9</property>
> + <property name="bottom_attach">10</property>
> <property name="x_options">GTK_FILL</property>
> <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkHSeparator" id="hseparator10">
> + <object class="GtkLabel" id="summary-routev6-network">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="xpad">3</property>
> </object>
> <packing>
> - <property name="left_attach">1</property>
> + <property name="left_attach">2</property>
> <property name="right_attach">3</property>
> - <property name="top_attach">2</property>
> - <property name="bottom_attach">3</property>
> + <property name="top_attach">16</property>
> + <property name="bottom_attach">17</property>
> <property name="x_options">GTK_FILL</property>
> + <property name="y_options"/>
> </packing>
> </child>
> <child>
> - <object class="GtkHSeparator" id="hseparator11">
> + <object class="GtkLabel" id="summary-routev6-gateway">
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> + <property name="xalign">0</property>
> + <property name="xpad">3</property>
> </object>
> <packing>
> - <property name="left_attach">1</property>
> + <property name="left_attach">2</property>
> <property name="right_attach">3</property>
> - <property name="top_attach">8</property>
> - <property name="bottom_attach">9</property>
> - <property name="x_options">GTK_FILL</property>
> + <property name="top_attach">17</property>
> + <property name="bottom_attach">18</property>
> </packing>
> </child>
> </object>
> diff --git a/ui/vmm-host.ui b/ui/vmm-host.ui
> index aca4cb7..bd315fe 100644
> --- a/ui/vmm-host.ui
> +++ b/ui/vmm-host.ui
> @@ -945,7 +945,7 @@
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> - <property name="label" translatable="yes">Route-Via:</property>
> + <property name="label" translatable="yes">Static Route:</property>
> </object>
> <packing>
> <property name="top_attach">3</property>
> @@ -1050,7 +1050,7 @@
> <property name="visible">True</property>
> <property name="can_focus">False</property>
> <property name="xalign">0</property>
> - <property name="label" translatable="yes">Route-Via:</property>
> + <property name="label" translatable="yes">Static Route:</property>
> </object>
> <packing>
> <property name="top_attach">3</property>
> diff --git a/virtManager/createnet.py b/virtManager/createnet.py
> index 7f61448..6951087 100644
> --- a/virtManager/createnet.py
> +++ b/virtManager/createnet.py
> @@ -54,16 +54,26 @@ class vmmCreateNetwork(vmmGObjectUI):
>
> "on_net_name_activate": self.forward,
> "on_net_forward_toggled" : self.change_forward_type,
> - "on_net-ipv4-enable_toggled" : self.change_ipv4_enable,
> - "on_net-ipv4-network_changed": self.change_network,
> +
> + "on_net-ipv4-enable_toggled" : self.change_ipv4_enable,
> + "on_net-ipv4-network_changed": self.change_ipv4_network,
> "on_net-dhcpv4-enable_toggled": self.change_dhcpv4_enable,
> - "on_net-dhcpv4-start_changed": self.change_dhcpv4_start,
> - "on_net-dhcpv4-end_changed": self.change_dhcpv4_end,
> - "on_net-ipv6-enable_toggled" : self.change_ipv6_enable,
> - "on_net-ipv6-network_changed": self.change_ipv6_network,
> + "on_net-dhcpv4-start_changed": self.change_dhcpv4_start,
> + "on_net-dhcpv4-end_changed": self.change_dhcpv4_end,
> +
> + "on_net-ipv6-enable_toggled" : self.change_ipv6_enable,
> + "on_net-ipv6-network_changed": self.change_ipv6_network,
> "on_net-dhcpv6-enable_toggled": self.change_dhcpv6_enable,
> - "on_net-dhcpv6-start_changed": self.change_dhcpv6_start,
> - "on_net-dhcpv6-end_changed": self.change_dhcpv6_end,
> + "on_net-dhcpv6-start_changed": self.change_dhcpv6_start,
> + "on_net-dhcpv6-end_changed": self.change_dhcpv6_end,
> +
> + "on_net-routev4-enable_toggled": self.change_routev4_enable,
> + "on_net-routev4-network_changed": self.change_routev4_network,
> + "on_net-routev4-gateway_changed": self.change_routev4_gateway,
> +
> + "on_net-routev6-enable_toggled": self.change_routev6_enable,
> + "on_net-routev6-network_changed": self.change_routev6_network,
> + "on_net-routev6-gateway_changed": self.change_routev6_gateway,
> })
> self.bind_escape_key_close()
>
> @@ -171,53 +181,77 @@ class vmmCreateNetwork(vmmGObjectUI):
> ignore = src
>
> white = Gdk.Color.parse("#f0f0f0")[1]
> - net4 = self.widget("net-ipv4-network")
> - start4 = self.widget("net-dhcpv4-start")
> - end4 = self.widget("net-dhcpv4-end")
> + net = self.widget("net-ipv4-network")
> + start = self.widget("net-dhcpv4-start")
> + end = self.widget("net-dhcpv4-end")
> + network = self.widget("net-routev4-network")
> + gateway = self.widget("net-routev4-gateway")
> if self.get_config_ipv4_enable():
> - net4.set_sensitive(True)
> - net4.set_text("")
> - net4.modify_bg(Gtk.StateType.NORMAL, white)
> + net.set_sensitive(True)
> + net.set_text("")
> + net.modify_bg(Gtk.StateType.NORMAL, white)
> if self.get_config_dhcpv4_enable():
> - start4.set_sensitive(True)
> - end4.set_sensitive(True)
> - else:
> - net4.set_text("")
> - start4.set_text("")
> - end4.set_text("")
> - net4.set_sensitive(False)
> - start4.set_sensitive(False)
> - end4.set_sensitive(False)
> - net4.modify_bg(Gtk.StateType.NORMAL, white)
> - start4.modify_bg(Gtk.StateType.NORMAL, white)
> - end4.modify_bg(Gtk.StateType.NORMAL, white)
> + start.set_sensitive(True)
> + end.set_sensitive(True)
> + if self.get_config_routev4_enable():
> + network.set_sensitive(True)
> + gateway.set_sensitive(True)
> + else:
> + net.set_text("")
> + start.set_text("")
> + end.set_text("")
> + network.set_text("")
> + gateway.set_text("")
> + net.set_sensitive(False)
> + start.set_sensitive(False)
> + end.set_sensitive(False)
> + network.set_sensitive(False)
> + gateway.set_sensitive(False)
> + net.modify_bg(Gtk.StateType.NORMAL, white)
> + start.modify_bg(Gtk.StateType.NORMAL, white)
> + end.modify_bg(Gtk.StateType.NORMAL, white)
> + network.modify_bg(Gtk.StateType.NORMAL, white)
> + gateway.modify_bg(Gtk.StateType.NORMAL, white)
>
> def change_ipv6_enable(self, src):
> ignore = src
>
> white = Gdk.Color.parse("#f0f0f0")[1]
> - net6 = self.widget("net-ipv6-network")
> - start6 = self.widget("net-dhcpv6-start")
> - end6 = self.widget("net-dhcpv6-end")
> + net = self.widget("net-ipv6-network")
> + start = self.widget("net-dhcpv6-start")
> + end = self.widget("net-dhcpv6-end")
> + network = self.widget("net-routev6-network")
> + gateway = self.widget("net-routev6-gateway")
> if self.get_config_ipv6_enable():
> - net6.set_sensitive(True)
> - net6.set_text("")
> - net6.modify_bg(Gtk.StateType.NORMAL, white)
> + net.set_sensitive(True)
> + net.set_text("")
> + net.modify_bg(Gtk.StateType.NORMAL, white)
> if self.get_config_dhcpv6_enable():
> - start6.set_sensitive(True)
> - end6.set_sensitive(True)
> - else:
> - net6.set_text("")
> - start6.set_text("")
> - end6.set_text("")
> - net6.set_sensitive(False)
> - start6.set_sensitive(False)
> - end6.set_sensitive(False)
> - net6.modify_bg(Gtk.StateType.NORMAL, white)
> - start6.modify_bg(Gtk.StateType.NORMAL, white)
> - end6.modify_bg(Gtk.StateType.NORMAL, white)
> -
> - def change_network(self, src):
> + start.set_sensitive(True)
> + end.set_sensitive(True)
> + if self.get_config_routev6_enable():
> + network.set_sensitive(True)
> + gateway.set_sensitive(True)
> + else:
> + net.set_text("")
> + start.set_text("")
> + end.set_text("")
> + network.set_text("")
> + gateway.set_text("")
> + net.set_sensitive(False)
> + start.set_sensitive(False)
> + end.set_sensitive(False)
> + network.set_sensitive(False)
> + gateway.set_sensitive(False)
> + net.modify_bg(Gtk.StateType.NORMAL, white)
> + start.modify_bg(Gtk.StateType.NORMAL, white)
> + end.modify_bg(Gtk.StateType.NORMAL, white)
> + network.modify_bg(Gtk.StateType.NORMAL, white)
> + gateway.modify_bg(Gtk.StateType.NORMAL, white)
> +
> + def change_ipv4_network(self, src):
> + ignore = src
> +
> ip = self.get_config_ip4()
> green = Gdk.Color.parse("#c0ffc0")[1]
> red = Gdk.Color.parse("#ffc0c0")[1]
> @@ -231,6 +265,8 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("net-info-type").set_text("")
> self.widget("net-dhcpv4-start").set_text("")
> self.widget("net-dhcpv4-end").set_text("")
> + self.widget("net-routev4-network").set_text("")
> + self.widget("net-routev4-gateway").set_text("")
> return
>
> # We've got a valid IP
> @@ -260,7 +296,16 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("net-dhcpv4-start").set_sensitive(False)
> self.widget("net-dhcpv4-end").set_sensitive(False)
>
> + if self.get_config_routev4_enable():
> + self.widget("net-routev4-network").set_sensitive(True)
> + self.widget("net-routev4-gateway").set_sensitive(True)
> + else:
> + self.widget("net-routev4-network").set_sensitive(False)
> + self.widget("net-routev4-gateway").set_sensitive(False)
> +
> def change_ipv6_network(self, src):
> + ignore = src
> +
> ip = self.get_config_ip6()
> green = Gdk.Color.parse("#c0ffc0")[1]
> red = Gdk.Color.parse("#ffc0c0")[1]
> @@ -274,12 +319,16 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("net-info-type-ip6").set_text("")
> self.widget("net-dhcpv6-start").set_text("")
> self.widget("net-dhcpv6-end").set_text("")
> + self.widget("net-routev6-network").set_text("")
> + self.widget("net-routev6-gateway").set_text("")
> return
>
> - if ip.prefixlen != 64 or not ip.is_private:
> - src.modify_bg(Gtk.StateType.NORMAL, red)
> - else:
> - src.modify_bg(Gtk.StateType.NORMAL, green)
> + color = green
> + if not ip.is_private:
> + color = red
> + if ip.prefixlen != 64:
> + color = red
> + src.modify_bg(Gtk.StateType.NORMAL, color)
>
> if ip.prefixlen != 64:
> self.widget("net-info-gateway-ip6").set_text("")
> @@ -306,37 +355,135 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("net-dhcpv6-start").set_sensitive(False)
> self.widget("net-dhcpv6-end").set_sensitive(False)
>
> + if self.get_config_routev6_enable():
> + self.widget("net-routev6-network").set_sensitive(True)
> + self.widget("net-routev6-gateway").set_sensitive(True)
> + else:
> + self.widget("net-routev6-network").set_sensitive(False)
> + self.widget("net-routev6-gateway").set_sensitive(False)
> +
> +
> + def change_routev4_enable(self, src):
> + ignore = src
> +
> + white = Gdk.Color.parse("#f0f0f0")[1]
> + ntwk = self.widget("net-routev4-network")
> + gway = self.widget("net-routev4-gateway")
> + ntwk.modify_bg(Gtk.StateType.NORMAL, white)
> + gway.modify_bg(Gtk.StateType.NORMAL, white)
> + ntwk.set_text("")
> + gway.set_text("")
> +
> + if self.get_config_routev4_enable():
> + ntwk.set_sensitive(True)
> + gway.set_sensitive(True)
> + else:
> + ntwk.set_sensitive(False)
> + gway.set_sensitive(False)
> +
> + def get_config_routev4_network(self):
> + if not self.get_config_routev4_enable():
> + return None
> + return self.widget("net-routev4-network").get_text()
> +
> + def get_config_routev4_gateway(self):
> + if not self.get_config_routev4_enable():
> + return None
> + return self.widget("net-routev4-gateway").get_text()
> +
> + def get_route_addr(self, addrStr):
> + if addrStr is None:
> + return None
> + try:
> + addr = ipaddr.IPNetwork(addrStr)
> + except:
> + addr = None
> + return addr
> +
> + def change_routev4_network(self, src):
> + ignore = src
> +
> + ntwk = self.get_config_routev4_network()
> + ipAddr = self.get_config_ip4()
> + black = Gdk.Color.parse("#000000")[1]
> + src.modify_text(Gtk.StateType.NORMAL, black)
> +
> + if ipAddr is None or ntwk is None:
> + white = Gdk.Color.parse("#f0f0f0")[1]
> + src.modify_bg(Gtk.StateType.NORMAL, white)
> + return
> + addr = self.get_route_addr(ntwk)
> + red = Gdk.Color.parse("#ffc0c0")[1]
> + green = Gdk.Color.parse("#c0ffc0")[1]
> + color = green
> + if addr is None:
> + color = red
> + else:
> + if addr.version != 4:
> + color = red
> + if addr.prefixlen > 28:
> + color = red
> + src.modify_bg(Gtk.StateType.NORMAL, color)
> +
> + def change_routev4_gateway(self, src):
> + ignore = src
> +
> + gway = self.get_config_routev4_gateway()
> + ipAddr = self.get_config_ip4()
> + black = Gdk.Color.parse("#000000")[1]
> + src.modify_text(Gtk.StateType.NORMAL, black)
> +
> + if ipAddr is None or gway is None:
> + white = Gdk.Color.parse("#f0f0f0")[1]
> + src.modify_bg(Gtk.StateType.NORMAL, white)
> + return
> + addr = self.get_route_addr(gway)
> + red = Gdk.Color.parse("#ffc0c0")[1]
> + green = Gdk.Color.parse("#c0ffc0")[1]
> + color = green
> + if addr is None:
> + color = red
> + else:
> + if addr.version != 4:
> + color = red
> + if not ipAddr.overlaps(addr):
> + color = red
> + if addr.prefixlen != 32:
> + color = red
> + src.modify_bg(Gtk.StateType.NORMAL, color)
>
> def change_dhcpv4_enable(self, src):
> ignore = src
>
> white = Gdk.Color.parse("#f0f0f0")[1]
> - start4 = self.widget("net-dhcpv4-start")
> - end4 = self.widget("net-dhcpv4-end")
> - start4.modify_bg(Gtk.StateType.NORMAL, white)
> - end4.modify_bg(Gtk.StateType.NORMAL, white)
> - start4.set_text("")
> - end4.set_text("")
> + start = self.widget("net-dhcpv4-start")
> + end = self.widget("net-dhcpv4-end")
> + start.modify_bg(Gtk.StateType.NORMAL, white)
> + end.modify_bg(Gtk.StateType.NORMAL, white)
> + start.set_text("")
> + end.set_text("")
>
> if not self.get_config_dhcpv4_enable():
> - start4.set_sensitive(False)
> - end4.set_sensitive(False)
> + start.set_sensitive(False)
> + end.set_sensitive(False)
> else:
> - start4.set_sensitive(True)
> - end4.set_sensitive(True)
> + start.set_sensitive(True)
> + end.set_sensitive(True)
>
> ip = self.get_config_ip4()
> if ip:
> - start = int(ip.numhosts / 2)
> - end = int(ip.numhosts - 2)
> - start4.set_text(str(ip.network + start))
> - end4.set_text(str(ip.network + end))
> + start.set_text(str(ip.network + int(ip.numhosts / 2)))
> + end.set_text(str(ip.network + int(ip.numhosts - 2)))
>
> def change_dhcpv4_start(self, src):
> + ignore = src
> +
> start = self.get_config_dhcpv4_start()
> self.change_dhcpv4(src, start)
>
> def change_dhcpv4_end(self, src):
> + ignore = src
> +
> end = self.get_config_dhcpv4_end()
> self.change_dhcpv4(src, end)
>
> @@ -344,43 +491,112 @@ class vmmCreateNetwork(vmmGObjectUI):
> ip = self.get_config_ip4()
> black = Gdk.Color.parse("#000000")[1]
> src.modify_text(Gtk.StateType.NORMAL, black)
> - if not ip:
> - return
>
> - if addr is None:
> + if ip is None or addr is None:
> white = Gdk.Color.parse("#f0f0f0")[1]
> src.modify_bg(Gtk.StateType.NORMAL, white)
> - elif not ip.overlaps(addr):
> + return
> + if addr.version != 4 or not ip.overlaps(addr):
> red = Gdk.Color.parse("#ffc0c0")[1]
> src.modify_bg(Gtk.StateType.NORMAL, red)
> else:
> green = Gdk.Color.parse("#c0ffc0")[1]
> src.modify_bg(Gtk.StateType.NORMAL, green)
>
> - def change_dhcpv6_enable(self, src):
> - ignore = src
> + def change_routev6_enable(self, src):
> + white = Gdk.Color.parse("#f0f0f0")[1]
> + ntwk = self.widget("net-routev6-network")
> + gway = self.widget("net-routev6-gateway")
> + ntwk.modify_bg(Gtk.StateType.NORMAL, white)
> + gway.modify_bg(Gtk.StateType.NORMAL, white)
> + ntwk.set_text("")
> + gway.set_text("")
> +
> + if self.get_config_routev6_enable():
> + ntwk.set_sensitive(True)
> + gway.set_sensitive(True)
> + else:
> + ntwk.set_sensitive(False)
> + gway.set_sensitive(False)
> +
> + def get_config_routev6_network(self):
> + if not self.get_config_routev6_enable():
> + return None
> + return self.widget("net-routev6-network").get_text()
>
> + def get_config_routev6_gateway(self):
> + if not self.get_config_routev6_enable():
> + return None
> + return self.widget("net-routev6-gateway").get_text()
> +
> + def change_routev6_network(self, src):
> + ntwk = self.get_config_routev6_network()
> + ip = self.get_config_ip6()
> + black = Gdk.Color.parse("#000000")[1]
> + src.modify_text(Gtk.StateType.NORMAL, black)
> +
> + if ip is None or ntwk is None:
> + white = Gdk.Color.parse("#f0f0f0")[1]
> + src.modify_bg(Gtk.StateType.NORMAL, white)
> + return
> + addr = self.get_route_addr(ntwk)
> + red = Gdk.Color.parse("#ffc0c0")[1]
> + green = Gdk.Color.parse("#c0ffc0")[1]
> + color = green
> + if addr is None:
> + color = red
> + else:
> + if addr.version != 6:
> + color = red
> + if addr.prefixlen > 64:
> + color = red
> + src.modify_bg(Gtk.StateType.NORMAL, color)
> +
> + def change_routev6_gateway(self, src):
> + gway = self.get_config_routev6_gateway()
> + ip = self.get_config_ip6()
> + black = Gdk.Color.parse("#000000")[1]
> + src.modify_text(Gtk.StateType.NORMAL, black)
> +
> + if ip is None or gway is None:
> + white = Gdk.Color.parse("#f0f0f0")[1]
> + src.modify_bg(Gtk.StateType.NORMAL, white)
> + return
> + addr = self.get_route_addr(gway)
> + red = Gdk.Color.parse("#ffc0c0")[1]
> + green = Gdk.Color.parse("#c0ffc0")[1]
> + color = green
> + if addr is None:
> + color = red
> + else:
> + if addr.version != 6:
> + color = red
> + if not ip.overlaps(addr):
> + color = red
> + if addr.prefixlen != 128:
> + color = red
> + src.modify_bg(Gtk.StateType.NORMAL, color)
> +
> + def change_dhcpv6_enable(self, src):
> white = Gdk.Color.parse("#f0f0f0")[1]
> - start6 = self.widget("net-dhcpv6-start")
> - end6 = self.widget("net-dhcpv6-end")
> - start6.modify_bg(Gtk.StateType.NORMAL, white)
> - end6.modify_bg(Gtk.StateType.NORMAL, white)
> - start6.set_text("")
> - end6.set_text("")
> + start = self.widget("net-dhcpv6-start")
> + end = self.widget("net-dhcpv6-end")
> + start.modify_bg(Gtk.StateType.NORMAL, white)
> + end.modify_bg(Gtk.StateType.NORMAL, white)
> + start.set_text("")
> + end.set_text("")
> if not self.get_config_dhcpv6_enable():
> - start6.set_sensitive(False)
> - end6.set_sensitive(False)
> + start.set_sensitive(False)
> + end.set_sensitive(False)
>
> else:
> - start6.set_sensitive(True)
> - end6.set_sensitive(True)
> + start.set_sensitive(True)
> + end.set_sensitive(True)
>
> ip = self.get_config_ip6()
> if ip:
> - start = 256
> - end = 512 - 1
> - start6.set_text(str(ip.network + start))
> - end6.set_text(str(ip.network + end))
> + start.set_text(str(ip.network + 256))
> + end.set_text(str(ip.network + 511))
>
> def change_dhcpv6_start(self, src):
> start = self.get_config_dhcpv6_start()
> @@ -394,13 +610,12 @@ class vmmCreateNetwork(vmmGObjectUI):
> ip = self.get_config_ip6()
> black = Gdk.Color.parse("#000000")[1]
> src.modify_text(Gtk.StateType.NORMAL, black)
> - if not ip:
> - return
>
> - if addr is None:
> + if ip is None or addr is None:
> white = Gdk.Color.parse("#f0f0f0")[1]
> src.modify_bg(Gtk.StateType.NORMAL, white)
> - elif not ip.overlaps(addr):
> + return
> + if addr.version != 6 or not ip.overlaps(addr):
> red = Gdk.Color.parse("#ffc0c0")[1]
> src.modify_bg(Gtk.StateType.NORMAL, red)
> else:
> @@ -451,13 +666,13 @@ class vmmCreateNetwork(vmmGObjectUI):
> return ipaddr.IPNetwork(self.widget("net-dhcpv6-start").get_text())
> except:
> return None
> +
> def get_config_dhcpv6_end(self):
> try:
> return ipaddr.IPNetwork(self.widget("net-dhcpv6-end").get_text())
> except:
> return None
>
> -
> def get_config_forwarding(self):
> if self.widget("net-forward-none").get_active():
> return [None, None]
> @@ -483,6 +698,12 @@ class vmmCreateNetwork(vmmGObjectUI):
> def get_config_dhcpv6_enable(self):
> return self.widget("net-dhcpv6-enable").get_active()
>
> + def get_config_routev4_enable(self):
> + return self.widget("net-routev4-enable").get_active()
> +
> + def get_config_routev6_enable(self):
> + return self.widget("net-routev6-enable").get_active()
> +
> def populate_summary(self):
> self.widget("summary-name").set_text(self.get_config_name())
> self.widget("summary-domain").set_text(self.get_config_domain_name())
> @@ -495,7 +716,7 @@ class vmmCreateNetwork(vmmGObjectUI):
> if ip:
> self.widget("label-ip4-gateway").show()
> self.widget("summary-ip4-gateway").show()
> - self.widget("label-ip4-network").set_text(_("Network:"))
> + self.widget("label-ip4-network").set_text(_("Network Address / prefix:"))
> self.widget("summary-ip4-network").set_text(str(ip))
> self.widget("summary-ip4-gateway").set_text(str(ip.network + 1))
> else:
> @@ -509,7 +730,7 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("summary-dhcp-end").show()
> start = self.get_config_dhcpv4_start()
> end = self.get_config_dhcpv4_end()
> - self.widget("label-dhcp-start").set_text("Start Address:")
> + self.widget("label-dhcp-start").set_text("DHCPv4 Start Address:")
> if start and end:
> self.widget("summary-dhcp-start").set_text(str(start.network))
> self.widget("summary-dhcp-end").set_text(str(end.network))
> @@ -522,6 +743,32 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("label-dhcp-start").set_text(_("DHCPv4 Status:"))
> self.widget("summary-dhcp-start").set_text(_("Disabled"))
>
> + if ip and self.get_config_routev4_enable():
> + self.widget("label-routev4-network").show()
> + self.widget("label-routev4-gateway").show()
> + self.widget("summary-routev4-network").show()
> + self.widget("summary-routev4-gateway").show()
> + self.widget("summary-routev4-network").set_text("")
> + self.widget("summary-routev4-gateway").set_text("")
> + ntwk = self.get_config_routev4_network()
> + try:
> + naddr = ipaddr.IPNetwork(ntwk)
> + except:
> + naddr = None
> + gway = self.get_config_routev4_gateway()
> + try:
> + gaddr = ipaddr.IPNetwork(gway)
> + except:
> + gaddr = None
> + if naddr and gaddr:
> + self.widget("summary-routev4-network").set_text(str(naddr))
> + self.widget("summary-routev4-gateway").set_text(str(gaddr.network))
> + else:
> + self.widget("label-routev4-network").hide()
> + self.widget("label-routev4-gateway").hide()
> + self.widget("summary-routev4-network").hide()
> + self.widget("summary-routev4-gateway").hide()
> +
> forward_txt = ""
> dev, mode = self.get_config_forwarding()
> forward_txt = vmmNetwork.pretty_desc(mode, dev)
> @@ -531,7 +778,7 @@ class vmmCreateNetwork(vmmGObjectUI):
> if ip:
> self.widget("label-ip6-gateway").show()
> self.widget("summary-ip6-gateway").show()
> - self.widget("label-ip6-network").set_text(_("Network:"))
> + self.widget("label-ip6-network").set_text(_("Network Address / prefix:"))
> self.widget("summary-ip6-network").set_text(str(ip))
> self.widget("summary-ip6-gateway").set_text(str(ip.network + 1))
> else:
> @@ -546,7 +793,7 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("summary-dhcpv6-end").show()
> start = self.get_config_dhcpv6_start()
> end = self.get_config_dhcpv6_end()
> - self.widget("label-dhcpv6-start").set_text("Start Address:")
> + self.widget("label-dhcpv6-start").set_text("DHCPv6 Start Address:")
> if start and end:
> self.widget("summary-dhcpv6-start").set_text(str(start.network))
> self.widget("summary-dhcpv6-end").set_text(str(end.network))
> @@ -558,6 +805,34 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("summary-dhcpv6-end").hide()
> self.widget("label-dhcpv6-start").set_text(_("DHCPv6 Status:"))
> self.widget("summary-dhcpv6-start").set_text(_("Disabled"))
> +
> + if ip and self.get_config_routev6_enable():
> + self.widget("label-routev6-network").show()
> + self.widget("label-routev6-gateway").show()
> + self.widget("summary-routev6-network").show()
> + self.widget("summary-routev6-gateway").show()
> + self.widget("summary-routev6-network").set_text("")
> + self.widget("summary-routev6-gateway").set_text("")
> + ntwk = self.get_config_routev6_network()
> + try:
> + naddr = ipaddr.IPNetwork(ntwk)
> + except:
> + naddr = None
> + gway = self.get_config_routev6_gateway()
> + try:
> + gaddr = ipaddr.IPNetwork(gway)
> + except:
> + gaddr = None
> + if naddr and gaddr:
> + self.widget("summary-routev6-network").set_text(str(naddr))
> + self.widget("summary-routev6-gateway").set_text(str(gaddr.network))
> + else:
> + self.widget("label-routev6-network").hide()
> + self.widget("label-routev6-gateway").hide()
> + self.widget("summary-routev6-network").hide()
> + self.widget("summary-routev6-gateway").hide()
> +
> +
> if ip:
> self.widget("summary-ipv6-forwarding").set_text("Routed network")
> else:
> @@ -574,15 +849,14 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("net-ipv4-network").set_sensitive(False)
> self.widget("net-dhcpv4-start").set_sensitive(False)
> self.widget("net-dhcpv4-end").set_sensitive(False)
> - return
> - self.widget("net-ipv4-network").set_sensitive(True)
> + else:
> + self.widget("net-ipv4-network").set_sensitive(True)
>
> if not self.get_config_dhcpv4_enable():
> self.widget("net-dhcpv4-end").set_text("")
> self.widget("net-dhcpv4-start").set_text("")
> self.widget("net-dhcpv4-start").set_sensitive(False)
> self.widget("net-dhcpv4-end").set_sensitive(False)
> - return
> else:
> ip = self.get_config_ip4()
> if ip:
> @@ -603,15 +877,16 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("net-ipv6-network").set_sensitive(False)
> self.widget("net-dhcpv6-start").set_sensitive(False)
> self.widget("net-dhcpv6-end").set_sensitive(False)
> - return
> - self.widget("net-ipv6-network").set_sensitive(True)
> + self.widget("net-routev6-network").set_sensitive(False)
> + self.widget("net-routev6-gateway").set_sensitive(False)
> + else:
> + self.widget("net-ipv6-network").set_sensitive(True)
>
> if not self.get_config_dhcpv6_enable():
> self.widget("net-dhcpv6-end").set_text("")
> self.widget("net-dhcpv6-start").set_text("")
> self.widget("net-dhcpv6-start").set_sensitive(False)
> self.widget("net-dhcpv6-end").set_sensitive(False)
> - return
> else:
> ip = self.get_config_ip6()
> if ip:
> @@ -622,6 +897,21 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.widget("net-dhcpv6-end").set_text(str(ip.network + end))
> self.widget("net-dhcpv6-start").set_sensitive(True)
> self.widget("net-dhcpv6-end").set_sensitive(True)
> + if not self.get_config_routev6_enable():
> + self.widget("net-routev6-network").set_text("")
> + self.widget("net-routev6-gateway").set_text("")
> + self.widget("net-routev6-network").set_sensitive(False)
> + self.widget("net-routev6-gateway").set_sensitive(False)
> + else:
> + self.widget("net-routev6-network").set_text("")
> + self.widget("net-routev6-gateway").set_text("")
> + self.widget("net-routev6-network").set_sensitive(True)
> + self.widget("net-routev6-gateway").set_sensitive(True)
> +
> + def populate_misc(self):
> + name = self.widget("net-name").get_text()
> + if self.widget("net-domain-name").get_text() == "":
> + self.widget("net-domain-name").set_text(name)
>
> def page_changed(self, ignore1, ignore2, page_number):
> if page_number == PAGE_NAME:
> @@ -632,6 +922,8 @@ class vmmCreateNetwork(vmmGObjectUI):
> self.populate_ipv4()
> elif page_number == PAGE_IPV6:
> self.populate_ipv6()
> + elif page_number == PAGE_MISC:
> + self.populate_misc()
> elif page_number == PAGE_SUMMARY:
> self.populate_summary()
>
> @@ -698,6 +990,39 @@ class vmmCreateNetwork(vmmGObjectUI):
> xml += " </dhcp>\n"
> xml += " </ip>\n"
>
> + ntwk = self.get_config_routev4_network()
> + try:
> + netaddr = ipaddr.IPNetwork(ntwk)
> + except:
> + netaddr = None
> + gway = self.get_config_routev4_gateway()
> + try:
> + gwaddr = ipaddr.IPNetwork(gway)
> + except:
> + gwaddr = None
> + if netaddr and gwaddr:
> + xml += "<route family='ipv4'"
> + xml += " address='%s'" % netaddr.network
> + xml += " prefix='%s'" % netaddr.prefixlen
> + xml += " gateway='%s' />" % gwaddr.network
> +
> + ntwk = self.get_config_routev6_network()
> + try:
> + netaddr = ipaddr.IPNetwork(ntwk)
> + except:
> + netaddr = None
> + gway = self.get_config_routev6_gateway()
> + try:
> + gwaddr = ipaddr.IPNetwork(gway)
> + except:
> + gwaddr = None
> + if netaddr and gwaddr:
> + xml += "<route family='ipv6'"
> + xml += " address='%s'" % netaddr.network
> + xml += " prefix='%s'" % netaddr.prefixlen
> + xml += " gateway='%s' />" % gwaddr.network
> +
> +
> xml += "</network>\n"
>
> logging.debug("Generated network XML:\n" + xml)
> @@ -753,21 +1078,56 @@ class vmmCreateNetwork(vmmGObjectUI):
> if enabled:
> start = self.get_config_dhcpv4_start()
> end = self.get_config_dhcpv4_end()
> - if enabled and start is None:
> + if start is None:
> return self.err.val_err(_("Invalid DHCP Address"),
> _("The DHCP start address could not be understood"))
> - if enabled and end is None:
> + if end is None:
> return self.err.val_err(_("Invalid DHCP Address"),
> _("The DHCP end address could not be understood"))
> - if enabled and not ip.overlaps(start):
> + if not ip.overlaps(start):
> return self.err.val_err(_("Invalid DHCP Address"),
> (_("The DHCP start address is not with the network %s") %
> (str(ip))))
> - if enabled and not ip.overlaps(end):
> + if not ip.overlaps(end):
> return self.err.val_err(_("Invalid DHCP Address"),
> (_("The DHCP end address is not with the network %s") %
> (str(ip))))
>
> + enabled = self.get_config_routev4_enable()
> + if enabled:
> + ntwk = self.get_config_routev4_network()
> + ntwkbad = False
> + gway = self.get_config_routev4_gateway()
> + gwaybad = False
> + if ntwk is None or gway is None:
> + return True
> + if ntwk == "" and gway == "":
> + return True
> + naddr = self.get_route_addr(ntwk)
> + if naddr is None:
> + ntwkbad = True
> + else:
> + if naddr.version != 4:
> + ntwkbad = True
> + if naddr.prefixlen > 28:
> + ntwkbad = True
> + gaddr = self.get_route_addr(gway)
> + if gaddr is None:
> + gwaybad = True
> + else:
> + if gaddr.version != 4:
> + gwaybad = True
> + if gaddr.prefixlen != 32:
> + gwaybad = True
> + if not ip.overlaps(gaddr):
> + gwaybad = True
> + if ntwkbad:
> + return self.err.val_err(_("Invalid static route"),
> + _("The network address is incorrect."))
> + if gwaybad:
> + return self.err.val_err(_("Invalid static route"),
> + _("The gateway address is incorrect."))
> +
> return True
>
> def validate_ipv6(self):
> @@ -812,6 +1172,41 @@ class vmmCreateNetwork(vmmGObjectUI):
> (_("The DHCPv6 end address is not with the network %s") %
> (str(ip))))
>
> + enabled = self.get_config_routev6_enable()
> + if enabled:
> + ntwk = self.get_config_routev6_network()
> + ntwkbad = False
> + gway = self.get_config_routev6_gateway()
> + gwaybad = False
> + if ntwk is None or gway is None:
> + return True
> + if ntwk == "" and gway == "":
> + return True
> + naddr = self.get_route_addr(ntwk)
> + if naddr is None:
> + ntwkbad = True
> + else:
> + if naddr.version != 6:
> + ntwkbad = True
> + if naddr.prefixlen > 64:
> + ntwkbad = True
> + gaddr = self.get_route_addr(gway)
> + if gaddr is None:
> + gwaybad = True
> + else:
> + if gaddr.version != 6:
> + gwaybad = True
> + if gaddr.prefixlen != 128:
> + gwaybad = True
> + if not ip.overlaps(gaddr):
> + gwaybad = True
> + if ntwkbad:
> + return self.err.val_err(_("Invalid static route"),
> + _("The network address is incorrect."))
> + if gwaybad:
> + return self.err.val_err(_("Invalid static route"),
> + _("The gateway address is incorrect."))
> +
> return True
>
> def validate_miscellaneous(self):
> diff --git a/virtManager/host.py b/virtManager/host.py
> index 100ac8d..6d3ca88 100644
> --- a/virtManager/host.py
> +++ b/virtManager/host.py
> @@ -575,7 +575,7 @@ class vmmHost(vmmGObjectUI):
> self.widget("net-ip4-dhcp-start").set_text(start)
> self.widget("net-ip4-dhcp-end").set_text(end)
> if route and route[0] and route[1]:
> - routeVia = str(route[0]) + " via " + str(route[1])
> + routeVia = str(route[0]) + ", gateway=" + str(route[1])
> self.widget("net-ip4-route-label").show()
> else:
> routeVia = _("")
> @@ -605,7 +605,7 @@ class vmmHost(vmmGObjectUI):
> iconsize = Gtk.IconSize.MENU
> icon = Gtk.STOCK_DISCONNECT
> self.widget("net-ip6-forwarding-icon").set_from_stock(icon, iconsize)
> - ipv6 = net.get_ipv6_route()
> + ipv6 = net.get_ipv6_routing()
> if ipv6:
> self.widget("net-ip6-forwarding").set_text(
> _("Isolated network, internal and host routing only"))
> @@ -622,7 +622,7 @@ class vmmHost(vmmGObjectUI):
> self.widget("net-ip6-dhcp-start").set_text(start)
> self.widget("net-ip6-dhcp-end").set_text(end)
> if route and route[0] and route[1]:
> - routeVia = str(route[0]) + " via " + str(route[1])
> + routeVia = str(route[0]) + ", gateway=" + str(route[1])
> self.widget("net-ip6-route-label").show()
> else:
> routeVia = ""
> @@ -1081,7 +1081,7 @@ class vmmHost(vmmGObjectUI):
> str(e))
> return
>
> - # This will require an interface restart
> + # XXX: This will require an interface restart
> self.widget("interface-apply").set_sensitive(False)
>
> def interface_startmode_changed(self, src_ignore):
> diff --git a/virtManager/network.py b/virtManager/network.py
> index d76e0be..60ddcb8 100644
> --- a/virtManager/network.py
> +++ b/virtManager/network.py
> @@ -17,6 +17,7 @@
> # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
> # MA 02110-1301 USA.
> #
> +import logging
>
> from virtManager import util
> import ipaddr
> @@ -97,14 +98,47 @@ class vmmNetwork(vmmLibvirtObject):
> def get_autostart(self):
> return self.net.autostart()
>
> + def get_ipv4_static_route(self):
> + doc = None
> + ret = None
> + routeAddr = None
> + routeVia = None
> + xml = self.get_xml()
> + doc = libxml2.parseDoc(xml)
> + nodes = doc.xpathEval('//route')
> + for node in nodes:
> + family = node.xpathEval('string(./@family)')
> + if not family or family == 'ipv4':
> + addrStr = node.xpathEval('string(./@address)')
> + netmaskStr = node.xpathEval('string(./@netmask)')
> + gatewayStr = node.xpathEval('string(./@gateway)')
> + prefix = node.xpathEval('string(./@prefix)')
> + if prefix:
> + prefix = int(prefix)
> + routeAddr = str(ipaddr.IPNetwork(str(addrStr) + "/" + str(prefix)).masked())
> + elif netmaskStr:
> + netmask = ipaddr.IPAddress(netmaskStr)
> + network = ipaddr.IPAddress(addrStr)
> + routeAddr = str(ipaddr.IPNetwork(str(network) + "/" + str(netmask)).masked())
> + else:
> + routeAddr = str(ipaddr.IPNetwork(str(addrStr)))
> + routeVia = str(ipaddr.IPAddress(str(gatewayStr)))
> + break
> +
> + if doc:
> + doc.freeDoc()
> + if routeAddr and routeVia:
> + ret = [routeAddr, routeVia]
> + else:
> + ret = None
> + return ret
> +
> def get_ipv4_network(self):
> doc = None
> ret = None
> goodNode = None
> dhcpstart = None
> dhcpend = None
> - routeAddr = None
> - routeVia = None
> xml = self.get_xml()
> doc = libxml2.parseDoc(xml)
> nodes = doc.xpathEval('//ip')
> @@ -118,21 +152,10 @@ class vmmNetwork(vmmLibvirtObject):
> goodNode = node
> break
>
> - for node in nodes:
> - family = node.xpathEval('string(./@family)')
> - if not family or family == 'ipv4':
> - routeVia = node.xpathEval('string(./@via)')
> - if routeVia:
> - routeAddr = node.xpathEval('string(./@address)')
> - break
> -
> if goodNode is None:
> for node in nodes:
> family = node.xpathEval('string(./@family)')
> if not family or family == 'ipv4':
> - tmp = node.xpathEval('string(./@via)')
> - if tmp:
> - continue
> goodNode = node
> break
>
> @@ -155,11 +178,38 @@ class vmmNetwork(vmmLibvirtObject):
> dhcp = [str(ipaddr.IPAddress(dhcpstart)), str(ipaddr.IPAddress(dhcpend))]
> else:
> dhcp = None
> + route = self.get_ipv4_static_route()
> + return [ret, dhcp, route]
> +
> + def get_ipv6_static_route(self):
> + doc = None
> + ret = None
> + routeAddr = None
> + routeVia = None
> + xml = self.get_xml()
> + doc = libxml2.parseDoc(xml)
> + nodes = doc.xpathEval('//route')
> + for node in nodes:
> + family = node.xpathEval('string(./@family)')
> + if family and family == 'ipv6':
> + addrStr = node.xpathEval('string(./@address)')
> + prefix = node.xpathEval('string(./@prefix)')
> + gatewayStr = node.xpathEval('string(./@gateway)')
> + if prefix:
> + prefix = int(prefix)
> + routeAddr = str(ipaddr.IPNetwork(str(addrStr) + "/" + str(prefix)).masked())
> + else:
> + routeAddr = str(ipaddr.IPNetwork(str(addrStr)))
> + routeVia = str(ipaddr.IPAddress(str(gatewayStr)))
> + break
> +
> + if doc:
> + doc.freeDoc()
> if routeAddr and routeVia:
> - route = [str(ipaddr.IPAddress(routeAddr)), str(ipaddr.IPAddress(routeVia))]
> + ret = [routeAddr, routeVia]
> else:
> - route = None
> - return [ret, dhcp, route]
> + ret = None
> + return ret
>
> def get_ipv6_network(self):
> doc = None
> @@ -167,8 +217,6 @@ class vmmNetwork(vmmLibvirtObject):
> goodNode = None
> dhcpstart = None
> dhcpend = None
> - routeAddr = None
> - routeVia = None
> xml = self.get_xml()
> doc = libxml2.parseDoc(xml)
> nodes = doc.xpathEval('//ip')
> @@ -182,21 +230,10 @@ class vmmNetwork(vmmLibvirtObject):
> goodNode = node
> break
>
> - for node in nodes:
> - family = node.xpathEval('string(./@family)')
> - if family and family == 'ipv6':
> - routeVia = node.xpathEval('string(./@via)')
> - if routeVia:
> - routeAddr = node.xpathEval('string(./@address)')
> - break
> -
> if goodNode is None:
> for node in nodes:
> family = node.xpathEval('string(./@family)')
> if family and family == 'ipv6':
> - tmp = node.xpathEval('string(./@via)')
> - if tmp:
> - continue
> goodNode = node
> break
>
> @@ -214,10 +251,7 @@ class vmmNetwork(vmmLibvirtObject):
> dhcp = [str(ipaddr.IPAddress(dhcpstart)), str(ipaddr.IPAddress(dhcpend))]
> else:
> dhcp = None
> - if routeAddr and routeVia:
> - route = [str(ipaddr.IPAddress(routeAddr)), str(ipaddr.IPAddress(routeVia))]
> - else:
> - route = None
> + route = self.get_ipv6_static_route()
> return [ret, dhcp, route]
>
> def get_name_domain(self):
> @@ -225,10 +259,10 @@ class vmmNetwork(vmmLibvirtObject):
> name_domain = util.xpath(xml, "/network/domain/@name")
> return name_domain
>
> - def get_ipv6_route(self):
> + def get_ipv6_routing(self):
> xml = self.get_xml()
> - ipv6_route = util.xpath(xml, "/network/@ipv6")
> - return ipv6_route
> + ipv6_routing = util.xpath(xml, "/network/@ipv6")
> + return ipv6_routing
>
> def get_ipv4_forward(self):
> xml = self.get_xml()
>
>
>
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list
>
More information about the virt-tools-list
mailing list