def test_structured_data_StructuredDataTree_equal_numerations(): tree_addresses_ordered = StructuredDataTree().load_from( "%s/tree_addresses_ordered" % TEST_DIR) tree_addresses_unordered = StructuredDataTree().load_from( "%s/tree_addresses_unordered" % TEST_DIR) assert tree_addresses_ordered.is_equal(tree_addresses_unordered) assert tree_addresses_unordered.is_equal(tree_addresses_ordered)
def _save_inventory_tree( hostname: HostName, inventory_tree: StructuredDataTree, ) -> Optional[StructuredDataTree]: store.makedirs(cmk.utils.paths.inventory_output_dir) filepath = cmk.utils.paths.inventory_output_dir + "/" + hostname if inventory_tree.is_empty(): # Remove empty inventory files. Important for host inventory icon if os.path.exists(filepath): os.remove(filepath) if os.path.exists(filepath + ".gz"): os.remove(filepath + ".gz") return None old_tree = StructuredDataTree().load_from(filepath) old_tree.normalize_nodes() if old_tree.is_equal(inventory_tree): console.verbose("Inventory was unchanged\n") return None if old_tree.is_empty(): console.verbose("New inventory tree\n") else: console.verbose("Inventory tree has changed\n") old_time = os.stat(filepath).st_mtime arcdir = "%s/%s" % (cmk.utils.paths.inventory_archive_dir, hostname) store.makedirs(arcdir) os.rename(filepath, arcdir + ("/%d" % old_time)) inventory_tree.save_to(cmk.utils.paths.inventory_output_dir, hostname) return old_tree
def do_inv_check(hostname, options): _inv_hw_changes = options.get("hw-changes", 0) _inv_sw_changes = options.get("sw-changes", 0) _inv_sw_missing = options.get("sw-missing", 0) _inv_fail_status = options.get( "inv-fail-status", 1) # State in case of an error (default: WARN) config_cache = config.get_config_cache() host_config = config_cache.get_host_config(hostname) if host_config.is_cluster: ipaddress = None else: ipaddress = ip_lookup.lookup_ip_address(hostname) status, infotexts, long_infotexts, perfdata = 0, [], [], [] sources = data_sources.DataSources(hostname, ipaddress) old_timestamp, inventory_tree, status_data_tree = _do_inv_for( sources, multi_host_sections=None, host_config=host_config, ipaddress=ipaddress, do_status_data_inv=host_config.do_status_data_inventory, ) if inventory_tree.is_empty() and status_data_tree.is_empty(): infotexts.append("Found no data") else: infotexts.append("Found %d inventory entries" % inventory_tree.count_entries()) # Node 'software' is always there because _do_inv_for creates this node for cluster info if not inventory_tree.get_sub_container(['software']).has_edge('packages')\ and _inv_sw_missing: infotexts.append("software packages information is missing" + check_api_utils.state_markers[_inv_sw_missing]) status = max(status, _inv_sw_missing) if old_timestamp: path = "%s/%s/%d" % (cmk.utils.paths.inventory_archive_dir, hostname, old_timestamp) old_tree = StructuredDataTree().load_from(path) if not old_tree.is_equal(inventory_tree, edges=["software"]): infotext = "software changes" if _inv_sw_changes: status = max(status, _inv_sw_changes) infotext += check_api_utils.state_markers[_inv_sw_changes] infotexts.append(infotext) if not old_tree.is_equal(inventory_tree, edges=["hardware"]): infotext = "hardware changes" if _inv_hw_changes: status = max(status, _inv_hw_changes) infotext += check_api_utils.state_markers[_inv_hw_changes] infotexts.append(infotext) if not status_data_tree.is_empty(): infotexts.append("Found %s status entries" % status_data_tree.count_entries()) for source in sources.get_data_sources(): source_state, source_output, _source_perfdata = source.get_summary_result_for_inventory( ) # Do not output informational (state = 0) things. These information are shown by the "Check_MK" service if source_state != 0: status = max(source_state, status) infotexts.append("[%s] %s" % (source.id(), source_output)) return status, infotexts, long_infotexts, perfdata