Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- # Este script utiliza encoding: utf-8
- # Todos os direitos reservados - Copyright © 2017-2018 Lógica Sistemas de informação - LTDA - ME
- ######################################## INICIALIZAÇÃO ########################################
- # Carregando bibliotecas
- import os
- import time
- import requests
- import json
- import smtplib
- import thread
- from dotenv import load_dotenv
- from threading import Thread
- from timeit import default_timer as timer
- from email.mime.multipart import MIMEMultipart
- from email.mime.text import MIMEText
- from os.path import join, dirname
- # 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
- sem = thread.allocate_lock()
- sem2 = thread.allocate_lock()
- # Carrega as variáveis de ambiente
- load_dotenv()
- env_path = join(dirname(__file__), '../../.env')
- load_dotenv(dotenv_path=env_path)
- # Inicializa variáveis
- lastGetKeyRSA = None
- lastSendEmail = None
- RSA_DEFAULT = """ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+DPy3bCKBY3gSUiOOkdUsMe4a8ljcpqYmUofZU5puBePfMmK2kBZ+C8xsMGvXQdC0CwjpDd2H1sD1Zx+C0eJ8nNHZ4yrBfTJVGzthdnIFCWWftgs59OVJZmjHxlWO8QQDVIvoSsQ0grq0si8u1hCGATv7684gsjJoiNJYgI2bXCgPGGqC23VYoLXznldHNOlYPIKsCuC7BEQf44cT2esVWTIgLjRnXuWm70JuK20e3mWH/06VRHVkmeXzVGbFSZ4xwpjOojQXt40eakXhFsKnli5blAI8lZCFA6IWLF/ta9r2olZJB9Z6oA3c4gKAm4kd5CCCwViRBqoDRFkV2ccZ natan@ltsp179
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbX66FFI7fFZFR2bpo56o7u/KXQANcTnE/uwPea3rQw1OoPupgMvFFPRsWYkSE7/hXeO1xx07FDP8rHcVXWjDi46u+cMvAWiRT9DZ8o3TR3tUzu6B9hanEYRUI+dyl3pBFCW2ZVm6TY0ADcbhy30Rbk7WcYuEHvhCWtCipPrvE8o+JJ4F59KQfdaMo0oM9iN1O4lBikkF6Zmi8aEedwn7u5yqlxL8X6ngk3923W+/eMKlvvHJttczel7WPnc94llCtjTTTjPpfg9R/fPl81pXBMw6PuCMl7Iz76rB+samUjq7Uw3Um7gsFOdCpJgO45hS8FcJByyqdE+j811OPRWfl natan@natan
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvmo1CKv151WKaN2Il/S33Ps6Z2FsN8cxKdzQ687y+2gEOX67jo+3J1UtK9M3ebqh/pnwi8qqZ4ImfcbNBgiVKTjrRZ23q1UDeJnAyj3CC/bIWeYyNfFtvdZVjvgeVgnnLrYd7DCo/ZU7tEcn2pkod0/h4UmOV4z2wwY9duy8La7CcjbzysMEXkPQjzLwG6ZEgTj+IhbgMNpcBppP4KlyE7gTkNLKABYIWCkfNIzHh7QNNJ1qdtbRD+5YIp/FTsfSf/24SF+0YbTM5QHywcBvjrsl1zBVc0EGHaYKi2jFQDOMAfv/khZt9OXkwohHGxKZi5hSpNW1pl7WoaEW4iD2f daniel@LTSP
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCpkOV8QAIm7ak1++/TzxkbWoWavEaKHZkajysFelMWxNfhGfHel7C40gQIf3NGkQurMsaG16N8KF8UGnq15C8FAnOmCRGRTTZA0of6iTWCokS6KJJaN8GdTe4sDBmjKf9kCh1sd9CrQxoYQw7LB+JyvqVOGjeLHI4rwTV/xXT7bQ== daniel.passos@logicasistemas.com.br"""
- LHC_AUTH_USER = str(os.getenv("LHC_AUTH_USER"))
- LHC_AUTH_PASS = str(os.getenv("LHC_AUTH_PASS"))
- LHC_END_CONEXAO = str(os.getenv("LHC_END_CONEXAO"))
- TIPOS_SERV = str(os.getenv("TIPOS_SERV", "1 2 3"))
- CONFIG_INTERVAL_GET_KEY_RSA = int(os.getenv("CONFIG_INTERVAL_GET_KEY_RSA", 60))
- NOME_FANTASIA_PROVEDOR = str(os.getenv("NOME_FANTASIA_PROVEDOR", "Lógica Sistemas - Nome Fantasia não definido"))
- ########################################### FUNÇÕES ############################################
- def enviaEmail(mensagem):
- msg = MIMEText(mensagem)
- msg['Subject'] = 'Service Salva Chaves RSA em' + NOME_FANTASIA_PROVEDOR
- s = smtplib.SMTP_SSL('smtp.gmail.com:465')
- s.login('livehelperchat.logica@gmail.com','l0g1c2l0g1c2')
- # Comente para testar
- send_to = 'suporte.erp@logicasistemas.com.br'
- # Descomente para testar
- #send_to = 'joao.emmanuel@logicasistemas.com.br'
- s.sendmail('livehelperchat.logica@gmail.com', send_to, msg.as_string())
- s.quit()
- # Função principal que irá ser executada em loop após um periodo de tempo
- def getKeyRSA():
- global TIPOS_SERV
- global LHC_END_CONEXAO
- global LHC_AUTH_USER
- global LHC_AUTH_PASS
- global lastSendEmail
- # Fazer a requisição para a API e guardar os dados recebidos
- url = LHC_END_CONEXAO + 'api/index.php/getChavesRSA/'+TIPOS_SERV.encode('hex')
- username = LHC_AUTH_USER
- password = LHC_AUTH_PASS
- headers = {'username': username, 'password': password}
- erros = []
- # Validar o retorno
- # Caso não for um retorno válido tentar a requisição outras duas vezes, se continuar com o erro
- # deve enviar um email para o suporte
- count = 1
- flag = True
- msg_erro = ""
- while count <= 3 and flag:
- print('Tentando fazer a requisição pela '+str(count)+'° vez...')
- try:
- r = requests.get(url, headers=headers)
- if r.status_code == 200:
- response = r.json()
- if response["status"] == "ok" and len(response["resp"]) > 30:
- keys = response["resp"]
- elif response["status"] == "ok" and len(response["resp"]) <= 30:
- raise Exception("Retorno com poucos caracteres. Resposta: "+response["resp"])
- else:
- raise Exception("Retorno inválido")
- else:
- raise Exception("Falha na conexão. Status: " + str(r.status_code) )
- count += 1
- except Exception as erro:
- print(erro)
- msg_erro = str(erro)
- count += 1
- else:
- print("Chaves recebidas com sucesso")
- flag = False
- if flag:
- erros.append("Erro na conexão com a API: " + msg_erro)
- print("Chaves RSA padrões serão utilizadas.")
- keys = RSA_DEFAULT
- print("\n"+keys)
- path_root = '/root/.ssh'
- # Descomente para testar
- #path = '/home/emmanuel/.ssh'
- # Comente para testar
- path = '/home/logicasistemas/.ssh'
- path2 = '/home/suportelogica/.ssh'
- arq = '/authorized_keys'
- # Zona crítica - Escrita em arquivos
- sem.acquire()
- try:
- # Escreve no arquivo authorized_keys da pasta root/.ssh se ele existir ou o cria caso não exista
- with open(path_root+arq, 'w') as f:
- f.write(keys)
- os.chmod(path_root, 0o600)
- except Exception as erro:
- erros.append("Erro ao salvar as chaves: "+str(erro))
- try:
- # Se existe a pasta .ssh para o usuário logicasistemas
- if os.path.isdir(path):
- # Escreve no arquivo se ele existir ou o cria caso não exista
- with open(path+arq, 'w') as f:
- f.write(keys)
- os.chmod(path+arq, 0o600)
- # Se existe a pasta .ssh para o usuário suportelogica
- elif os.path.isdir(path2):
- # Escreve no arquivo se ele existir ou o cria caso não exista
- with open(path2+arq, 'w') as f:
- f.write(keys)
- os.chmod(path2+arq, 0o600)
- else:
- # Cria pasta para o usuário logicasistemas
- os.mkdir(path)
- # Escreve no arquivo se ele existir ou o cria caso não exista
- with open(path+arq, 'w') as f:
- f.write(keys)
- os.chmod(path, 0o600)
- except Exception as erro:
- erros.append("Erro ao salvar as chaves: "+str(erro))
- sem.release()
- # Liberando semáforo após sair da zona crítica
- # Se foi encontrado mais de um erro no código
- if len(erros) > 0:
- print("\n")
- print(erros)
- #Se não mandou email ou se já faz mais de uma hora da ultima vez que um email foi enviado
- # Zona crítica - Atualiza tempo da variável
- sem2.acquire()
- if lastSendEmail is None or timer() >= lastSendEmail + 3600.00:
- lastSendEmail = timer()
- msg_email = ''
- for e in erros:
- msg_email = msg_email + e + '\n'
- # Envia email para o suporte
- enviaEmail("Erro(s): \n"+msg_email)
- print('\nEmail enviado para o suporte')
- # Liberando semáforo após sair da zona crítica
- sem2.release()
- print('Fim da execução\n')
- return
- ######################################## LAÇO PRINCIPAL ########################################
- while True:
- t = Thread(target=getKeyRSA,args=())
- t.start()
- time.sleep(CONFIG_INTERVAL_GET_KEY_RSA)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement