#!/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()