qubes/vm/net: allow setting custom IP

Fixes QubesOS/qubes-issues#1477
This commit is contained in:
Marek Marczykowski-Górecki 2016-10-31 03:04:13 +01:00
parent 4585f2b503
commit b8145595a9
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724

View File

@ -45,6 +45,25 @@ def _setter_mac(self, prop, value):
return value return value
def _default_ip(self):
if not self.is_networked():
return None
if self.netvm is not None:
return self.netvm.get_ip_for_vm(self) # pylint: disable=no-member
else:
return self.get_ip_for_vm(self)
def _setter_ip(self, prop, value):
# pylint: disable=unused-argument
if not isinstance(value, basestring):
raise ValueError('IP address must be a string')
value = value.lower()
if re.match(r"^([0-9]{1,3}.){3}[0-9]{1,3}$", value) is None:
raise ValueError('Invalid IP address value')
return value
class NetVMMixin(qubes.events.Emitter): class NetVMMixin(qubes.events.Emitter):
''' Mixin containing network functionality ''' ''' Mixin containing network functionality '''
mac = qubes.property('mac', type=str, mac = qubes.property('mac', type=str,
@ -53,6 +72,12 @@ class NetVMMixin(qubes.events.Emitter):
ls_width=17, ls_width=17,
doc='MAC address of the NIC emulated inside VM') doc='MAC address of the NIC emulated inside VM')
ip = qubes.property('ip', type=str,
default=_default_ip,
setter=_setter_ip,
ls_width=15,
doc='IP address of this domain.')
# CORE2: swallowed uses_default_netvm # CORE2: swallowed uses_default_netvm
netvm = qubes.VMProperty('netvm', load_stage=4, allow_none=True, netvm = qubes.VMProperty('netvm', load_stage=4, allow_none=True,
default=(lambda self: self.app.default_fw_netvm if self.provides_network default=(lambda self: self.app.default_fw_netvm if self.provides_network
@ -74,16 +99,6 @@ class NetVMMixin(qubes.events.Emitter):
# used in networked appvms or proxyvms (netvm is not None) # used in networked appvms or proxyvms (netvm is not None)
# #
@qubes.tools.qvm_ls.column(width=15)
@property
def ip(self):
'''IP address of this domain.'''
if not self.is_networked():
return None
if self.netvm is not None:
return self.netvm.get_ip_for_vm(self) # pylint: disable=no-member
else:
return self.get_ip_for_vm(self)
@qubes.tools.qvm_ls.column(width=15) @qubes.tools.qvm_ls.column(width=15)
@property @property