diff --git a/dirkules/manager/driveManager.py b/dirkules/manager/driveManager.py index 1412967..86e70fd 100644 --- a/dirkules/manager/driveManager.py +++ b/dirkules/manager/driveManager.py @@ -80,6 +80,7 @@ def get_drives(): def pool_gen(): part_dict = dict() + Pool.query.delete() # creates map uuid is key, partitions are values for part in Partitions.query.all(): if part.uuid in part_dict: @@ -97,7 +98,9 @@ def pool_gen(): drives = drives + str(Drive.query.get(part.drive_id)) + "," drives = drives[:-1] value = value[0] - Pool.query.delete() + missing = absent_drive(drives) + if missing is not None: + missing = ",".join(str(x.name) for x in missing) if value.fs == "btrfs": if value.mountpoint: memory_map = btrfsTools.get_space(value.mountpoint) @@ -108,7 +111,7 @@ def pool_gen(): ['unbekannt', '1.00', 'unbekannt', '1.00']))) pool_obj = Pool(value.label, memory_map.get("total"), memory_map.get("free"), raid_map.get("data_raid"), raid_map.get("data_ratio"), raid_map.get("meta_raid"), raid_map.get("meta_ratio"), value.fs, - value.mountpoint, "not implemented", drives, get_pool_health(drives)) + value.mountpoint, "not implemented", drives, get_pool_health(drives), missing) db.session.add(pool_obj) elif value.fs == "ext4": @@ -117,7 +120,7 @@ def pool_gen(): else: free_space = 2 pool_obj = Pool(value.label, value.size, free_space, raid, 1.00, raid, 1.00, value.fs, value.mountpoint, - "not implemented", drives) + "not implemented", drives, get_pool_health(drives), missing) db.session.add(pool_obj) db.session.commit() @@ -137,6 +140,23 @@ def get_pool_health(drive_list): return True +def absent_drive(drive_list): + """ + :param drive_list: contains drives which belongs to pool + :return: List of absent drives or None + """ + missing = list() + drive_split = drive_list.split(",") + for drive in drive_split: + db_drive = db.session.query(Drive).filter(Drive.name == drive).scalar() + if db_drive.missing: + missing.append(db_drive) + if not missing: + return None + else: + return missing + + def delete_drive(drive): """ removes a given drive object (including cascades) from db diff --git a/dirkules/models.py b/dirkules/models.py index 258e5fc..be9fac0 100644 --- a/dirkules/models.py +++ b/dirkules/models.py @@ -78,9 +78,10 @@ class Pool(db.Model): mountopt = db.Column(db.String) drives = db.Column(db.String) healthy = db.Column(db.Boolean) + missing = db.Column(db.String) def __init__(self, label, size, free, data_raid, data_ratio, meta_raid, meta_ratio, fs, mountpoint, mountopt, - drives, healthy): + drives, healthy, missing): self.label = label self.size = size self.free = free @@ -93,6 +94,7 @@ class Pool(db.Model): self.mountopt = mountopt self.drives = drives self.healthy = healthy + self.missing = missing class Time(db.Model): diff --git a/dirkules/templates/pool.html b/dirkules/templates/pool.html index d57385d..6effbf1 100644 --- a/dirkules/templates/pool.html +++ b/dirkules/templates/pool.html @@ -81,7 +81,7 @@ Gesundheit - {% if pool.healthy %} + {% if pool.healthy and pool.missing is none %} Gesund {% else %} Kritisch @@ -99,13 +99,14 @@

Die RAID Level von Data und Metadata unterscheiden sich. Normalerweise sollten beide gleich - konfiguriert werden, da es sonst unter Umständen zu Datenverlust kommen kann, wenn ein + konfiguriert werden, da es sonst unter Umständen zu Datenverlust kommen kann, wenn + ein Laufwerk ausfällt.
Solltest du einen guten Grund dafür haben, ignoriere einfach diese Meldung.

{% endif %} - {% if pool.healthy %} + {% if pool.healthy and pool.missing is none %}
@@ -116,16 +117,28 @@

{% else %} -
- -
- Kritischer Zustand + {% if not pool.healthy %} +
+ +
+ Kritischer Zustand +
+

+ Mindetstens ein Laufwerk befindet sich in einem schlechten Zustand! Du solltest + dieses schnellstmöglich tauschen. +

-

- Mindetstens ein Laufwerk befindet sich in einem schlechten Zustand! Du solltest - dieses schnellstmöglich tauschen. -

-
+ {% else %} +
+ +
+ Kritischer Zustand +
+

+ Folgende Laufwerke wurden nicht gefunden: {{ pool.missing }} +

+
+ {% endif %} {% endif %}