#!/usr/bin/python3
import os
import shutil
from errno import ENOENT
from subprocess import Popen, PIPE
from argparse import ArgumentParser


DEFAULT_GLUSTERD_WORKDIR = "/var/lib/glusterd"


def handle_rm_error(func, path, exc_info):
    if exc_info[1].errno == ENOENT:
        return

    raise exc_info[1]


def get_glusterd_workdir():
    p = Popen(["gluster", "system::", "getwd"],
              stdout=PIPE, stderr=PIPE, universal_newlines=True)

    out, _ = p.communicate()

    if p.returncode == 0:
        return out.strip()
    else:
        return DEFAULT_GLUSTERD_WORKDIR


def get_args():
    parser = ArgumentParser(description="Volume delete post hook script")
    parser.add_argument("--volname")
    return parser.parse_args()


def main():
    args = get_args()
    glusterfind_dir = os.path.join(get_glusterd_workdir(), "glusterfind")

    # Check all session directories, if any directory found for
    # the deleted volume, cleanup all the session directories
    try:
        ls_glusterfind_dir = os.listdir(glusterfind_dir)
    except OSError:
        ls_glusterfind_dir = []

    for session in ls_glusterfind_dir:
        # don't blow away the keys directory
        if session == ".keys":
            continue

        # Possible session directory
        volume_session_path = os.path.join(glusterfind_dir,
                                           session,
                                           args.volname)
        if os.path.exists(volume_session_path):
            shutil.rmtree(volume_session_path, onerror=handle_rm_error)

        # Try to Remove directory, if any other dir exists for different
        # volume, then rmdir will fail with ENOTEMPTY which is fine
        try:
            os.rmdir(os.path.join(glusterfind_dir, session))
        except (OSError, IOError):
            pass


if __name__ == "__main__":
    main()
