add btrfs-scrub.py

This commit is contained in:
Martin Matous 2025-03-18 20:09:52 +01:00
parent 2cef97f92b
commit 63db8162e3
Signed by: mmatous
GPG key ID: 8BED4CD352953224
2 changed files with 52 additions and 0 deletions

View file

@ -12,6 +12,15 @@ Dependencies: python3, apprise, cryptography, dnspython, requests, Matrix accoun
Usage: Use provided availability-monitor.service as user unit.
## btrfs-scrub.py
Scrub btrfs volume and report results via matrix and e-mail.
Status: active use
Dependencies: python3, apprise, Matrix account
Usage: Invoke periodically using systemd timer (or cron).
## dnf-search-install.py
Wrapper, marks already installed packages for `dnf search`.

43
btrfs-scrub.py Executable file
View file

@ -0,0 +1,43 @@
#!/usr/bin/env python3
# nonstdlib requirements: apprise
# to be invoked via btrfs-scrub@.(timer+service)
import os
import platform
import subprocess
import sys
from pathlib import Path
import apprise
MATRIX_USER = os.environ['MATRIX_USER']
MATRIX_PASSWORD = os.environ['MATRIX_PASSWORD']
MATRIX_ROOM = os.environ['MATRIX_ROOM']
MAIL_USER = os.environ['MAIL_USER']
MAIL_PW = os.environ['MAIL_PASSWORD']
MAIL_TO = os.environ['MAIL_TO']
def report_results(res: subprocess.CompletedProcess) -> None:
print(res.stdout)
print(res.stderr, file=sys.stderr)
apobj = apprise.Apprise()
with apprise.LogCapture(level=apprise.logging.INFO) as output:
apobj.add(f'matrixs://{MATRIX_USER}@nitro.chat/{MATRIX_ROOM}?pass={MATRIX_PASSWORD}')
# can't specify user & pw at the start
# https://github.com/caronc/apprise/wiki/Troubleshooting#special-characters-and-url-conflicts
apobj.add(
f'mailtos://@matous.dev:465?user={MAIL_USER}&stmp=mx1.matous.dev&from=Apprise Monitor <{MAIL_USER}>&pass={MAIL_PW}&to={MAIL_TO}&mode=ssl'
)
title = f'{platform.node()} BTRFS scrub finished: {res.returncode}'
apobj.notify(title=title, body=f'Summary:\n{res.stdout}\n\n{res.stderr}')
print(output.getvalue())
path = Path(sys.argv[1])
cmd = ['/bin/btrfs', 'scrub', 'start', '-d', '-B', path]
res = subprocess.run(cmd, text=True, capture_output=True, check=False)
report_results(res)