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

import commands, time, os


#######################################################################
# Script que realiza bakcups de MVs nun Repositorio de alamacenamento #
#######################################################################



######################################################################
####################################
# Directorio onde se van realizar as copias das MVs: as exportacións
# Cambiar en función do punto de montaxe 
# Usar o comando mount para ver a identificacion do punto de montaxe 
# onde se vai realizar a copia.
# O script vai cambiar de directorio para excutar dende aí o proceso 
# de copia da MV (exportación)
####################################
######################################################################
directory = "/var/run/sr-mount/037eac02-ddd8-be5d-4179-a08cad518f23"
os.chdir(directory)


######################################################################
####################################
# Función que devolve un array co par (uuid e nome) das MVs que non son 
# dom0 nin un snapshot
####################################
######################################################################
def get_backup_vms():
    result = []
    


    cmd = "xe vm-list is-control-domain=false is-a-snapshot=false"

    # Se se quere facer Backup dunha sóa MV descomentar a seguinte liña e configurala
    #cmd = "xe vm-list name-label=Nome da MV"

    output = commands.getoutput(cmd)

    for vm in output.split("\n\n\n"):
        lines = vm.splitlines()
        uuid = lines[0].split(":")[1][1:]
        name = lines[1].split(":")[1][1:]
        result += [(uuid, name)]

    return result




######################################################################
####################################
# Función que é chamada dende o seguinte bucle e
# recibe:
#   o uuid de cada MV 
#   un nome de ficheiro co que se vai crear o snapshot e o ficheiro a exportar.
# Crea, exporta e elimina o snapshot. 
####################################
######################################################################
def backup_vm(uuid, filename):
    cmd = "xe vm-snapshot uuid=" + uuid + " new-name-label=" + filename
    snapshot_uuid = commands.getoutput(cmd)

    cmd = "xe template-param-set is-a-template=false ha-always-run=false uuid=" + snapshot_uuid
    commands.getoutput(cmd)

    cmd = "xe vm-export vm=" + snapshot_uuid + " filename=" + filename + ".xva"
    commands.getoutput(cmd)

    cmd = "xe vm-uninstall uuid=" + snapshot_uuid + " force=true"
    commands.getoutput(cmd)


 

######################################################################
####################################
# Bucle que procesa tódolos pares (uuid, nome) das MVs
# Chama á 1ª función get_backup_vms() para obter eses pares (uuid, nome) das MVs do host
# Crea o nome do ficheiro (filename) baseado na data-hora e o nome da MV
# Chama á 2ª función (backup_vm) para realizar o backup de cada MV. 
####################################
######################################################################
for (uuid, name) in get_backup_vms():
    timestamp = time.strftime("%Y%m%d-%H%M", time.gmtime())
    print timestamp, uuid, name
    filename = "\"" + timestamp + " " + name +"\""
    backup_vm(uuid, filename)