Согласно комментариям, вы можете добавлять каждый line
в пустой список, открывать CSV-файл в нужном формате в режиме w
(запись) и записывать список в CSV.Это создаст CSV-файл с данными в sshdata
, если это то, что вы ищете:
import csv
filename = 'ssh_output.csv'
def __call__():
#your code here#
hostdata_list = []
hardware_data = []
for line in sshdata:
if 'HARDWARE' in line:
row = 'some_data'
hardware_data.append(row)
hostdata_list.append(line)
with open('input.csv', 'r') as f:
reader = csv.reader(f)
header = next(reader)
with open(filename, 'a+') as f:
writer = csv.writer(f)
writer.writerow(header)
if hardware_data is not None:
writer.writerow(hardware_data)
writer.writerow(hostdata_list)
print('sshdata written to {} for host {}'.format(filename, hostname))
Предлагаемое решение XML :
СледующееРешение обеспечивает рабочий процесс, который принимает hp_input.xml
для поставщика HP.Конечно, у вас может быть dell_input.xml
, если поставщик Dell.
Я использовал библиотеки xmltodict
и dicttoxml
для преобразования ввода в dict, добавив ключ output
для каждогоКоманда, обновите значение для этого ключа на основе выходных данных для команды, затем снова преобразуйте выходной dict в xml и запишите в файл hp_output.xml
или dell_output.xml
.Чтобы написать xml в красивой печати, я использовал lxml
.Прежде чем продолжить, убедитесь, что вы установили необходимые библиотеки с pip
.
Сначала верните stdout
из __call__()
в классе ssh
:
class ssh:
#your code#
def __call__():
stdout_outputs = []
#your code#
stdout_outputs.append(stdout.read())
return stdout_outputs
ДалееСледующая функция примет входной XML-файл и преобразует его в dict:
import xmltodict
import lxml.etree as etree
import dicttoxml
import json
def xml_to_dict(xml_doc):
with open(xml_doc) as f:
data = xmltodict.parse(f.read())
# print(json.dumps(data, indent=4)) #check dict
return data
Следующая функция получает значение команды из вышеуказанного dict и отправляет его на выполнение в remote
, получает вывод и обновляет dictполучено сверху.
def get_output_dict():
if vendor == 'HP':
data = xml_to_dict(xml_doc='hp_input.xml')
elif vendor == 'Dell':
data = xml_to_dict(xml_doc='dell_input.xml')
for test in data['platform']['vendor']['tests']:
command = test.get('command',[]) #continue if command is not present
if isinstance(command, list):
for i in command:
output = list(dict(i=remote(i)))
output = list(dict(command=remote(command)))
test['output'] = output
return json.loads(json.dumps(data))
Теперь, когда у нас есть последний dict из вышеуказанной функции, следующая функция снова преобразует его в xml и записывает в выходной xml-файл:
def get_output_xml(output_dict):
output_xml = dicttoxml.dicttoxml(output_dict,custom_root='output', attr_type=False, root=False)
if vendor == 'HP':
filename = 'hp_output.xml'
elif vendor == 'Dell':
filename = 'dell_output.xml'
tree = etree.fromstring(output_xml)
output_xml_string = etree.tostring(tree, pretty_print=True)
with open(filename, 'wb') as f:
f.write(output_xml_string)
print('Output for hostname server: {} written to: {}'.format(hostname, filename))
return output_xml
Вы можете поместить все функции в один класс и добавить обработку исключений по своему усмотрению.Мы можем вызвать функции следующим образом:
data = get_output_dict()
xml = get_output_xml(data)
Код был протестирован с предоставленным входным xml и фиктивным значением для вывода.Хотя я не тестировал paramiko
, этот код должен дать вам базовый рабочий процесс для получения желаемого выходного XML-файла, и, если возникнут какие-либо ошибки, они могут быть отлажены.