0
0 комментариев

python 3.8 Windows

Здравствуйте стоит задача в периодическом опросе роутеров и записи полученой информации в таблицу сам скрипт написан спасибо за помощь stud_55@mail.ru

import telnetlib
import time
import datetime
import csv

now = datetime.datetime.now()
nowt = (now.strftime("%d-%m-%Y %H:%M"))
start_time = time.time()
with open('C:\py\\table1.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile, delimiter=';')

    for row in reader:
        print(row['Адрес'], row['WAN IP'],)
        adress = row['Адрес']
        WANip = row['WAN IP']
        VPNip = row['VPN IP']
        user = 'admin'
        password = 'hjgbyu'
        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:
            print(e)
            status = 'Connection failed!'
            handle = open("information.csv", "a")
            handle.write(rez_str + ';' + model + ';' + release + ';' + sn + ';' + mac + ';' + des + ';' + status + '\n')
            handle.close()
            print('--- Сбор данных закончен за ---')
            print("---------- %s скунд -------------" % (time.time() - start_time1))
        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:
                print(f)
            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:
                handle = open("information.csv", "a")
                handle.write(rez_str + ';' + model + ';' + release + ';' + sn + ';' + mac + ';' + des + ';' + status + '\n')
                handle.close()
                print('--- Сбор данных закончен за ---')
                print("---------- %s скунд -------------" % (time.time() - start_time1))
    print("--- Скрипт завершил работу за --- %s секунд ---" % (time.time() - start_time))

Существует 2 проблемы

  1. Если если есть коннект по телнету но на сам роутер зайти не удается (не правильный пароль либо еще какин то проблемы) скрипт вылетает с ошибкой
  2. Вторая проблема намного более  острая из за большого количества роутеров опрос проходит очень длительный временной интервал около 10 часов и чтобы решить эту проблему я хотел прикрутить многопоточность но из за низкого уровня знаний мне это не удалось вот что у меня не вышло
  3. import random
    import time
    from threading import Thread
    import telnetlib
    import time
    import datetime
    import csv
    
    now = datetime.datetime.now()
    nowt = (now.strftime("%d-%m-%Y %H:%M"))
    start_time = time.time()
    with open('C:\py\\table1.csv', newline='') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=';')
    start_time = time.time()
    class MyThread(Thread):
        for row in reader:
            print(row['Адрес'], row['WAN IP'], )
            adress = row['Адрес']
            WANip = row['WAN IP']
            VPNip = row['VPN IP']
            user = 'admin'
            password = 'hjgbyu'
            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:
                print(e)
                status = 'Connection failed!'
            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:
                    print(f)
                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()
                    handle = open("information.csv", "a")
                    handle.write(rez_str + ';' + model + ';' + release + ';' + sn + ';' + mac + ';' + des + ';' + status + '\n')
                    handle.close()
                    print('--- Сбор данных закончен за ---')
                    print("---------- %s скунд -------------" % (time.time() - start_time1))
    
        def __init__(self, name):
            Thread.__init__(self)
            self.name = name
    
        def run(self):
            amount = random.randint(3, 15)
            time.sleep(amount)
            msg = "%s is running" % self.name
            print(msg)
    
    def create_threads():
        for i in range(5):
            name = "Thread #%s" % (i + 1)
            my_thread = MyThread(name)
            my_thread.start()
    
    if __name__ == "__main__":
    
    print("--- Скрипт завершил работу за --- %s секунд ---" % (time.time() - start_time))
Решенный вопрос
Добавить комментарий