Advertisement
Guest User

Untitled

a guest
Feb 6th, 2019
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.12 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # Este script utiliza encoding: utf-8
  3.  
  4. # Todos os direitos reservados - Copyright © 2017-2018 Lógica Sistemas de informação - LTDA - ME
  5.  
  6. ######################################## INICIALIZAÇÃO ########################################
  7.  
  8. # Carregando bibliotecas
  9. import os
  10. import time
  11. import requests
  12. import json
  13. import smtplib
  14. import thread
  15.  
  16. from dotenv import load_dotenv
  17. from threading import Thread
  18. from timeit import default_timer as timer
  19. from email.mime.multipart import MIMEMultipart
  20. from email.mime.text import MIMEText
  21. from os.path import join, dirname
  22.  
  23. # Cria dois semáforos, um para cuidar da zona crítica da escrita dos arquivos e outro para a zona crítica na alteração do valor de lastSendEmail
  24. sem = thread.allocate_lock()
  25. sem2 = thread.allocate_lock()
  26.  
  27. # Carrega as variáveis de ambiente
  28. load_dotenv()
  29. env_path = join(dirname(__file__), '../../.env')
  30. load_dotenv(dotenv_path=env_path)
  31.  
  32. # Inicializa variáveis
  33. lastGetKeyRSA = None
  34. lastSendEmail = None
  35. RSA_DEFAULT = """ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+DPy3bCKBY3gSUiOOkdUsMe4a8ljcpqYmUofZU5puBePfMmK2kBZ+C8xsMGvXQdC0CwjpDd2H1sD1Zx+C0eJ8nNHZ4yrBfTJVGzthdnIFCWWftgs59OVJZmjHxlWO8QQDVIvoSsQ0grq0si8u1hCGATv7684gsjJoiNJYgI2bXCgPGGqC23VYoLXznldHNOlYPIKsCuC7BEQf44cT2esVWTIgLjRnXuWm70JuK20e3mWH/06VRHVkmeXzVGbFSZ4xwpjOojQXt40eakXhFsKnli5blAI8lZCFA6IWLF/ta9r2olZJB9Z6oA3c4gKAm4kd5CCCwViRBqoDRFkV2ccZ natan@ltsp179
  36. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbX66FFI7fFZFR2bpo56o7u/KXQANcTnE/uwPea3rQw1OoPupgMvFFPRsWYkSE7/hXeO1xx07FDP8rHcVXWjDi46u+cMvAWiRT9DZ8o3TR3tUzu6B9hanEYRUI+dyl3pBFCW2ZVm6TY0ADcbhy30Rbk7WcYuEHvhCWtCipPrvE8o+JJ4F59KQfdaMo0oM9iN1O4lBikkF6Zmi8aEedwn7u5yqlxL8X6ngk3923W+/eMKlvvHJttczel7WPnc94llCtjTTTjPpfg9R/fPl81pXBMw6PuCMl7Iz76rB+samUjq7Uw3Um7gsFOdCpJgO45hS8FcJByyqdE+j811OPRWfl natan@natan
  37. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvmo1CKv151WKaN2Il/S33Ps6Z2FsN8cxKdzQ687y+2gEOX67jo+3J1UtK9M3ebqh/pnwi8qqZ4ImfcbNBgiVKTjrRZ23q1UDeJnAyj3CC/bIWeYyNfFtvdZVjvgeVgnnLrYd7DCo/ZU7tEcn2pkod0/h4UmOV4z2wwY9duy8La7CcjbzysMEXkPQjzLwG6ZEgTj+IhbgMNpcBppP4KlyE7gTkNLKABYIWCkfNIzHh7QNNJ1qdtbRD+5YIp/FTsfSf/24SF+0YbTM5QHywcBvjrsl1zBVc0EGHaYKi2jFQDOMAfv/khZt9OXkwohHGxKZi5hSpNW1pl7WoaEW4iD2f daniel@LTSP
  38. ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCpkOV8QAIm7ak1++/TzxkbWoWavEaKHZkajysFelMWxNfhGfHel7C40gQIf3NGkQurMsaG16N8KF8UGnq15C8FAnOmCRGRTTZA0of6iTWCokS6KJJaN8GdTe4sDBmjKf9kCh1sd9CrQxoYQw7LB+JyvqVOGjeLHI4rwTV/xXT7bQ== daniel.passos@logicasistemas.com.br"""
  39. LHC_AUTH_USER = str(os.getenv("LHC_AUTH_USER"))
  40. LHC_AUTH_PASS = str(os.getenv("LHC_AUTH_PASS"))
  41. LHC_END_CONEXAO = str(os.getenv("LHC_END_CONEXAO"))
  42. TIPOS_SERV = str(os.getenv("TIPOS_SERV", "1 2 3"))
  43. CONFIG_INTERVAL_GET_KEY_RSA = int(os.getenv("CONFIG_INTERVAL_GET_KEY_RSA", 60))
  44. NOME_FANTASIA_PROVEDOR = str(os.getenv("NOME_FANTASIA_PROVEDOR", "Lógica Sistemas - Nome Fantasia não definido"))
  45.  
  46. ########################################### FUNÇÕES ############################################
  47.  
  48. def enviaEmail(mensagem):
  49. msg = MIMEText(mensagem)
  50. msg['Subject'] = 'Service Salva Chaves RSA em' + NOME_FANTASIA_PROVEDOR
  51.  
  52. s = smtplib.SMTP_SSL('smtp.gmail.com:465')
  53. s.login('livehelperchat.logica@gmail.com','l0g1c2l0g1c2')
  54. # Comente para testar
  55. send_to = 'suporte.erp@logicasistemas.com.br'
  56. # Descomente para testar
  57. #send_to = 'joao.emmanuel@logicasistemas.com.br'
  58. s.sendmail('livehelperchat.logica@gmail.com', send_to, msg.as_string())
  59. s.quit()
  60.  
  61. # Função principal que irá ser executada em loop após um periodo de tempo
  62. def getKeyRSA():
  63. global TIPOS_SERV
  64. global LHC_END_CONEXAO
  65. global LHC_AUTH_USER
  66. global LHC_AUTH_PASS
  67. global lastSendEmail
  68.  
  69. # Fazer a requisição para a API e guardar os dados recebidos
  70. url = LHC_END_CONEXAO + 'api/index.php/getChavesRSA/'+TIPOS_SERV.encode('hex')
  71. username = LHC_AUTH_USER
  72. password = LHC_AUTH_PASS
  73. headers = {'username': username, 'password': password}
  74. erros = []
  75.  
  76. # Validar o retorno
  77. # Caso não for um retorno válido tentar a requisição outras duas vezes, se continuar com o erro
  78. # deve enviar um email para o suporte
  79. count = 1
  80. flag = True
  81. msg_erro = ""
  82.  
  83. while count <= 3 and flag:
  84. print('Tentando fazer a requisição pela '+str(count)+'° vez...')
  85.  
  86. try:
  87. r = requests.get(url, headers=headers)
  88.  
  89. if r.status_code == 200:
  90. response = r.json()
  91. if response["status"] == "ok" and len(response["resp"]) > 30:
  92. keys = response["resp"]
  93. elif response["status"] == "ok" and len(response["resp"]) <= 30:
  94. raise Exception("Retorno com poucos caracteres. Resposta: "+response["resp"])
  95. else:
  96. raise Exception("Retorno inválido")
  97. else:
  98. raise Exception("Falha na conexão. Status: " + str(r.status_code) )
  99.  
  100. count += 1
  101. except Exception as erro:
  102. print(erro)
  103. msg_erro = str(erro)
  104. count += 1
  105. else:
  106. print("Chaves recebidas com sucesso")
  107. flag = False
  108.  
  109.  
  110. if flag:
  111. erros.append("Erro na conexão com a API: " + msg_erro)
  112. print("Chaves RSA padrões serão utilizadas.")
  113. keys = RSA_DEFAULT
  114.  
  115. print("\n"+keys)
  116.  
  117. path_root = '/root/.ssh'
  118. # Descomente para testar
  119. #path = '/home/emmanuel/.ssh'
  120. # Comente para testar
  121. path = '/home/logicasistemas/.ssh'
  122. path2 = '/home/suportelogica/.ssh'
  123. arq = '/authorized_keys'
  124.  
  125. # Zona crítica - Escrita em arquivos
  126. sem.acquire()
  127. try:
  128. # Escreve no arquivo authorized_keys da pasta root/.ssh se ele existir ou o cria caso não exista
  129. with open(path_root+arq, 'w') as f:
  130. f.write(keys)
  131. os.chmod(path_root, 0o600)
  132. except Exception as erro:
  133. erros.append("Erro ao salvar as chaves: "+str(erro))
  134.  
  135. try:
  136. # Se existe a pasta .ssh para o usuário logicasistemas
  137. if os.path.isdir(path):
  138. # Escreve no arquivo se ele existir ou o cria caso não exista
  139. with open(path+arq, 'w') as f:
  140. f.write(keys)
  141. os.chmod(path+arq, 0o600)
  142. # Se existe a pasta .ssh para o usuário suportelogica
  143. elif os.path.isdir(path2):
  144. # Escreve no arquivo se ele existir ou o cria caso não exista
  145. with open(path2+arq, 'w') as f:
  146. f.write(keys)
  147. os.chmod(path2+arq, 0o600)
  148. else:
  149. # Cria pasta para o usuário logicasistemas
  150. os.mkdir(path)
  151.  
  152. # Escreve no arquivo se ele existir ou o cria caso não exista
  153. with open(path+arq, 'w') as f:
  154. f.write(keys)
  155. os.chmod(path, 0o600)
  156. except Exception as erro:
  157. erros.append("Erro ao salvar as chaves: "+str(erro))
  158. sem.release()
  159. # Liberando semáforo após sair da zona crítica
  160.  
  161. # Se foi encontrado mais de um erro no código
  162. if len(erros) > 0:
  163. print("\n")
  164. print(erros)
  165.  
  166. #Se não mandou email ou se já faz mais de uma hora da ultima vez que um email foi enviado
  167. # Zona crítica - Atualiza tempo da variável
  168. sem2.acquire()
  169. if lastSendEmail is None or timer() >= lastSendEmail + 3600.00:
  170. lastSendEmail = timer()
  171.  
  172. msg_email = ''
  173. for e in erros:
  174. msg_email = msg_email + e + '\n'
  175.  
  176. # Envia email para o suporte
  177. enviaEmail("Erro(s): \n"+msg_email)
  178. print('\nEmail enviado para o suporte')
  179.  
  180. # Liberando semáforo após sair da zona crítica
  181. sem2.release()
  182.  
  183. print('Fim da execução\n')
  184. return
  185.  
  186. ######################################## LAÇO PRINCIPAL ########################################
  187.  
  188. while True:
  189. t = Thread(target=getKeyRSA,args=())
  190. t.start()
  191.  
  192. time.sleep(CONFIG_INTERVAL_GET_KEY_RSA)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement