-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathautomatizacao.py
154 lines (131 loc) · 6.22 KB
/
automatizacao.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import os
import time
import paramiko
import yagmail
from datetime import datetime
import yaml
# Nome do arquivo YAML na mesma pasta
arquivo_yml = 'config.yml'
# Abrir e ler o arquivo YAML
with open(arquivo_yml, 'r') as arquivo:
dados = yaml.safe_load(arquivo)
# Configurações do servidor SFTP
hostname = dados['login']['hostname']
port = 22
username = dados['login']['username']
password = dados['login']['password']
remote_directory_in = dados['login']['remote_directory_in']
remote_directory_done = dados['login']['remote_directory_done']
# Diretório local onde estão os arquivos .ret
local_directory = dados['root']['local_directory']
log_directory = dados['root']['log_directory']
log_file_path = os.path.join(log_directory, 'arquivos_enviados.txt')
# Configuração do e-mail
sender_email = dados['smtp']['username']
receiver_email = dados['smtp']['receiver_email']
smtp_username = dados['smtp']['username']
smtp_password = dados['smtp']['password']
while True:
# Conexão SFTP
def conectar_sftp():
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname, port, username, password)
return ssh.open_sftp()
# Função para verificar se o nome do arquivo já está no log
def verificar_arquivo_no_log(nome_arquivo):
if os.path.exists(log_file_path):
with open(log_file_path, 'r') as log_file:
linhas = log_file.readlines()
for linha in linhas:
# Verificar se o nome do arquivo e a mensagem "enviado com sucesso" estão presentes
if nome_arquivo in linha and 'enviado com sucesso' in linha:
return True
return False
# Função para verificar se o arquivo já existe no servidor SFTP
def verificar_arquivo_existe(sftp, nome_arquivo, diretorio):
try:
sftp.stat(os.path.join(diretorio, nome_arquivo))
return True
except FileNotFoundError:
return False
# Função para registrar mensagens no log
def registrar_log(mensagem):
with open(log_file_path, 'a') as log_file:
data_hora = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
log_file.write(f"[{data_hora}] {mensagem}\n")
# Função para enviar um e-mail consolidado com todos os arquivos enviados
def enviar_email_consolidado(arquivos_enviados):
try:
yag = yagmail.SMTP(smtp_username, smtp_password)
assunto = "Arquivos enviados com sucesso"
contents = "<div style='text-align: center;'>"
contents += "<p><strong style='color: green;'>Arquivos enviados:</strong></p>"
contents += "<ul>"
for arquivo in arquivos_enviados:
contents += f"<li>{arquivo}</li>"
contents += "</ul>"
contents += "<br><br><br></div>"
yag.send(
to=receiver_email,
subject=assunto,
contents=contents,
headers={'X-Priority': '1'}
)
print("E-mail enviado com sucesso!")
except Exception as e:
print(f"Erro ao enviar o e-mail: {e}")
registrar_log(f"Erro ao enviar o e-mail: {e}")
# Função principal
def listar_e_transferir_arquivos():
try:
# Conectando ao servidor SFTP
sftp = conectar_sftp()
# Listando os arquivos .ret
arquivos_para_transferir = []
arquivos_enviados = []
for arquivo in os.listdir(local_directory):
if arquivo.endswith('.ret'):
# Verificar se o arquivo já foi enviado pelo log
if verificar_arquivo_no_log(arquivo):
print(f"O arquivo {arquivo} já foi enviado anteriormente. Não será transferido novamente.")
registrar_log(f"Arquivo {arquivo} já existe no log. Transferência não realizada.")
else:
arquivos_para_transferir.append(arquivo)
# Listando arquivos encontrados
if arquivos_para_transferir:
print("Arquivos encontrados:")
for arquivo in arquivos_para_transferir:
print(f"- {arquivo}")
for arquivo in arquivos_para_transferir:
try:
# Verificar se o arquivo já existe no SFTP
if not verificar_arquivo_existe(sftp, arquivo, remote_directory_in) and \
not verificar_arquivo_existe(sftp, arquivo, remote_directory_done):
sftp.put(os.path.join(local_directory, arquivo),
os.path.join(remote_directory_in, arquivo))
print(f"Arquivo {arquivo} transferido com sucesso para {remote_directory_in}")
# Registrar envio no arquivo de log
registrar_log(f"Arquivo {arquivo} enviado com sucesso.")
arquivos_enviados.append(arquivo)
else:
print(f"Arquivo {arquivo} já existe em {remote_directory_in} ou {remote_directory_done}, não foi transferido.")
registrar_log(f"Arquivo {arquivo} já existe em {remote_directory_in} ou {remote_directory_done}, não foi transferido.")
except Exception as e:
print(f"Erro ao transferir o arquivo {arquivo}: {e}")
registrar_log(f"Erro ao transferir o arquivo {arquivo}: {e}")
# Enviar um único e-mail consolidado com os arquivos enviados
if arquivos_enviados:
enviar_email_consolidado(arquivos_enviados)
else:
print("Nenhum arquivo .ret foi encontrado.")
registrar_log("Nenhum arquivo .ret foi encontrado.")
# Fechando a conexão SFTP
sftp.close()
except Exception as e:
print(f"Ocorreu um erro: {e}")
registrar_log(f"Ocorreu um erro geral: {e}")
# Executar a função
listar_e_transferir_arquivos()
# programa espera 30 min para rodar novamente
time.sleep(1800)