From 83a2d2feeb39cf0bd395c412bbce9ab25dc349ad Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Thu, 19 May 2022 11:06:08 +0200 Subject: [PATCH] interfaces: convert loopback for #5411 --- src/etc/inc/interfaces.inc | 1 - src/etc/inc/plugins.inc.d/loopback.inc | 41 ++++++++++++++----- src/etc/inc/plugins.inc.d/vxlan.inc | 1 - .../conf/actions.d/actions_interface.conf | 2 +- src/sbin/pluginctl | 6 ++- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index ede393a94..bdc6a6986 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -763,7 +763,6 @@ function interfaces_configure($verbose = false) interfaces_vlan_configure($verbose); /* XXX: temporary plugin spot for device creation (independent of other devices) */ - plugins_configure('loopback_prepare', $verbose); plugins_configure('openvpn_prepare', $verbose); /* run through priority lists */ diff --git a/src/etc/inc/plugins.inc.d/loopback.inc b/src/etc/inc/plugins.inc.d/loopback.inc index 417971582..b9abc2c47 100644 --- a/src/etc/inc/plugins.inc.d/loopback.inc +++ b/src/etc/inc/plugins.inc.d/loopback.inc @@ -28,26 +28,36 @@ function loopback_configure() { - return array( - 'loopback_prepare' => array('loopback_configure_interface') - ); + return [ + 'loopback' => ['loopback_configure_do'] + ]; } function loopback_devices() { - $devices = array(); + $names = []; - $devices[] = array('pattern' => '^lo', 'volatile' => true, 'configurable' => true); + foreach (iterator_to_array((new \OPNsense\Interfaces\Loopback())->loopback->iterateItems()) as $loopback) { + $names[] = "lo{$loopback->deviceId}"; + } - return $devices; + return [[ + 'function' => 'loopback_configure_device', + 'configurable' => true, + 'pattern' => '^lo', + 'volatile' => true, + 'type' => 'loopback', + 'names' => $names, + ]]; } -function loopback_configure_interface($verbose = false) +function loopback_configure_do($verbose = false, $device = null) { $cnf = OPNsense\Core\Config::getInstance()->object(); $configured_interfaces = legacy_interface_listget(); $configured_devices = ['lo0']; // lo0 should always be configured $loopbacks = iterator_to_array((new \OPNsense\Interfaces\Loopback())->loopback->iterateItems()); + if ($verbose && !empty($loopbacks)) { echo 'Configuring Loopback interfaces...'; flush(); @@ -56,21 +66,32 @@ function loopback_configure_interface($verbose = false) // (re)configure loopback devices foreach ($loopbacks as $loopback) { $device_name = "lo{$loopback->deviceId}"; + + if ($device !== null && $device != $device_name) { + continue; + } + $configured_devices[] = $device_name; if (!in_array($device_name, $configured_interfaces)) { - echo $device_name; - mwexecf('/sbin/ifconfig %s create', array($device_name)); + mwexecf('/sbin/ifconfig %s create', [$device_name]); } } + // destroy non existing interfaces foreach ($configured_interfaces as $intf) { if (strpos($intf, "lo") === 0) { if (!in_array($intf, $configured_devices)) { - mwexecf('/sbin/ifconfig %s destroy', array($intf)); + mwexecf('/sbin/ifconfig %s destroy', [$intf]); } } } + if ($verbose && !empty($loopbacks)) { echo "done.\n"; } } + +function loopback_configure_device($device) +{ + loopback_configure_do(false, $device); +} diff --git a/src/etc/inc/plugins.inc.d/vxlan.inc b/src/etc/inc/plugins.inc.d/vxlan.inc index 800adcdfa..98602df62 100644 --- a/src/etc/inc/plugins.inc.d/vxlan.inc +++ b/src/etc/inc/plugins.inc.d/vxlan.inc @@ -59,7 +59,6 @@ function vxlan_configure_do($verbose = false, $device = null) $configured_devices = array(); $changed_devices = array(); $vxlans = iterator_to_array((new \OPNsense\Interfaces\VxLan())->vxlan->iterateItems()); - $verbose = $device === null ? $verbose : false; if ($verbose && !empty($vxlans)) { echo 'Configuring VXLAN interfaces...'; diff --git a/src/opnsense/service/conf/actions.d/actions_interface.conf b/src/opnsense/service/conf/actions.d/actions_interface.conf index 83a0daf7e..62cf22c04 100644 --- a/src/opnsense/service/conf/actions.d/actions_interface.conf +++ b/src/opnsense/service/conf/actions.d/actions_interface.conf @@ -121,7 +121,7 @@ message: Reconfiguring vlan type: script [loopback.configure] -command: /usr/local/sbin/pluginctl -c loopback_prepare +command: /usr/local/sbin/pluginctl -c loopback message: Reconfiguring loopbacks type: script diff --git a/src/sbin/pluginctl b/src/sbin/pluginctl index 97b11532e..195a177e9 100755 --- a/src/sbin/pluginctl +++ b/src/sbin/pluginctl @@ -83,9 +83,11 @@ if (isset($opts['h'])) { if (empty($args[0])) { echo $device['type'] . PHP_EOL; } elseif ($args[0] == $device['type']) { - echo implode(PHP_EOL, $device['names']) . PHP_EOL; + foreach ($device['names'] as $name) { + echo $name . PHP_EOL; + } } elseif (in_array($args[0], $device['names'])) { - echo "Reconfiguring {$args[0]}..."; + echo "Reconfiguring {$args[0]}..."; flush(); call_user_func_array($device['function'], [$args[0]]); echo "done.\n";