The old python backup software.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

146 lines
8.2 KiB

#!/usr/bin/python
# coding=utf-8
import paramiko
import time
import sys
def get_data(host, user, password, commands): # вытаскиваем из циски данные
errorcode = ''
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # если нет хоста - добавляем
out = [] # выхлоп будет в этом списке
try:
client.connect(hostname=host, username=user, password=password, look_for_keys=False,
allow_agent=False) # пытаемся подключиться, look_for_keys=False, allow_agent=False - зачем-то нужны циске.
except Exception as exept: # в случае исключения -
errorcode = exept # возвращаем код и описание исключения
else: # усли все в порядке
conn = client.invoke_shell() # врубаем интерактивный шелл - с цисками только так.
time.sleep(1) # задержка
conn.recv(1000) # хаваем все, что выплюнула цика, дабы не отсвечивало
for command in commands: # Читаем и исполняем команды
if command[0] == "$username":
command[0] = user
if command[0] == "$password":
command[0] = password
conn.send(command[0] + '\n') # засылаем команду
time.sleep(int(command[1])) # ждем указанный таймаут
if command[2]: # если сказано сохранять - сохраняем выхлоп
conn_out = conn.recv(99999999999).splitlines() # жрем выхлоп в список, разбивая по строкам
out_line = "" # пустая строка для сохранения
if len(conn_out) > 2:
conn_out.pop() # обрезаем последнюю строку строку
conn_out.pop(0) # Обрезаем первую строку
if command[3]: # если сказано комментить - комментим
for line in conn_out: # перебираем все строки
line = "!" + line # Добавляем в начало !
out_line = out_line + line + '\n' # Собираем все мимо строк, прямо в одну строковую переменную
else: # Если не сказано коментить - не коментим
for line in conn_out: # перебираем все строки
out_line = out_line + line + '\n' # Собираем все мимо строк, прямо в одну строковую переменную
out.append(out_line) # Добавляем все толпой в выхлоп
else: # если выхлоп нам ненужон
conn.recv(99999999999) # хаваем его в никуда
finally: # по окончании всех процедур
client.close() # закрываем коннектий
return out, errorcode # Вертаем все, что наковыряли
def read_file(in_file):
errorcode = "" # устанавливаем переменные
out = []
try: # Пробуем открыть файл
f = open(in_file, 'r')
except Exception as exept:
errorcode = exept # не получилось - запиливаем исключение
else: # Если все норм - начинаем читать
for line in f: # Каждую линию
sp_line = line.split(',') # бомбим линию по разделителю в переменную
command = [] # устанавливаем список, в котором будет храниться команда с атрибутами
if len(sp_line) > 0: # если элементов больше 0
command.append(sp_line[0]) # добавляем элемент в список (это будет команда)
if len(sp_line) > 1: # если больше одного
if sp_line[1].strip().isdigit(): # если 1-й элемент из цыфарок
command.append(int(sp_line[1].strip())) # добавляем цыфарку, это таймаут
else: # если не цыфарки
command.append("1") # то таймаут - 1 секунд
if len(sp_line) > 2: # если более 2
if sp_line[2].strip() == "0" or sp_line[2].strip() == "False": # 2 элемент равен фалсе или 0
command.append(False) # добавляем фалсе
else: # если там чтой-то другое
command.append(True) # добавляем трую
if len(sp_line) > 3: # если элементов больше 3
if sp_line[3].strip() == "0" or sp_line[3].strip() == "False": # 3 элемент равен фалсе или 0
command.append(False) # добавляем фалсе
else: # если там чтой-то другое
command.append(True) # добавляем трую
if 0 < len(command) < 4: # если элементов не хватает, добиваем фалсой
for i in [0, 1, 2, 3]:
try:
command[i]
except IndexError:
command.append(False)
out.append(command)
return out, errorcode # вертаем, что наковыряли
def arg_parse(args): # парсим коммандную строку
user = "" # устанавливаем переменные
password = ""
cmdfile = ""
host = ""
errorcode = ""
for arg in args[1:]: # Перебираем элементы, присваивая списку все подряд
if "\"" in arg or "\'" in arg: # обрезаем кавычки, если есть
arg = arg[1:-1]
sp_arg = arg.split("=")
if sp_arg[0].strip() not in ["host", "user", "password", "cmdfile"]:
errorcode = errorcode + " " + arg + " Недопустимый аргумент, допустимые аргументы:" \
"user=, host=, password=, cmdfile="
elif sp_arg[0].strip() == "user":
user = sp_arg[1].strip()
elif sp_arg[0].strip() == "password":
password = sp_arg[1].strip()
elif sp_arg[0].strip() == "host":
host = sp_arg[1].strip()
elif sp_arg[0].strip() == "cmdfile":
cmdfile = sp_arg[1].strip()
if str(user) == "": # дальше все подряд ясно
errorcode = errorcode + "пользователь пустой "
if str(password) == "":
errorcode = errorcode + "пароль пустой "
if str(cmdfile) == "":
errorcode = errorcode + "не указан cmdfile "
if str(host) == "":
errorcode = errorcode + "хост пустой "
return user, password, host, cmdfile, errorcode
if __name__ == '__main__':
user = ''
host = ''
password = ''
cmdfile = ''
errorcode = ''
if len(sys.argv) > 1:
user, password, host, cmdfile, errorcode = arg_parse(sys.argv)
commands, errorcode = read_file(cmdfile)
if errorcode:
exit(errorcode)
try:
commands
except NameError:
commands = [['login', 0, False, True],
[user, 0, False, True],
[password, 0, False, True],
['terminal pager 0', 1, False, True],
['show version', 5, True, True],
['show flash', 5, True, True],
['show configuration', 10, True, False]]
output, errorcode = get_data(host, user, password, commands)
if errorcode == "0":
for out in output:
print out
else:
print("errorcode = " + str(errorcode))

Powered by TurnKey Linux.