From fb73c95f6ebd4dc2c2b1cbe4d205fe909fc2c9f5 Mon Sep 17 00:00:00 2001 From: Kai Dederichs Date: Thu, 5 May 2022 14:45:26 +0200 Subject: [PATCH] Fix FreeBsd Interface parsing in cases that the interface has no speed or mac Signed-off-by: Kai Dederichs Make test throw when requesting a non-valid interface Signed-off-by: Kai Dederichs Backport FreeBSD.php to stable23 Signed-off-by: Kai Dederichs Fix CS Signed-off-by: Kai Dederichs --- lib/OperatingSystems/FreeBSD.php | 17 ++++++---- tests/data/freebsd_interface_epair0b | 9 +++++ tests/data/freebsd_interface_lo0 | 7 ++++ tests/data/freebsd_interface_pflog0 | 2 ++ tests/data/freebsd_interfaces | 18 ++++++++++ tests/lib/FreeBSDTest.php | 51 ++++++++++++++++++++++++++++ 6 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 tests/data/freebsd_interface_epair0b create mode 100644 tests/data/freebsd_interface_lo0 create mode 100644 tests/data/freebsd_interface_pflog0 create mode 100644 tests/data/freebsd_interfaces diff --git a/lib/OperatingSystems/FreeBSD.php b/lib/OperatingSystems/FreeBSD.php index 1651e82e..bea52169 100644 --- a/lib/OperatingSystems/FreeBSD.php +++ b/lib/OperatingSystems/FreeBSD.php @@ -159,7 +159,7 @@ public function getNetworkInterfaces(): array { preg_match_all("/^(?<=(?!\t)).*(?=:)/m", $ifconfig, $interfaces); foreach ($interfaces[0] as $interface) { - $iface = []; + $iface = []; $iface['interface'] = $interface; try { @@ -170,8 +170,8 @@ public function getNetworkInterfaces(): array { preg_match_all("/(?<=inet ).\S*/m", $intface, $ipv4); preg_match_all("/(?<=inet6 )((.*(?=%))|(.\S*))/m", $intface, $ipv6); - $iface['ipv4'] = implode(' ', $ipv4[0]); - $iface['ipv6'] = implode(' ', $ipv6[0]); + $iface['ipv4'] = implode(' ', $ipv4[0]); + $iface['ipv6'] = implode(' ', $ipv6[0]); if ($iface['interface'] !== 'lo0') { preg_match_all("/(?<=ether ).*/m", $intface, $mac); @@ -179,8 +179,13 @@ public function getNetworkInterfaces(): array { preg_match("/\b[0-9].*?(?=base)/m", $intface, $speed); preg_match("/(?<=\<).*(?=-)/m", $intface, $duplex); - $iface['mac'] = implode(' ', $mac[0]); - $iface['speed'] = $speed[0]; + if (isset($mac[0])) { + $iface['mac'] = implode(' ', $mac[0]); + } + + if (isset($speed[0])) { + $iface['speed'] = $speed[0]; + } if (isset($status[0])) { $iface['status'] = $status[0]; @@ -206,7 +211,7 @@ public function getNetworkInterfaces(): array { } } else { $iface['status'] = 'active'; - $iface['speed'] = 'unknown'; + $iface['speed'] = 'unknown'; $iface['duplex'] = ''; } $result[] = $iface; diff --git a/tests/data/freebsd_interface_epair0b b/tests/data/freebsd_interface_epair0b new file mode 100644 index 00000000..f4453140 --- /dev/null +++ b/tests/data/freebsd_interface_epair0b @@ -0,0 +1,9 @@ +epair0b: flags=8843 metric 0 mtu 1500 + options=8 + ether 1a:c0:4d:ba:b5:82 + hwaddr 02:60:e8:04:f6:0b + inet 192.168.178.150 netmask 0xffffff00 broadcast 192.168.178.255 + groups: epair + media: Ethernet 10Gbase-T (10Gbase-T ) + status: active + nd6 options=1 \ No newline at end of file diff --git a/tests/data/freebsd_interface_lo0 b/tests/data/freebsd_interface_lo0 new file mode 100644 index 00000000..b377291f --- /dev/null +++ b/tests/data/freebsd_interface_lo0 @@ -0,0 +1,7 @@ +lo0: flags=8049 metric 0 mtu 16384 + options=680003 + inet6 ::1 prefixlen 128 + inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 + inet 127.0.0.1 netmask 0xff000000 + groups: lo + nd6 options=21 diff --git a/tests/data/freebsd_interface_pflog0 b/tests/data/freebsd_interface_pflog0 new file mode 100644 index 00000000..509a0490 --- /dev/null +++ b/tests/data/freebsd_interface_pflog0 @@ -0,0 +1,2 @@ +pflog0: flags=0<> metric 0 mtu 33160 + groups: pflog diff --git a/tests/data/freebsd_interfaces b/tests/data/freebsd_interfaces new file mode 100644 index 00000000..f42787b6 --- /dev/null +++ b/tests/data/freebsd_interfaces @@ -0,0 +1,18 @@ +lo0: flags=8049 metric 0 mtu 16384 + options=680003 + inet6 ::1 prefixlen 128 + inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 + inet 127.0.0.1 netmask 0xff000000 + groups: lo + nd6 options=21 +pflog0: flags=0<> metric 0 mtu 33160 + groups: pflog +epair0b: flags=8843 metric 0 mtu 1500 + options=8 + ether 1a:c0:4d:ba:b5:82 + hwaddr 02:60:e8:04:f6:0b + inet 192.168.178.150 netmask 0xffffff00 broadcast 192.168.178.255 + groups: epair + media: Ethernet 10Gbase-T (10Gbase-T ) + status: active + nd6 options=1 diff --git a/tests/lib/FreeBSDTest.php b/tests/lib/FreeBSDTest.php index d986972d..2f5c6e03 100644 --- a/tests/lib/FreeBSDTest.php +++ b/tests/lib/FreeBSDTest.php @@ -96,6 +96,57 @@ public function testGetMemoryNoData(): void { $this->assertEquals(new Memory(), $this->os->getMemory()); } + public function testGetNetworkInterfaces(): void { + $this->os->method('executeCommand') + ->willReturnCallback(static function ($command) { + if ($command === '/sbin/ifconfig -a') { + return file_get_contents(__DIR__ . '/../data/freebsd_interfaces'); + } + if ($command === '/sbin/ifconfig lo0') { + return file_get_contents(__DIR__ . '/../data/freebsd_interface_lo0'); + } + if ($command === '/sbin/ifconfig pflog0') { + return file_get_contents(__DIR__ . '/../data/freebsd_interface_pflog0'); + } + if ($command === '/sbin/ifconfig epair0b') { + return file_get_contents(__DIR__ . '/../data/freebsd_interface_epair0b'); + } + + // Regex matches way more than the interface names, so if it doesn't match any of the defined ones, throw. + throw new \RuntimeException(); + }); + + $interfaces = $this->os->getNetworkInterfaces(); + $this->assertEquals([ + [ + "interface" => "lo0", + "ipv4" => "127.0.0.1", + "ipv6" => "::1 fe80::1", + "status" => "active", + "speed" => "unknown", + "duplex" => "", + ], + [ + "interface" => "pflog0", + "ipv4" => "", + "ipv6" => "", + "mac" => "", + "status" => "active", + "speed" => "unknown", + "duplex" => "", + ], + [ + "interface" => "epair0b", + "ipv4" => "192.168.178.150", + "ipv6" => "", + "mac" => "1a:c0:4d:ba:b5:82", + "speed" => "10 Gbps", + "status" => "active", + "duplex" => "Duplex: full", + ] + ], $interfaces); + } + public function testSupported(): void { $this->assertFalse($this->os->supported()); }