Merge pull request #4701 from martinpitt/networkd-polkit
hostnamed: allow networkd to set the transient hostname
This commit is contained in:
+52
-4
@@ -37,6 +37,7 @@ import unittest
|
||||
import tempfile
|
||||
import subprocess
|
||||
import shutil
|
||||
import socket
|
||||
|
||||
networkd_active = subprocess.call(['systemctl', 'is-active', '--quiet',
|
||||
'systemd-networkd']) == 0
|
||||
@@ -77,6 +78,8 @@ class ClientTestBase:
|
||||
def tearDown(self):
|
||||
self.shutdown_iface()
|
||||
subprocess.call(['systemctl', 'stop', 'systemd-networkd'])
|
||||
subprocess.call(['ip', 'link', 'del', 'dummy0'],
|
||||
stderr=subprocess.DEVNULL)
|
||||
|
||||
def writeConfig(self, fname, contents):
|
||||
os.makedirs(os.path.dirname(fname), exist_ok=True)
|
||||
@@ -121,10 +124,13 @@ DHCP=%s
|
||||
# create interface first, then start networkd
|
||||
self.create_iface(ipv6=ipv6)
|
||||
subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
|
||||
else:
|
||||
elif coldplug is not None:
|
||||
# start networkd first, then create interface
|
||||
subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
|
||||
self.create_iface(ipv6=ipv6)
|
||||
else:
|
||||
# "None" means test sets up interface by itself
|
||||
subprocess.check_call(['systemctl', 'start', 'systemd-networkd'])
|
||||
|
||||
try:
|
||||
subprocess.check_call([self.networkd_wait_online, '--interface',
|
||||
@@ -194,7 +200,7 @@ DHCP=%s
|
||||
else:
|
||||
self.fail('nameserver 192.168.5.1 not found in ' + RESOLV_CONF)
|
||||
|
||||
if not coldplug:
|
||||
if coldplug is False:
|
||||
# check post-down.d hook
|
||||
self.shutdown_iface()
|
||||
|
||||
@@ -291,13 +297,15 @@ class DnsmasqClientTest(ClientTestBase, unittest.TestCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.dnsmasq = None
|
||||
self.iface_mac = 'de:ad:be:ef:47:11'
|
||||
|
||||
def create_iface(self, ipv6=False, dnsmasq_opts=None):
|
||||
'''Create test interface with DHCP server behind it'''
|
||||
|
||||
# add veth pair
|
||||
subprocess.check_call(['ip', 'link', 'add', 'name', self.iface, 'type',
|
||||
'veth', 'peer', 'name', self.if_router])
|
||||
subprocess.check_call(['ip', 'link', 'add', 'name', self.iface,
|
||||
'address', self.iface_mac,
|
||||
'type', 'veth', 'peer', 'name', self.if_router])
|
||||
|
||||
# give our router an IP
|
||||
subprocess.check_call(['ip', 'a', 'flush', 'dev', self.if_router])
|
||||
@@ -413,6 +421,46 @@ Domains= ~company ~lab''')
|
||||
self.assertRegex(general_log, 'query.*megasearch.net')
|
||||
self.assertNotIn('megasearch.net', vpn_log)
|
||||
|
||||
def test_transient_hostname(self):
|
||||
'''networkd sets transient hostname from DHCP'''
|
||||
|
||||
orig_hostname = socket.gethostname()
|
||||
self.addCleanup(socket.sethostname, orig_hostname)
|
||||
# temporarily move /etc/hostname away; restart hostnamed to pick it up
|
||||
if os.path.exists('/etc/hostname'):
|
||||
subprocess.check_call(['mount', '--bind', '/dev/null', '/etc/hostname'])
|
||||
self.addCleanup(subprocess.call, ['umount', '/etc/hostname'])
|
||||
subprocess.check_call(['systemctl', 'stop', 'systemd-hostnamed.service'])
|
||||
|
||||
self.create_iface(dnsmasq_opts=['--dhcp-host=%s,192.168.5.210,testgreen' % self.iface_mac])
|
||||
self.do_test(coldplug=None, extra_opts='IPv6AcceptRA=False', dhcp_mode='ipv4')
|
||||
|
||||
# should have received the fixed IP above
|
||||
out = subprocess.check_output(['ip', '-4', 'a', 'show', 'dev', self.iface])
|
||||
self.assertRegex(out, b'inet 192.168.5.210/24 .* scope global dynamic')
|
||||
# should have set transient hostname in hostnamed
|
||||
self.assertIn(b'testgreen', subprocess.check_output(['hostnamectl']))
|
||||
# and also applied to the system
|
||||
self.assertEqual(socket.gethostname(), 'testgreen')
|
||||
|
||||
def test_transient_hostname_with_static(self):
|
||||
'''transient hostname is not applied if static hostname exists'''
|
||||
|
||||
orig_hostname = socket.gethostname()
|
||||
self.addCleanup(socket.sethostname, orig_hostname)
|
||||
if not os.path.exists('/etc/hostname'):
|
||||
self.writeConfig('/etc/hostname', orig_hostname)
|
||||
subprocess.check_call(['systemctl', 'stop', 'systemd-hostnamed.service'])
|
||||
|
||||
self.create_iface(dnsmasq_opts=['--dhcp-host=%s,192.168.5.210,testgreen' % self.iface_mac])
|
||||
self.do_test(coldplug=None, extra_opts='IPv6AcceptRA=False', dhcp_mode='ipv4')
|
||||
|
||||
# should have received the fixed IP above
|
||||
out = subprocess.check_output(['ip', '-4', 'a', 'show', 'dev', self.iface])
|
||||
self.assertRegex(out, b'inet 192.168.5.210/24 .* scope global dynamic')
|
||||
# static hostname wins over transient one, thus *not* applied
|
||||
self.assertEqual(socket.gethostname(), orig_hostname)
|
||||
|
||||
|
||||
class NetworkdClientTest(ClientTestBase, unittest.TestCase):
|
||||
'''Test networkd client against networkd server'''
|
||||
|
||||
Reference in New Issue
Block a user