diff --git a/html/includes/forms/application-update.inc.php b/html/includes/forms/application-update.inc.php new file mode 100644 index 0000000000..06fc631915 --- /dev/null +++ b/html/includes/forms/application-update.inc.php @@ -0,0 +1,56 @@ +. + * + * @package LibreNMS + * @link http://librenms.org + * @copyright 2017 Tony Murray + * @author Tony Murray + */ + +if (is_admin() === false) { + $status = array('status' => 1, 'message' => 'You need to be admin'); +} else { + $device_id = $_POST['device_id']; + $app = $_POST['application']; + + if (!isset($app) && validate_device_id($device_id) === false) { + $status = array('status' => 1, 'message' => 'Error with data'); + } else { + $status = array('status' => 1, 'message' => 'Database update failed'); + if ($_POST['state'] == 'true') { + $update = array( + 'device_id' => $device_id, + 'app_type' => $app, + 'app_status' => '', + 'app_instance' => '' + ); + if (dbInsert($update, 'applications')) { + log_event("Application enabled by user: $app", $device_id, 'application', 1); + $status = array('status' => 0, 'message' => 'Application enabled'); + } + } else { + if (dbDelete('applications', '`device_id`=? AND `app_type`=?', array($device_id, $app))) { + log_event("Application disabled by user: $app", $device_id, 'application', 3); + $status = array('status' => 0, 'message' => 'Application disabled'); + } + } + } +} +header('Content-Type: application/json'); +echo _json_encode($status); diff --git a/html/pages/device/edit/apps.inc.php b/html/pages/device/edit/apps.inc.php index 1a06b4a46b..69e0122403 100644 --- a/html/pages/device/edit/apps.inc.php +++ b/html/pages/device/edit/apps.inc.php @@ -2,95 +2,68 @@ $device['device_id'], 'app_type' => $app, 'app_status' => '', 'app_instance' => ''), 'applications'); - } - } - - if ($updated) { - print_message('Applications updated!'); - } else { - print_message('No changes.'); - } -}//end if - -// Show list of apps with checkboxes -echo '
'; - -$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 "
-
-
- - - - - - - "; - -$row = 1; +echo '
    '; foreach ($applications as $app) { - if (is_integer($row / 2)) { - $row_colour = $list_colour_a; - } else { - $row_colour = $list_colour_b; + $modifiers = ''; + $app_text = nicecase($app); + // check if the app exists in the enable apps array and check if it was automatically enabled + if (isset($enabled_apps[$app])) { + $modifiers = ' checked'; + if ($enabled_apps[$app]) { + $app_text .= ' (Discovered)'; + $modifiers .= ' disabled'; + } } - echo "
"; - echo ' '; - echo ' '; - echo ' - '; - - $row++; + echo '
  • '; + echo ""; + echo ' ' . $app_text . ''; + echo '
  • '; } -echo '
    EnableApplication
    '; - echo ' "; - echo ' '.nicecase($app).'
    '; -echo '
    -
    - -
    -
    -'; -echo '
    '; -echo '
    '; -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`);