Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import telnetlib
- import logging
- from logging import FileHandler
- from logging import Formatter
- import threading
- import datetime
- import time
- import csv
- LOG_FORMAT = ("%(message)s")
- LOG_LEVEL = logging.INFO
- # логгер для записи в файл
- MESSAGING_LOG_FILE = "information.csv"
- messaging_logger = logging.getLogger("messaging")
- messaging_logger.setLevel(LOG_LEVEL)
- messaging_logger_file_handler = FileHandler(MESSAGING_LOG_FILE, "w", encoding = "UTF-8")
- messaging_logger_file_handler.setLevel(LOG_LEVEL)
- messaging_logger_file_handler.setFormatter(Formatter(LOG_FORMAT))
- messaging_logger.addHandler(messaging_logger_file_handler)
- # логгер для вывода в консоль
- console_logger = logging.getLogger("console")
- console_logger.setLevel(LOG_LEVEL)
- console_logger.addHandler(logging.StreamHandler())
- # класс менеджер для запуска потока и обработки callback`a
- class Manager():
- # запуск потока
- def Test(self, func, router_data, num):
- console_logger.info('Получение данных от роутера по адресу: '+ num)
- MyThread(self.on_thread_finished, target=func, args=[router_data], kwargs={'num': num}).start()
- # callback-функция, вызывается после завершения потока
- def on_thread_finished(self, data):
- console_logger.info("Получение данных от роутера по адресу: " + data[0] + " завершилось: " + data[1])
- # класс потока с проверкой на исключения и вывод их в callback`e
- class MyThread(threading.Thread):
- def __init__(self, callback, *args, **kwargs):
- threading.Thread.__init__(self, *args, **kwargs)
- self.callback = callback
- self.num = kwargs['kwargs']['num']
- run_original = self.run # ссылка на оригинальный метод run
- def run_with_except_hook(*args2, **kwargs2):
- try:
- run_original(*args2, **kwargs2) # вызов оригинального run
- # отлов ошибок
- except Exception as e:
- data = (self.num, 'с ошибкой {}'.format(type(e)))
- self.callback(data)
- else:
- data = (self.num, 'успешно')
- self.callback(data)
- self.run = run_with_except_hook # переопределение метода run
- def parse_csv(filename):
- with open(filename, encoding='utf-8') as f:
- next(f) # пропускаем заголовки
- yield from csv.reader(f)
- # функция для запуска в потоке
- def check_router(router_data, **kwargs):
- adress, WANip, VPNip, user, password = router_data
- console_logger.info(adress + ', ' + WANip)
- model = 'empty'
- release = 'empty'
- sn = 'empty'
- mac = 'empty'
- des = 'empty'
- status = ''
- # Автологин
- start_time1 = time.time()
- rez_str = adress + ';' + WANip + ';' + VPNip
- try:
- tn = telnetlib.Telnet(WANip)
- status = 'Connection success!'
- except Exception as e:
- status = 'Connection failed!'
- console_logger.info('Не удалось подключиться к роутеру по адресу ' + adress)
- messaging_logger.info(rez_str + ';' + model + ';' + release + ';' + sn + ';' + mac + ';' + des + ';' + status + '\n')
- console_logger.info('--- Сбор данных закончен за ---')
- t = time.time() - start_time1
- console_logger.info('---------- '+ str(t) +' секунд -------------')
- else:
- try:
- tn.read_until(b'Login: ', timeout=2)
- tn.write(user.encode('ascii') + b'\n')
- tn.read_until(b'Password: ', timeout=2)
- tn.write(password.encode('ascii') + b'\n')
- tn.read_until(b'(config)> ', timeout=1)
- except Exception as f:
- console_logger.info('Не удалось залогиниться к роутеру по адресу ' + adress)
- else:
- # Собираем инфу из роутера
- tn.read_until(b'(config)> ', timeout=2)
- tn.write('show version'.encode('ascii') + b'\n')
- time.sleep(2)
- # Сбор модели
- out = tn.read_very_eager().decode('ascii')
- out = out.split(' ')
- if 'description:' in out:
- i1 = out.index('description:')
- model = (out[i1 + 1]) + ' ' + (out[i1 + 2]) + ' ' + (out[i1 + 3]).strip('\r\n\r\n(config)>')
- elif 'device:' in out:
- i2 = out.index('device:')
- model = (out[i2 + 1]) + ' ' + (out[i2 + 2]).strip('\r\n')
- else:
- model = 'неизвестная модель'
- if 'release:' in out:
- i3 = out.index('release:')
- release = (out[i3 + 1]).strip('\r\n')
- else:
- release = 'Нужен повторный опрос'
- tn.read_until(b'(config)> ', timeout=2)
- tn.read_until(b'(config)> ', timeout=2)
- tn.write('show interface PPTP0'.encode('ascii') + b'\n')
- time.sleep(2)
- # Сбор инфы по VPN
- out1 = tn.read_very_eager().decode('utf-8')
- out1 = out1.split(' ')
- if 'description:' in out1:
- i4 = out1.index('description:')
- des = (out1[i4 + 1]).strip('\r\n')
- else:
- des = 'Подключение VPN не настроено'
- # Сбор Серийного номера
- tn.write('show defaults'.encode('ascii') + b'\n')
- time.sleep(6)
- out2 = tn.read_very_eager().decode('ascii')
- out2 = out2.split(' ')
- if 'serial:' in out2:
- i5 = out2.index('serial:')
- sn = (out2[i5 + 1]).strip('\r\n')
- else:
- sn = 'В FW нет serial'
- # Сбор MAC Адреса
- tn.read_until(b'(config)> ', timeout=1)
- tn.write('show interface ISP'.encode('utf-8') + b'\n')
- time.sleep(2)
- out3 = tn.read_very_eager().decode('utf-8')
- out3 = out3.split(' ')
- if 'mac:' in out3:
- i6 = out3.index('mac:')
- mac = (out3[i6 + 1]).strip('\r\n')
- else:
- mac = ''
- # #Сбор конфига
- tn.write('show running-config'.encode('ascii') + b'\n')
- time.sleep(2)
- out4 = tn.read_very_eager().decode('utf-8')
- out4 = out4.split('\r\n')
- # Запись данных в файл (Buckup config)
- handle = open('{}.txt'.format(WANip).encode('ascii'), 'w')
- for l in out4:
- handle.write (l+'\n')
- handle.close()
- finally:
- messaging_logger.info(rez_str + ';' + model + ';' + release + ';' + sn + ';' + mac + ';' + des + ';' + status + '\n')
- t = time.time() - start_time1
- console_logger.info('--- Сбор данных закончен за ------ ' + str(t) + ' секунд -------------')
- def main():
- start_time = time.time()
- m = Manager() # менеджер для запуска потоков
- # делаем список из файла
- routers = list(parse_csv('C:\\py\\table1.csv'))
- # запуск потоков - по числу роутеров
- while len(routers) > 0:
- data = routers.pop(0)[0].split(';')
- # запуск потока
- m.Test(check_router, router_data=data, num=data[0])
- print('--- Скрипт завершил работу за --- %s секунд ---' % (time.time() - start_time))
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement