#!/usr/bin/env python
# -*- coding: utf-8 -*-

""" Script de configuration automatique de la réplication AAF

Ce script permet d'identifier tous les scribes de la base zephir et de créer automatiquement
la jointure avec l'export AAF mis à disposition sur le zephir.

   Script mis à disposition sous licence GPLv3.

   Auteurs :
      - Philippe Caseiro <pcaseiro@cadoles.com>
      - Laurent Couillaud <lcouillaud@ac-noumea.nc>

"""

import os
import xmlrpclib
import argparse
import getpass

def isScribe(zephir, moduleID):
   """
      Détermine si le moduleID est celui d'un scribe
         :zephir: Connexion XMLRPC vers le zephir
         :moduleID: Identifiant unique des modules sur le zephir
   """

   mods = zephir.modules.get_module(moduleID)
   if mods[1][0]['libelle'].find("scribe") == -1:
       return False
   else:
       return True

def getScribes(zephir):
   """
      Récupère la liste de tous les serveurs scribe depuis le zephir
         :zephir: Connexion XMLRPC vers le zephir
   """
   scribes = []
   servers = zephir.serveurs.get_serveur()
   for srv in servers[1]:
       if isScribe(zephir, srv['module_initial']):
          scribes.append(srv)
   return scribes

def getScribeIDByRNE(lst, rne):
   """
      Récupère l'ID d'un scribe en fonction d'un rne
         :lst: Liste des serveurs
         :rne: code RNE
   """
    for elm in lst:
        if elm['rne'] == rne:
            return elm['id']

def getScribeLibelleByID(lst, sid):
   """
      Récupère le libéllé du serveur en fonction de l'ID du scribe
         :lst: Liste des serveurs
         :sid: Id du scribe
   """
    for elm in lst:
        if elm['id'] == sid:
            return elm['libelle']

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument("--user", action='store', help="Zephir login")
parser.add_argument("--password", action='store', help="Zephir password")
parser.add_argument("--zephir", action='store', help="Adresse IP du serveur Zéphir")
parser.add_argument("--directory", action='store', help="Répertoire d'arrivé des exports AAF")
parser.add_argument("--notify", action='store_true', help="Envoyer la notification d'upload au Zéphir",default=False)

results = parser.parse_args()

if not results.user:
    user = raw_input("Login Zéphir : ")
else:
    user = results.user

if not results.password:
    password = getpass.getpass("Mot de passe Zéphir")
else:
    password = results.password

if not results.zephir:
    zephir = raw_input("Adresse IP du serveur Zéphir :")
else:
    zephir = results.zephir

if not results.directory:
    rootdir = raw_input("Répertoire d'arrivé des exports AAF :")
else:
    rootdir = results.directory

try:
   """ Ouverture de la session XMLRPC sur le zephir """
    zephir = xmlrpclib.Server("https://" + user + ":" + password + "@"  + zephir + ":7080")

   """ Récupération de la liste des scribes sur le zephir """
    scribes = getScribes(zephir)

   """
       Vérification de la jonction de chaque fichier tar.gz du dossier /var/lib/zephir/aaf a chaque serveur scribe.
       Si le fichier n'est pas jointé, il procède à la jointure et execute la notification de l'upload
   """

    for archive in os.listdir(rootdir):
        if archive.endswith("tar.gz"):
            archrne = archive.split('.')[0]
            scribeid = getScribeIDByRNE(scribes, archrne)
            if zephir.aaf.get_list(scribeid)[1] == []:
                zephir.aaf.add_file(scribeid, archive)
                print("Association de l'archive [" + archive + "] avec le scribe [" + getScribeLibelleByID(scribeid) + "]")
                if results.notify:
                    zephir.aaf.notify_upload(archive)
            else:
                print("\tAssociation déjà en place pour le scribe [" + getScribeLibelleByID(scribes, scribeid) + "]" )
                continue

except xmlrpclib.ProtocolError as err:
    print "Execution error"
    print err
    exit(2)

