Beispiel #1
0
def zyxel(ip, name):
    with ftplib.FTP(ip) as ftp:
        ftp.set_debuglevel(debug_level)  # Уровень отладки
        ftp.set_pasv(False)  # Отключение пассивного режима (ОБЯЗАТЕЛЬНО!)
        timed = str(datetime.now())[0:10]
        file_copy = '/srv/config_mirror/dsl/' + name.strip(
        ) + '/' + timed + 'config-0'
        file_origin = 'config-0'
        try:
            ftp.login(user='******', passwd='rootsev')
            cfg = []
            res = ftp.retrlines('RETR' + file_origin,
                                cfg.append)  # Запись конфигурации в переменную
            if not findall(r'226', res):
                elog("Ошибка обращения к файлу конфигурации", ip, name)
                return 0
            cfg = ''.join(cfg)
            diff_result = diff_config(name, cfg,
                                      'dsl')  # Вызов функции сравнения конф-ий

            if diff_result:  # Если файлы различаются
                with open(file_copy, 'w') as fp:
                    res = ftp.retrlines('RETR' + file_origin, fp.write)
                    if not findall(r'226', res):
                        elog("Backup FAILED!", ip, name)
                        if os.path.isfile(file_copy):
                            os.remove(file_copy)
        except ftplib.all_errors as error:
            elog(error, ip, name)
            if os.path.isfile(file_copy):
                os.remove(file_copy)
Beispiel #2
0
def zte(devices_ip, name, tftp):
    '''
    Функция обработки файлов конфигурации
    коммутаторов доступа ZTE
    '''
    user = '******'
    password = '******'  #keyring.get_password('asw', user)
    user = user.encode('ascii')
    password = password.encode('ascii')

    # -------------------------------------------НАЧАЛО-------------------------------------------------
    with telnetlib.Telnet(devices_ip) as t:
        with open('/srv/svi/log/zte.log', 'a') as file:  # открываем логи

            output = str(t.read_until(b'login:'******'log', output)) == True:
                t.write(user + b'\n')
            else:
                file.write('| ' + str(datetime.now())[0:19] + ' | ' +
                           "{:15}".format(devices_ip) + ' | ' + name +
                           ' | Таймаут превышен\n')  # ошибка ввода логина
                return 0

            output = str(t.read_until(b'password:'******'password:'******'\n')
            else:
                file.write('| ' + str(datetime.now())[0:19] + ' | ' +
                           "{:15}".format(devices_ip) + ' | ' + name +
                           ' | Таймаут превышен \n')  # ошибка ввода пароля

            output = str(
                t.read_until(b'login-authentication failure!', timeout=3))
            # Неверный логин или пароль
            if bool(findall(r'login-authentication failure!', output)) == True:
                file.write('| ' + str(datetime.now())[0:19] + ' | ' +
                           "{:15}".format(devices_ip) + ' | ' + name +
                           ' | Неверный логин или пароль \n')
                return 0

            t.write(b'enable\n')
            t.read_until(b'password:'******'sevaccess\n')
            output = str(t.read_until(b'(cfg)#', timeout=2))
            if bool(findall(r'\(cfg\)#', output)) != True:
                file.write(
                    '| ' + str(datetime.now())[0:19] + ' | ' +
                    "{:15}".format(devices_ip) + ' | ' + name +
                    ' | Неверный пароль от привилегированного пользователя \n')
                t.write(b'exit\n')
            t.write(b'show start-config\n')
            time.sleep(0.4)
            cfg = []
            # wii - После преобразования с битовой строки остаются символы:
            wii = '\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08'

            # ---------------------------ЛИСТИНГ КОНФИГУРАЦИИ--------------------------------
            while True:
                y = t.read_until(b'break -----', timeout=0.5).decode('ascii')
                if bool(y) == True and bool(match('\s', y)) == False:
                    t.write(b' ')
                    cfg.append(
                        y.replace(
                            '----- more ----- Press Q or Ctrl+C to break -----',
                            '').replace(wii, '').replace('\r', ''))
                else:
                    break
            cfg = ''.join(cfg)

            # --------------------------Сравнение конфигураций-------------------------------
            trfl = diff_config(name, cfg)
            t.write(b'config tffs\n')
            if trfl == True:

                # ------------------------------РАБОТА С TFTP----------------------------------
                if tftp == True:

                    file_name = str(name.strip() + '.txt')
                    command_to_copy = str(
                        'copy startcfg.txt ' + file_name + '\n').encode(
                            'ascii')  # Копирование файла на коммутаторе
                    t.write(command_to_copy)
                    output = str(t.read_until(b'bytes copied', timeout=3))
                    #print(output)
                    if bool(findall(r'bytes copied', output)) == True:
                        upload()  # ЗАГРУЗКА ПО TFTP

                    elif bool(findall(r'File exists', output)) == True:
                        delete_file = str('remove ' + file_name + '\n').encode(
                            'ascii')  # Удалить файл после передачи
                        t.write(delete_file)
                        t.read_until(b'[Yes|No]:', timeout=1)
                        t.write(b'y\n')
                        t.read_until(b'done !', timeout=2)
                        print('deleted')
                        t.write(command_to_copy)
                        t.read_until(b'bytes copied', timeout=3)
                        upload()  # ЗАГРУЗКА ПО TFTP
                    else:
                        file.write(
                            '| ' + str(datetime.now())[0:19] + ' | ' +
                            "{:15}".format(devices_ip) + ' | ' + name +
                            ' | Файл конфигурации с именем \'startcfg.txt\' не найден! \n'
                        )

                # -------------------------------ОТПРАВКА ПО FTP----------------------------------
                elif tftp == False:

                    dir_name = str(
                        'ftp 10.20.0.14 asw/' + name.strip() + '/' + timed +
                        'startrun.dat upload /cfg/startrun.dat username svi password q7TP6GwCS%c3\n\n'
                    ).encode('ascii')
                    t.write(dir_name)
                    time.sleep(5)
                    output = str(t.read_very_eager().decode('ascii'))
                    if bool(findall(r'uploaded', output)) == True:
                        file.write('| ' + str(datetime.now())[0:19] + ' | ' +
                                   "{:15}".format(devices_ip) + ' | ' + name +
                                   ' | Backup успешен! \n')
                    elif bool(findall(r'([данные])', output)) == True:
                        file.write('| ' + str(datetime.now())[0:19] + ' | ' +
                                   "{:15}".format(devices_ip) + ' | ' + name +
                                   ' | Некорректные данные аутентификации \n')
                    elif bool(
                            findall(r'No such file or directory (0x2)',
                                    output)) == True:
                        file.write(
                            '| ' + str(datetime.now())[0:19] + ' | ' +
                            "{:15}".format(devices_ip) + ' | ' + name +
                            ' | Неправильный путь на стороне коммутатора \n')
                    elif bool(findall(r'No such file or directory',
                                      output)) == True:
                        file.write(
                            '| ' + str(datetime.now())[0:19] + ' | ' +
                            "{:15}".format(devices_ip) + ' | ' + name +
                            ' | Неправильный путь на стороне сервера \n')
                    else:
                        file.write('| ' + str(datetime.now())[0:19] + ' | ' +
                                   "{:15}".format(devices_ip) + ' | ' + name +
                                   ' | Время ожидания истекло \n')

                else:
                    file.write('| ' + str(datetime.now())[0:19] + ' | ' +
                               "{:15}".format(devices_ip) + ' | ' + name +
                               ' | Неправильно задан ключ \'noftp\' \n')
            else:
                file.write(
                    '| ' + str(datetime.now())[0:19] + ' | ' +
                    "{:15}".format(devices_ip) + ' | ' + name +
                    ' | Конфигурация за последние сутки не изменилась \n')

            t.write(b'exit\n')
            t.write(b'exit\n')
            t.write(b'exit\n')
Beispiel #3
0
def zte(ip, name, tftp):
    '''
    Функция обработки файлов конфигурации
    коммутаторов доступа ZTE
    '''
    user = '******'
    with open('/etc/svi_password.cfg', 'r') as f:
        master_password = f.readlines()
        for find_pass in master_password:
            if user in find_pass:
                password = str(find_pass.split(' ')[1]).encode('ascii')
    find_name = findall('SVSL-(\d+)-(\S+)-\D{3}(\d)', name)
    zte_name = find_name[0][0] + find_name[0][1] + find_name[0][2]
    user = user.encode('ascii')
    # -------------------------------------------НАЧАЛО-------------------------------------------------
    with telnetlib.Telnet(ip) as t:
        output = str(t.read_until(b'login:'******'log', output)):
            t.write(user + b'\n')
        else:
            elog("Таймаут превышен", ip, name)
            return 0
        output = str(t.read_until(b'password:'******'password:'******'\n')
        else:
            elog("Таймаут превышен", ip, name)
        output = str(t.read_until(b'login-authentication failure!', timeout=3))
        if bool(findall(r'login-authentication failure!', output)):
            elog("Неверный логин или пароль", ip, name)
            return 0
        t.write(b'enable\n')
        t.read_until(b'password:'******'sevaccess\n')
        output = str(t.read_until(b'(cfg)#', timeout=2))
        if not bool(findall(r'\(cfg\)#', output)):
            elog("Неверный пароль от привилегированного пользователя", ip,
                 name)
            t.write(b'exit\n')
        t.write(b'show start-config\n')
        time.sleep(0.4)
        cfg = []
        # wii - После преобразования с битовой строки остаются символы:
        wii = '\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08\x08 \x08'
        # ---------------------------ЛИСТИНГ КОНФИГУРАЦИИ--------------------------------
        while True:
            y = t.read_until(b'break -----', timeout=0.5).decode('ascii')
            if bool(y) and not bool(match('\s', y)):
                t.write(b' ')
                cfg.append(
                    y.replace(
                        '----- more ----- Press Q or Ctrl+C to break -----',
                        '').replace(wii, '').replace('\r', ''))
            else:
                break
        cfg = ''.join(cfg)
        # --------------------------Сравнение конфигураций-------------------------------
        trfl = diff_config(name, cfg, 'asw')
        t.write(b'config tffs\n')
        if trfl:
            # ------------------------------РАБОТА С TFTP----------------------------------
            if tftp:
                command_to_copy = str(
                    'copy startcfg.txt  ' + zte_name + '.txt \n').encode(
                        'ascii')  # Копирование файла на коммутаторе
                t.write(command_to_copy)
                time.sleep(1)
                output = str(t.read_until(b'bytes copied', timeout=3))
                if bool(findall(r'bytes copied', output)):
                    upload(t, zte_name, name, ip)  # ЗАГРУЗКА ПО TFTP
                elif bool(findall(r'File exists', output)):
                    delete_file = str('remove ' + zte_name + '.txt \n').encode(
                        'ascii')  # Удалить файл после передачи
                    t.write(delete_file)
                    t.read_until(b'[Yes|No]:', timeout=1)
                    t.write(b'Yes\n')
                    t.write(command_to_copy)
                    t.read_until(b'bytes copied', timeout=3)
                    upload(t, zte_name, name, ip)
                else:
                    t.write(b'cd cfg\n')
                    time.sleep(1)
                    command_to_copy = str(
                        'copy startrun.dat  ' + zte_name + '.txt \n').encode(
                            'ascii')  # Копирование файла на коммутаторе
                    t.write(command_to_copy)
                    time.sleep(3)
                    upload(t, zte_name, name, ip)
                    if ip != '172.30.0.73':
                        elog(
                            "Файл конфигурации с именем \'startcfg.txt/startrun.dat\' не найден.",
                            ip, name)
            # -------------------------------ОТПРАВКА ПО FTP----------------------------------
            elif not tftp:
                dir_name = str(
                    'ftp 10.20.0.14 asw/' + name.strip() + '/' + timed +
                    'startrun.dat upload /cfg/startrun.dat username svi password q7TP6GwCS%c3\n\n'
                ).encode('ascii')
                t.write(dir_name)
                time.sleep(5)
                output = str(t.read_very_eager().decode('ascii'))
                if bool(findall(r'uploaded', output)):
                    pass
                elif bool(findall(r'([данные])', output)):
                    elog("Некорректные данные аутентификации", ip, name)
                elif bool(findall(r'No such file or directory (0x2)', output)):
                    elog("Неправильный путь на стороне коммутатора", ip, name)
                elif bool(findall(r'No such file or directory', output)):
                    elog("Неправильный путь на стороне сервера", ip, name)
                else:
                    elog("Время ожидания истекло", ip, name)
            else:
                elog("Неправильно задан ключ \'noftp\'", ip, name)
        t.write(b'exit\n')
        t.write(b'exit\n')
        t.write(b'exit\n')
        print(ip, ': Выполнено')
Beispiel #4
0
def iskratel_slot(devices_ip, name):
    '''
    Функция бэкапа конфига с плат Iskratel.
    Аргументы: ip платы(str), имя платы(str).
    '''

    ### Логи ###

    def elog(info, devices_ip, name):

        '''
        Функция логирования.
        Аргументы: текст ошибки(str), ip платы(str), имя платы(str).
        '''
        logs.error_log.error("%s-> %s: %s" % (devices_ip.ljust(15, '-'), name, info))
    ### / ###

    ### FTP download ###

    def ftp_download(start_path, local_path):

        '''
        Функция построения дерева директорий и скачивания всех файлов в них.
        Аргументы: начальный путь на ftp(str), начальный локальный путь для записи(str).
        '''

        try:
            ftp.cwd(start_path)
        except Exception as exc:
            elog("Ошибка при переходе в директорию " + start_path + ': ' + str(exc) , devices_ip, name)
            pass
        ls = []
        ftp.dir(ls.append)
        for line in ls:
            if line.startswith('d') and not line.endswith('.'):
                dir = re.search(r'\S*$', line)
                try:
                    os.mkdir(local_path + '/' + dir.group(0))
#                    print(name + '    найдена папка ' + dir.group(0))
                    ftp_download(start_path + '/' + dir.group(0), local_path + '/' + dir.group(0))
                except Exception as exc:
                    elog('Ошибка создания директории ' + dir.group(0) + ': ' + str(exc), devices_ip, name)
                    pass
            if line.startswith('-'):
                try:
                    file = re.search(r'\S*$', line)
#                   print(name + '    найден файл ' + file.group(0))
                    with open (local_path + '/' + file.group(0), 'wb') as local_file:
                        ftp.retrbinary('RETR ' + file.group(0), local_file.write)
                except Exception as exc:
                    elog('Ошибка при скачивании файла ' + file.group(0) + ': ' + str(exc), devices_ip, name)
                    pass
        return
   ### / ###

    now = datetime.datetime.now()
#    print(name + '    старт')
    ### Юзернейм и пароль ###
    user = '******'
    with open('/etc/svi_password.cfg', 'r') as f:
        master_password = f.readlines()
        for find_pass in master_password:
            try:
                if user and 'iskratel_slot' in find_pass:
                    password=str(find_pass.split(' ')[1]).encode('ascii')
                    en_user = user.encode('ascii')
            except Exception as exc:
                elog('Пароль не найден: ' + str(exc), devices_ip, name)
                return
    ### / ###

    ### Логин ###
    t = telnetlib.Telnet(devices_ip)
    output = t.expect([b'user id :'],timeout=2)
    if bool(re.findall(r'user id :', output[2].decode('ascii'))) == True:
        t.write(en_user + b'\n')
    else:
        elog('Не найдена строка ввода логина', devices_ip, name)
        return
    output = t.expect([b'password:'******'password:'******'ascii'))) == True:
        t.write(password + b'\n')
    else:
        elog('Не найдена строка ввода пароля',devices_ip, name)
        return
    ### / ###

    ### Чтение конфигурации ###
    output = t.expect([b'mBAN>'], timeout=2)
    try:
        if bool(re.findall(r'mBAN>', output[2].decode('ascii'))) == True:
            t.write(b'show system config\n')
#        print(name + '    логин успешен')
        else:
            elog('Не найдена строка приглашения',devices_ip, name)
            return
    except Exception as exc:
        elog('Ошибка кодировки ' + exc, devices_ip, name)
    cfg = []
    i = 1
    check = (b'1', b'2', b'3')
    while 'mBAN>' not in check[2].decode('ascii'):
        check = t.expect([b'Press any key to continue or Esc to stop scrolling.', b'mBAN>'], timeout=0.2)
        t.write(b' ')
        cfg.append(check[2].decode('ascii').replace('\r\nPress any key to continue or Esc to stop scrolling.', ''))
        i+=1
        if i > 110:
            print(name + '    бесконечный цикл конфига')
            break
#    try:
#        while i < 30:
#            output = t.expect([b'Press any key to continue or Esc to stop scrolling.'], timeout=0.2)
#            if bool(re.findall(r'Press any key to continue or Esc to stop scrolling.', output[2].decode('ascii'))) == True:
#                cfg.append(output[2].decode('ascii').replace('\r\nPress any key to continue or Esc to stop scrolling.', ''))
#                t.write(b' ')
#            elif bool(re.findall(r'mBAN>$', output[2].decode('ascii'))) == True:
#                cfg.append(output[2].decode('ascii').replace('\r\nPress any key to continue or Esc to stop scrolling.', ''))
#                break
#            elif if bool(re.findall(r'Press any key to continue or Esc to stop scrolling.', output[2].decode('ascii'))) == False:
#
#            i+=1
#            print(i)
#    except Exception as exc:
#        elog('Ошибка чтения конфигурации: ' + str(exc),devices_ip, name)
#        return
    ### / ###

    t.write(b'exit\n')  # logout

    ### Первод конфига в строку, удаление блоков с динамическими данными, вызов функции сравнения ###
    cfg = ''.join(cfg).replace('\r', '')
    cut1 = cfg.find('Basic System data')
    cut2 = cfg.find('IP routing-running')
    cut3 = cfg.find('Bridge status:')
    cut4 = cfg.find('Mactable for all interfaces:')
    cut5 = cfg.find('VLANs registered in system:')
    cut6 = cfg.find('bridge poll load')
    cut7 = cfg.find('calculated discardind probabilities')
    cut8 = cfg.find('Status and summary statistic DHCP RA:')
    cut9 = cfg.find('Opt82 and statistics for each interface:')
    cut10 = cfg.find('Status and summary statistic of PPPoE IA:')
    cut11 = cfg.find('Show PPPoE specific information for each interface:')
    cut12 = cfg.find('No DSS public key is detected:')
    cut13 = cfg.find('SNMP:')
    cut14 = cfg.find('mBAN>')
    cfg = cfg[cut1:cut2] + cfg[cut3:cut4] + cfg[cut5:cut6] + cfg[cut7:cut8] + cfg[cut9:cut10] + cfg[cut11:cut12] + cfg[cut13:cut14]
#    print(name + '    конфиг собран и подрезан')
    try:
        diff_result = diff_config(name, cfg, 'iskratel')
    except Exception as exc:
        elog('Ошибка функции сравнения: ' + str(exc),devices_ip, name)
        return
     ### / ###

    if diff_result == True:

        ### FTP ###
        try:
            with ftplib.FTP(devices_ip) as ftp:
                ftp.login(user = user, passwd = password.decode('ascii'))
                ftp.cwd('/tffs')
                now = now.strftime('%d-%m-%Y_%H-%M')
                start_local_path = '/srv/config_mirror/dsl/' + name + '/' + now
                os.mkdir(start_local_path)
                my_folders = re.findall(r'M[A-Z,0-9]*', ' '.join(ftp.nlst()))
                for my_folder in my_folders:
#                    print(name + '    найдена М папка ' + my_folder)
                    local_path = start_local_path + '/' + str(my_folder).strip('[]').strip("'")
                    os.mkdir(local_path)
                    download = ftp_download('/tffs/'+str(my_folder).strip('[]').strip("'"), local_path)
                ftp.quit()
        except Exception as exc:
            elog('Ошибка FTP: ' + str(exc),devices_ip, name)
            ftp.quit()
            return
        ### / ###
    print(name + '    скрипт завешён')
Beispiel #5
0
def msan(ip, name):
    timed = str(datetime.now())[0:10]
    user = '******'
    with open('/etc/svi_password.cfg', 'r') as f:
        master_password = f.readlines()
        for find_pass in master_password:
            if user in find_pass:
                password = str(find_pass.split(' ')[1]).encode('ascii')
                if len(find_pass.split(' ')) == 3:
                    password_two = str(
                        find_pass.split(' ')[2].strip()).encode('ascii')
    en_user = user.encode('ascii')
    # ---------------------TELNET ПОДКЛЮЧЕНИЕ--------------------------
    with telnetlib.Telnet(ip) as t:
        time.sleep(1)
        output = str(t.read_until(b'User name:', timeout=1))
        if bool(findall(r'User name:', output)):
            t.write(en_user + b'\n')  # ввод логина
        elif bool(findall(r'Connection closed by foreign host', output)):
            elog("Превышен лимит подключений", ip, name)
            return 0
        else:
            elog("Ошибка telnet", ip, name)
            return 0
        output = str(t.read_until(b'User password:'******'User password:'******'\n')  # ввод пароля
        else:
            elog("Ошибка telnet", ip, name)
            return 0
        output = str(t.read_until(b'User name:', timeout=1))
        if bool(findall(r'User name:', output)):
            t.write(en_user + b'\n')  # ввод логина
            if bool(findall(r'Connection closed by foreign host', output)):
                elog("Превышен лимит подключений", ip, name)
                return 0
            output = str(t.read_until(b'User password:'******'User password:'******'\n')  # ввод пароля
            else:
                elog("Ошибка telnet", ip, name)
                return 0
            output = str(t.read_until(b'.', timeout=1))
        else:
            if bool(findall(r'Username or password invalid\.', output)):
                elog("Неправильный логин или пароль", ip, name)
                return 0
        if bool(
                findall(r'Reenter times have reached the upper limit\.',
                        output)):
            elog("Данный пользователь уже зашел на оборудование", ip, name)
            return 0
        t.write(b'enable\n')
        t.write(b'config\n')
        t.write(b'scroll 100\n')
        t.write(b'display saved-configuration\n')
        #        t.write(b'display config\n')
        x = t.read_until(b'display saved-configuration')
        #        t.write(b'\n')
        cfg = []  # переменная для хранения конфигурации
        # Листинг конфигураций
        brk = False
        while True:
            check = t.read_until(b'to break ) ----', timeout=1).decode('ascii')
            if not brk:
                if bool(search(r'config.#', str(check))):
                    brk = True
                t.write(b' ')
                cfg.append(
                    check.replace(
                        '---- More ( Press \'Q\' to break ) ----', '').replace(
                            'D                                     D',
                            '').replace('\n',
                                        '').replace('\r',
                                                    '').replace('\x07 ', ''))
            else:
                break
        cfg = ''.join(cfg)
        diff_result = diff_config(name, cfg,
                                  'msan')  # вызов функции сравнения конф-ий
        if diff_result:  # Если файлы различаются
            # FTP отправка
            upload_command = str('backup configuration ftp 10.20.0.14 /msan/' +
                                 name.strip() + '/' + timed +
                                 '-data.dat\n').encode('ascii')
            t.write(upload_command)  # ОТПРАВКА ФАЙЛА
            t.write(b'y\n')  # подтверждение отправки файла
            backup_check = t.read_until(b'(config)#\n  Backing up', timeout=10)
            #            print(backup_check)
            # Логирование
            if bool(
                    findall(r'Backing up files is successful',
                            str(backup_check))):
                pass
            elif bool(
                    findall(
                        r'The file with the same name exists on FTP server',
                        str(backup_check))):
                elog("Файл с таким именем уже существует", ip, name)
            else:
                elog("Backup FAILED :(", ip, name)
        t.write(b'quit\n')  # logout
        t.write(b'y\n')