diff --git a/plist b/plist index 5f6dccd95..7a38d17ba 100644 --- a/plist +++ b/plist @@ -2422,7 +2422,6 @@ /usr/local/www/system_advanced_firewall.php /usr/local/www/system_advanced_misc.php /usr/local/www/system_advanced_network.php -/usr/local/www/system_advanced_sysctl.php /usr/local/www/system_authservers.php /usr/local/www/system_gateway_groups.php /usr/local/www/system_gateway_groups_edit.php diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Core/Api/TunablesController.php b/src/opnsense/mvc/app/controllers/OPNsense/Core/Api/TunablesController.php index c4ec95a45..7f08eb433 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Core/Api/TunablesController.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/Core/Api/TunablesController.php @@ -29,6 +29,7 @@ namespace OPNsense\Core\Api; use OPNsense\Base\ApiMutableModelControllerBase; use OPNsense\Core\Backend; +use OPNsense\Core\Config; use OPNsense\Base\UserException; class TunablesController extends ApiMutableModelControllerBase @@ -36,29 +37,69 @@ class TunablesController extends ApiMutableModelControllerBase protected static $internalModelName = 'sysctl'; protected static $internalModelClass = 'OPNsense\Core\Tunables'; - public function searchAction() + public function searchItemAction() { return $this->searchBase("item", null, "sysctl"); } - public function setSubnetAction($uuid) + public function setItemAction($uuid) { + if ($this->request->isPost() && count(explode('-', $uuid)) != 5) { + /* generate new uuid when key is a tunable name (from system_sysctl_defaults) */ + Config::getInstance()->lock(); + $uuid = $this->getModel()->item->generateUUID(); + } return $this->setBase("sysctl", "item", $uuid); } - public function addSubnetAction() + public function addItemAction() { return $this->addBase("sysctl", "item"); } - public function getSubnetAction($uuid = null) + public function getItemAction($uuid = null) { return $this->getBase("sysctl", "item", $uuid); } - public function delSubnetAction($uuid) + public function delItemAction($uuid) { return $this->delBase("item", $uuid); } + public function resetAction() + { + if ($this->request->isPost()) { + if (file_exists('/usr/local/etc/config.xml')) { + Config::getInstance()->lock(); + $factory_config = Config::getInstance()->toArrayFromFile('/usr/local/etc/config.xml', []); + $mdl = $this->getModel()->Default(); + if (!empty($factory_config['sysctl']) && !empty($factory_config['sysctl']['item'])){ + foreach ($factory_config['sysctl']['item'] as $item) { + $node = $mdl->item->Add(); + foreach ($item as $key => $val) { + $node->$key = (string)$val; + } + } + } + $this->save(); + return ['status' => 'ok']; + } else { + return ['status' => 'no_default']; + } + } + return ['status' => 'failed']; + } + + public function reconfigureAction() + { + if ($this->request->isPost()) { + /* both sysctl and login use tunables, restart them both */ + $tmp1 = strtolower(trim((new Backend())->configdpRun('service restart', ['login']))); + $tmp2 = strtolower(trim((new Backend())->configdpRun('service restart', ['sysctl']))); + + return ['status' => $tmp1 == 'ok' && $tmp2 == 'ok' ? 'ok' : 'failed']; + } + return ['status' => 'failed']; + } } diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Core/TunablesController.php b/src/opnsense/mvc/app/controllers/OPNsense/Core/TunablesController.php index 98ce2d950..ad8f6fc54 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Core/TunablesController.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/Core/TunablesController.php @@ -34,6 +34,5 @@ class TunablesController extends \OPNsense\Base\IndexController { $this->view->pick('OPNsense/Core/tunables'); $this->view->formDialogTunable = $this->getForm('tunable'); - } } diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Core/forms/tunable.xml b/src/opnsense/mvc/app/controllers/OPNsense/Core/forms/tunable.xml index 55cba1f4c..ffb724d88 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Core/forms/tunable.xml +++ b/src/opnsense/mvc/app/controllers/OPNsense/Core/forms/tunable.xml @@ -1,16 +1,16 @@
- item.tunable + sysctl.tunable text - item.value + sysctl.value text - item.descr + sysctl.descr text diff --git a/src/opnsense/mvc/app/models/OPNsense/Core/ACL/ACL.xml b/src/opnsense/mvc/app/models/OPNsense/Core/ACL/ACL.xml index 543594998..d2b2e61aa 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Core/ACL/ACL.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Core/ACL/ACL.xml @@ -528,7 +528,8 @@ System: Advanced: Tunables - system_advanced_sysctl.php* + ui/core/tunables + api/core/tunables/* diff --git a/src/opnsense/mvc/app/models/OPNsense/Core/FieldTypes/TunableField.php b/src/opnsense/mvc/app/models/OPNsense/Core/FieldTypes/TunableField.php index 797f77df4..57c5b90ec 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Core/FieldTypes/TunableField.php +++ b/src/opnsense/mvc/app/models/OPNsense/Core/FieldTypes/TunableField.php @@ -1,7 +1,7 @@ $item){ - $result[] = [ + /* md5($key) ensures static keys identifiable as static options */ + $result[md5($key)] = [ 'tunable' => $key, 'value' => $item['value'] ?? '', 'default_value' => $item['default'], @@ -62,6 +63,9 @@ class TunableField extends ArrayField return $result; } + /** + * {@inheritdoc} + */ protected function actionPostLoadingEvent() { if (self::$default_values === null) { @@ -78,6 +82,9 @@ class TunableField extends ArrayField foreach ($this->iterateItems() as $node) { if (isset(self::$static_entries[(string)$node->tunable])) { unset(self::$static_entries[(string)$node->tunable]); + } elseif ($node->value == 'default') { + /* default is only a valid choice when defaults are offered */ + $node->value = ''; } if (isset(self::$default_values[(string)$node->tunable])) { $node->default_value->setValue(self::$default_values[(string)$node->tunable]['value']); diff --git a/src/opnsense/mvc/app/models/OPNsense/Core/Menu/Menu.xml b/src/opnsense/mvc/app/models/OPNsense/Core/Menu/Menu.xml index 958212b8d..603e18e3d 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Core/Menu/Menu.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Core/Menu/Menu.xml @@ -63,9 +63,7 @@ - - - + diff --git a/src/opnsense/mvc/app/views/OPNsense/Core/tunables.volt b/src/opnsense/mvc/app/views/OPNsense/Core/tunables.volt index d208cd902..c65cbdc18 100644 --- a/src/opnsense/mvc/app/views/OPNsense/Core/tunables.volt +++ b/src/opnsense/mvc/app/views/OPNsense/Core/tunables.volt @@ -27,11 +27,11 @@ @@ -73,7 +99,11 @@ - + + + diff --git a/src/www/system_advanced_sysctl.php b/src/www/system_advanced_sysctl.php deleted file mode 100644 index 6acf3e1d1..000000000 --- a/src/www/system_advanced_sysctl.php +++ /dev/null @@ -1,347 +0,0 @@ - - * Copyright (C) 2008 Shrew Soft Inc. - * Copyright (C) 2003-2004 Manuel Kasper - * 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. - */ - -require_once("guiconfig.inc"); -require_once("system.inc"); - -$a_defaults = system_sysctl_defaults(); -$a_system = []; /* to be filled from defaults */ -$a_tunable = &config_read_array('sysctl', 'item'); -$a_sysctl = json_decode(configd_run('system sysctl gather'), true); - -if ($_SERVER['REQUEST_METHOD'] === 'GET') { - if (isset($_GET['id']) && isset($a_tunable[$_GET['id']])) { - $id = $_GET['id']; - } - if (isset($_GET['act'])) { - $act = $_GET['act']; - } else { - $act = null; - } - $pconfig = []; - if (isset($id)) { - $pconfig['tunable'] = $a_tunable[$id]['tunable']; - $pconfig['value'] = $a_tunable[$id]['value']; - $pconfig['descr'] = $a_tunable[$id]['descr']; - } else { - $pconfig['tunable'] = isset($_GET['tunable']) ? $_GET['tunable'] : null; - $pconfig['value'] = null; - $pconfig['descr'] = null; - } -} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { - if (isset($_POST['id']) && isset($a_tunable[$_POST['id']])) { - $id = $_POST['id']; - } - if (isset($_POST['act'])) { - $act = $_POST['act']; - } else { - $act = null; - } - $pconfig = $_POST; - - if (isset($id) && $act == "del") { - unset($a_tunable[$id]); - write_config(); - mark_subsystem_dirty('sysctl'); - header(url_safe('Location: /system_advanced_sysctl.php')); - exit; - } else if ($act == 'reset') { - // reset tunables to factory defaults (when available) - if (file_exists('/usr/local/etc/config.xml')) { - $factory_config = load_config_from_file('/usr/local/etc/config.xml'); - if (!empty($factory_config['sysctl']) && !empty($factory_config['sysctl']['item'])){ - $a_tunable = $factory_config['sysctl']['item']; - mark_subsystem_dirty('sysctl'); - write_config(); - } - } - header(url_safe('Location: /system_advanced_sysctl.php')); - exit; - } else if (!empty($pconfig['apply'])) { - system_sysctl_configure(); - system_login_configure(); - clear_subsystem_dirty('sysctl'); - header(url_safe('Location: /system_advanced_sysctl.php')); - exit; - } elseif (!empty($pconfig['Submit'])) { - $tunableent = []; - $tunableent['tunable'] = $pconfig['tunable']; - $tunableent['value'] = $pconfig['value']; - $tunableent['descr'] = $pconfig['descr']; - - if (isset($id)) { - $a_tunable[$id] = $tunableent; - } else { - $a_tunable[] = $tunableent; - } - - mark_subsystem_dirty('sysctl'); - write_config(); - header(url_safe('Location: /system_advanced_sysctl.php')); - exit; - } -} - -foreach ($a_defaults as $name => $info) { - if (!empty($info['required'])) { - $a_system[] = $name; - } -} - -foreach ($a_tunable as $key => &$tunable) { - /* translate hidden strings before HTML escape */ - if (!empty($tunable['descr'])) { - $tunable['descr'] = gettext($tunable['descr']); - } elseif (!empty($a_sysctl[$tunable['tunable']]['description'])) { - $tunable['descr'] = $a_sysctl[$tunable['tunable']]['description']; - } - - if (!empty($a_defaults[$tunable['tunable']]['type'])) { - $tunable['type'] = $a_defaults[$tunable['tunable']]['type']; - } elseif (!empty($a_sysctl[$tunable['tunable']]['type'])) { - $tunable['type'] = $a_sysctl[$tunable['tunable']]['type']; - } - - /* add the key for config-bound tunables */ - $tunable['key'] = $key; - - /* remove system defaults in config items */ - $pos = array_search($tunable['tunable'], $a_system); - if ($pos !== false) { - unset($a_system[$pos]); - } -} - -foreach ($a_system as $default) { - /* display system defaults as well */ - $next = [ 'tunable' => $default, 'value' => 'default', 'descr' => $a_sysctl[$default]['description'] ?? '' ]; - if (!empty($a_defaults[$default]['type'])) { - $next['type'] = $a_defaults[$default]['type']; - } elseif (!empty($a_sysctl[$default]['type'])) { - $next['type'] = $a_sysctl[$default]['type']; - } - if (!empty($a_defaults[$default]['description'])) { - $next['descr'] = $a_defaults[$default]['description']; - } - $a_tunable[] = $next; -} - -uasort($a_tunable, function($a, $b) { - return strnatcmp($a['tunable'], $b['tunable']); -}); - -include("head.inc"); - -legacy_html_escape_form_data($a_tunable); -legacy_html_escape_form_data($pconfig); - -?> - - - - - - - -
-
-
-' .gettext('Tunables are composed of runtime settings for sysctl.conf which take effect ' . - 'immediately after apply and boot settings for loader.conf which require a reboot.')); - } -?> - - - - -
-
- - - - - - - - - - - - - - - - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - -
- -
- -
- -
  - - " onclick="window.location.href='/system_advanced_sysctl.php'" /> - - - -
-
- -
-
-
-
-
-