diff options
author | backportbot-nextcloud[bot] <45182681+backportbot-nextcloud[bot]@users.noreply.github.com> | 2022-06-03 10:57:52 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-03 10:57:52 +0300 |
commit | c0055d0d2046af8b851757a223ab8c0ba706743d (patch) | |
tree | 354f33cff8fdd68d17d2c7031a4646ae2fc7bcd3 | |
parent | 946da4de61266db57857e009c24368ac9dcec69e (diff) |
Fix FreeBsd Interface parsing in cases that the interface has no speed or mac (#375)
Signed-off-by: Kai Dederichs <kai.dederichs@protonmail.com>
Make test throw when requesting a non-valid interface
Signed-off-by: Kai Dederichs <kai.dederichs@protonmail.com>
Backport FreeBSD.php to stable23
Signed-off-by: Kai Dederichs <k.dederichs@spicymedia.io>
Fix CS
Signed-off-by: Kai Dederichs <k.dederichs@spicymedia.io>
Co-authored-by: Kai Dederichs <kai.dederichs@protonmail.com>
-rw-r--r-- | lib/OperatingSystems/FreeBSD.php | 17 | ||||
-rw-r--r-- | tests/data/freebsd_interface_epair0b | 9 | ||||
-rw-r--r-- | tests/data/freebsd_interface_lo0 | 7 | ||||
-rw-r--r-- | tests/data/freebsd_interface_pflog0 | 2 | ||||
-rw-r--r-- | tests/data/freebsd_interfaces | 18 | ||||
-rw-r--r-- | tests/lib/FreeBSDTest.php | 51 |
6 files changed, 98 insertions, 6 deletions
diff --git a/lib/OperatingSystems/FreeBSD.php b/lib/OperatingSystems/FreeBSD.php index 1651e82..bea5216 100644 --- a/lib/OperatingSystems/FreeBSD.php +++ b/lib/OperatingSystems/FreeBSD.php @@ -159,7 +159,7 @@ class FreeBSD implements IOperatingSystem { preg_match_all("/^(?<=(?!\t)).*(?=:)/m", $ifconfig, $interfaces); foreach ($interfaces[0] as $interface) { - $iface = []; + $iface = []; $iface['interface'] = $interface; try { @@ -170,8 +170,8 @@ class FreeBSD implements IOperatingSystem { 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 @@ class FreeBSD implements IOperatingSystem { 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 @@ class FreeBSD implements IOperatingSystem { } } 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 0000000..f445314 --- /dev/null +++ b/tests/data/freebsd_interface_epair0b @@ -0,0 +1,9 @@ +epair0b: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 + options=8<VLAN_MTU> + 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 <full-duplex>) + status: active + nd6 options=1<PERFORMNUD>
\ 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 0000000..b377291 --- /dev/null +++ b/tests/data/freebsd_interface_lo0 @@ -0,0 +1,7 @@ +lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 + options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6> + inet6 ::1 prefixlen 128 + inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 + inet 127.0.0.1 netmask 0xff000000 + groups: lo + nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> diff --git a/tests/data/freebsd_interface_pflog0 b/tests/data/freebsd_interface_pflog0 new file mode 100644 index 0000000..509a049 --- /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 0000000..f42787b --- /dev/null +++ b/tests/data/freebsd_interfaces @@ -0,0 +1,18 @@ +lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 + options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6> + inet6 ::1 prefixlen 128 + inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 + inet 127.0.0.1 netmask 0xff000000 + groups: lo + nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> +pflog0: flags=0<> metric 0 mtu 33160 + groups: pflog +epair0b: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 + options=8<VLAN_MTU> + 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 <full-duplex>) + status: active + nd6 options=1<PERFORMNUD> diff --git a/tests/lib/FreeBSDTest.php b/tests/lib/FreeBSDTest.php index d986972..2f5c6e0 100644 --- a/tests/lib/FreeBSDTest.php +++ b/tests/lib/FreeBSDTest.php @@ -96,6 +96,57 @@ class FreeBSDTest extends TestCase { $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()); } |