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

import os
import cisco_backuper as cisco
import datetime
import logging
import send_to_zabbix as sender


def conf_read():  # читаем конфиг
    errorcode = ""  # Устанавливаем переменные
    out = {}
    try:  # Пробуем открыть конфиг
        f = open("/opt/backuper/main_backuper.conf", 'r')  # ОПАСНОСТЕ! БЫДЛОКОД!!! ЗАХАРДКОДИЛ КОНФИГ!!!
    except Exception as exept:  # ЭКСЕПШЕН!!!!
        errorcode = exept
    else:  # если все в норме, то вперед, к победе
        for line in f:  # перебираем лайн по одной
            if line[0] == "#":  # если начинаетя с решетки - коммент
                continue  # пропускаем
            sp_line = line.split("=")  # разделяем строку
            if len(sp_line) == 2:  # если параметров - сколько надо
                if sp_line[0] not in ['hosts', 'typedir', 'cmddir', 'outdir']:  # и если это не один из параметров
                    errorcode = "unknown arg " + str(sp_line)  # говорим, что всё говно
                    break  # и вываливаемся
                if "#" in sp_line[1]:  # если во втором аргументе есть решеточка
                    param = sp_line[1].split("#")[0].strip()  # то обрезаем все, кроме решетки
                else:  # а если нет
                    param = sp_line[1].strip()  # то не обрезаем
                out[sp_line[0]] = param  # добавляем параметр
    return out, errorcode  # вертаем всё


def hosts_read(hosts):  # читаем файл с хостами
    errorcode = ""  # Устанавливаем переменные
    out = []
    args = []
    try:  # пробуем открыть файл
        f = open(hosts, 'r')
    except Exception as exept:  # ловим исключение
        errorcode = exept
    else:  # если все в порядке
        for line in f:  # читаем линии
            if line[0] == "#":  # если начинаетя с решетки - коммент
                continue
            if "#" in line:  # если в строке решетка
                sp_line = line.split("#")[0].split(
                    ",")  # то бомбим строку по решетке, и первый элемент снова бомбим, уже по запятой
            else:
                sp_line = line.split(",")  # а если нет решетки, то просто бомбим по запятой
            for arg in sp_line:  # а потом перебираем элементы
                args.append(arg.strip())  # и добавляем в список
            out.append(args)  # а потом добавляем список в список
            args = []  # сбрасываем ненужные уже значения
    return out, errorcode  # вертаем в зад что наковыряли


def type_read(type_dir, type_file):  # читаем тип хоста надоело комментить все как в предыдущей
    errorcode = ""
    out = {}
    try:
        f = open((type_dir + type_file), 'r')
    except Exception as exept:
        errorcode = exept
    else:
        for line in f:
            if line[0] == "#":
                continue
            sp_line = line.split("=")
            if len(sp_line) == 2:
                if sp_line[0] not in ['cmd', 'user', 'password']:
                    errorcode = "unknown arg " + str(sp_line)
                    break
                if "#" in sp_line[1]:
                    param = sp_line[1].split("#")[1].strip()
                else:
                    param = sp_line[1].strip()
                    if "\"" in param or "\'" in param:
                        param = param[1:-1]
                out[sp_line[0]] = param
    return out, errorcode


def out_write(write_dir, name, out):
    errorcode = ""
    now_date = datetime.date.today()
    dir_to_write = write_dir + str(now_date) + "/"
    logging.debug("dir = " + str(dir_to_write))
    outfile = dir_to_write + name
    logging.debug("file = " + outfile)
    if not os.path.exists(dir_to_write):
        try:
            os.mkdir(dir_to_write)
        except Exception as exept:
            errorcode = exept
            return errorcode
    if not os.path.isdir(dir_to_write):
        errorcode = "Dir to write is not dir"
        return errorcode
    if not os.path.exists(outfile):
        try:
            f = open(outfile, "w")
        except Exception as exept:
            errorcode = exept
            return errorcode
        else:
            in_file = ""
            for outed in out:
                in_file = in_file + outed
            f.write(in_file)
            logging.debug("writed")
        finally:
            f.close()
    else:
        errorcode = "file exist"
        return errorcode
    return errorcode


def main():
    logging.basicConfig(format = u'%(filename)s[LINE:%(lineno)d]# %(levelname)-8s [%(asctime)s]  %(message)s',
                        level=logging.DEBUG, filename="./backuper.log")
    errorcode = ""
    conf = {}
    out = []
    conf, errorcode = conf_read()
    hosts = []
    if errorcode != "":
        logging.critical(errorcode)
        keys = {"backuper[backuper_error]" : "1", }
        sender.sendkey(keys)
        exit(errorcode)
    else:
        hosts, errorcode = hosts_read(conf["hosts"])
    if errorcode != "":
        logging.critical(errorcode)
        keys = {"backuper[backuper_error]" : "2", }
        sender.sendkey(keys)
        exit(errorcode)
    else:
        keys = {"backuper[backuper_error]" : "0", }
        sender.sendkey(keys)
        for host in hosts:
            logging.debug(str(host) + "-" + str(errorcode))
    for host in hosts:
        if host[2] != "up":
            logging.debug(host[0] + " down")
            continue
        logging.debug(host[0] + " up")
        logging.debug("reading type")
        type_attr, errorcode = type_read(conf["typedir"], host[1])
        if errorcode != "":
            logging.warn(errorcode)
            keys = {"backuper[" + host[0] + "]" : "1"}
            sender.sendkey(keys)
            continue
        logging.debug(type_attr)
        logging.debug("reading cmd")
        commands, errorcode = cisco.read_file((conf["cmddir"] + type_attr["cmd"]))
        if errorcode != "":
            logging.warn(errorcode)
            logging.warn(errorcode)
            keys = {"backuper[" + host[0] + "]" : "2", }
            sender.sendkey(keys)
            continue
        logging.debug(commands)
        logging.debug(commands)
        out, errorcode = cisco.get_data(host[0], type_attr["user"], type_attr["password"], commands)
        if errorcode != "":
            logging.warn(errorcode)
            logging.warn(errorcode)
            keys = {"backuper[" + host[0] + "]" : "3", }
            sender.sendkey(keys)
            continue
        errorcode = out_write(conf['outdir'], host[0], out)
        if errorcode != "":
            logging.warn(errorcode)
            keys = {"backuper[" + host[0] + "]" : "4", }
            sender.sendkey(keys)
        else:
            keys = {"backuper[" + host[0] + "]" : "0", }
            sender.sendkey(keys)

if __name__ == '__main__':
    main()
