__('Delete'), 2 => __('Disable'), 3 => __('Enable'), ); if ($config['poller_id'] == 1) { $poller_actions += array(4 =>__('Full Sync')); } $poller_status = array( 0 => '
' . __('New/Idle') . '
', 1 => '
' . __('Running') . '
', 2 => '
' . __('Idle') . '
', 3 => '
' . __('Down') . '
', 4 => '
' . __('Disabled') . '
', 5 => '
' . __('Recovering') . '
', 6 => '
' . __('Heartbeat') . '
', ); /* file: pollers.php, action: edit */ $fields_poller_edit = array( 'spacer0' => array( 'method' => 'spacer', 'friendly_name' => __('Data Collector Information'), ), 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('The primary name for this Data Collector.'), 'value' => '|arg1:name|', 'size' => '50', 'default' => __('New Data Collector'), 'max_length' => '100' ), 'hostname' => array( 'method' => 'textbox', 'friendly_name' => __('Data Collector Hostname'), 'description' => __('The hostname for Data Collector. It may have to be a Fully Qualified Domain name for the remote Pollers to contact it for activities such as re-indexing, Real-time graphing, etc.'), 'value' => '|arg1:hostname|', 'size' => '50', 'default' => '', 'max_length' => '100' ), 'timezone' => array( 'method' => 'drop_callback', 'friendly_name' => __('TimeZone'), 'description' => __('The TimeZone for the Data Collector.'), 'sql' => 'SELECT Name AS id, Name AS name FROM mysql.time_zone_name ORDER BY name', 'action' => 'ajax_tz', 'id' => '|arg1:timezone|', 'value' => '|arg1:timezone|' ), 'notes' => array( 'method' => 'textarea', 'friendly_name' => __('Notes'), 'description' => __('Notes for this Data Collectors Database.'), 'value' => '|arg1:notes|', 'textarea_rows' => 4, 'textarea_cols' => 50 ), 'spacer_collection' => array( 'method' => 'spacer', 'friendly_name' => __('Collection Settings'), ), 'processes' => array( 'method' => 'textbox', 'friendly_name' => __('Processes'), 'description' => __('The number of Data Collector processes to use to spawn.'), 'value' => '|arg1:processes|', 'size' => '10', 'default' => read_config_option('concurrent_processes'), 'max_length' => '4' ), 'threads' => array( 'method' => 'textbox', 'friendly_name' => __('Threads'), 'description' => __('The number of Spine Threads to use per Data Collector process.'), 'value' => '|arg1:threads|', 'size' => '10', 'default' => read_config_option('max_threads'), 'max_length' => '4' ), 'sync_interval' => array( 'method' => 'drop_array', 'friendly_name' => __('Sync Interval'), 'description' => __('The polling sync interval in use. This setting will affect how often this poller is checked and updated.'), 'value' => '|arg1:sync_interval|', 'default' => read_config_option('poller_sync_interval'), 'array' => $poller_sync_intervals, ), 'spacer_remotedb' => array( 'method' => 'spacer', 'friendly_name' => __('Remote Database Connection'), ), 'dbhost' => array( 'method' => 'textbox', 'friendly_name' => __('Hostname'), 'description' => __('The hostname for the remote database server.'), 'value' => '|arg1:dbhost|', 'size' => '50', 'default' => '', 'max_length' => '100' ), 'dbdefault' => array( 'method' => 'textbox', 'friendly_name' => __('Remote Database Name'), 'description' => __('The name of the remote database.'), 'value' => '|arg1:dbdefault|', 'size' => '20', 'default' => $database_default, 'max_length' => '20' ), 'dbuser' => array( 'method' => 'textbox', 'friendly_name' => __('Remote Database User'), 'description' => __('The user name to use to connect to the remote database.'), 'value' => '|arg1:dbuser|', 'size' => '20', 'default' => $database_username, 'max_length' => '20' ), 'dbpass' => array( 'method' => 'textbox_password', 'friendly_name' => __('Remote Database Password'), 'description' => __('The user password to use to connect to the remote database.'), 'value' => '|arg1:dbpass|', 'size' => '40', 'default' => $database_password, 'max_length' => '64' ), 'dbport' => array( 'method' => 'textbox', 'friendly_name' => __('Remote Database Port'), 'description' => __('The TCP port to use to connect to the remote database.'), 'value' => '|arg1:dbport|', 'size' => '5', 'default' => $database_port, 'max_length' => '5' ), 'dbssl' => array( 'method' => 'checkbox', 'friendly_name' => __('Remote Database SSL'), 'description' => __('If the remote database uses SSL to connect, check the checkbox below.'), 'value' => '|arg1:dbssl|', 'default' => $database_ssl ? 'on':'' ), 'dbsslkey' => array( 'method' => 'textbox', 'friendly_name' => __('Remote Database SSL Key'), 'description' => __('The file holding the SSL Key to use to connect to the remote database.'), 'value' => '|arg1:dbsslkey|', 'size' => '50', 'default' => $database_ssl_key, 'max_length' => '255' ), 'dbsslcert' => array( 'method' => 'textbox', 'friendly_name' => __('Remote Database SSL Certificate'), 'description' => __('The file holding the SSL Certificate to use to connect to the remote database.'), 'value' => '|arg1:dbsslcert|', 'size' => '50', 'default' => $database_ssl_cert, 'max_length' => '255' ), 'dbsslca' => array( 'method' => 'textbox', 'friendly_name' => __('Remote Database SSL Authority'), 'description' => __('The file holding the SSL Certificate Authority to use to connect to the remote database.'), 'value' => '|arg1:dbsslca|', 'size' => '50', 'default' => $database_ssl_ca, 'max_length' => '255' ), 'id' => array( 'method' => 'hidden', 'value' => '|arg1:id|', ), 'save_component_poller' => array( 'method' => 'hidden', 'value' => '1' ) ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'ajax_tz': print json_encode(db_fetch_assoc_prepared('SELECT Name AS label, Name AS `value` FROM mysql.time_zone_name WHERE Name LIKE ? ORDER BY Name LIMIT ' . read_config_option('autocomplete_rows'), array('%' . get_nfilter_request_var('term') . '%'))); break; case 'ping': test_database_connection(); break; case 'edit': top_header(); poller_edit(); bottom_footer(); break; default: top_header(); pollers(); bottom_footer(); break; } /* -------------------------- Global Form Functions -------------------------- */ /* -------------------------- The Save Function -------------------------- */ function form_save() { if (isset_request_var('save_component_poller')) { // Common data $save['id'] = get_filter_request_var('id'); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save['hostname'] = form_input_validate(get_nfilter_request_var('hostname'), 'hostname', '', false, 3); $save['timezone'] = form_input_validate(get_nfilter_request_var('timezone'), 'timezone', '', false, 3); $save['notes'] = form_input_validate(get_nfilter_request_var('notes'), 'notes', '', true, 3); // Process settings $save['processes'] = form_input_validate(get_nfilter_request_var('processes'), 'processes', '^[0-9]+$', false, 3); $save['threads'] = form_input_validate(get_nfilter_request_var('threads'), 'threads', '^[0-9]+$', false, 3); if ($save['id'] != 1) { $save['sync_interval'] = form_input_validate(get_nfilter_request_var('sync_interval'), 'sync_interval', '^[0-9]+$', false, 3); // Database settings $save['dbdefault'] = form_input_validate(get_nfilter_request_var('dbdefault'), 'dbdefault', '', true, 3); $save['dbhost'] = form_input_validate(get_nfilter_request_var('dbhost'), 'dbhost', '', true, 3); $save['dbuser'] = form_input_validate(get_nfilter_request_var('dbuser'), 'dbuser', '', true, 3); $save['dbpass'] = form_input_validate(get_nfilter_request_var('dbpass'), 'dbpass', '', true, 3); $save['dbport'] = form_input_validate(get_nfilter_request_var('dbport'), 'dbport', '', true, 3); $save['dbssl'] = isset_request_var('dbssl') ? 'on':''; $save['dbsslkey'] = form_input_validate(get_nfilter_request_var('dbsslkey'), 'dbsslkey', '', true, 3); $save['dbsslcert'] = form_input_validate(get_nfilter_request_var('dbsslcert'), 'dbsslcert', '', true, 3); $save['dbsslca'] = form_input_validate(get_nfilter_request_var('dbsslca'), 'dbsslca', '', true, 3); } // Check for duplicate hostname $error = false; if (poller_check_duplicate_poller_id($save['id'], $save['hostname'], 'hostname')) { raise_message('dupe_hostname', __('You have already used this hostname \'%s\'. Please enter a non-duplicate hostname.', $save['hostname']), MESSAGE_LEVEL_ERROR); $error = true; } if (isset($save['dbhost'])) { if (poller_check_duplicate_poller_id($save['id'], $save['dbhost'], 'dbhost')) { raise_message('dupe_dbhost', __('You have already used this database hostname \'%s\'. Please enter a non-duplicate database hostname.', $save['hostname']), MESSAGE_LEVEL_ERROR); $error = true; } } if (isset($save['dbhost']) && $save['dbhost'] == 'localhost' && $save['id'] > 1) { raise_message('poller_dbhost'); } elseif ($save['id'] > 1 && poller_host_duplicate($save['id'], $save['dbhost'])) { raise_message('poller_nodupe'); } elseif (!is_error_message() && $error == false) { $poller_id = sql_save($save, 'poller'); if ($poller_id) { raise_message(1); } else { raise_message(2); } } header('Location: pollers.php?header=false&action=edit&id=' . (empty($poller_id) ? get_nfilter_request_var('id') : $poller_id)); } } function poller_check_duplicate_poller_id($poller_id, $hostname, $column) { $ip_addresses = array(); $ip_hostnames = array(); if (is_ipaddress($hostname)) { $address = gethostbyaddr($hostname); if ($address != $hostname) { $ip_hostnames[$address] = $address; } else { $ip_addresses[$address] = $address; } $ip_addresses[$hostname] = $hostname; } else { $addresses = dns_get_record($hostname); $ip = gethostbyname($hostname); if ($ip != $hostname) { $ip_addresses[$ip] = $ip; } $ip_hostnames[$hostname] = $hostname; if (sizeof($addresses)) { foreach($addresses as $address) { if (isset($address['target'])) { $ip_hostnames[$address['host']] = $address['host']; } if (isset($address['host'])) { $ip_hostnames[$address['host']] = $address['host']; } if (isset($address['ip'])) { $ip_addresses[$address['ip']] = $address['ip']; } } } } $sql_where1 = ''; if (sizeof($ip_addresses)) { $sql_where1 = "$column IN ('" . implode("','", $ip_addresses) . "')"; } $sql_where2 = ''; if (sizeof($ip_hostnames)) { foreach($ip_hostnames as $host) { $parts = explode('.', $host); $sql_where2 .= ($sql_where2 != '' ? ' OR ':' OR (') . "($column = '$parts[0]' OR $column LIKE '$parts[0].%' OR $column = '$host')"; } $sql_where2 .= ')'; } $duplicate = db_fetch_cell_prepared("SELECT id FROM poller WHERE id != ? AND ($sql_where1 $sql_where2)", array($poller_id)); if (empty($duplicate)) { return false; } else { return true; } } function poller_host_duplicate($poller_id, $host) { if ($host == 'localhost') { return true; } else { return db_fetch_cell_prepared('SELECT COUNT(*) FROM poller WHERE dbhost LIKE "' . $host . '%" AND id != ?', array($poller_id)); } } function form_actions() { global $poller_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { // delete db_execute('DELETE FROM poller WHERE ' . array_to_sql_or($selected_items, 'id')); db_execute('UPDATE host SET poller_id=1 WHERE ' . array_to_sql_or($selected_items, 'poller_id')); db_execute('UPDATE automation_networks SET poller_id=1 WHERE ' . array_to_sql_or($selected_items, 'poller_id')); db_execute('UPDATE automation_processes SET poller_id=1 WHERE ' . array_to_sql_or($selected_items, 'poller_id')); db_execute('UPDATE poller_command SET poller_id=1 WHERE ' . array_to_sql_or($selected_items, 'poller_id')); db_execute('UPDATE poller_item SET poller_id=1 WHERE ' . array_to_sql_or($selected_items, 'poller_id')); db_execute('UPDATE poller_output_realtime SET poller_id=1 WHERE ' . array_to_sql_or($selected_items, 'poller_id')); db_execute('UPDATE poller_time SET poller_id=1 WHERE ' . array_to_sql_or($selected_items, 'poller_id')); cacti_log('NOTE: The poller(s) with the id(s): ' . implode(',', $selected_items) . ' deleted by user ' . $_SESSION['sess_user_id'], false, 'WEBUI'); } elseif (get_request_var('drp_action') == '2') { // disable db_execute('UPDATE poller SET disabled="on" WHERE ' . array_to_sql_or($selected_items, 'id')); cacti_log('NOTE: The poller(s) with the id(s): ' . implode(',', $selected_items) . ' disabled by user ' . $_SESSION['sess_user_id'], false, 'WEBUI'); } elseif (get_request_var('drp_action') == '3') { // enable db_execute('UPDATE poller SET disabled="" WHERE ' . array_to_sql_or($selected_items, 'id')); cacti_log('NOTE: The poller(s) with the id(s): ' . implode(',', $selected_items) . ' enabled by user ' . $_SESSION['sess_user_id'], false, 'WEBUI'); } elseif (get_request_var('drp_action') == '4') { // full sync session_write_close(); // Save&Close the session so the Interface is still responsive $success = array(); $failed = array(); $ids = array(); foreach($selected_items as $item) { // Operation not allowed on the main poller if ($item == 1) { continue; } $ids[] = $item; $poller = db_fetch_row_prepared('SELECT * FROM poller WHERE id = ?', array($item)); if ($poller['dbhost'] == 'localhost') { raise_message('poller_dbhost'); continue; } elseif ($item == 1) { raise_message('poller_nomain'); continue; } else { if (replicate_out($item)) { $success[] = $item; db_execute_prepared('UPDATE poller SET last_sync = NOW() WHERE id = ?', array($item)); } else { $failed[] = $item; } } } session_start(); // Start the session again if (sizeof($failed)) { cacti_log('WARNING: Some selected Remote Data Collectors in [' . implode(', ', $ids) . '] failed synchronization by user ' . get_username($_SESSION['sess_user_id']) . ', Successful/Failed[' . sizeof($success) . '/' . sizeof($failed) . ']. See log for details.', false, 'WEBUI'); } else { cacti_log('NOTE: All selected Remote Data Collectors in [' . implode(', ', $ids) . '] synchronized correctly by user ' . get_username($_SESSION['sess_user_id']), false, 'WEBUI'); } } } header('Location: pollers.php?header=false'); exit; } /* setup some variables */ $pollers = ''; $i = 0; /* loop through each of the graphs selected on the previous page and get more info about them */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $pollers .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM poller WHERE id = ?', array($matches[1]))) . '
  • '; $poller_array[$i] = $matches[1]; $i++; } } top_header(); form_start('pollers.php'); html_start_box($poller_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($poller_array) && cacti_sizeof($poller_array)) { if (get_nfilter_request_var('drp_action') == '1') { // delete print "

    " . __n('Click \'Continue\' to delete the following Data Collector. Note, all devices will be disassociated from this Data Collector and mapped back to the Main Cacti Data Collector.', 'Click \'Continue\' to delete all following Data Collectors. Note, all devices will be disassociated from these Data Collectors and mapped back to the Main Cacti Data Collector.', cacti_sizeof($poller_array)) . "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { // disable print "

    " . __n('Click \'Continue\' to disable the following Data Collector.', 'Click \'Continue\' to disable the following Data Collectors.', cacti_sizeof($poller_array)) . "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '3') { // enable print "

    " . __n('Click \'Continue\' to enable the following Data Collector.', 'Click \'Continue\' to enable the following Data Collectors.', cacti_sizeof($poller_array)) . "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '4') { // full sync print "

    " . __n('Click \'Continue\' to Synchronize the Remote Data Collector for Offline Operation.', 'Click \'Continue\' to Synchronize the Remote Data Collectors for Offline Operation.', cacti_sizeof($poller_array)) . "

    \n"; $save_html = " "; } } else { raise_message(40); header('Location: pollers.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /* --------------------- Site Functions --------------------- */ function poller_edit() { global $fields_poller_edit; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (!isempty_request_var('id')) { $poller = db_fetch_row_prepared('SELECT * FROM poller WHERE id = ?', array(get_request_var('id'))); $header_label = __('Site [edit: %s]', html_escape($poller['name'])); } else { $poller = array(); $header_label = __('Site [new]'); } form_start('pollers.php', 'poller'); html_start_box($header_label, '100%', true, '3', 'center', ''); if (cacti_sizeof($poller)) { if ($poller['id'] == 1) { unset($fields_poller_edit['sync_interval']); unset($fields_poller_edit['spacer_remotedb']); unset($fields_poller_edit['dbdefault']); unset($fields_poller_edit['dbhost']); unset($fields_poller_edit['dbuser']); unset($fields_poller_edit['dbpass']); unset($fields_poller_edit['dbport']); unset($fields_poller_edit['dbssl']); unset($fields_poller_edit['dbsslkey']); unset($fields_poller_edit['dbsslcert']); unset($fields_poller_edit['dbsslca']); } if ($poller['timezone'] == '') { $poller['timezone'] = ini_get('date.timezone'); } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_poller_edit, (isset($poller) ? $poller : array())) ) ); $tip_text = __('Remote Data Collectors must be able to communicate to the Main Data Collector, and vice versa. Use this button to verify that the Main Data Collector can communicate to this Remote Data Collector.'); if (read_config_option('hide_form_description') == 'on') { $tooltip = '
    ' . $tip_text . ''; } else { $tooltip = '
    ' . str_replace("\n", '', display_tooltip($tip_text)) . '
    '; } $row_html = '
    ' . __('Test Database Connection') . $tooltip . '
    '; $pt = read_config_option('poller_type'); if (isset($poller) && cacti_sizeof($poller)) { if ($poller['id'] > 1) { ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ) ); validate_store_request_vars($filters, 'sess_pollers'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box( __('Data Collectors'), '100%', '', '3', 'center', ''); ?>
    '> ' title=''> ' title=''>
    array('display' => __('Collector Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The Name of this Data Collector.')), 'id' => array('display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The unique id associated with this Data Collector.')), 'hostname' => array('display' => __('Hostname'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The Hostname where the Data Collector is running.')), 'status' => array('display' => __('Status'), 'align' => 'center', 'sort' => 'DESC', 'tip' => __('The Status of this Data Collector.')), 'nosort0' => array('display' => __('Proc/Threads'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The Number of Poller Processes and Threads for this Data Collector.')), 'total_time' => array('display' => __('Polling Time'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The last data collection time for this Data Collector.')), 'nosort1' => array('display' => __('Avg/Max'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The Average and Maximum Collector timings for this Data Collector.')), 'hosts' => array('display' => __('Devices'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Devices associated with this Data Collector.')), 'snmp' => array('display' => __('SNMP Gets'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of SNMP gets associated with this Collector.')), 'script' => array('display' => __('Scripts'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of script calls associated with this Data Collector.')), 'server' => array('display' => __('Servers'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of script server calls associated with this Data Collector.')), 'last_update' => array('display' => __('Last Finished'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The last time this Data Collector completed.')), 'last_status' => array('display' => __('Last Update'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The last time this Data Collector checked in with the main Cacti site.')), 'last_sync' => array('display' => __('Last Sync'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The last time this Data Collector was full synced with main Cacti site.'))); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($pollers)) { foreach ($pollers as $poller) { if ($poller['id'] == 1) { $disabled = true; } else { $disabled = false; } if ($poller['disabled'] == 'on') { $poller['status'] = 4; }else if ($poller['heartbeat'] > 310) { $poller['status'] = 6; } $mma = round($poller['avg_time'], 2) . '/' . round($poller['max_time'], 2); if (empty($poller['name'])) { $poller['name'] = '<no name>'; } $pt = read_config_option('poller_type'); form_alternate_row('line' . $poller['id'], true, $disabled); form_selectable_cell(filter_value($poller['name'], get_request_var('filter'), 'pollers.php?action=edit&id=' . $poller['id']), $poller['id']); form_selectable_cell($poller['id'], $poller['id'], '', 'right'); form_selectable_ecell($poller['hostname'], $poller['id'], '', 'right'); form_selectable_cell($poller_status[$poller['status']], $poller['id'], '', 'center'); form_selectable_cell($poller['processes'] . '/' . ($pt == 2 ? $poller['threads']:'-'), $poller['id'], '', 'right'); form_selectable_cell(number_format_i18n($poller['total_time'], 2), $poller['id'], '', 'right'); form_selectable_cell($mma, $poller['id'], '', 'right'); form_selectable_cell(number_format_i18n($poller['hosts'], '-1'), $poller['id'], '', 'right'); form_selectable_cell(number_format_i18n($poller['snmp'], '-1'), $poller['id'], '', 'right'); form_selectable_cell(number_format_i18n($poller['script'], '-1'), $poller['id'], '', 'right'); form_selectable_cell(number_format_i18n($poller['server'], '-1'), $poller['id'], '', 'right'); form_selectable_cell(substr($poller['last_update'], 5), $poller['id'], '', 'right'); form_selectable_cell(substr($poller['last_status'], 5), $poller['id'], '', 'right'); if ($poller['id'] == 1) { form_selectable_cell(__('N/A'), $poller['id'], '', 'right'); } else { form_selectable_cell(substr($poller['last_sync'], 5), $poller['id'], '', 'right'); } form_checkbox_cell($poller['name'], $poller['id'], $disabled); form_end_row(); } } else { print "" . __('No Data Collectors Found') . "\n"; } html_end_box(false); if (cacti_sizeof($pollers)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($poller_actions); form_end(); }