#!/usr/bin/env python3

import subprocess
from sys import exit
import xml.etree.cElementTree as etree

brick = 'datastore0'

def get_node_uuid():
    cmd = ["gluster", "system::", "uuid", "get", "--xml"]
    out = execute(cmd)

    tree = etree.fromstring(out)
    uuid_el = tree.find("uuidGenerate/uuid")
    return uuid_el.text


def execute(cmd):
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out, err = p.communicate()
    ret_code = p.returncode
    if ret_code != 0:
        print('error with execute {}'.format(' '.join(cmd)))
        print(out)
        exit(1)
    return out


def get_external_bricks():
    pass


def find_sb_files():
    cmd = ['gluster', 'volume', 'heal', brick, 'info', '--xml']
    tree = etree.fromstring(execute(cmd))
    current = False
    files = {}
    for p in tree.findall('healInfo/bricks/brick'):
        current_files = []
        for f in p.findall('file'):
            filename = f.text
            if filename != '/':
                current_files.append(f.text)
        files[p.get('hostUuid')] = {'name': p.find('name').text,
                                    'files': current_files}

    return files


def manager_file(rep, fil, bricks):
    if rep.lower() == 'o':
        if len(bricks) == 1:
            dst_brick = bricks[0]
        else:
            for idx, br in enumerate(bricks):
                print('{}: {}'.format(0, br))
            ret = int(input('numéro : '))
            dst_brick = bricks[ret]
        cmd = ['gluster', 'volume', 'heal', brick, 'split-brain',
               'source-brick', dst_brick, fil]
        execute(cmd)


def main():
    my_uuid = get_node_uuid()
    files = find_sb_files()
    files_managed = []
    for fil in files[my_uuid]['files']:
        bricks = []
        for uuid in files:
            if uuid != my_uuid and fil in files[uuid]['files']:
                bricks.append(files[uuid]['name'])

        if bricks:
            files_managed.append(fil)
            rep = input('le fichier "{}" est désynchronisé, supprimer la version locale ? (o/N) : '.format(fil))
            manager_file(rep, fil, bricks)

    files_bricks = {}
    for uuid in files:
        if uuid != my_uuid:
            for fil in files[uuid]['files']:
                if fil not in files_managed:
                    files_bricks.setdefault(fil, []).append(files[uuid]['name'])
    for fil, bricks in files_bricks.items():
        rep = input('le fichier "{}" est inexistant, récupérer le fichier ? (o/N) : '.format(fil))
        manager_file(rep, fil, bricks)


if __name__ == "__main__":
    main()
