#!/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")