Skip to content

Commit ddcab75

Browse files
author
3np
committed
Merge branch '1cho1ce/add-ipv6-dns' into master
* add-ipv6-dns: Add Virtual DNS for IPv6
2 parents 929dce2 + ced192c commit ddcab75

4 files changed

Lines changed: 79 additions & 2 deletions

File tree

qubes/tests/api_admin.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,24 +341,50 @@ def test_027_vm_property_get_all(self):
341341
self.assertEqual(value, expected)
342342

343343
def test_028_vm_property_get_list(self):
344+
self.vm.features["ipv6"] = "1"
344345
self.vm.provides_network = True
345346
value = self.call_mgmt_func(
346347
b"admin.vm.property.Get", b"test-vm1", b"dns"
347348
)
348349
self.assertEqual(value, "default=True type=str 10.139.1.1 10.139.1.2")
350+
value = self.call_mgmt_func(
351+
b"admin.vm.property.Get", b"test-vm1", b"dns6"
352+
)
353+
self.assertEqual(value, "default=True type=str ")
354+
self.vm.features["supported-feature.ipv6dns"] = "1"
355+
value = self.call_mgmt_func(
356+
b"admin.vm.property.Get", b"test-vm1", b"dns6"
357+
)
358+
self.assertEqual(value, "default=True type=str fd09:24ef:4179::a8b:1 fd09:24ef:4179::a8b:2")
349359

350360
def test_029_vm_property_get_list_none(self):
361+
self.vm.features["ipv6"] = "1"
351362
value = self.call_mgmt_func(
352-
b"admin.vm.property.Get", b"test-vm1", b"dns"
363+
b"admin.vm.property.Get", b"test-vm1", b"dns6"
364+
)
365+
self.assertEqual(value, "default=True type=str ")
366+
self.vm.features["supported-feature.ipv6dns"] = "1"
367+
value = self.call_mgmt_func(
368+
b"admin.vm.property.Get", b"test-vm1", b"dns6"
353369
)
354370
self.assertEqual(value, "default=True type=str ")
355371

356372
def test_029_vm_property_get_list_default(self):
373+
self.vm.features["ipv6"] = "1"
357374
self.vm.provides_network = True
358375
value = self.call_mgmt_func(
359376
b"admin.vm.property.GetDefault", b"test-vm1", b"dns"
360377
)
361378
self.assertEqual(value, "type=str 10.139.1.1 10.139.1.2")
379+
value = self.call_mgmt_func(
380+
b"admin.vm.property.Get", b"test-vm1", b"dns6"
381+
)
382+
self.assertEqual(value, "type=str ")
383+
self.vm.features["supported-feature.ipv6dns"] = "1"
384+
value = self.call_mgmt_func(
385+
b"admin.vm.property.Get", b"test-vm1", b"dns6"
386+
)
387+
self.assertEqual(value, "type=str fd09:24ef:4179::a8b:1 fd09:24ef:4179::a8b:2")
362388

363389
def test_030_vm_property_set_vm(self):
364390
netvm = self.app.add_new_vm(

qubes/tests/vm/qubesvm.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2498,19 +2498,32 @@ def test_621_qdb_vm_with_network(
24982498
vm.create_qdb_entries()
24992499
self.assertEqual(test_qubesdb.data, expected)
25002500

2501+
test_qubesdb.data.clear()
2502+
with self.subTest("ipv6_dns"):
2503+
template.features["supported-feature.ipv6dns"] = "1"
2504+
netvm.features["ipv6"] = True
2505+
expected["/qubes-primary-dns6"] = "fd09:24ef:4179::a8b:1"
2506+
expected["/qubes-secondary-dns6"] = "fd09:24ef:4179::a8b:2"
2507+
vm.create_qdb_entries()
2508+
self.assertEqual(test_qubesdb.data, expected)
2509+
25012510
test_qubesdb.data.clear()
25022511
with self.subTest("ipv6_just_appvm"):
2512+
template.features["supported-feature.ipv6dns"] = "1"
25032513
del netvm.features["ipv6"]
25042514
vm.features["ipv6"] = True
25052515
expected["/qubes-ip6"] = (
25062516
qubes.config.qubes_ipv6_prefix.replace(":0000", "") + "::a89:3"
25072517
)
25082518
del expected["/qubes-gateway6"]
2519+
del expected["/qubes-primary-dns6"]
2520+
del expected["/qubes-secondary-dns6"]
25092521
vm.create_qdb_entries()
25102522
self.assertEqual(test_qubesdb.data, expected)
25112523

25122524
test_qubesdb.data.clear()
25132525
with self.subTest("proxy_ipv4"):
2526+
del template.features["supported-feature.ipv6dns"]
25142527
del vm.features["ipv6"]
25152528
expected["/name"] = "test-inst-netvm"
25162529
expected["/qubes-vm-type"] = "NetVM"
@@ -2563,6 +2576,19 @@ def test_621_qdb_vm_with_network(
25632576
netvm.create_qdb_entries()
25642577
self.assertEqual(test_qubesdb.data, expected)
25652578

2579+
test_qubesdb.data.clear()
2580+
with self.subTest("proxy_ipv6_dns"):
2581+
template.features["supported-feature.ipv6dns"] = "1"
2582+
netvm.features["ipv6"] = True
2583+
expected["/qubes-netvm-primary-dns6"] = "fd09:24ef:4179::a8b:1"
2584+
expected["/qubes-netvm-secondary-dns6"] = "fd09:24ef:4179::a8b:2"
2585+
2586+
with unittest.mock.patch(
2587+
"qubes.vm.qubesvm.QubesVM.is_running", lambda _: True
2588+
):
2589+
netvm.create_qdb_entries()
2590+
self.assertEqual(test_qubesdb.data, expected)
2591+
25662592
@unittest.mock.patch("qubes.utils.get_timezone")
25672593
@unittest.mock.patch("qubes.utils.urandom")
25682594
@unittest.mock.patch("qubes.vm.qubesvm.QubesVM.untrusted_qdb")

qubes/vm/mix/net.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,19 @@ def dns(self):
282282

283283
return None
284284

285+
@qubes.stateless_property
286+
def dns6(self):
287+
'''IPv6 DNS servers set up for this domain.'''
288+
if self.features.check_with_netvm('ipv6', False) and \
289+
self.features.check_with_template("supported-feature.ipv6dns", \
290+
False) and (self.netvm is not None or self.provides_network):
291+
return StrSerializableTuple((
292+
'fd09:24ef:4179::a8b:1',
293+
'fd09:24ef:4179::a8b:2',
294+
))
295+
296+
return None
297+
285298
def __init__(self, *args, **kwargs):
286299
self._firewall = None
287300
super().__init__(*args, **kwargs)
@@ -562,7 +575,7 @@ def on_property_set_ip(self, _event, name, newvalue=None, oldvalue=None):
562575
"property-reset:visible_gateway", name="visible_gateway"
563576
)
564577

565-
@qubes.events.handler("property-set:ip6", "property-reset:ipv6")
578+
@qubes.events.handler("property-set:ip6", "property-reset:ip6")
566579
def on_property_set_ip6(self, _event, name, newvalue=None, oldvalue=None):
567580
# pylint: disable=unused-argument
568581
if newvalue == oldvalue:

qubes/vm/qubesvm.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2790,6 +2790,11 @@ def create_qdb_entries(self):
27902790

27912791
for i, addr in zip(("primary", "secondary"), self.dns):
27922792
self.untrusted_qdb.write("/qubes-netvm-{}-dns".format(i), addr)
2793+
if self.dns6: # pylint: disable=using-constant-test
2794+
for i, addr in zip(("primary", "secondary"), self.dns6):
2795+
self.untrusted_qdb.write(
2796+
"/qubes-netvm-{}-dns6".format(i), str(addr)
2797+
)
27932798

27942799
if self.netvm is not None:
27952800
self.untrusted_qdb.write("/qubes-mac", str(self.mac))
@@ -2810,6 +2815,13 @@ def create_qdb_entries(self):
28102815
self.untrusted_qdb.write(
28112816
"/qubes-gateway6", str(self.visible_gateway6)
28122817
)
2818+
if (self.dns6
2819+
and self.netvm.features.check_with_netvm("ipv6", False)
2820+
):
2821+
for i, addr in zip(("primary", "secondary"), self.dns6):
2822+
self.untrusted_qdb.write(
2823+
"/qubes-{}-dns6".format(i), str(addr)
2824+
)
28132825

28142826
tzname = qubes.utils.get_timezone()
28152827
if tzname and not self.features.check_with_template(

0 commit comments

Comments
 (0)