%PDF- %PDF-
| Direktori : /proc/self/root/backups/router/usr/local/etc/inc/plugins.inc.d/ |
| Current File : //proc/self/root/backups/router/usr/local/etc/inc/plugins.inc.d/core.inc |
<?php
/*
* Copyright (C) 2018-2022 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.
*/
function core_services()
{
global $config;
$services = array();
if (isset($config['OPNsense']['captiveportal']['zones']['zone'])) {
$enabled = false;
if (!empty($config['OPNsense']['captiveportal']['zones']['zone']['enabled'])) {
// single zone and enabled
$enabled = true;
} else {
// possible more zones, traverse items
foreach ($config['OPNsense']['captiveportal']['zones']['zone'] as $zone) {
if (!empty($zone['enabled'])) {
$enabled = true;
}
}
}
if ($enabled) {
$services[] = array(
'pidfile' => '/var/run/lighttpd-api-dispatcher.pid',
'description' => gettext('Captive Portal'),
'configd' => array(
'restart' => array('captiveportal restart'),
'start' => array('captiveportal start'),
'stop' => array('captiveportal stop'),
),
'name' => 'captiveportal',
);
}
}
$services[] = array(
'description' => gettext('System Configuration Daemon'),
'pidfile' => '/var/run/configd.pid',
'mwexec' => array(
'restart' => array('/usr/local/etc/rc.d/configd restart'),
'start' => array('/usr/local/etc/rc.d/configd start'),
'stop' => array('/usr/local/etc/rc.d/configd stop'),
),
'name' => 'configd',
'locked' => true,
);
$services[] = array(
'description' => gettext('Users and Groups'),
'php' => array(
"restart" => array('system_login_configure')
),
'nocheck' => true,
'name' => 'login',
);
$services[] = array(
'description' => gettext('System routing'),
'php' => array(
"restart" => array('system_routing_configure')
),
'nocheck' => true,
'name' => 'routing',
);
$services[] = array(
'description' => gettext('System tunables'),
'php' => array(
"restart" => array('system_sysctl_configure')
),
'nocheck' => true,
'name' => 'sysctl',
);
$services[] = array(
'description' => gettext('Cron'),
'php' => array(
'start' => ['system_cron_configure'],
'restart' => ['system_cron_configure'],
),
'pidfile' => '/var/run/cron.pid',
'name' => 'cron',
);
$services[] = array(
'description' => gettext('Syslog-ng Daemon'),
'php' => array(
'stop' => array('system_syslog_stop'),
'start' => array('system_syslog_start'),
'restart' => array('system_syslog_start')
),
'pidfile' => '/var/run/syslog-ng.pid',
'name' => 'syslog-ng',
);
return $services;
}
function core_devices()
{
$devices = [];
$bridge_names = [];
foreach (config_read_array('bridges', 'bridged') as $dev) {
$bridge_names[$dev['bridgeif']] = [
'descr' => sprintf('%s (%s)', $dev['bridgeif'], $dev['descr']),
'ifdescr' => sprintf('%s', $dev['descr']),
'name' => $dev['bridgeif'],
];
}
$devices[] = [
'function' => 'interfaces_bridge_configure',
'names' => $bridge_names,
'pattern' => '^bridge',
'volatile' => true,
'type' => 'bridge',
];
$gif_names = [];
foreach (config_read_array('gifs', 'gif') as $dev) {
$gif_names[$dev['gifif']] = [
'descr' => sprintf('%s %s (%s)', $dev['gifif'], $dev['remote-addr'], $dev['descr']),
'ifdescr' => sprintf('%s', $dev['descr']),
'name' => $dev['gifif'],
];
}
$devices[] = [
'function' => 'interfaces_gif_configure',
'configurable' => false,
'names' => $gif_names,
'pattern' => '^gif',
'volatile' => true,
'type' => 'gif',
];
$gre_names = [];
foreach (config_read_array('gres', 'gre') as $dev) {
$gre_names[$dev['greif']] = [
'descr' => sprintf('%s %s (%s)', $dev['greif'], $dev['remote-addr'], $dev['descr']),
'ifdescr' => sprintf('%s', $dev['descr']),
'name' => $dev['greif'],
];
}
$devices[] = [
'function' => 'interfaces_gre_configure',
'configurable' => false,
'names' => $gre_names,
'pattern' => '^gre',
'volatile' => true,
'type' => 'gre',
];
$lagg_names = [];
foreach (config_read_array('laggs', 'lagg') as $dev) {
$lagg_names[$dev['laggif']] = [
'descr' => sprintf('%s (%s)', $dev['laggif'], $dev['descr']),
'ifdescr' => sprintf('%s', $dev['descr']),
'exclude' => explode(',', $dev['members']),
'name' => $dev['laggif'],
];
}
$devices[] = [
'names' => $lagg_names,
'pattern' => '^lagg',
'volatile' => true,
'type' => 'lagg',
];
$ppp_names = [];
foreach (config_read_array('ppps', 'ppp') as $dev) {
$ppp_names[$dev['if']] = [
'descr' => sprintf('%s (%s) - %s %s', $dev['if'], $dev['ports'], $dev['descr'] ?? '', $dev['username']),
'ifdescr' => sprintf('%s', $dev['descr'] ?? ''),
'ipaddr' => $dev['type'],
'name' => $dev['if'],
];
}
$devices[] = [
'pattern' => '^cua|^l2tp|^ppp|^pptp', /* XXX ^cua likely doesn't match since it's a /dev node */
'names' => $ppp_names,
'volatile' => true,
'type' => 'ppp',
];
$vlan_names = [];
foreach (config_read_array('vlans', 'vlan') as $dev) {
$vlan_names[$dev['vlanif']] = [
'descr' => sprintf(gettext('%s %s (Parent: %s, Tag: %s)'), $dev['vlanif'], $dev['descr'], $dev['if'], $dev['tag']),
'ifdescr' => sprintf('%s', $dev['descr']),
'name' => $dev['vlanif'],
];
}
$devices[] = [
'pattern' => '_vlan|^vlan|^qinq',
'names' => $vlan_names,
'volatile' => true,
'type' => 'vlan',
];
$wlan_names = [];
foreach (config_read_array('wireless', 'clone') as $dev) {
$wlan_names[$dev['cloneif']] = [
'descr' => sprintf('%s (%s)', $dev['cloneif'], $dev['descr']),
'ifdescr' => sprintf('%s', $dev['descr']),
'name' => $dev['cloneif'],
];
}
/* also need to find implied clones that do not have explicit cloneif set */
foreach (legacy_config_get_interfaces() as $id => $conf) {
if (isset($conf['wireless']) && !isset($wlan_names[$conf['if']])) {
$wlan_names[$conf['if']] = [
'descr' => sprintf('%s (%s)', $conf['if'], gettext('wireless clone')),
'ifdescr' => gettext('wireless clone'),
'name' => $conf['if'],
];
$realif = get_real_interface($id);
if ($realif == $conf['if']) {
continue;
}
/* return both implicit and explicit clone if implicit clone was given */
$wlan_names[$realif] = [
'descr' => sprintf('%s (%s)', $realif, gettext('wireless clone')),
'ifdescr' => gettext('wireless clone'),
'name' => $realif,
];
}
}
$devices[] = [
'function' => 'interfaces_wlan_clone',
'names' => $wlan_names,
'pattern' => '_wlan',
'volatile' => true,
'type' => 'wlan',
];
/* historic handling of tunnel devices and other unstable things */
$devices[] = ['pattern' => '_stf|^tap|^tun|^ue', 'volatile' => true];
return $devices;
}
function core_cron()
{
global $config;
$jobs = array();
$jobs[]['autocron'] = array('/usr/local/sbin/configctl -d syslog archive', '1');
$jobs[]['autocron'] = array('/usr/local/sbin/expiretable -v -t 3600 sshlockout', '2');
$jobs[]['autocron'] = array('/usr/local/sbin/expiretable -v -t 3600 virusprot', '3');
$jobs[]['autocron'] = array('/usr/local/sbin/ping_hosts.sh', '*/4');
$jobs[]['autocron'] = array('/usr/local/sbin/configctl -d firmware changelog cron', '0', '22');
/**
* rrd graph collector, only schedule execution when enabled
*/
if (isset($config['rrd']['enable'])) {
$jobs[]['autocron'] = [
'/usr/local/bin/flock -n -E 0 -o /tmp/updaterrd.lock /usr/local/opnsense/scripts/health/updaterrd.php',
'*'
];
}
if (!empty($config['system']['rrdbackup']) && $config['system']['rrdbackup'] > 0) {
$jobs[]['autocron'] = array(
'/usr/local/etc/rc.syshook.d/backup/20-rrd',
'0',
'*/' . $config['system']['rrdbackup']
);
}
if (!empty($config['system']['dhcpbackup']) && $config['system']['dhcpbackup'] > 0) {
$jobs[]['autocron'] = array(
'/usr/local/etc/rc.syshook.d/backup/20-dhcpleases',
'0',
'*/' . $config['system']['dhcpbackup']
);
}
if (!empty($config['system']['netflowbackup']) && $config['system']['netflowbackup'] > 0) {
$jobs[]['autocron'] = array(
'/usr/local/etc/rc.syshook.d/backup/20-netflow',
'0',
'*/' . $config['system']['netflowbackup']
);
}
if (!empty($config['system']['captiveportalbackup']) && $config['system']['captiveportalbackup'] > 0) {
$jobs[]['autocron'] = array(
'/usr/local/etc/rc.syshook.d/backup/20-captiveportal',
'0',
'*/' . $config['system']['captiveportalbackup']
);
}
foreach ((new OPNsense\Backup\BackupFactory())->listProviders() as $classname => $provider) {
if ($provider['handle']->isEnabled()) {
$jobs[]['autocron'] = array('/usr/local/sbin/configctl -d system remote backup 3600', 0, 1);
break;
}
}
if (!empty((string)(new OPNsense\Trust\General())->fetch_crls)) {
$jobs[]['autocron'] = array('/usr/local/sbin/configctl -d system trust download_crls', '1');
}
return $jobs;
}
function core_syslog()
{
$logfacilities = [];
$logfacilities['audit'] = ['facility' => ['audit']];
$logfacilities['configd'] = ['facility' => ['configd.py']];
$logfacilities['dhcpd'] = ['facility' => ['dhcpd']];
$logfacilities['lighttpd'] = ['facility' => ['lighttpd']];
$logfacilities['pkg'] = ['facility' => ['pkg', 'pkg-static']];
$logfacilities['portalauth'] = ['facility' => ['captiveportal']];
$logfacilities['ppps'] = ['facility' => ['ppp']];
$logfacilities['resolver'] = ['facility' => ['unbound']];
$logfacilities['routing'] = ['facility' => ['routed', 'olsrd', 'zebra', 'ospfd', 'bgpd', 'miniupnpd']];
$logfacilities['wireless'] = ['facility' => ['hostapd']];
return $logfacilities;
}
/**
* sync configuration via xmlrpc
* @return array
*/
function core_xmlrpc_sync()
{
$result = array();
$result[] = array(
'description' => gettext('Users and Groups'),
'help' => gettext('Synchronize the users and groups over to the other HA host.'),
'section' => 'system.user,system.group',
'id' => 'users',
'services' => ["login"],
);
$result[] = array(
'description' => gettext('Auth Servers'),
'help' => gettext('Synchronize the authentication servers (e.g. LDAP, RADIUS) over to the other HA host.'),
'section' => 'system.authserver',
'id' => 'authservers',
'services' => ["login"],
);
$result[] = array(
'description' => gettext('Certificates'),
'help' => gettext('Synchronize the Certificate Authorities, Certificates, and Certificate Revocation Lists over to the other HA host.'),
'section' => 'cert,ca,crl',
'id' => 'certs',
);
$result[] = array(
'description' => gettext('DHCPD'),
'help' => gettext('Synchronize the DHCP Server settings over to the other HA host. This only applies to DHCP for IPv4.'),
'section' => 'dhcpd',
'id' => 'dhcpd',
'services' => ["dhcpd"],
);
$result[] = array(
'description' => gettext('DHCPDv6'),
'help' => gettext('Synchronize DHCPv6 including router advertisements.'),
'section' => 'dhcpdv6',
'id' => 'dhcpdv6',
'services' => ["dhcpdv6", "radvd"],
);
$result[] = array(
'description' => gettext('Virtual IPs'),
'help' => gettext('Synchronize the CARP Virtual IPs to the other HA host.'),
'section' => 'virtualip',
'id' => 'virtualip',
);
$result[] = array(
'description' => gettext('Static Routes'),
'help' => gettext('Synchronize the Static Route configuration and Gateways to the other HA host.'),
'section' => 'staticroutes,gateways,OPNsense.Gateways',
'id' => 'staticroutes',
'services' => ["routing", "dpinger"],
);
$result[] = array(
'description' => gettext('Network Time'),
'section' => 'ntpd,system.timeservers',
'id' => 'ntpd',
'services' => ["ntpd"],
);
$result[] = array(
'description' => gettext('Syslog'),
'section' => 'syslog,OPNsense.Syslog',
'id' => 'syslog',
'services' => ["syslogd"],
);
$result[] = array(
'description' => gettext('Cron'),
'section' => 'OPNsense.cron',
'id' => 'cron',
'services' => ["cron"],
);
$result[] = array(
'description' => gettext('System Tunables'),
'section' => 'sysctl',
'id' => 'sysctl',
'services' => ["sysctl"],
);
$result[] = array(
'description' => gettext('Web GUI'),
'section' => 'system.webgui',
'id' => 'webgui',
'services' => ["webgui"],
);
$result[] = array(
'description' => gettext('Backup - Google Drive'),
'section' => 'system.remotebackup',
'id' => 'remotebackup'
);
return $result;
}
function core_configure()
{
return [
/* XXX these are all specialized and try to avoid extra script use */
'dns_reload' => ['system_resolver_configure'],
'firmware_reload' => ['system_firmware_configure'],
'route_reload' => ['system_routing_configure:2'],
'syslog_reset' => ['system_syslog_reset'],
'trust_reload' => ['system_trust_configure'],
'user_changed' => ['core_user_changed_groups:2'],
'crl' => ['core_trust_crl'],
];
}
function core_run()
{
return [
'host_routes' => 'system_resolvconf_host_routes',
];
}
/**
* user changed event, synchronize attached system groups for requested user
*/
function core_user_changed_groups($unused, $username)
{
global $config;
if (is_array($config['system']['user'])) {
foreach ($config['system']['user'] as $user) {
if ($user['name'] == $username && (!empty($user['shell']) || $user['uid'] == 0)) {
exec("/usr/bin/groups " . escapeshellarg($username) . ' 2>/dev/null', $out, $ret);
$current_groups = [];
if (!$ret) {
$current_groups = explode(" ", $out[0]);
}
foreach ($config['system']['group'] as $group) {
$in_group = false;
foreach (!empty($group['member']) ? $group['member'] : [] as $grp) {
$in_group = $in_group || in_array($user['uid'], explode(',', $grp));
}
$to_remove = in_array($group['name'], $current_groups) && !$in_group;
$to_add = !in_array($group['name'], $current_groups) && $in_group;
if ($to_remove || $to_add) {
local_group_set($group);
}
}
}
}
}
}
/**
* When CRL's are deployed locally, we need to flush them to disk.
* If at some point in time it turns out this event is too slow, we should split system_trust_configure() and possibly
* certctl.py to only process CRL's on demand.
*/
function core_trust_crl()
{
$trust = new \OPNsense\Trust\General();
if (!empty((string)$trust->install_crls)) {
system_trust_configure();
}
}