-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathraid_interface.py
65 lines (50 loc) · 1.99 KB
/
raid_interface.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import re
import collections
raid_entry = collections.namedtuple("raid_entry", "name status level drives size dev_name elements online_elements disks recovery sub_status")
def get_status():
fd = open("/proc/mdstat", "r")
txt = fd.read()
fd.close()
raid_dict = dict()
for device in re.findall(r"(md[0-9]*) : (\S+) (\S+) (.*?)\n\s+?(\d+)\s+?blocks[^\[]+\[(\d+)\/(\d+)\]\s+\[(.*?)\]", txt):
entry = raid_entry(device[0], device[1], device[2], [],
device[4], "/dev/%s" % device[0], device[5], device[6], device[7], 0, False)
raid_dict[entry.name] = entry
for device in re.findall(r"(md[0-9]*) : .*?\n.*?\n.*? (recovery|check|resync|reshape) =\s+([\d\.]+)%", txt):
try:
raid_dict[device[0]] = raid_dict[device[0]]._replace(sub_status=device[1],recovery=float(device[2]))
except:
pass
return raid_dict
def get_text():
raid_db = get_status()
if len(raid_db) == 0:
return []
ret = []
for name, rdev in raid_db.items():
if len(raid_db) == 1:
ret_name = "RAID"
else:
ret_name = name
if rdev.status == "active":
if rdev.recovery > 0 or rdev.sub_status:
rstat = 'Working'
if rdev.sub_status == 'recovery':
rstat = 'Recovery'
if rdev.sub_status == 'check':
rstat = 'Testing'
if rdev.sub_status == 'resync':
rstat = 'Resync'
if rdev.sub_status == 'reshape':
rstat = 'Growing'
ret_status = "%s %s%%" % ( rstat, round(rdev.recovery,1) )
elif rdev.elements > rdev.online_elements:
ret_status = "Degraded %s" % rdev.disks
else:
ret_status = "Healthy"
else:
ret_status = rdev.status
ret.append(ret_name + ": " + ret_status)
return ret
if __name__ == "__main__":
print(get_text())