v0 python
script for checking all drives health status and reporting using ntfy
This commit is contained in:
89
check_drives_health.py
Normal file
89
check_drives_health.py
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
import subprocess
|
||||||
|
import requests
|
||||||
|
|
||||||
|
# Function to get all available drives
|
||||||
|
def get_all_drives():
|
||||||
|
try:
|
||||||
|
# Run lsblk to get all available drives
|
||||||
|
result = subprocess.run(['lsblk', '-d', '-n', '-o', 'NAME'], capture_output=True, text=True)
|
||||||
|
drives = [f"/dev/{line.strip()}" for line in result.stdout.splitlines() if line.strip()]
|
||||||
|
return drives
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error getting drives: {e}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
# Function to check SMART status of a drive
|
||||||
|
def check_smart_status(drive):
|
||||||
|
try:
|
||||||
|
# Run smartctl command for the specified drive
|
||||||
|
result = subprocess.run(['sudo', 'smartctl', drive, '-a'], capture_output=True, text=True)
|
||||||
|
output = result.stdout
|
||||||
|
|
||||||
|
# Look for the "SMART overall-health self-assessment test result" line
|
||||||
|
health_line = None
|
||||||
|
for line in output.splitlines():
|
||||||
|
if "SMART overall-health self-assessment test result" in line:
|
||||||
|
health_line = line
|
||||||
|
break
|
||||||
|
|
||||||
|
# Check if the health test result is "PASSED"
|
||||||
|
if health_line and "PASSED" in health_line:
|
||||||
|
return True, health_line
|
||||||
|
else:
|
||||||
|
return False, health_line if health_line else "SMART health result not found"
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
return False, f"Error checking SMART status: {e}"
|
||||||
|
|
||||||
|
# Function to send a notification using ntfy
|
||||||
|
def send_ntfy_notification(title, body, priority="default", tags=None):
|
||||||
|
url = "https://ntfy.hrasci.eu/rpi5" # Replace with your ntfy topic URL
|
||||||
|
headers = {
|
||||||
|
"Title": title,
|
||||||
|
"Priority": priority,
|
||||||
|
"Tags": ",".join(tags) if tags else "",
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.post(url, headers=headers, data=body)
|
||||||
|
if response.status_code == 200:
|
||||||
|
print("Notification sent successfully.")
|
||||||
|
else:
|
||||||
|
print(f"Failed to send notification: {response.status_code}")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error sending notification: {e}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Get all available drives
|
||||||
|
drives = get_all_drives()
|
||||||
|
|
||||||
|
if not drives:
|
||||||
|
print("No drives found.")
|
||||||
|
return
|
||||||
|
|
||||||
|
unhealthy_drives = []
|
||||||
|
healthy_drives = []
|
||||||
|
|
||||||
|
for drive in drives:
|
||||||
|
# Check the SMART status for each drive
|
||||||
|
smart_ok, smart_output = check_smart_status(drive)
|
||||||
|
|
||||||
|
if smart_ok:
|
||||||
|
healthy_drives.append(f"{drive}: PASSED")
|
||||||
|
else:
|
||||||
|
unhealthy_drives.append(f"{drive}: {smart_output}")
|
||||||
|
|
||||||
|
# Send notifications based on the drive status
|
||||||
|
if unhealthy_drives:
|
||||||
|
# If there are unhealthy drives, send urgent notifications
|
||||||
|
for drive_info in unhealthy_drives:
|
||||||
|
title = f"SMART Alert for {drive_info.split(':')[0]}"
|
||||||
|
tags = ["warning", "skull"]
|
||||||
|
send_ntfy_notification(title, drive_info, priority="urgent", tags=tags)
|
||||||
|
else:
|
||||||
|
# If all drives are healthy, send a low priority notification
|
||||||
|
healthy_message = "\n".join(healthy_drives)
|
||||||
|
send_ntfy_notification("All Drives Healthy", healthy_message, priority="low", tags=["ok", "check"])
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user