as7951 Ответов: 1

Создание нескольких выходных файлов для нескольких входных файлов при выполнении telnet


Эксперты,
Запросите поддержку, чтобы исправить эту проблему и расположить код(python2.6) в правильной последовательности
У меня есть несколько входных файлов, из которых мне нужно прочитать значение третьего столбца и передать его команде("show run interface gigabitEthernet %s\r\n" % data), присутствующей внутри скрипта, который выполняет telnet и извлечение данных. У меня также есть один файл, который содержит список IP-адресов, которые будут использоваться для устройства telnet один за другим. Требуется несколько выходных файлов для каждого входного файла.

Передача значения в этой команде внутри скрипта:

show run interface gigabitEthernet %s\r\n"


Проблема : скрипт не может генерировать несколько выходных файлов для нескольких входных файлов.
Выходные данные для всех входных файлов генерируются в одном выходном файле 'result_s'

Имейте несколько входных файлов, содержащих данные, как показано ниже :

Файл 1:

Sessions,CPU,facility
43,17104773,1
45,17104234,2


Файл 2:
Sessions,CPU,facility
43,17104773,3
45,17104234,4


Нужен вывод по другому пути в отдельном файле для каждого входного файла

Что я уже пробовал:

<pre lang="Python">
#!/usr/bin/env python
import sys
import telnetlib
import os
import subprocess

import csv
import os
import logging

# This is the main logger object to be used throughout the script
logger = None

# Create the necessary log handles
#   A log file is created with the filename specified
#   Other log messages are also printed on the console as per the level
def createLogHandlers(logfile):
    global logger
    logging.basicConfig(filename=logfile ,
                        filemode='a',
                        level=logging.DEBUG,
                        format='%(asctime)s %(levelname)-8s %(message)s',
                        datefmt='%a, %d %b %Y %H:%M:%S')
    logger = logging.getLogger('Telnet')

    # Create handler which logs messages on console
    log_console = logging.StreamHandler()
    log_console.setLevel(logging.DEBUG)
    log_console.setFormatter(logging.Formatter('%(asctime)s %(levelname)-8s %(message)s',
                                                datefmt='%a, %d %b %Y %H:%M:%S'))
    logger.addHandler(log_console)


# Global Objects
COLUMN_DATA = []
PATHSTR = "/tmp/input"
os.chdir (PATHSTR)

'''
This will extract data from all the files with filename
pattern "aa<number>" present in the PATHSTR
'''
def extract_column_data():
    global COLUMN_DATA
    fileCount = 1
    for file in os.listdir(PATHSTR):
        if file.startswith("aa"):
            logger.info("Reading from file %s, file counter = %d" % (file, fileCount))
            fileCount += 1

            infile = open(file)
            outfile = open('out_%d.txt' % fileCount, 'wb')

            csvreader = csv.DictReader(infile)
            csvwriter = csv.writer(outfile)

            for row in csvreader:
                # store the data in memory
                COLUMN_DATA.append(row['facility'])

                # Write the data to storage
                csvwriter.writerow(row['facility'])

            infile.close()
            outfile.close()



def my_function(device):
    global COLUMN_DATA
    f = open('result_S', 'w')
    user = "abc"
    password = "abc"
    try:
        # TELNET TO DEVICE
        telnet = telnetlib.Telnet(device)
        telnet.read_until('username: ', 3)
        telnet.write(user + '\r')
        telnet.read_until('password: ', 3)
        telnet.write(password + '\r')
        telnet.write("term len 0" + "\r\n")
        response = telnet.read_until('IST', timeout=5)

        logger.info("Logged into device ip = %s successfully" % device)

         for data in COLUMN_DATA:
            logger.info("Checking show run for interface %s" % data)
            telnet.write("show run interface gigabitEthernet %s\r\n" % data)
            response = telnet.read_until('S', timeout=5)
            logger.debug("Received response:\n%s " % response)

            f.write('\n' + str(device) + "\t" + "response:" + "\t" + response)
            telnet.write('\r\r')
            telnet.write('\r\r')
            #telnet.write('exit' + '\r')
    except NameError:
        logger.error("Script ERROR")
    except:
        logger.error("Telnet Failed")
    finally:
        f.close( )



### MAIN FUNCTION ###

if __name__ == "__main__":
    createLogHandlers('telnet_b.log')

    extract_column_data()

    IP_address = open("IP_file", "r")

    logger.info("Reading from file %s" % IP_address.name)
    for device in IP_address:
       logger.debug("Parsed device=%s" % device)
       logger.info("Running ping against device=%s" % device)
       res = subprocess.call(['ping', '-c', '2', device])
    if res == 0:
        logger.debug("Ping to device=%s successfull" % device)
        logger.info("Initating show run collection on device=%s" % device)
        my_function(device)
    else:
        print
        logger.warning("Ping to device=%s failed" % device)

1 Ответов

Рейтинг:
2

Richard MacCutchan

def my_function(device):
    global COLUMN_DATA
    f = open('result_S', 'w')

Вам нужно переместить открытый файл в цикл, где вы тестируете каждый интерфейс, и использовать номер интерфейса в качестве суффикса в имени файла. Аналогично коду в extract_column функция.