# mod/mtn.py

import cfg
import inc.infos as infos
import inc.mpc as mpc
import mod.commun as commun

# variables externes utilisées dans ce module
#          fichierVERSION
#          DIR_JK

# variables externes utilisées dans ce module
#          DIR_JK
#          MACHINE_DEV_1
#          MACHINE_DEV_2

def bak_backup():
    """ sauvegarde complète en local dans /opt/jk2019.bak """
    # on incrémente automatiquement la version
    # 791, mardi 25 février 2020, 11 heure 12
    mpc.ferme_ton_clapet()
    cmd "head -1 /opt/jk2019/tout/VERSION.txt | cut -f1 -d','"
    nouvelleVersion int(mpc.sub_proc(cmd)) + 1
    cmd "echo {}, $(date '+%A %e %B %Y, %_H heure %M') > /tmp/jk2019_version_B_nouvelle".format(nouvelleVersion)
    mpc.sub_proc(cmd)
    cmd "cp /opt/jk2019/tout/VERSION.txt /tmp/jk2019_version_A_actu.txt"
    mpc.sub_proc(cmd)
    cmd "cat /tmp/jk2019_version_B_nouvelle /tmp/jk2019_version_A_actu.txt > /opt/jk2019/tout/VERSION.txt"
    mpc.sub_proc(cmd)
    cmd "cp /tmp/jk2019_version_B_nouvelle /tmp/derVersion.txt"
    mpc.sub_proc(cmd)
    # cmd = "rm /tmp/jk2019_version_B_nouvelle /tmp/jk2019_version_A_actu.txt"
    # mpc.sub_proc(cmd)

    # créer le dossier de sauvegarde, /opt/jk2019.bak/<date_du_jour>
    src cfg.DIR_JK
    from time import localtimestrftime
    # date_fichier = strftime("%Y%m%d_%H%M%S", localtime())
    date_Ymd strftime("%Y%m%d"localtime())
    dst_horo cfg.DIR_JK ".bak/" date_Ymd
    mpc.sub_proc("sudo mkdir -p {0}; sudo chmod -R 777 {0}".format(dst_horo))

    # sauvegarde fichiers annexes
    bak_DEV "{}/misc/sauvegardes_DEV".format(src)
    mpc.sub_proc("sudo rm -rf {} 2>/dev/null".format(bak_DEV))
    mpc.sub_proc("sudo mkdir -p {}".format(bak_DEV))

    tmpBAK "/tmp/bak_jk2019_"
    mpc.sub_proc("tree /m           > {}tree_m.txt".format(tmpBAK))
    mpc.sub_proc("du -hsc /m        > {}du_m.txt".format(tmpBAK))
    mpc.sub_proc("tree {}           > {}tree_opt_jk2019.txt".format(srctmpBAK))
    mpc.sub_proc("du -hsc {}        > {}du_opt_jk2019.txt".format(srctmpBAK))
    mpc.sub_proc("sudo mv {}*txt {}".format(tmpBAKbak_DEV))

    # TODO en cours : bak_restore.sh, ligne 65
    mpc.sub_proc("sudo cp /etc/mpd.conf {}".format(bak_DEV))
    mpc.sub_proc("sudo cp /home/pi/.profile {}/_.profile".format(bak_DEV))
    mpc.sub_proc("sudo chmod -R 777 {}".format(bak_DEV))

    date_Ymd_HM strftime("%Y%m%d_%Hh%M"localtime())
    hostname_1 mpc.sub_proc("hostname")
    bak_file dst_horo "/" date_Ymd_HM "_sur_" hostname_1 ".tgz"
    infos.m_g("suppression des __pycache__ dans {}".format(src))
    mpc.sub_proc("find " src " -type d -name \"__pycache__\" -exec rm -rf {} \;")
    # compression des fichiers
    cmd "tar zcvf {} {} >/dev/null 2>&1".format(bak_filesrc)
    infos.m_g(cmd)
    mpc.sub_proc(cmd)
    bak_local src ".bak"
    mpc.sub_proc("sudo mkdir -p {0} > /dev/null; sudo chmod -R 777 {0}".format(bak_local))
    mpc.sub_proc("cp {} {}/jk2019.tgz".format(bak_filedst_horo))
    mpc.sub_proc("mv /tmp/derVersion.txt {}".format(dst_horo))
    masque "sauvegarde locale terminée, uploader {}/jk2019.tgz " \
        "vers ftp://.../jj/jk2019 pour màj avec 4 puis 88"
    infos.m_g (masque.format(dst_horo))
    masque "mettre à jour jk2019.tgz et derVersion.txt dans http://gangand.net/jj/jk2019"
    infos.m_g (masque.format(dst_horo))
    masque "la restauration est possible avec 4 puis 99"
    infos.m_g (masque.format(dst_horo))
    masque "4 = module maintenance, 88 = restauration"
    infos.m_g (masque.format(dst_horo))
    msg "sauvegarde locale terminée"
    infos.pdrNew(msg)


def bak_restor():
    """ vérifie quelques paramètres avant la restauration """
    mpc.ferme_ton_clapet()
    # vérifier le hostname
    hostname_1 mpc.sub_proc("hostname")
    # if hostname_1 in [ cfg.MACHINE_DEV_1, cfg.MACHINE_DEV_2 ]:
    if hostname_1 == cfg.MACHINE_DEV_1:
        infos.pdrNew("On est sur " hostname_1 ", la machine maître de développement")
        infos.pdrNew("Taper 1199 puis Entrée pour restorer")
        # infos.pdrNew("Pas de restauration mais ...")
        continuer input("Taper 1199 puis Entrée pour restorer")
        if continuer == "1199":
            infos.pdrNew("Restauration demandée en cours")
            bak_restor_GO()
        else:
            infos.pdrNew("Restauration abandonnée")

    elif hostname_1 == cfg.MACHINE_DEV_2:
        infos.pdrNew("On est sur " hostname_1 ", la machine secondaire développement")
        infos.pdrNew("Restauration possible en forçant avec 1199 puis entrée")
        continuer input("Taper 1199 puis Entrée pour forcer la mise à jour")
        if continuer == "1199":
            bak_restor_GO()
        else:
            infos.m_g("Restauration abandonnée")
    else:
        infos.m_g("On est sur " hostname_1 ", restauration possible")


def bak_restor_GO(): # restaurer /opt/jk2109 partout sauf sur machine_de_DEV
# entrée : variable MACHINE_DEV_1, MACHINE_DEV_2

    # nettoyer dossier temporaire de téléchargement
    dest "/tmp/decomp_jk2019"
    mpc.sub_proc("rm -rf " dest " 2>/dev/null")
    mpc.sub_proc("mkdir " dest)

    # rappel :
    # ONLINE_BACKUP_dir=http://gangand.net/jj/jk2019
    # ONLINE_BACKUP_file=jk2019.tgz
    url_online_backup cfg.ONLINE_BACKUP_dir "/" cfg.ONLINE_BACKUP_file

    infos.m_g("Téléchargement de la dernière màj (sauvegarde)")
    infos.m_g("cd " dest "; wget " url_online_backup)
    mpc.sub_proc("cd " dest "; wget " url_online_backup)

    if commun.file_exists(dest "/" cfg.ONLINE_BACKUP_file) == False:
        msg "Problème de téléchargement du fichier de sauvegarde"
        infos.pdrNew(msg)
    else:
        infos.m_g("bak_restor_GO(), pas DUMMY")
        infos.m_g("cd " dest "; tar zxf " cfg.ONLINE_BACKUP_file)
        mpc.sub_proc("cd " dest "; tar zxf " cfg.ONLINE_BACKUP_file)

        infos.m_g("cd " dest "; rm " cfg.ONLINE_BACKUP_file)
        mpc.sub_proc("cd " dest "; rm " cfg.ONLINE_BACKUP_file)

        mpc.stop()

        infos.m_g("sudo rm -rf " cfg.DIR_JK)
        mpc.sub_proc("sudo rm -rf " cfg.DIR_JK)

        infos.m_g("cd " dest "/opt/; sudo mv jk2019 /opt")
        mpc.sub_proc("cd " dest "/opt/; sudo mv jk2019 /opt")

        infos.m_g("sudo chmod -R 777 " cfg.DIR_JK)
        mpc.sub_proc("sudo chmod -R 777 " cfg.DIR_JK)

        cmd "rm -rf " +  cfg.DIRE_FILE_ATTENTE
        infos.m_g(cmd)
        mpc.sub_proc(cmd# sinon message au reboot 1199 ...

        infos.m_g("sudo shutdown -r now")
        mpc.sub_proc("sudo shutdown -r now")


def memo_stop_module():
    """ quitter module (touche 0) : mémoriser où on est """
    pass


def menu_voc11():
    """ menu spécial aba """
    commun.menu_vocal("mtn_special11""maintenance")


def reprendre():
    """ lancer le module maintenance """
    infos.ini_set("py_current_module""mtn")
    msg "module maintenance"
    mpc.stop()
    mpc.ferme_ton_clapet()

    espace_libre = ("df /m | tail -1 | awk '{print $4}'")
    espace_total = ("df /m | tail -1 | awk '{print $2}'")
    libre mpc.sub_proc(espace_libre)
    total mpc.sub_proc(espace_total)
    msg += ", espace libre sur /m, " str(int(int(libre)/1024)) + " méga octets"
    msg += ", espace total , " str(int(int(total)/1024)) + " méga octets"
    infos.pdrNew(msg)


def version_current():
    """ version xavbox en cours
    """
    with open(cfg.fichierVersionas fileVersion:
        version_actu fileVersion.readlines()[0].strip()
    return version_actu


def version_update():
    """ version mise à jour en ligne disponible
    """
    # rappel
    # ONLINE_BACKUP_dir = "http://gangand.net/jj/jk2019"
    # http://gangand.net/jj/jk2019/derVersion.txt
    # contenu type :
    # 833, mercredi 10 juin 2020, 11 heure 17
    dest "/tmp/version_update"
    mpc.sub_proc("rm -rf " dest " 2>/dev/null")
    mpc.sub_proc("mkdir " dest)
    cmd "cd " dest "; wget " cfg.ONLINE_BACKUP_dir "/derVersion.txt"
    mpc.sub_proc(cmd)
    with open(dest "/derVersion.txt"as fileVersion:
        version_maj_ligne fileVersion.readlines()[0].strip()
    return version_maj_ligne.split(",")[0]


if __name__ == "__main__":
    print("Bienvenue dans le module mtn (maintenance)")