mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-26 21:57:33 +03:00
We should only copy the inactive protocol XML, which lists things like dhcp, vs the running XML, which is the same format as static addressing.
162 lines
4.4 KiB
Python
162 lines
4.4 KiB
Python
#
|
|
# Copyright (C) 2009, 2013 Red Hat, Inc.
|
|
# Copyright (C) 2009 Cole Robinson <crobinso@redhat.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
# MA 02110-1301 USA.
|
|
#
|
|
|
|
from virtinst import Interface
|
|
|
|
from .libvirtobject import vmmLibvirtObject
|
|
|
|
|
|
class vmmInterface(vmmLibvirtObject):
|
|
def __init__(self, conn, backend, key):
|
|
vmmLibvirtObject.__init__(self, conn, backend, key, Interface)
|
|
|
|
self._active = True
|
|
|
|
(self._inactive_xml_flags,
|
|
self._active_xml_flags) = self.conn.get_interface_flags(self._backend)
|
|
|
|
self._support_isactive = None
|
|
|
|
self.tick()
|
|
|
|
# Routines from vmmLibvirtObject
|
|
def _XMLDesc(self, flags):
|
|
return self._backend.XMLDesc(flags)
|
|
def _define(self, xml):
|
|
return self.conn.define_interface(xml)
|
|
|
|
def set_active(self, state):
|
|
if state == self._active:
|
|
return
|
|
|
|
self.idle_emit(state and "started" or "stopped")
|
|
self._active = state
|
|
self.refresh_xml()
|
|
|
|
def _backend_get_active(self):
|
|
ret = True
|
|
if self._support_isactive is None:
|
|
self._support_isactive = self.conn.check_support(
|
|
self.conn.SUPPORT_INTERFACE_ISACTIVE, self._backend)
|
|
|
|
if not self._support_isactive:
|
|
return True
|
|
return bool(self._backend.isActive())
|
|
|
|
def tick(self):
|
|
self.set_active(self._backend_get_active())
|
|
|
|
def is_active(self):
|
|
return self._active
|
|
|
|
def get_mac(self):
|
|
return self.get_xmlobj().macaddr
|
|
|
|
def _kick_conn(self):
|
|
self.conn.schedule_priority_tick(polliface=True)
|
|
|
|
def start(self):
|
|
self._backend.create(0)
|
|
self.idle_add(self.refresh_xml)
|
|
self._kick_conn()
|
|
|
|
def stop(self):
|
|
self._backend.destroy(0)
|
|
self.idle_add(self.refresh_xml)
|
|
self._kick_conn()
|
|
|
|
def delete(self, force=True):
|
|
ignore = force
|
|
self._backend.undefine()
|
|
self._kick_conn()
|
|
|
|
def is_bridge(self):
|
|
typ = self.get_type()
|
|
return typ == "bridge"
|
|
|
|
def get_type(self):
|
|
return self.get_xmlobj().type
|
|
|
|
def get_pretty_type(self):
|
|
itype = self.get_type()
|
|
|
|
if itype == Interface.INTERFACE_TYPE_VLAN:
|
|
return "VLAN"
|
|
elif itype:
|
|
return str(itype).capitalize()
|
|
else:
|
|
return "Interface"
|
|
|
|
def get_startmode(self):
|
|
return self.get_xmlobj().start_mode or "none"
|
|
|
|
def set_startmode(self, newmode):
|
|
def change(obj):
|
|
obj.start_mode = newmode
|
|
self._redefine(change)
|
|
self.redefine_cached()
|
|
|
|
def get_slaves(self):
|
|
return [[obj.name, obj.type or "Unknown"] for obj in
|
|
self.get_xmlobj().interfaces]
|
|
|
|
def get_slave_names(self):
|
|
# Returns a list of names of all enslaved interfaces
|
|
return [x[0] for x in self.get_slaves()]
|
|
|
|
def _get_ip(self, iptype):
|
|
obj = self.get_xmlobj()
|
|
found = None
|
|
for protocol in obj.protocols:
|
|
if protocol.family == iptype:
|
|
found = protocol
|
|
break
|
|
if not found:
|
|
return None, []
|
|
|
|
ret = []
|
|
for ip in found.ips:
|
|
ipstr = ip.address
|
|
if not ipstr:
|
|
continue
|
|
if ip.prefix:
|
|
ipstr += "/%s" % ip.prefix
|
|
ret.append(ipstr)
|
|
return found, ret
|
|
|
|
def get_ipv4(self):
|
|
proto, ips = self._get_ip("ipv4")
|
|
if proto is None:
|
|
return []
|
|
|
|
ipstr = None
|
|
if ips:
|
|
ipstr = ips[0]
|
|
return [proto.dhcp, ipstr]
|
|
|
|
def get_ipv6(self):
|
|
proto, ips = self._get_ip("ipv6")
|
|
if proto is None:
|
|
return []
|
|
return [proto.dhcp, proto.autoconf, ips]
|
|
|
|
def get_protocol_xml(self, inactive=False):
|
|
return self.get_xmlobj(inactive=inactive).protocols[:]
|