#!/usr/bin/env python
# -*- coding: utf8 -*-
"""
diagnose du rvp
"""
import subprocess
import shlex
import re
from commands import getstatusoutput
from os.path import isfile
from creole import config
from creole.client import CreoleClient
from zephir.monitor.agents.rvp import parse_ipsec_statusall


dico_eole = CreoleClient().get_creole()
install_rvp = dico_eole.get('install_rvp', 'non')
cmd = [". /usr/lib/eole/diagnose.sh"]
cmd.append('EchoGras "*** Réseau virtuel privé"')

# test du RVP si configuré
if install_rvp == "oui":
    process = subprocess.Popen(['ipsec', 'statusall'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
    statusall_err = process.wait()
    if statusall_err == 0:
        ret = process.stdout.read()
        tunnels, total, up, down, idle_threads = parse_ipsec_statusall(ret)

    if dico_eole.get('type_amon') is not None:
        # diagnose Amon
        TEST_RVP = "/usr/share/eole/test-rvp"
        if isfile(TEST_RVP):
            if statusall_err == 0:
                if "0 up, 0 connecting" in ret:
                    cmd.append('printf ".  %${len_pf}s =>" "RVP"')
                    cmd.append('EchoOrange " Aucun tunnel actif"')
                else:
                    for tunnel in tunnels:
                        if tunnel['child_name'] != '':
                            tested_ip = tunnel['dst'].split('--')
                            if len(tested_ip) > 1:
                                for ip in tested_ip:
                                    if "injoignable" in ip:
                                        cmd_line = 'printf ".  %${len_pf}s => " "RVP '
                                        cmd_line += str(ip.split('injoignable')[0].strip())\
                                                    +'"'+'\nEchoRouge " Erreur"'
                                        if cmd_line not in cmd:
                                            cmd.append(cmd_line)
                                    elif "joignable" in ip:
                                        cmd_line = 'printf ".  %${len_pf}s => " "RVP '
                                        cmd_line += str(ip.split('joignable')[0].strip())\
                                                    +'"'+'\nEchoVert " OK"'
                                        if cmd_line not in cmd:
                                            cmd.append(cmd_line)
            else:
                cmd.append('printf ".  %${len_pf}s => " "RVP"')
                cmd.append('EchoRouge " Erreur"')
        else:
            cmd.append('NoConfig "RVP"')
    else:
        # diagnose Eolebase ou Sphynx
        activer_haute_dispo = dico_eole.get('activer_haute_dispo', 'non')
        local_ipsec = True
        remote_ipsec = False
        if activer_haute_dispo != 'non':
            crm_cmd = 'crm resource show ipsec_rsc'.split()
            crm_process = subprocess.Popen(crm_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
            rc_crm = crm_process.wait()
            if rc_crm == 0:
                crm_output = crm_process.stdout.read().split('\n')[0]
                local_node = dico_eole['nom_machine']
                if dico_eole['activer_haute_dispo'] == 'maitre':
                    remote_node = dico_eole['nom_machine_esclave']
                elif dico_eole['activer_haute_dispo'] == 'esclave':
                    remote_node = dico_eole['nom_machine_maitre']
                find_line = "^resource ipsec_rsc is running on: {0} $"
                if re.match(find_line.format(local_node), crm_output):
                    local_ipsec = True
                    remote_ipsec = False
                elif re.match(find_line.format(remote_node), crm_output):
                    local_ipsec = False
                    remote_ipsec = True
            else:
                local_ipsec = False
                remote_ipsec = False
        if local_ipsec:
            cmd.append('printf ".  %${len_pf}s =>" "VPN"')
            if statusall_err == 0:
                if "0 up, 0 connecting" in ret:
                    cmd.append('EchoOrange " Aucun tunnel actif"')
                else:
                    cmd.append('EchoVert " Ok"')
            else:
                cmd.append('EchoRouge " Erreur"')
            cmd.append('TestService ARV $(CreoleGet adresse_ip_eth0):$(CreoleGet arv_port)')
        elif remote_ipsec:
            cmd.append('printf ".  %${len_pf}s =>" ""')
            cmd.append('EchoBleu "  IPsec sur noeud distant"')
        else:
            cmd.append('printf ".  %${len_pf}s =>" ""')
            cmd.append('EchoRouge "  IPsec sur aucun noeud du cluster"')
else:
    cmd.append('Inactif "RVP"')
cmd.append('echo')
# Exécution des commandes
cmd_string = "\n".join(cmd)
err, ret = getstatusoutput(cmd_string)
print ret
exit(0)
