[virt-tools-list] [virt-manager PATCH 2/2] createinterface: check ip address format

Cole Robinson crobinso at redhat.com
Sat Mar 29 16:01:51 UTC 2014


On 03/28/2014 02:57 AM, Chen Hanxiao wrote:
> This patch will use socket module to check
> whether an ip address is valid or not.
> 
> Signed-off-by: Chen Hanxiao <chenhanxiao at cn.fujitsu.com>
> ---
>  virtManager/createinterface.py | 26 +++++++++++++++++++++++---
>  1 file changed, 23 insertions(+), 3 deletions(-)
> 
> diff --git a/virtManager/createinterface.py b/virtManager/createinterface.py
> index 4588bba..ac83291 100644
> --- a/virtManager/createinterface.py
> +++ b/virtManager/createinterface.py
> @@ -24,6 +24,7 @@ from gi.repository import Gdk
>  # pylint: enable=E0611
>  
>  import logging
> +import socket
>  
>  from virtinst import Interface, InterfaceProtocol
>  
> @@ -762,7 +763,23 @@ class vmmCreateInterface(vmmGObjectUI):
>          return self.build_ip_info()
>  
>      def build_ip_info(self):
> -        def build_ip(addr_str):
> +        def ipFormatCheck(addr, version):
> +            if version == "IPv4":
> +                try:
> +                    socket.inet_pton(socket.AF_INET, addr)
> +                except socket.error:
> +                    return False
> +                else:
> +                    return True
> +            if version == "IPv6":
> +                try:
> +                    socket.inet_pton(socket.AF_INET6, addr)
> +                except socket.error:
> +                    return False
> +                else:
> +                    return True
> +
> +        def build_ip(addr_str, version):
>              if not addr_str:
>                  raise ValueError(_("Please enter an IP address"))
>              ret = addr_str.rsplit("/", 1)
> @@ -770,6 +787,9 @@ class vmmCreateInterface(vmmGObjectUI):
>              prefix = None
>              if len(ret) > 1:
>                  prefix = ret[1]
> +
> +            if not ipFormatCheck(address, version):
> +                raise ValueError(_("Bad IP address: '%s'") % address)
>              return address, prefix
>  
>          is_manual = self.widget("ip-do-manual").get_active()
> @@ -803,7 +823,7 @@ class vmmCreateInterface(vmmGObjectUI):
>                  ipv4.family = "ipv4"
>                  ipv4.dhcp = bool(v4_mode == IP_DHCP)
>                  if not ipv4.dhcp:
> -                    addr, prefix = build_ip(v4_addr)
> +                    addr, prefix = build_ip(v4_addr, "IPv4")
>                      if addr:
>                          ipv4.add_ip(addr, prefix)
>                      if v4_gate:
> @@ -819,7 +839,7 @@ class vmmCreateInterface(vmmGObjectUI):
>                      if v6_gate:
>                          ipv6.gateway = v6_gate
>                      for v6_addr in v6_addrlist:
> -                        addr, prefix = build_ip(v6_addr)
> +                        addr, prefix = build_ip(v6_addr, "IPv6")
>                          if addr:
>                              ipv6.add_ip(addr, prefix)
>  
> 

We use python-ipaddr for the virtual network code, which makes validating an
IP address a oneline I think. And this validation should actually be in
virtinst/interface.py, if it fits there.

- Cole




More information about the virt-tools-list mailing list