Skip to content

Commit 288a0d0

Browse files
committed
fix: match interface regex in ShellDriver
Fix regex to correctly match network interfaces with dots and/or dashes in the name Previously, the regex for extracting the interface from the default route was not capable of matching network interfaces containing dots ('.') and/or dashes ('-') in their names. This commit improves the regex by allowing such interfaces to be correctly identified. For example, interfaces like 'br-lan.42' and 'eth0-1' are now correctly matched by the updated regex. Sample output of the `ip -4 route list default` command: default via 192.168.42.255 dev br-lan.42 src 192.168.42.1 Signed-off-by: Rainer Poisel <[email protected]>
1 parent 1ab0abd commit 288a0d0

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

labgrid/driver/shelldriver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,7 @@ def get_default_interface_device_name(self, version=4):
567567

568568
regex = r"""default\s+via # leading strings
569569
\s+\S+ # IP address
570-
\s+dev\s+(\w+) # interface"""
570+
\s+dev\s+([\w\.-]+) # interface"""
571571

572572
default_route = self._run_check(f"ip -{version} route list default")
573573
matches = re.findall(regex, "\n".join(default_route), re.X)

tests/test_shelldriver.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ def test_run_with_timeout(self, target_with_fakeconsole, mocker):
4848
res = d.run("test")
4949
assert res == (['success'], [], 0)
5050

51+
def test_default_interface_device_name(self, target_with_fakeconsole, mocker):
52+
fake_default_route_show = "default via 10.0.2.2 dev br-lan src 10.0.2.15"
53+
54+
t = target_with_fakeconsole
55+
d = ShellDriver(t, "shell", prompt="dummy", login_prompt="dummy", username="dummy")
56+
d.on_activate = mocker.MagicMock()
57+
d = t.get_driver("ShellDriver")
58+
d._run = mocker.MagicMock(return_value=([fake_default_route_show], [], 0))
59+
60+
res = d.get_default_interface_device_name()
61+
assert res == "br-lan"
62+
5163
def test_get_ip_addresses(self, target_with_fakeconsole, mocker):
5264
fake_ip_addr_show = r"""
5365
18: br-lan.42 inet 192.168.42.1/24 brd 192.168.42.255 scope global br-lan.42\ valid_lft forever preferred_lft forever
@@ -62,3 +74,26 @@ def test_get_ip_addresses(self, target_with_fakeconsole, mocker):
6274

6375
res = d.get_ip_addresses("br-lan.42")
6476
assert res[0] == IPv4Interface("192.168.42.1/24")
77+
78+
def test_get_ip_addresses_default(self, target_with_fakeconsole, mocker):
79+
t = target_with_fakeconsole
80+
d = ShellDriver(t, "shell", prompt="dummy", login_prompt="dummy", username="dummy")
81+
d.on_activate = mocker.MagicMock()
82+
d = t.get_driver("ShellDriver")
83+
d._run = mocker.MagicMock()
84+
d._run.side_effect = [
85+
(["default via 192.168.42.255 dev br-lan.42 src 192.168.42.1"], [], 0),
86+
(
87+
[
88+
r"""
89+
18: br-lan.42 inet 192.168.42.1/24 brd 192.168.42.255 scope global br-lan.42\ valid_lft forever preferred_lft forever
90+
18: br-lan.42 inet6 fe80::9683:c4ff:fea6:fb6b/64 scope link \ valid_lft forever preferred_lft forever
91+
"""
92+
],
93+
[],
94+
0,
95+
),
96+
]
97+
98+
res = d.get_ip_addresses()
99+
assert res[0] == IPv4Interface("192.168.42.1/24")

0 commit comments

Comments
 (0)