Interface\Autoconf add new static class to access information collected by ifctl and remove existing direct callers.

This commit is contained in:
Ad Schellevis 2024-02-26 10:47:00 +01:00
parent 387fc592d7
commit 2fa2a2be23
3 changed files with 114 additions and 35 deletions

View File

@ -33,6 +33,7 @@ use OPNsense\Core\Backend;
use OPNsense\Core\Config;
use OPNsense\Firewall\Util;
use OPNsense\Routing\Gateways;
use OPNsense\Interface\Autoconf;
class OverviewController extends ApiControllerBase
{
@ -154,16 +155,9 @@ class OverviewController extends ApiControllerBase
continue;
}
/* collect ifctl received properties for this interface */
foreach (['nameserver', 'prefix', 'router', 'searchdomain'] as $ifctl) {
$items = [];
foreach (['', 'v6'] as $ext) {
if (is_file("/tmp/{$if}_{$ifctl}{$ext}")) {
$items[] = trim(file_get_contents("/tmp/{$if}_{$ifctl}{$ext}"));
}
}
if (!empty($items)) {
$tmp["ifctl.{$ifctl}"] = $items;
}
foreach (Autoconf::all($if) as $key => $value)
{
$tmp["ifctl.{$key}"] = $value;
}
$tmp['status'] = (!empty($details['flags']) && in_array('up', $details['flags'])) ? 'up' : 'down';

View File

@ -0,0 +1,107 @@
<?php
/*
* Copyright (C) 2024 Deciso B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
namespace OPNsense\Interface;
class Autoconf
{
/**
* @return string fetch ifctl collected data
*/
private static function get($if, $type, $ipproto='inet')
{
$fsuffix = $ipproto == 'inet6' ? 'v6' : '';
foreach (['', ':slaac'] as $isuffix) {
$file = "/tmp/{$if}{$isuffix}_{$type}{$fsuffix}";
if (file_exists($file)) {
return trim(@file_get_contents($file));
}
}
return null;
}
/**
* @return string nameserver when offered
*/
public static function getNameserver($if, $ipproto='inet')
{
return self::get($if, 'nameserver', $ipproto);
}
/**
* @return string router when offered
*/
public static function getRouter($if, $ipproto='inet')
{
return self::get($if, 'router', $ipproto);
}
/**
* @return string prefix when offered
*/
public static function getPrefix($if, $ipproto='inet')
{
return self::get($if, 'prefix', $ipproto);
}
/**
* @return string search domain when offered
*/
public static function getSearchdomain($if, $ipproto='inet')
{
return self::get($if, 'searchdomain', $ipproto);
}
/**
* fetch all collected dynamic interface properties
* @return array
*/
public static function all($if)
{
$result = [];
foreach (['inet', 'inet6'] as $ipproto)
{
$map = [
'nameserver' => self::getNameserver($if, $ipproto),
'prefix' => self::getPrefix($if, $ipproto),
'router' => self::getRouter($if, $ipproto),
'searchdomain' => self::getSearchdomain($if, $ipproto)
];
foreach ($map as $key => $content) {
if ($content !== null) {
if (!isset($result[$key])) {
$result[$key] = [];
}
$result[$key][] = $content;
}
}
}
return $result;
}
}

View File

@ -1,7 +1,7 @@
<?php
/*
* Copyright (C) 2019-2023 Deciso B.V.
* Copyright (C) 2019-2024 Deciso B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@ -31,6 +31,7 @@ namespace OPNsense\Routing;
use OPNsense\Base\BaseModel;
use OPNsense\Core\Config;
use OPNsense\Firewall\Util;
use OPNsense\Interface\Autoconf;
use OPNsense\Base\Messages\Message;
class Gateways extends BaseModel
@ -244,29 +245,6 @@ class Gateways extends BaseModel
return $result;
}
/**
* return dynamic router address from file-based location created via ifctl utility
* @param string $realif underlying network device name
* @param string $ipproto inet/inet6 type
* @return string $router IP address
*/
private function getRouterFromFile($realif, $ipproto = 'inet')
{
$fsuffix = $ipproto == 'inet6' ? 'v6' : '';
$router = null;
/* some types have fallback files we are looking for in order */
foreach (['', ':slaac'] as $isuffix) {
$file = "/tmp/{$realif}{$isuffix}_router{$fsuffix}";
if (file_exists($file)) {
$router = trim(@file_get_contents($file));
break;
}
}
return $router;
}
/**
* return the device name present in the system for the specific configuration
* @param string $ifname name of the interface
@ -478,7 +456,7 @@ class Gateways extends BaseModel
}
if (!empty($thisconf['virtual']) && in_array($thisconf['name'], $reservednames)) {
/* if name is already taken, don't try to add a new (virtual) entry */
} elseif (($router = $this->getRouterFromFile($realif, $ipproto)) != null) {
} elseif (($router = Autoconf::getRouter($realif, $ipproto)) != null) {
$thisconf['gateway'] = $router;
if (empty($thisconf['monitor_disable']) && empty($thisconf['monitor'])) {
$thisconf['monitor'] = $thisconf['gateway'];