#!/usr/bin/env python
# -*- coding: utf8 -*-
"""
diagnose du rvp
"""
import subprocess
import shlex
import re
import time
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)
    ret, err_output = process.communicate()
    statusall_err = process.returncode

    if statusall_err == 0:
        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:
                print statusall_err
                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']
            crm_process = subprocess.Popen(crm_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
            crm_output, err_output = crm_process.communicate()
            rc_crm = process.returncode
            if rc_crm == 0:
                crm_output = crm_output.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 total == 0:
                    cmd.append('EchoVert " Aucun tunnel"')
                elif up < total:
                    cmd.append('EchoOrange " {0} tunnel{1} actif{1} sur {2}"'.format(up, '' if up < 2 else 's',total))
                else:
                    cmd.append('EchoVert " Ok ({0} tunnel{1} actif{1} sur {2})"'.format(up, '' if up < 2 else 's',total))
            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)
