aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php')
-rw-r--r--vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php131
1 files changed, 88 insertions, 43 deletions
diff --git a/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php b/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php
index 57015133a..8234abaee 100644
--- a/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php
+++ b/vendor/ramsey/uuid/src/Provider/Node/SystemNodeProvider.php
@@ -1,4 +1,5 @@
<?php
+
/**
* This file is part of the ramsey/uuid library
*
@@ -7,50 +8,86 @@
*
* @copyright Copyright (c) Ben Ramsey <ben@benramsey.com>
* @license http://opensource.org/licenses/MIT MIT
- * @link https://benramsey.com/projects/ramsey-uuid/ Documentation
- * @link https://packagist.org/packages/ramsey/uuid Packagist
- * @link https://github.com/ramsey/uuid GitHub
*/
+declare(strict_types=1);
+
namespace Ramsey\Uuid\Provider\Node;
+use Ramsey\Uuid\Exception\NodeException;
use Ramsey\Uuid\Provider\NodeProviderInterface;
+use Ramsey\Uuid\Type\Hexadecimal;
+
+use function array_filter;
+use function array_map;
+use function array_walk;
+use function count;
+use function ob_get_clean;
+use function ob_start;
+use function preg_match;
+use function preg_match_all;
+use function reset;
+use function str_replace;
+use function strpos;
+use function strtolower;
+use function strtoupper;
+use function substr;
+
+use const GLOB_NOSORT;
+use const PREG_PATTERN_ORDER;
/**
- * SystemNodeProvider provides functionality to get the system node ID (MAC
- * address) using external system calls
+ * SystemNodeProvider retrieves the system node ID, if possible
+ *
+ * The system node ID, or host ID, is often the same as the MAC address for a
+ * network interface on the host.
*/
class SystemNodeProvider implements NodeProviderInterface
{
/**
- * Returns the system node ID
- *
- * @return string|false System node ID as a hexadecimal string, or false if it is not found
+ * Pattern to match nodes in ifconfig and ipconfig output.
+ */
+ private const IFCONFIG_PATTERN = '/[^:]([0-9a-f]{2}([:-])[0-9a-f]{2}(\2[0-9a-f]{2}){4})[^:]/i';
+
+ /**
+ * Pattern to match nodes in sysfs stream output.
+ */
+ private const SYSFS_PATTERN = '/^([0-9a-f]{2}:){5}[0-9a-f]{2}$/i';
+
+ public function getNode(): Hexadecimal
+ {
+ $node = $this->getNodeFromSystem();
+
+ if ($node === '') {
+ throw new NodeException(
+ 'Unable to fetch a node for this system'
+ );
+ }
+
+ return new Hexadecimal($node);
+ }
+
+ /**
+ * Returns the system node, if it can find it
*/
- public function getNode()
+ protected function getNodeFromSystem(): string
{
static $node = null;
if ($node !== null) {
- return $node;
+ return (string) $node;
}
- $pattern = '/[^:]([0-9A-Fa-f]{2}([:-])[0-9A-Fa-f]{2}(\2[0-9A-Fa-f]{2}){4})[^:]/';
- $matches = [];
-
- // first try a linux specific way
+ // First, try a Linux-specific approach.
$node = $this->getSysfs();
- // Search the ifconfig output for all MAC addresses and return
- // the first one found
- if ($node === false) {
- if (preg_match_all($pattern, $this->getIfconfig(), $matches, PREG_PATTERN_ORDER)) {
- $node = $matches[1][0];
- }
- }
- if ($node !== false) {
- $node = str_replace([':', '-'], '', $node);
+ if ($node === '') {
+ // Search ifconfig output for MAC addresses & return the first one.
+ $node = $this->getIfconfig();
}
+
+ $node = str_replace([':', '-'], '', $node);
+
return $node;
}
@@ -58,11 +95,12 @@ class SystemNodeProvider implements NodeProviderInterface
* Returns the network interface configuration for the system
*
* @codeCoverageIgnore
- * @return string
*/
- protected function getIfconfig()
+ protected function getIfconfig(): string
{
- if (strpos(strtolower(ini_get('disable_functions')), 'passthru') !== false) {
+ $disabledFunctions = strtolower((string) ini_get('disable_functions'));
+
+ if (strpos($disabledFunctions, 'passthru') !== false) {
return '';
}
@@ -70,40 +108,50 @@ class SystemNodeProvider implements NodeProviderInterface
switch (strtoupper(substr(constant('PHP_OS'), 0, 3))) {
case 'WIN':
passthru('ipconfig /all 2>&1');
+
break;
case 'DAR':
passthru('ifconfig 2>&1');
+
break;
case 'FRE':
passthru('netstat -i -f link 2>&1');
+
break;
case 'LIN':
default:
passthru('netstat -ie 2>&1');
+
break;
}
- return ob_get_clean();
+ $ifconfig = (string) ob_get_clean();
+
+ $node = '';
+ if (preg_match_all(self::IFCONFIG_PATTERN, $ifconfig, $matches, PREG_PATTERN_ORDER)) {
+ $node = $matches[1][0] ?? '';
+ }
+
+ return (string) $node;
}
/**
- * Returns mac address from the first system interface via the sysfs interface
- *
- * @return string|bool
+ * Returns MAC address from the first system interface via the sysfs interface
*/
- protected function getSysfs()
+ protected function getSysfs(): string
{
- $mac = false;
+ $mac = '';
if (strtoupper(constant('PHP_OS')) === 'LINUX') {
$addressPaths = glob('/sys/class/net/*/address', GLOB_NOSORT);
- if (empty($addressPaths)) {
- return false;
+ if ($addressPaths === false || count($addressPaths) === 0) {
+ return '';
}
$macs = [];
- array_walk($addressPaths, function ($addressPath) use (&$macs) {
+
+ array_walk($addressPaths, function (string $addressPath) use (&$macs): void {
if (is_readable($addressPath)) {
$macs[] = file_get_contents($addressPath);
}
@@ -111,18 +159,15 @@ class SystemNodeProvider implements NodeProviderInterface
$macs = array_map('trim', $macs);
- // remove invalid entries
- $macs = array_filter($macs, function ($mac) {
- return
- // localhost adapter
- $mac !== '00:00:00:00:00:00' &&
- // must match mac adress
- preg_match('/^([0-9a-f]{2}:){5}[0-9a-f]{2}$/i', $mac);
+ // Remove invalid entries.
+ $macs = array_filter($macs, function (string $address) {
+ return $address !== '00:00:00:00:00:00'
+ && preg_match(self::SYSFS_PATTERN, $address);
});
$mac = reset($macs);
}
- return $mac;
+ return (string) $mac;
}
}