%PDF- %PDF-
| Direktori : /proc/self/root/backups/router/usr/local/etc/inc/ |
| Current File : //proc/self/root/backups/router/usr/local/etc/inc/config.inc |
<?php
/*
* Copyright (C) 2015-2022 Franco Fichtner <franco@opnsense.org>
* Copyright (C) 2009 Erik Kristensen <erik@erikkristensen.com>
* Copyright (C) 2004-2010 Scott Ullrich <sullrich@gmail.com>
* Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>
* 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.
*/
final class product
{
private static $instance = null;
private static $data = null;
public static function getInstance(): product
{
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct()
{
self::$data = json_decode(file_get_contents('/usr/local/opnsense/version/core'), true);
/* boot detection */
self::$data['product_booting'] = false;
$fp = fopen('/var/run/booting', 'a+e');
if ($fp) {
self::$data['product_booting'] = !flock($fp, LOCK_SH | LOCK_NB);
fclose($fp);
}
/* development flag */
$develflag = '/var/run/development';
self::$data['product_development'] = file_exists($develflag);
}
private function __clone()
{
}
public function __wakeup()
{
throw new Exception('Cannot unserialize singleton');
}
public function __call($name, $arguments)
{
if (!empty(self::$data['product_' . $name])) {
return self::$data['product_' . $name];
}
}
}
function reopenlog()
{
openlog(product::getInstance()->id(), LOG_ODELAY, LOG_USER);
}
reopenlog();
require_once("xmlparse.inc");
require_once("legacy_bindings.inc");
require_once("certs.inc");
/*
* Hook up the plugin system which consists of several low-profile
* functions that can be called from within our backend code when
* they exist.
*/
require_once('plugins.inc');
/**
* parse config into array and return
*/
function load_config_from_file($filename)
{
return OPNsense\Core\Config::getInstance()->toArrayFromFile($filename, listtags());
}
/****f* config/parse_config
* NAME
* parse_config - Read in config.xml if needed and return $config array
* RESULT
* $config - array containing all configuration variables
******/
function parse_config()
{
$cnf = OPNsense\Core\Config::getInstance();
// return config data as array, use old "listags" construction to mark certain elements as array (even if they're not recurring)
$config = $cnf->toArray(listtags());
return $config;
}
/****f* config/convert_config
* NAME
* convert_config - Attempt to update config.xml.
* DESCRIPTION
* convert_config() reads the current global configuration
* and attempts to convert it to conform to the latest
* config.xml version. This allows major formatting changes
* to be made with a minimum of breakage.
* RESULT
* null
******/
/* convert configuration, if necessary */
function convert_config($verbose = false)
{
global $config;
if (!isset($config['revision'])) {
/* force a revision tag for proper handling in config history */
write_config('Factory configuration', false);
}
/* chain the new migration into this function call */
$cmd = '/usr/local/opnsense/mvc/script/run_migrations.php';
if ($verbose) {
passthru($cmd);
} else {
mwexecf($cmd);
}
/* register pluggable interfaces */
$cmd = '/usr/local/sbin/pluginctl -i';
if ($verbose) {
passthru($cmd);
} else {
mwexecf($cmd);
}
/* factory reset on release type and plugins if necessary */
$cmd = '/usr/local/opnsense/scripts/firmware/register.php sync';
if ($verbose) {
passthru($cmd);
} else {
mwexecf($cmd);
}
/* reload the config as it was rewritten and saved in the script context */
OPNsense\Core\Config::getInstance()->forceReload();
$config = parse_config();
}
/****f* config/write_config
* NAME
* write_config - Backup and write the firewall configuration.
* DESCRIPTION
* write_config() handles backing up the current configuration,
* applying changes, and regenerating the configuration cache.
* INPUTS
* $desc - string containing the a description of configuration changes
* $backup - boolean: do not back up current configuration if false.
* RESULT
* null
******/
/* save the system configuration */
function write_config($desc = '', $backup = true)
{
global $config;
if (!empty($_SERVER['REMOTE_ADDR'])) {
if (!empty($_SESSION['Username']) && ($_SESSION['Username'] != 'root')) {
$user = getUserEntry($_SESSION['Username']);
if (is_array($user) && userHasPrivilege($user, "user-config-readonly")) {
// okay, it's not very nice to check permissions here, but let's make it explicit while we do...
syslog(LOG_ERR, "WARNING: User {$_SESSION['Username']} may not write config (user-config-readonly set)");
return false;
}
}
}
/**
* XXX: Temporary construction.
* When called via a legacy interface configure page, we might want to register new interfaces, but
* in cases we just want to save our changes (not related to interfaces), we risk raising errors for
* missing imports.
* Eventually relevant callers should call 'interface invoke registration', which is the same as
* mvc components use now (but can't be called here without side effects)
*/
try {
plugins_interfaces();
} catch (Throwable $e) {
null;
}
$cnf = OPNsense\Core\Config::getInstance();
$cnf->fromArray($config);
$revision_info = make_config_revision_entry($desc);
try {
$cnf->save($revision_info, $backup);
} catch (OPNsense\Core\ConfigException $e) {
// write failure
syslog(LOG_ERR, 'WARNING: Config contents could not be saved. Could not open file!');
return -1;
}
/* on successful save, serialize config back to global */
$config = $cnf->toArray(listtags());
return $config;
}
function config_restore($conffile)
{
global $config;
if (!file_exists($conffile)) {
return 1;
}
$cnf = OPNsense\Core\Config::getInstance();
$cnf->backup();
$cnf->restoreBackup($conffile);
$config = parse_config();
write_config(sprintf('Reverted to %s', array_pop(explode('/', $conffile))), false);
return 0;
}
function &config_read_array()
{
global $config;
$current = &$config;
foreach (func_get_args() as $key) {
if (!isset($current[$key]) || !is_array($current[$key])) {
$current[$key] = [];
}
$current = &$current[$key];
}
return $current;
}
function make_config_revision_entry($desc = '')
{
if (!empty($_SESSION['Username'])) {
$username = $_SESSION['Username'];
} else {
$username = '(' . shell_safe('/usr/bin/whoami') . ')';
}
if (!empty($_SERVER['REMOTE_ADDR'])) {
$username .= '@' . $_SERVER['REMOTE_ADDR'];
}
if (empty($desc)) {
$desc = sprintf('%s made changes', $_SERVER['SCRIPT_NAME']);
}
$revision = [];
$revision['username'] = $username;
$revision['time'] = microtime(true);
$revision['description'] = $desc;
return $revision;
}
/**
* find list of registered interfaces
* @param array $filters list of filters to apply
* @return array interfaces
*/
function legacy_config_get_interfaces($filters = [], $exclude_ifs = [])
{
$interfaces = [];
foreach (config_read_array('interfaces') as $ifname => $iface) {
if (in_array($ifname, $exclude_ifs)) {
continue;
}
// undo stupid listags() turning our item into a new array, preventing certain names to be used as interface.
// see src/etc/inc/xmlparse.inc
if (isset($iface[0])) {
$iface = $iface[0];
}
// apply filters
$iface_match = true;
foreach ($filters as $filter_key => $filter_value) {
if ($filter_key == 'enable' && isset($iface[$filter_key])) {
$field_value = true;
} else {
$field_value = isset($iface[$filter_key]) ? $iface[$filter_key] : false;
}
if ($field_value != $filter_value) {
$iface_match = false;
break;
}
}
if ($iface_match && !empty($iface)) {
$iface['descr'] = !empty($iface['descr']) ? $iface['descr'] : strtoupper($ifname);
$iface['ipaddrv6'] = !empty($iface['ipaddrv6']) ? $iface['ipaddrv6'] : null;
$iface['ipaddr'] = !empty($iface['ipaddr']) ? $iface['ipaddr'] : null;
$interfaces[$ifname] = $iface;
}
}
uasort($interfaces, function ($a, $b) {
return strnatcmp($a['descr'], $b['descr']);
});
return $interfaces;
}
/**
* legacy helper to generate a uuid in a similar fashion as the model code would.
*/
function generate_uuid()
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
random_int(0, 0xffff),
random_int(0, 0xffff),
random_int(0, 0xffff),
random_int(0, 0x0fff) | 0x4000,
random_int(0, 0x3fff) | 0x8000,
random_int(0, 0xffff),
random_int(0, 0xffff),
random_int(0, 0xffff)
);
}
/**
* parse stored json content, return empty when not found or expired
*/
function get_cached_json_content($filename, $ttl = 3600)
{
$result = null;
if (file_exists($filename)) {
$fstat = stat($filename);
if ((time() - $fstat['mtime']) < $ttl) {
$result = json_decode(file_get_contents($filename), true);
}
}
return $result;
}
$config = parse_config();
/* set timezone */
$timezone = $config['system']['timezone'];
if (!$timezone) {
$timezone = 'Etc/UTC';
}
date_default_timezone_set($timezone);