64 lines
2.6 KiB
Python
64 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
|
|
|
|
import subprocess
|
|
import os
|
|
import xml.etree.ElementTree as ET
|
|
|
|
if __name__=="__main__":
|
|
AllVolumes = dict()
|
|
failedVolume = dict()
|
|
my_env = os.environ.copy()
|
|
res=subprocess.run("gluster volume status --xml",shell=True,capture_output=True,universal_newlines=True,env=my_env)
|
|
root = ET.fromstring(res.stdout)
|
|
for volume in root.iter('volume'):
|
|
VolumeName = volume.find('volName').text
|
|
AllVolumes[VolumeName]=dict()
|
|
AllVolumes[VolumeName]["nodes"] = dict()
|
|
for node in volume.findall('node'):
|
|
NodeName = node.find('hostname').text
|
|
Path = node.find('path').text
|
|
Port = node.find('port').text
|
|
Status = node.find('status').text
|
|
pid = node.find('pid').text
|
|
AllVolumes[VolumeName]["nodes"][NodeName] = dict()
|
|
AllVolumes[VolumeName]["nodes"][NodeName]['Path'] = Path
|
|
AllVolumes[VolumeName]["nodes"][NodeName]['Port'] = Port
|
|
AllVolumes[VolumeName]["nodes"][NodeName]['Status'] = Status
|
|
AllVolumes[VolumeName]["nodes"][NodeName]['pid'] = pid
|
|
if NodeName == "Self-heal Daemon":
|
|
continue
|
|
elif NodeName == "Quota Daemon":
|
|
continue
|
|
else:
|
|
if int(Status)==0 or Port=="N/A":
|
|
if not VolumeName in failedVolume:
|
|
failedVolume[VolumeName]=[]
|
|
failedVolume[VolumeName].append(NodeName)
|
|
AllVolumes[VolumeName]["tasks"] = dict()
|
|
for task in volume.findall('task'):
|
|
type = task.find('type').text
|
|
id = task.find('id').text
|
|
status = task.find('status').text
|
|
statusStr = task.find('statusStr').text
|
|
AllVolumes[VolumeName]["tasks"]["type"] = type
|
|
AllVolumes[VolumeName]["tasks"]["id"] = id
|
|
AllVolumes[VolumeName]["tasks"]["status"] = status
|
|
AllVolumes[VolumeName]["tasks"]["statusStr"] = statusStr
|
|
|
|
print("All Volumes:")
|
|
print(AllVolumes)
|
|
|
|
print("Failed Nodes:")
|
|
print(failedVolume)
|
|
|
|
for _Volume,_Nodes in failedVolume.items():
|
|
Pass=True
|
|
for Node in _Nodes:
|
|
if subprocess.call(["ping","-q","-c","2",Node]) != 0:
|
|
Pass=False
|
|
if Pass==True:
|
|
print(f" Volume {_Volume} seems online again, force restart")
|
|
subprocess.call(["gluster","volume","start",_Volume,"force"])
|
|
|
|
print("Finished") |