Created
November 3, 2024 22:01
-
-
Save surfaceflinger/dea723330cd6b5ea4cc55ac843d30305 to your computer and use it in GitHub Desktop.
Compare property/setting differences across all ZFS zpools and datasets!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env nix-shell | |
#! nix-shell -i python3 -p python3Packages.py-libzfs | |
import libzfs | |
def collect_all_datasets(dataset, all_datasets): | |
""" | |
Recursively collects all datasets from a given dataset and its children. | |
Args: | |
dataset: The starting dataset. | |
all_datasets: A list to store all collected datasets. | |
""" | |
all_datasets.append(dataset) | |
for child in dataset.children: | |
collect_all_datasets(child, all_datasets) | |
def compare_dataset_properties(datasets, ignore_properties): | |
""" | |
Compares properties of multiple ZFS datasets and prints out differences. | |
Args: | |
datasets: A list of ZFS dataset objects. | |
ignore_properties: A set of property names to ignore. | |
""" | |
# Get a list of all property names across all datasets, excluding ignored ones | |
all_properties = set() | |
for dataset in datasets: | |
all_properties.update(set(dataset.properties.keys()) - ignore_properties) | |
# Compare property values for each property | |
for property_name in all_properties: | |
property_values = set() | |
for dataset in datasets: | |
if property_name in dataset.properties: | |
property_values.add(dataset.properties[property_name].value) | |
# If more than one value exists, print the differences | |
if len(property_values) > 1: | |
print(f"Property '{property_name}' has different values across datasets:") | |
for dataset in datasets: | |
if property_name in dataset.properties: | |
print(f" - Dataset '{dataset.name}': {dataset.properties[property_name].value}") | |
if __name__ == "__main__": | |
# Define properties to ignore | |
ignore_properties = {"unique", "keyguid", "used", "refcompressratio", "createtxg", "usedbychildren", "logicalused", "canmount", "written", "logicalreferenced", "guid", "usedbydataset", "compressratio", "referenced", "objsetid", "encryptionroot", "name", "prevsnap", "usedbysnapshots", "creation", "keylocation", "pbkdf2salt", "available"} | |
# Collect all datasets from all pools | |
all_datasets = [] | |
for pool in libzfs.ZFS().pools: | |
collect_all_datasets(pool.root_dataset, all_datasets) | |
compare_dataset_properties(all_datasets, ignore_properties) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env nix-shell | |
#! nix-shell -i python3 -p python3Packages.py-libzfs | |
import libzfs | |
def compare_pool_properties(pools): | |
""" | |
Compares properties of multiple ZFS pools and prints out differences. | |
Args: | |
pools: A list of ZFS pool objects. | |
""" | |
# Get a list of all property names across all pools | |
all_properties = set() | |
for pool in pools: | |
all_properties.update(pool.properties.keys()) | |
# Compare property values for each pool | |
for property_name in all_properties: | |
property_values = set() | |
for pool in pools: | |
if property_name in pool.properties: | |
property_values.add(pool.properties[property_name].value) | |
# If more than one value exists, print the differences | |
if len(property_values) > 1: | |
print(f"Property '{property_name}' has different values across pools:") | |
for pool in pools: | |
if property_name in pool.properties: | |
print(f" - Pool '{pool.name}': {pool.properties[property_name].value}") | |
if __name__ == "__main__": | |
# Get a list of all ZFS pools | |
pools = list(libzfs.ZFS().pools) | |
# Compare pool properties | |
compare_pool_properties(pools) |
Author
surfaceflinger
commented
Nov 3, 2024
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment