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

2 years ago
  1. #!/usr/bin/python
  2. # coding=utf-8
  3. import paramiko
  4. import time
  5. import sys
  6. def get_data(host, user, password, commands): # вытаскиваем из циски данные
  7. errorcode = ''
  8. client = paramiko.SSHClient()
  9. client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # если нет хоста - добавляем
  10. out = [] # выхлоп будет в этом списке
  11. try:
  12. client.connect(hostname=host, username=user, password=password, look_for_keys=False,
  13. allow_agent=False) # пытаемся подключиться, look_for_keys=False, allow_agent=False - зачем-то нужны циске.
  14. except Exception as exept: # в случае исключения -
  15. errorcode = exept # возвращаем код и описание исключения
  16. else: # усли все в порядке
  17. conn = client.invoke_shell() # врубаем интерактивный шелл - с цисками только так.
  18. time.sleep(1) # задержка
  19. conn.recv(1000) # хаваем все, что выплюнула цика, дабы не отсвечивало
  20. for command in commands: # Читаем и исполняем команды
  21. if command[0] == "$username":
  22. command[0] = user
  23. if command[0] == "$password":
  24. command[0] = password
  25. conn.send(command[0] + '\n') # засылаем команду
  26. time.sleep(int(command[1])) # ждем указанный таймаут
  27. if command[2]: # если сказано сохранять - сохраняем выхлоп
  28. conn_out = conn.recv(99999999999).splitlines() # жрем выхлоп в список, разбивая по строкам
  29. out_line = "" # пустая строка для сохранения
  30. if len(conn_out) > 2:
  31. conn_out.pop() # обрезаем последнюю строку строку
  32. conn_out.pop(0) # Обрезаем первую строку
  33. if command[3]: # если сказано комментить - комментим
  34. for line in conn_out: # перебираем все строки
  35. line = "!" + line # Добавляем в начало !
  36. out_line = out_line + line + '\n' # Собираем все мимо строк, прямо в одну строковую переменную
  37. else: # Если не сказано коментить - не коментим
  38. for line in conn_out: # перебираем все строки
  39. out_line = out_line + line + '\n' # Собираем все мимо строк, прямо в одну строковую переменную
  40. out.append(out_line) # Добавляем все толпой в выхлоп
  41. else: # если выхлоп нам ненужон
  42. conn.recv(99999999999) # хаваем его в никуда
  43. finally: # по окончании всех процедур
  44. client.close() # закрываем коннектий
  45. return out, errorcode # Вертаем все, что наковыряли
  46. def read_file(in_file):
  47. errorcode = "" # устанавливаем переменные
  48. out = []
  49. try: # Пробуем открыть файл
  50. f = open(in_file, 'r')
  51. except Exception as exept:
  52. errorcode = exept # не получилось - запиливаем исключение
  53. else: # Если все норм - начинаем читать
  54. for line in f: # Каждую линию
  55. sp_line = line.split(',') # бомбим линию по разделителю в переменную
  56. command = [] # устанавливаем список, в котором будет храниться команда с атрибутами
  57. if len(sp_line) > 0: # если элементов больше 0
  58. command.append(sp_line[0]) # добавляем элемент в список (это будет команда)
  59. if len(sp_line) > 1: # если больше одного
  60. if sp_line[1].strip().isdigit(): # если 1-й элемент из цыфарок
  61. command.append(int(sp_line[1].strip())) # добавляем цыфарку, это таймаут
  62. else: # если не цыфарки
  63. command.append("1") # то таймаут - 1 секунд
  64. if len(sp_line) > 2: # если более 2
  65. if sp_line[2].strip() == "0" or sp_line[2].strip() == "False": # 2 элемент равен фалсе или 0
  66. command.append(False) # добавляем фалсе
  67. else: # если там чтой-то другое
  68. command.append(True) # добавляем трую
  69. if len(sp_line) > 3: # если элементов больше 3
  70. if sp_line[3].strip() == "0" or sp_line[3].strip() == "False": # 3 элемент равен фалсе или 0
  71. command.append(False) # добавляем фалсе
  72. else: # если там чтой-то другое
  73. command.append(True) # добавляем трую
  74. if 0 < len(command) < 4: # если элементов не хватает, добиваем фалсой
  75. for i in [0, 1, 2, 3]:
  76. try:
  77. command[i]
  78. except IndexError:
  79. command.append(False)
  80. out.append(command)
  81. return out, errorcode # вертаем, что наковыряли
  82. def arg_parse(args): # парсим коммандную строку
  83. user = "" # устанавливаем переменные
  84. password = ""
  85. cmdfile = ""
  86. host = ""
  87. errorcode = ""
  88. for arg in args[1:]: # Перебираем элементы, присваивая списку все подряд
  89. if "\"" in arg or "\'" in arg: # обрезаем кавычки, если есть
  90. arg = arg[1:-1]
  91. sp_arg = arg.split("=")
  92. if sp_arg[0].strip() not in ["host", "user", "password", "cmdfile"]:
  93. errorcode = errorcode + " " + arg + " Недопустимый аргумент, допустимые аргументы:" \
  94. "user=, host=, password=, cmdfile="
  95. elif sp_arg[0].strip() == "user":
  96. user = sp_arg[1].strip()
  97. elif sp_arg[0].strip() == "password":
  98. password = sp_arg[1].strip()
  99. elif sp_arg[0].strip() == "host":
  100. host = sp_arg[1].strip()
  101. elif sp_arg[0].strip() == "cmdfile":
  102. cmdfile = sp_arg[1].strip()
  103. if str(user) == "": # дальше все подряд ясно
  104. errorcode = errorcode + "пользователь пустой "
  105. if str(password) == "":
  106. errorcode = errorcode + "пароль пустой "
  107. if str(cmdfile) == "":
  108. errorcode = errorcode + "не указан cmdfile "
  109. if str(host) == "":
  110. errorcode = errorcode + "хост пустой "
  111. return user, password, host, cmdfile, errorcode
  112. if __name__ == '__main__':
  113. user = ''
  114. host = ''
  115. password = ''
  116. cmdfile = ''
  117. errorcode = ''
  118. if len(sys.argv) > 1:
  119. user, password, host, cmdfile, errorcode = arg_parse(sys.argv)
  120. commands, errorcode = read_file(cmdfile)
  121. if errorcode:
  122. exit(errorcode)
  123. try:
  124. commands
  125. except NameError:
  126. commands = [['login', 0, False, True],
  127. [user, 0, False, True],
  128. [password, 0, False, True],
  129. ['terminal pager 0', 1, False, True],
  130. ['show version', 5, True, True],
  131. ['show flash', 5, True, True],
  132. ['show configuration', 10, True, False]]
  133. output, errorcode = get_data(host, user, password, commands)
  134. if errorcode == "0":
  135. for out in output:
  136. print out
  137. else:
  138. print("errorcode = " + str(errorcode))

Powered by TurnKey Linux.