mirror of
https://github.com/librenms/librenms.git
synced 2024-10-07 16:52:45 +00:00
121 lines
3.6 KiB
PHP
121 lines
3.6 KiB
PHP
<?php
|
|
/**
|
|
* applications.inc.php
|
|
*
|
|
* Discover applications
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* @package LibreNMS
|
|
* @link http://librenms.org
|
|
* @copyright 2016 Tony Murray
|
|
* @author Tony Murray <murraytony@gmail.com>
|
|
*/
|
|
|
|
echo "\nApplications: ";
|
|
|
|
// fetch applications from the client
|
|
$results = snmpwalk_cache_oid($device, 'nsExtendStatus', array(), 'NET-SNMP-EXTEND-MIB');
|
|
|
|
// Load our list of available applications
|
|
$applications = array();
|
|
if ($results) {
|
|
foreach (glob($config['install_dir'] . '/includes/polling/applications/*.inc.php') as $file) {
|
|
$name = basename($file, '.inc.php');
|
|
$applications[$name] = $name;
|
|
}
|
|
|
|
// fix applications that don't match their snmp extend name
|
|
$applications['dhcpstats'] = 'dhcp-stats';
|
|
$applications['fbsdnfsclient'] = 'fbsd-nfs-client';
|
|
$applications['fbsdnfsserver'] = 'fbsd-nfs-server';
|
|
$applications['mailq'] = 'postfix';
|
|
$applications['osupdate'] = 'os-updates';
|
|
$applications['phpfpmsp'] = 'php-fpm';
|
|
$applications['postfixdetailed'] = 'postfix';
|
|
}
|
|
|
|
d_echo(PHP_EOL . 'Available: ' . implode(', ', array_keys($applications)) . PHP_EOL);
|
|
d_echo('Checking for: ' . implode(', ', array_keys($results)) . PHP_EOL);
|
|
|
|
// Generate a list of enabled apps and a list of all discovered apps from the db
|
|
list($enabled_apps, $discovered_apps) = array_reduce(dbFetchRows(
|
|
'SELECT `app_type`,`discovered` FROM `applications` WHERE `device_id`=? ORDER BY `app_type`',
|
|
array($device['device_id'])
|
|
), function ($result, $app) {
|
|
$result[0][] = $app['app_type'];
|
|
if ($app['discovered']) {
|
|
$result[1][] = $app['app_type'];
|
|
}
|
|
return $result;
|
|
}, array(array(), array()));
|
|
|
|
|
|
// Enable applications
|
|
$current_apps = array();
|
|
foreach ($results as $extend => $result) {
|
|
if (isset($applications[$extend])) {
|
|
$app = $applications[$extend];
|
|
$current_apps[] = $app;
|
|
|
|
if (in_array($app, $enabled_apps)) {
|
|
echo '.';
|
|
} else {
|
|
dbInsert(array(
|
|
'device_id' => $device['device_id'],
|
|
'app_type' => $app,
|
|
'discovered' => 1,
|
|
'app_status' => '',
|
|
'app_instance' => ''
|
|
), 'applications');
|
|
|
|
echo '+';
|
|
log_event("Application enabled by discovery: $app", $device, 'application', 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
// remove non-existing apps
|
|
$apps_to_remove = array_diff($discovered_apps, $current_apps);
|
|
$num = count($apps_to_remove);
|
|
if ($num > 0) {
|
|
echo str_repeat('-', $num);
|
|
$vars = $apps_to_remove;
|
|
array_unshift($vars, $device['device_id']);
|
|
dbDelete(
|
|
'applications',
|
|
'`device_id`=? AND `app_type` IN (' . implode(',', array_fill(0, $num, '?')) . ')',
|
|
$vars
|
|
);
|
|
foreach ($apps_to_remove as $app) {
|
|
log_event("Application disabled by discovery: $app", $device, 'application', 3);
|
|
}
|
|
}
|
|
|
|
echo PHP_EOL;
|
|
|
|
unset(
|
|
$applications,
|
|
$enabled_apps,
|
|
$discovered_apps,
|
|
$current_apps,
|
|
$apps_to_remove,
|
|
$results,
|
|
$file,
|
|
$name,
|
|
$extend,
|
|
$app,
|
|
$num
|
|
);
|