412a576ccd
Erweiterung Filter nach Dataset oder Volums
48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
||
|
||
import subprocess
|
||
import re
|
||
import time
|
||
import argparse
|
||
|
||
# Argumente verarbeiten
|
||
parser = argparse.ArgumentParser(description="ZFS Snapshot Übersicht")
|
||
parser.add_argument("--filter", help="Nur bestimmte Datasets anzeigen (Regex möglich, z. B. 'rpool/ROOT')", type=str)
|
||
args = parser.parse_args()
|
||
|
||
# Snapshots abrufen
|
||
_snapshots = subprocess.check_output("/usr/sbin/zfs list -t snapshot -Hpo name,creation".split())
|
||
|
||
LABELS = ("frequent", "hourly", "daily", "weekly", "monthly", "yearly", "backup-zfs", "bashclub-zfs")
|
||
RE_LABELSEARCH = re.compile("|".join(LABELS))
|
||
_datasets = {}
|
||
|
||
# Snapshots parsen
|
||
for _datastore, _snapshot, _creation in re.findall(r"^([\w_./-]+)@([\w_.-]+)\t(\d+)", _snapshots.decode('utf-8'), re.M):
|
||
if args.filter and not re.search(args.filter, _datastore):
|
||
continue # Dataset entspricht nicht dem Filter
|
||
|
||
if _datastore not in _datasets:
|
||
_datasets[_datastore] = {}
|
||
_label = RE_LABELSEARCH.search(_snapshot)
|
||
_label = _label.group(0) if _label else "other"
|
||
|
||
if _label not in _datasets[_datastore]:
|
||
_datasets[_datastore][_label] = []
|
||
_datasets[_datastore][_label].append((_snapshot, int(_creation)))
|
||
|
||
# Ergebnisse anzeigen
|
||
for _datastore in _datasets.keys():
|
||
print(_datastore)
|
||
print("-" * 40)
|
||
for _label in _datasets[_datastore].keys():
|
||
_data = _datasets[_datastore][_label]
|
||
_first = time.strftime("%d.%m.%Y %H:%M:%S", time.localtime(_data[0][1]))
|
||
_last = time.strftime("%d.%m.%Y %H:%M:%S", time.localtime(_data[-1][1]))
|
||
_count = len(_data)
|
||
print(f" {_label} {_count}")
|
||
print(f" {_first} {_data[0][0]}")
|
||
if _count > 1:
|
||
print(f" {_last} {_data[-1][0]}")
|
||
print("")
|