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)
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')
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, ': Выполнено')
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 + ' скрипт завешён')
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')