';
-
-$apps_enabled = dbFetchRows('SELECT * from `applications` WHERE `device_id` = ? ORDER BY app_type', array($device['device_id']));
-if (count($apps_enabled)) {
- foreach ($apps_enabled as $application) {
- $app_enabled[] = $application['app_type'];
- }
-}
-
-echo "
';
+echo '';
+?>
+
+
diff --git a/html/pages/device/edit/modules.inc.php b/html/pages/device/edit/modules.inc.php
index 42e176a685..157df21684 100644
--- a/html/pages/device/edit/modules.inc.php
+++ b/html/pages/device/edit/modules.inc.php
@@ -77,7 +77,8 @@ foreach ($poller_modules as $module => $module_status) {
');
- echo('');
+ echo '';
echo('
|
@@ -159,7 +160,8 @@ foreach ($discovery_modules as $module => $module_status) {
');
- echo('');
+ echo '';
echo('
|
diff --git a/includes/defaults.inc.php b/includes/defaults.inc.php
index 520cc9f6c7..4162618d4f 100644
--- a/includes/defaults.inc.php
+++ b/includes/defaults.inc.php
@@ -769,6 +769,7 @@ $config['discovery_modules']['vmware-vminfo'] = 0;
$config['discovery_modules']['libvirt-vminfo'] = 0;
$config['discovery_modules']['toner'] = 0;
$config['discovery_modules']['ucd-diskio'] = 1;
+$config['discovery_modules']['applications'] = 0;
$config['discovery_modules']['services'] = 1;
$config['discovery_modules']['stp'] = 1;
$config['discovery_modules']['ntp'] = 1;
diff --git a/includes/definitions/freebsd.yaml b/includes/definitions/freebsd.yaml
index b130df95f8..adc2d6ecf1 100644
--- a/includes/definitions/freebsd.yaml
+++ b/includes/definitions/freebsd.yaml
@@ -6,3 +6,5 @@ processor_stacked: 1
over:
- { graph: device_processor, text: 'Processor Usage' }
- { graph: device_ucd_memory, text: 'Memory Usage' }
+discovery_modules:
+ applications: 1
diff --git a/includes/definitions/linux.yaml b/includes/definitions/linux.yaml
index b89df4fade..d7b8683aa1 100644
--- a/includes/definitions/linux.yaml
+++ b/includes/definitions/linux.yaml
@@ -15,6 +15,7 @@ poller_modules:
ospf: 0
stp: 0
discovery_modules:
+ applications: 1
bgp-peers: 0
stp: 0
vmware-vminfo: 1
diff --git a/includes/discovery/applications.inc.php b/includes/discovery/applications.inc.php
new file mode 100644
index 0000000000..87b20c82fc
--- /dev/null
+++ b/includes/discovery/applications.inc.php
@@ -0,0 +1,120 @@
+.
+ *
+ * @package LibreNMS
+ * @link http://librenms.org
+ * @copyright 2016 Tony Murray
+ * @author Tony Murray
+ */
+
+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
+);
diff --git a/sql-schema/181.sql b/sql-schema/181.sql
new file mode 100644
index 0000000000..766b2a66b5
--- /dev/null
+++ b/sql-schema/181.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `applications` CHANGE `app_state_prev` `app_state_prev` VARCHAR(32) NULL;
+ALTER TABLE `applications` ADD `discovered` TINYINT NOT NULL DEFAULT '0' AFTER `app_state`;
+ALTER IGNORE TABLE `applications` ADD UNIQUE `unique_index`(`device_id`, `app_type`);