csc-cia-stne 0.0.94__py3-none-any.whl → 0.0.96__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- csc_cia_stne/__init__.py +3 -1
- csc_cia_stne/ftp.py +306 -0
- csc_cia_stne/stne_admin.py +1 -1
- csc_cia_stne/utilitarios/functions/__init__.py +4 -3
- csc_cia_stne/utilitarios/functions/func_rdp.py +110 -110
- csc_cia_stne/utilitarios/validations/ftp.py +109 -0
- {csc_cia_stne-0.0.94.dist-info → csc_cia_stne-0.0.96.dist-info}/METADATA +3 -2
- {csc_cia_stne-0.0.94.dist-info → csc_cia_stne-0.0.96.dist-info}/RECORD +11 -9
- {csc_cia_stne-0.0.94.dist-info → csc_cia_stne-0.0.96.dist-info}/WHEEL +1 -1
- {csc_cia_stne-0.0.94.dist-info → csc_cia_stne-0.0.96.dist-info}/licenses/LICENCE +0 -0
- {csc_cia_stne-0.0.94.dist-info → csc_cia_stne-0.0.96.dist-info}/top_level.txt +0 -0
csc_cia_stne/__init__.py
CHANGED
@@ -15,6 +15,7 @@ from .slack import Slack
|
|
15
15
|
from .web import web_screen
|
16
16
|
from .wacess import Waccess
|
17
17
|
from .gcp_bucket import GCPBucket
|
18
|
+
from .ftp import FTP
|
18
19
|
|
19
20
|
# Define os itens disponíveis para importação
|
20
21
|
__all__ = [
|
@@ -32,7 +33,8 @@ __all__ = [
|
|
32
33
|
"Slack",
|
33
34
|
"web_screen",
|
34
35
|
"Waccess",
|
35
|
-
"GCPBucket"
|
36
|
+
"GCPBucket",
|
37
|
+
"FTP"
|
36
38
|
]
|
37
39
|
|
38
40
|
_diretorio_inicial = os.getcwd()
|
csc_cia_stne/ftp.py
ADDED
@@ -0,0 +1,306 @@
|
|
1
|
+
import pycurl
|
2
|
+
import socket
|
3
|
+
import time
|
4
|
+
import os
|
5
|
+
from io import BytesIO
|
6
|
+
|
7
|
+
from .utilitarios.validations.ftp import InitParamsValidator,UploadDownloadValidator,ListFilesValidator
|
8
|
+
|
9
|
+
class FTP():
|
10
|
+
|
11
|
+
def __init__(self, host:str , user:str , password:str , timeout:int=30, port:bool=21, tls:bool=True, ssl:bool=True, verify_ssl:bool=False, verify_host:bool=False, tryouts:int=3):
|
12
|
+
|
13
|
+
self.host = host
|
14
|
+
self.user = user
|
15
|
+
self.password = password
|
16
|
+
self.port = port
|
17
|
+
self.timeout = timeout
|
18
|
+
self.tls = tls
|
19
|
+
self.ssl = ssl
|
20
|
+
self.verify_ssl = verify_ssl
|
21
|
+
self.verify_host = verify_host
|
22
|
+
self.tryouts = tryouts
|
23
|
+
|
24
|
+
try:
|
25
|
+
|
26
|
+
InitParamsValidator(
|
27
|
+
host=self.host,
|
28
|
+
user=self.user,
|
29
|
+
password=self.password,
|
30
|
+
port=self.port,
|
31
|
+
timeout=self.timeout,
|
32
|
+
tls=self.tls,
|
33
|
+
ssl=self.ssl,
|
34
|
+
verify_ssl=self.verify_ssl,
|
35
|
+
verify_host=self.verify_host,
|
36
|
+
tryouts=self.tryouts
|
37
|
+
)
|
38
|
+
|
39
|
+
except Exception as e:
|
40
|
+
|
41
|
+
raise ValueError(f"Erro na validação dos parâmetros de inicialização: {str(e)}")
|
42
|
+
|
43
|
+
|
44
|
+
self._test_connection()
|
45
|
+
|
46
|
+
def _test_connection(self):
|
47
|
+
"""
|
48
|
+
Testa a conexão com o servidor FTP utilizando o host e a porta especificados.
|
49
|
+
Este método tenta estabelecer uma conexão de socket com o servidor FTP
|
50
|
+
usando os parâmetros `host` e `port`. Caso a conexão seja bem-sucedida,
|
51
|
+
retorna `True`. Caso contrário, levanta uma exceção `ConnectionError` com
|
52
|
+
uma mensagem apropriada.
|
53
|
+
Raises:
|
54
|
+
ConnectionError: Se ocorrer um timeout ou se a conexão for recusada.
|
55
|
+
ConnectionError: Se ocorrer um erro desconhecido durante a tentativa de conexão.
|
56
|
+
Returns:
|
57
|
+
bool: `True` se a conexão for bem-sucedida.
|
58
|
+
"""
|
59
|
+
|
60
|
+
try:
|
61
|
+
|
62
|
+
with socket.create_connection((self.host, self.port), timeout=self.timeout) as sock:
|
63
|
+
|
64
|
+
sock.close()
|
65
|
+
|
66
|
+
return True
|
67
|
+
|
68
|
+
except (socket.timeout, ConnectionRefusedError) as e:
|
69
|
+
|
70
|
+
raise ConnectionError(f"Erro de timeout ou conexão negada {self.host}:{self.port}. Error: {str(e)}")
|
71
|
+
|
72
|
+
except Exception as e:
|
73
|
+
|
74
|
+
raise ConnectionError(f"Erro desconhecido ao tentar conexão com {self.host}:{self.port}. Error: {str(e)}")
|
75
|
+
|
76
|
+
def _login_server(self):
|
77
|
+
"""
|
78
|
+
Estabelece uma conexão com o servidor FTP utilizando as credenciais fornecidas e configurações de segurança.
|
79
|
+
Configurações:
|
80
|
+
- `self.user` e `self.password`: Credenciais de autenticação para o servidor FTP.
|
81
|
+
- `self.tls`: Se True, força o uso de TLS para a conexão.
|
82
|
+
- `self.ssl`: Se True, ativa FTPS explícito.
|
83
|
+
- `self.verify_ssl`: Se False, desativa a verificação de certificado SSL.
|
84
|
+
- `self.verify_host`: Se False, desativa a verificação do host SSL.
|
85
|
+
Retorna:
|
86
|
+
pycurl.Curl: Objeto de conexão configurado para o servidor FTP.
|
87
|
+
Exceções:
|
88
|
+
ConnectionError: Lançada quando ocorre um erro ao tentar estabelecer a conexão com o servidor FTP.
|
89
|
+
"""
|
90
|
+
|
91
|
+
try:
|
92
|
+
|
93
|
+
connection_ftp = pycurl.Curl()
|
94
|
+
|
95
|
+
connection_ftp.setopt(connection_ftp.USERPWD, f"{self.user}:{self.password}")
|
96
|
+
|
97
|
+
connection_ftp.setopt(connection_ftp.CONNECTTIMEOUT, self.timeout) # Tempo limite para conexão
|
98
|
+
|
99
|
+
connection_ftp.setopt(connection_ftp.TIMEOUT, self.timeout*2) # Tempo limite para operação
|
100
|
+
|
101
|
+
if self.tls is True:
|
102
|
+
|
103
|
+
connection_ftp.setopt(connection_ftp.USE_SSL, connection_ftp.USESSL_ALL) # Força uso de TLS
|
104
|
+
|
105
|
+
if self.ssl is True:
|
106
|
+
|
107
|
+
connection_ftp.setopt(connection_ftp.FTP_SSL, connection_ftp.FTPSSL_ALL) # Ativa FTPS explícito
|
108
|
+
|
109
|
+
if self.verify_ssl is False:
|
110
|
+
|
111
|
+
connection_ftp.setopt(connection_ftp.SSL_VERIFYPEER, 0) # Desativar verificação SSL (ajuste conforme necessário)
|
112
|
+
|
113
|
+
if self.verify_host is False:
|
114
|
+
|
115
|
+
connection_ftp.setopt(connection_ftp.SSL_VERIFYHOST, 0) # Desativar verificação de host SSL
|
116
|
+
|
117
|
+
return connection_ftp
|
118
|
+
|
119
|
+
except Exception as e:
|
120
|
+
|
121
|
+
self._test_connection()
|
122
|
+
|
123
|
+
raise ConnectionError(f"Erro ao tentar conexão com o servidor FTP {self.host}:{self.port}. Error: {str(e)}")
|
124
|
+
|
125
|
+
def upload_or_download_file(self, filename:str, filepathftp:str, method:str="UPLOAD"):
|
126
|
+
"""
|
127
|
+
Faz upload ou download de um arquivo para/da um servidor FTP.
|
128
|
+
Args:
|
129
|
+
filename (str): Nome do arquivo local a ser enviado ou recebido.
|
130
|
+
filepathftp (str): Caminho remoto no servidor FTP onde o arquivo será enviado ou recebido.
|
131
|
+
method (str, opcional): Método de operação, "UPLOAD" para enviar arquivo ou "DOWNLOAD" para baixar arquivo.
|
132
|
+
O padrão é "UPLOAD".
|
133
|
+
Returns:
|
134
|
+
dict: Um dicionário contendo:
|
135
|
+
- 'status' (bool): Indica se a operação foi bem-sucedida.
|
136
|
+
- 'status_code' (int): Código de resposta do servidor FTP.
|
137
|
+
- 'message' (str): Mensagem indicando o resultado da operação.
|
138
|
+
Raises:
|
139
|
+
FileNotFoundError: Se o arquivo especificado não for encontrado.
|
140
|
+
PermissionError: Se houver problemas de permissão ao acessar o arquivo.
|
141
|
+
Exception: Para outros erros durante a operação.
|
142
|
+
Nota:
|
143
|
+
O método tenta realizar a operação várias vezes, conforme definido em `self.tryouts`.
|
144
|
+
Em caso de falha, retorna um status indicando o erro.
|
145
|
+
"""
|
146
|
+
|
147
|
+
try:
|
148
|
+
|
149
|
+
UploadDownloadValidator(
|
150
|
+
filename=filename,
|
151
|
+
filepathftp=filepathftp,
|
152
|
+
method=method.upper()
|
153
|
+
)
|
154
|
+
|
155
|
+
except Exception as e:
|
156
|
+
|
157
|
+
raise ValueError(f"Erro na validação dos parâmetros de upload/download: {str(e)}")
|
158
|
+
|
159
|
+
filename = os.path.join(os.getcwd(), filename)
|
160
|
+
|
161
|
+
connection_ftp = self._login_server()
|
162
|
+
|
163
|
+
remote_path = f"{filepathftp}{filename}"
|
164
|
+
|
165
|
+
ftp_url = f"ftp://{self.host}{remote_path}"
|
166
|
+
|
167
|
+
status_upload = True
|
168
|
+
|
169
|
+
methodfile = "rb"
|
170
|
+
|
171
|
+
if method.upper() == "DOWNLOAD":
|
172
|
+
|
173
|
+
methodfile = "wb"
|
174
|
+
|
175
|
+
for try_out in range(self.tryouts):
|
176
|
+
|
177
|
+
time.sleep(5)
|
178
|
+
|
179
|
+
try:
|
180
|
+
|
181
|
+
with open(filename, methodfile) as file:
|
182
|
+
|
183
|
+
connection_ftp.setopt(connection_ftp.URL, ftp_url)
|
184
|
+
|
185
|
+
connection_ftp.setopt(connection_ftp.UPLOAD, 1)
|
186
|
+
|
187
|
+
if method.upper() == "UPLOAD":
|
188
|
+
|
189
|
+
connection_ftp.setopt(connection_ftp.READDATA, file)
|
190
|
+
|
191
|
+
elif method.upper() == "DOWNLOAD":
|
192
|
+
|
193
|
+
connection_ftp.setopt(connection_ftp.WRITEDATA, file)
|
194
|
+
|
195
|
+
connection_ftp.perform()
|
196
|
+
|
197
|
+
status_code = connection_ftp.getinfo(connection_ftp.RESPONSE_CODE)
|
198
|
+
|
199
|
+
break
|
200
|
+
|
201
|
+
except FileNotFoundError as e:
|
202
|
+
|
203
|
+
raise FileNotFoundError(f"Arquivo '{filename}' não encontrado. Error: {str(e)}")
|
204
|
+
|
205
|
+
except PermissionError as e:
|
206
|
+
|
207
|
+
raise PermissionError(f"Permissão negada para acessar o arquivo '{filename}'. Error: {str(e)}")
|
208
|
+
|
209
|
+
except Exception as e:
|
210
|
+
|
211
|
+
status_code = None
|
212
|
+
|
213
|
+
status_upload = False
|
214
|
+
|
215
|
+
if status_code == 226:
|
216
|
+
|
217
|
+
status_upload = True
|
218
|
+
|
219
|
+
else:
|
220
|
+
|
221
|
+
status_upload = False
|
222
|
+
|
223
|
+
connection_ftp.close()
|
224
|
+
|
225
|
+
return {
|
226
|
+
'status': status_upload,
|
227
|
+
'status_code': status_code
|
228
|
+
}
|
229
|
+
|
230
|
+
def list_files(self, filepathftp:str):
|
231
|
+
"""
|
232
|
+
Lista arquivos em um diretório FTP especificado.
|
233
|
+
Este método conecta-se a um servidor FTP, lista os arquivos disponíveis no diretório especificado
|
234
|
+
e retorna os nomes dos arquivos juntamente com metadados, se disponíveis.
|
235
|
+
Args:
|
236
|
+
filepathftp (str): Caminho do diretório no servidor FTP onde os arquivos serão listados.
|
237
|
+
Returns:
|
238
|
+
dict: Um dicionário contendo:
|
239
|
+
- 'status' (bool): Indica se a operação foi bem-sucedida.
|
240
|
+
- 'status_code' (int ou None): Código de resposta do servidor FTP.
|
241
|
+
- 'message' (str): Mensagem detalhando o resultado da operação.
|
242
|
+
- 'files' (list): Lista de arquivos encontrados no diretório FTP.
|
243
|
+
Raises:
|
244
|
+
ConnectionError: Caso ocorra algum erro ao criar o buffer de memória ou ao definir a URL do FTP.
|
245
|
+
"""
|
246
|
+
|
247
|
+
try:
|
248
|
+
|
249
|
+
ListFilesValidator(filepathftp=filepathftp)
|
250
|
+
|
251
|
+
except Exception as e:
|
252
|
+
|
253
|
+
raise ValueError(f"Erro na validação dos parâmetros de listagem de arquivos: {str(e)}")
|
254
|
+
|
255
|
+
try:
|
256
|
+
|
257
|
+
buffer = BytesIO()
|
258
|
+
|
259
|
+
except Exception as e:
|
260
|
+
|
261
|
+
raise ConnectionError(f"Erro ao criar buffer de memória. Error: {str(e)}")
|
262
|
+
|
263
|
+
connection_ftp = self._login_server()
|
264
|
+
|
265
|
+
ftp_url = f"ftp://{self.host}{filepathftp}"
|
266
|
+
|
267
|
+
for try_out in range(self.tryouts):
|
268
|
+
|
269
|
+
try:
|
270
|
+
|
271
|
+
connection_ftp.setopt(connection_ftp.URL, ftp_url)
|
272
|
+
|
273
|
+
connection_ftp.setopt(connection_ftp.WRITEDATA, buffer)
|
274
|
+
|
275
|
+
connection_ftp.setopt(connection_ftp.VERBOSE, False)
|
276
|
+
|
277
|
+
connection_ftp.setopt(connection_ftp.NOBODY, False)
|
278
|
+
|
279
|
+
connection_ftp.setopt(connection_ftp.DIRLISTONLY, False) # True = apenas nomes; False = nomes + metadados estilo ls -l
|
280
|
+
|
281
|
+
connection_ftp.perform()
|
282
|
+
|
283
|
+
conteudo = buffer.getvalue().decode('utf-8')
|
284
|
+
|
285
|
+
lista_arquivos = [linha.strip() for linha in conteudo.splitlines() if linha.strip()]
|
286
|
+
|
287
|
+
connection_ftp.close()
|
288
|
+
|
289
|
+
return {
|
290
|
+
'status': True,
|
291
|
+
'status_code': connection_ftp.getinfo(connection_ftp.RESPONSE_CODE),
|
292
|
+
'message': f"Arquivos listados com sucesso de {self.host}:{self.port}/{filepathftp}.",
|
293
|
+
'files': lista_arquivos
|
294
|
+
}
|
295
|
+
|
296
|
+
except Exception as e:
|
297
|
+
|
298
|
+
raise ConnectionError(f"Erro ao definir URL do FTP. Error: {str(e)}")
|
299
|
+
|
300
|
+
connection_ftp.close()
|
301
|
+
|
302
|
+
return {
|
303
|
+
'status': False,
|
304
|
+
'status_code': None,
|
305
|
+
'message': f"Falha ao listar arquivos de {self.host}:{self.port}/{filepathftp}."
|
306
|
+
}
|
csc_cia_stne/stne_admin.py
CHANGED
@@ -543,7 +543,7 @@ class StoneAdmin:
|
|
543
543
|
|
544
544
|
if async_mode:
|
545
545
|
|
546
|
-
response = requests.get(f"{self.base_url}/exports/accounts/{account_id}/statement?start_date={data_inicio}&end_date={data_fim}&format=pdf&async=true", headers=self.authenticated_header, timeout=
|
546
|
+
response = requests.get(f"{self.base_url}/exports/accounts/{account_id}/statement?start_date={data_inicio}&end_date={data_fim}&format=pdf&async=true", headers=self.authenticated_header, timeout=120)
|
547
547
|
|
548
548
|
else:
|
549
549
|
|
@@ -4,8 +4,9 @@ from .func_b64 import b64decode, b64encode
|
|
4
4
|
from .func_converters import convert_bquery_result_to_json
|
5
5
|
from .func_settings import get_config
|
6
6
|
from .func_get_secret import get_secret
|
7
|
-
from .func_rdp import obter_ip_conexao_rdp, conectar_rdp
|
7
|
+
# from .func_rdp import obter_ip_conexao_rdp, conectar_rdp
|
8
8
|
from .func_datetime import now_sp
|
9
|
+
|
9
10
|
__all__ = [
|
10
11
|
"titulo",
|
11
12
|
"recriar_pasta",
|
@@ -14,7 +15,7 @@ __all__ = [
|
|
14
15
|
"convert_bquery_result_to_json",
|
15
16
|
"get_config",
|
16
17
|
"get_secret",
|
17
|
-
"obter_ip_conexao_rdp",
|
18
|
+
# "obter_ip_conexao_rdp",
|
18
19
|
"now_sp",
|
19
|
-
"conectar_rdp"
|
20
|
+
# "conectar_rdp"
|
20
21
|
]
|
@@ -1,147 +1,147 @@
|
|
1
|
-
import platform
|
2
|
-
import subprocess
|
3
|
-
import time
|
4
|
-
import pyautogui
|
5
|
-
import psutil
|
6
|
-
import pygetwindow as gw
|
7
|
-
import logging
|
8
|
-
pyautogui.USE_MOUSEINFO = False
|
9
|
-
log = logging.getLogger('__main__')
|
1
|
+
# import platform
|
2
|
+
# import subprocess
|
3
|
+
# import time
|
4
|
+
# import pyautogui
|
5
|
+
# import psutil
|
6
|
+
# import pygetwindow as gw
|
7
|
+
# import logging
|
8
|
+
# pyautogui.USE_MOUSEINFO = False
|
9
|
+
# log = logging.getLogger('__main__')
|
10
10
|
|
11
|
-
def obter_ip_conexao_rdp():
|
12
|
-
|
11
|
+
# def obter_ip_conexao_rdp():
|
12
|
+
# """Retorna o ip da conexão RDP
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
# Returns:
|
15
|
+
# str: ip
|
16
|
+
# """
|
17
17
|
|
18
|
-
|
18
|
+
# for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
|
19
19
|
|
20
|
-
|
20
|
+
# if proc.info['name'] == 'mstsc.exe' and proc.info['cmdline']:
|
21
21
|
|
22
|
-
|
22
|
+
# for arg in proc.info['cmdline']:
|
23
23
|
|
24
|
-
|
24
|
+
# if arg.startswith("/v:"): # O argumento '/v:' contém o IP
|
25
25
|
|
26
|
-
|
26
|
+
# return arg.replace("/v:", "").strip()
|
27
27
|
|
28
|
-
|
28
|
+
# return None
|
29
29
|
|
30
|
-
def verificar_sessao_rdp()->bool:
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
# def verificar_sessao_rdp()->bool:
|
31
|
+
# """Verifica se a sessão RDP está ativa"""
|
32
|
+
# # Verifica se o processo mstsc.exe está rodando
|
33
|
+
# for proc in psutil.process_iter(['name']):
|
34
|
+
# if proc.info['name'] == 'mstsc.exe':
|
35
|
+
# #return True
|
36
36
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
# # Verifica se a janela da Área de Trabalho Remota está aberta
|
38
|
+
# for window in gw.getAllTitles():
|
39
|
+
# if "Área de Trabalho Remota" in window or "Remote Desktop" in window:
|
40
|
+
# return True
|
41
41
|
|
42
|
-
|
42
|
+
# return False
|
43
43
|
|
44
|
-
def conectar_rdp(host:str, usuario:str, senha:str)->bool:
|
45
|
-
|
44
|
+
# def conectar_rdp(host:str, usuario:str, senha:str)->bool:
|
45
|
+
# """Conecta via RDP em uma máquina remota
|
46
46
|
|
47
|
-
|
47
|
+
# Args:
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
# host (str): ip/host destino
|
50
|
+
# usuario (str): usuário
|
51
|
+
# senha (str): senha
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
# Returns:
|
54
|
+
# bool: True/False
|
55
|
+
# """
|
56
56
|
|
57
|
-
|
57
|
+
# sistema = platform.system()
|
58
58
|
|
59
|
-
|
59
|
+
# if sistema == "Windows":
|
60
60
|
|
61
|
-
|
61
|
+
# try:
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
63
|
+
# def criar_arquivo_rdp(host, usuario, caminho_rdp="conexao.rdp")->str:
|
64
|
+
# """Cria um arquivo .rdp para conexão RDP
|
65
|
+
# Args:
|
66
|
+
# host (str): host do computador remoto
|
67
|
+
# usuario (str): Usuário
|
68
|
+
# caminho_rdp (str): Caminho do arquivo .rdp
|
69
|
+
# Returns:
|
70
|
+
# str: Caminho do arquivo .rdp
|
71
|
+
# """
|
72
|
+
# conteudo_rdp = f"""
|
73
|
+
# screen mode id:i:2
|
74
|
+
# desktopwidth:i:1920
|
75
|
+
# desktopheight:i:1080
|
76
|
+
# session bpp:i:32
|
77
|
+
# winposstr:s:0,1,0,0,800,600
|
78
|
+
# full address:s:{host}
|
79
|
+
# username:s:{usuario}
|
80
|
+
# """
|
81
|
+
# with open(caminho_rdp, "w") as arquivo:
|
82
|
+
# arquivo.write(conteudo_rdp.strip())
|
83
83
|
|
84
|
-
|
84
|
+
# return caminho_rdp
|
85
85
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
86
|
+
# caminho_rdp = criar_arquivo_rdp(host, usuario)
|
87
|
+
# subprocess.run(f"start mstsc {caminho_rdp}", shell=True)
|
88
|
+
# # Espera a conexão ser feita e confirma que realmente quer fazer a conexão com o computador remoto de forma insegura (certificado)
|
89
|
+
# time.sleep(10)
|
90
|
+
# pyautogui.press('left')
|
91
|
+
# pyautogui.press('enter')
|
92
|
+
# # Espera 3 segundos para digitar a senha e dar enter
|
93
|
+
# time.sleep(3)
|
94
|
+
# pyautogui.write(senha)
|
95
|
+
# pyautogui.press('enter')
|
96
|
+
# # Espera 5 segundos para aparecer a tela sobre o certificado e aceitar a conexão de forma insegura (certificado)
|
97
|
+
# time.sleep(5)
|
98
|
+
# pyautogui.press('left')
|
99
|
+
# pyautogui.press('enter')
|
100
|
+
# # Aguarda 5 segundos e verifica se a conexão foi feita com sucesso
|
101
|
+
# time.sleep(5)
|
102
|
+
# return verificar_sessao_rdp()
|
103
103
|
|
104
|
-
|
104
|
+
# except Exception as e:
|
105
105
|
|
106
|
-
|
107
|
-
|
106
|
+
# log.error(f"Erro ao conectar à área de trabalho remota:\n{e}")
|
107
|
+
# return False
|
108
108
|
|
109
|
-
|
109
|
+
# elif sistema == "Linux":
|
110
110
|
|
111
|
-
|
112
|
-
|
113
|
-
|
111
|
+
# # Comando para executar a conexao com o xfreerdp
|
112
|
+
# # Para instalar: sudo apt install freerdp2-x11
|
113
|
+
# comando_rdp = f"""xfreerdp /u:{usuario} /p:{senha} /v:{host} /size:1920x1080"""
|
114
114
|
|
115
|
-
|
116
|
-
|
115
|
+
# # Executar o comando e capturar saída
|
116
|
+
# try:
|
117
117
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
118
|
+
# processo_rdp = subprocess.Popen(
|
119
|
+
# comando_rdp,
|
120
|
+
# shell=True,
|
121
|
+
# stdout=subprocess.PIPE,
|
122
|
+
# stderr=subprocess.PIPE,
|
123
|
+
# text=True
|
124
|
+
# )
|
125
125
|
|
126
|
-
|
126
|
+
# except Exception as e:
|
127
127
|
|
128
|
-
|
128
|
+
# raise Exception(f"Falha ao executar o comando de conexão RDP no Linux. Você possui o xfreerdp instalado? (sudo apt install freerdp2-x11)\nErro: {str(e)}")
|
129
129
|
|
130
|
-
|
131
|
-
|
130
|
+
# # Aguarda 10 segundos, para aparecer o banner azul
|
131
|
+
# time.sleep(10)
|
132
132
|
|
133
|
-
|
134
|
-
|
133
|
+
# # Se a conexão foi bem-sucedida, retornar True
|
134
|
+
# if processo_rdp.poll() is None:
|
135
135
|
|
136
|
-
|
137
|
-
|
138
|
-
|
136
|
+
# # Clica no 'enter', no banner azul
|
137
|
+
# pyautogui.press('enter')
|
138
|
+
# return True
|
139
139
|
|
140
|
-
|
140
|
+
# else:
|
141
141
|
|
142
|
-
|
142
|
+
# return False
|
143
143
|
|
144
|
-
|
144
|
+
# else:
|
145
145
|
|
146
|
-
|
146
|
+
# raise Exception("Sistema operacional não suportado (Somente 'Windows' ou 'Linux').")
|
147
147
|
|
@@ -0,0 +1,109 @@
|
|
1
|
+
from pydantic import BaseModel, field_validator
|
2
|
+
|
3
|
+
class InitParamsValidator(BaseModel):
|
4
|
+
"""
|
5
|
+
Classe InitParamsValidator
|
6
|
+
Valida os parâmetros de inicialização para conexão FTP.
|
7
|
+
Atributos:
|
8
|
+
host (str): Endereço do servidor FTP. Deve ser uma string não vazia.
|
9
|
+
user (str): Nome de usuário para autenticação. Deve ser uma string não vazia.
|
10
|
+
password (str): Senha para autenticação. Deve ser uma string não vazia.
|
11
|
+
port (int): Porta do servidor FTP. Deve ser um inteiro positivo.
|
12
|
+
tryouts (int): Número de tentativas de conexão. Deve ser um inteiro positivo.
|
13
|
+
timeout (int): Tempo limite para conexão em segundos. Deve ser um inteiro positivo.
|
14
|
+
tls (bool): Indica se a conexão deve usar TLS. Deve ser um valor booleano.
|
15
|
+
ssl (bool): Indica se a conexão deve usar SSL. Deve ser um valor booleano.
|
16
|
+
verify_ssl (bool): Indica se o certificado SSL deve ser verificado. Deve ser um valor booleano.
|
17
|
+
verify_host (bool): Indica se o host deve ser verificado. Deve ser um valor booleano.
|
18
|
+
Métodos:
|
19
|
+
check_str_input(cls, value, info):
|
20
|
+
Valida se os campos 'host', 'user' e 'password' são strings não vazias.
|
21
|
+
Levanta ValueError caso o valor seja inválido.
|
22
|
+
check_int_input(cls, value, info):
|
23
|
+
Valida se os campos 'port', 'timeout' e 'tryouts' são inteiros positivos.
|
24
|
+
Levanta ValueError caso o valor seja inválido.
|
25
|
+
check_bool_input(cls, value, info):
|
26
|
+
Valida se os campos 'tls', 'ssl', 'verify_ssl' e 'verify_host' são booleanos.
|
27
|
+
Levanta ValueError caso o valor seja inválido.
|
28
|
+
"""
|
29
|
+
host:str
|
30
|
+
user:str
|
31
|
+
password:str
|
32
|
+
port:int
|
33
|
+
tryouts:int
|
34
|
+
timeout:int
|
35
|
+
tls:bool
|
36
|
+
ssl:bool
|
37
|
+
verify_ssl:bool
|
38
|
+
verify_host:bool
|
39
|
+
|
40
|
+
@field_validator('host','user','password')
|
41
|
+
def check_str_input(cls, value, info):
|
42
|
+
if not isinstance(value, str) or not value.strip():
|
43
|
+
raise ValueError(f"O parametro '{info.field_name}' deve ser uma string e não um {type(value)} e não vazio")
|
44
|
+
return value
|
45
|
+
|
46
|
+
@field_validator('port','timeout','tryouts')
|
47
|
+
def check_int_input(cls, value, info):
|
48
|
+
if not isinstance(value, int) or value <= 0:
|
49
|
+
raise ValueError(f"O parametro '{info.field_name}' deve ser um inteiro positivo e não um {type(value)}")
|
50
|
+
return value
|
51
|
+
|
52
|
+
@field_validator('tls','ssl','verify_ssl','verify_host')
|
53
|
+
def check_bool_input(cls, value, info):
|
54
|
+
if not isinstance(value, bool):
|
55
|
+
raise ValueError(f"O parametro '{info.field_name}' deve ser um booleano e não um {type(value)}")
|
56
|
+
return value
|
57
|
+
|
58
|
+
|
59
|
+
class UploadDownloadValidator(BaseModel):
|
60
|
+
"""
|
61
|
+
Classe UploadDownloadValidator
|
62
|
+
Valida os parâmetros fornecidos para operações de upload e download via FTP.
|
63
|
+
Atributos:
|
64
|
+
filename (str): Nome do arquivo. Deve ser uma string não vazia.
|
65
|
+
filepathftp (str): Caminho no FTP onde o arquivo está localizado ou será armazenado. Deve ser uma string não vazia.
|
66
|
+
method (str): Método da operação, deve ser 'upload' ou 'download'.
|
67
|
+
Métodos:
|
68
|
+
check_str_input(cls, value, info):
|
69
|
+
Valida se os campos 'filename' e 'filepathftp' são strings não vazias.
|
70
|
+
Levanta ValueError se o valor não for uma string ou estiver vazio.
|
71
|
+
check_method(cls, value):
|
72
|
+
Valida se o campo 'method' é 'upload' ou 'download'.
|
73
|
+
Levanta ValueError se o valor não for uma das opções válidas.
|
74
|
+
"""
|
75
|
+
filename:str
|
76
|
+
filepathftp:str
|
77
|
+
method:str
|
78
|
+
|
79
|
+
@field_validator('filename','filepathftp')
|
80
|
+
def check_str_input(cls, value, info):
|
81
|
+
if not isinstance(value, str) or not value.strip():
|
82
|
+
raise ValueError(f"O parametro '{info.field_name}' deve ser uma string e não um {type(value)} e não vazio")
|
83
|
+
return value
|
84
|
+
|
85
|
+
@field_validator('method')
|
86
|
+
def check_method(cls, value):
|
87
|
+
if str(value).lower() not in ['upload', 'download']:
|
88
|
+
raise ValueError(f"O parametro 'method' deve ser 'upload' ou 'download', mas foi recebido '{value}'")
|
89
|
+
return value
|
90
|
+
|
91
|
+
|
92
|
+
class ListFilesValidator(BaseModel):
|
93
|
+
"""
|
94
|
+
Classe ListFilesValidator
|
95
|
+
Valida os parâmetros relacionados ao caminho de arquivos no FTP.
|
96
|
+
Atributos:
|
97
|
+
filepathftp (str): Representa o caminho do arquivo no FTP. Deve ser uma string não vazia.
|
98
|
+
Métodos:
|
99
|
+
check_str_input(cls, value, info):
|
100
|
+
Valida se o valor fornecido para o campo 'filepathftp' é uma string não vazia.
|
101
|
+
Levanta um ValueError caso o valor não seja uma string ou seja vazio.
|
102
|
+
"""
|
103
|
+
filepathftp:str
|
104
|
+
|
105
|
+
@field_validator('filepathftp')
|
106
|
+
def check_str_input(cls, value, info):
|
107
|
+
if not isinstance(value, str) or not value.strip():
|
108
|
+
raise ValueError(f"O parametro '{info.field_name}' deve ser uma string e não um {type(value)} e não vazio")
|
109
|
+
return value
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: csc_cia_stne
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.96
|
4
4
|
Summary: Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs
|
5
5
|
License: MIT
|
6
6
|
Keywords: karavela,csc,cia,stone,rpa,botcity,stne
|
@@ -30,7 +30,8 @@ Requires-Dist: email-validator
|
|
30
30
|
Requires-Dist: botcity-maestro-sdk
|
31
31
|
Requires-Dist: psutil
|
32
32
|
Requires-Dist: cryptography
|
33
|
-
Requires-Dist:
|
33
|
+
Requires-Dist: pycurl
|
34
|
+
Requires-Dist: socket
|
34
35
|
Dynamic: license-file
|
35
36
|
|
36
37
|
Essa biblioteca é desenvolvida e atualizada pelo time **CSC-CIA** da **Stone**
|
@@ -1,7 +1,8 @@
|
|
1
|
-
csc_cia_stne/__init__.py,sha256=
|
1
|
+
csc_cia_stne/__init__.py,sha256=jwLhGpOwFCow_6cqzwLn31WcIrMzutMZtEQpLL4bQtM,2638
|
2
2
|
csc_cia_stne/bc_correios.py,sha256=pQAnRrcXEMrx3N1MWydZVIhEQLerh3x8-0B045zZIzk,24174
|
3
3
|
csc_cia_stne/bc_sta.py,sha256=sE-aU-ZVSAqryQrT1-nor9eAFM5npNAKF1QSm-ChhGU,28945
|
4
4
|
csc_cia_stne/email.py,sha256=K0DcgxTPKa_Rz_SJekjbW8Nw_1L9s_iuDDxZ-69bZfM,8387
|
5
|
+
csc_cia_stne/ftp.py,sha256=zoUQMRKTWdpUUmy0Ty2PT4mMaW84tPgs4d11O8HMNhQ,10833
|
5
6
|
csc_cia_stne/gcp_bigquery.py,sha256=foq8azvvv_f7uikMDslX9RcUIrx7RAS-Sn0AGW0QFQc,7231
|
6
7
|
csc_cia_stne/gcp_bucket.py,sha256=nP77BtagZ7jQq6lS88ZEa1qshzBza6e_LvhgS3_JJJk,10268
|
7
8
|
csc_cia_stne/google_drive.py,sha256=k6GnM8bxQUPbXhaK6Sa4JpWrCcJ0vzYgXP8Uexy7YR0,16073
|
@@ -11,16 +12,16 @@ csc_cia_stne/logger_rich.py,sha256=fklgkBb4rblKQd7YZ3q-eWfhGg9eflO2k2-z4pGh_yo,5
|
|
11
12
|
csc_cia_stne/provio.py,sha256=G-pDnHYLSp97joc7S7dvwjNvl3omnTmvdi3rOPQf5GA,3987
|
12
13
|
csc_cia_stne/servicenow.py,sha256=cJtNtLZ8glWfs3OAzl78ZFlPyPz39CSBxHqpTdUU7i0,32136
|
13
14
|
csc_cia_stne/slack.py,sha256=sPLeaQh_JewLcrBDjjwUgbjtC7d1Np03OTy06JimMV4,8117
|
14
|
-
csc_cia_stne/stne_admin.py,sha256=
|
15
|
+
csc_cia_stne/stne_admin.py,sha256=4v_BVQAwZeWmxvjDOkwFAl9yIxJ3r54BY7pRgAgSXEM,24220
|
15
16
|
csc_cia_stne/wacess.py,sha256=g-bWZNpm_tU7UsW1G_rqh_2fW2KShvxZHGOerX8DuQw,26768
|
16
17
|
csc_cia_stne/web.py,sha256=_pc6BzPy2x0RvqtZsByjtKcSuUqlVTevfmmmKbVWLhA,15417
|
17
18
|
csc_cia_stne/utilitarios/__init__.py,sha256=rBGAmW0WcZnwTfVNuikNuJ1RBs6o7aw4xrV2QSsF9Bs,389
|
18
|
-
csc_cia_stne/utilitarios/functions/__init__.py,sha256=
|
19
|
+
csc_cia_stne/utilitarios/functions/__init__.py,sha256=6qM7QH4hI-5Gmg22aH_z93NRkTmjSbBayF2aW-81A6A,581
|
19
20
|
csc_cia_stne/utilitarios/functions/func_b64.py,sha256=XGU34BIQQXWXBS0yM2B4A2wDlcrMl1unIJXjq4lpLnk,1254
|
20
21
|
csc_cia_stne/utilitarios/functions/func_converters.py,sha256=EY1zvlBaRX7G1MceVSiRXwwKDQDZwUO9iECBL0fe5iU,481
|
21
22
|
csc_cia_stne/utilitarios/functions/func_datetime.py,sha256=UA7ch4sQWTiYcz8r6LtGujIdpTU-Sht8qmTYvm9vhh0,257
|
22
23
|
csc_cia_stne/utilitarios/functions/func_get_secret.py,sha256=cJZe_qtFFbISfQAo0iSCHjqutIjMvRF-L3I_bKUpM8I,2869
|
23
|
-
csc_cia_stne/utilitarios/functions/func_rdp.py,sha256=
|
24
|
+
csc_cia_stne/utilitarios/functions/func_rdp.py,sha256=HdQ2vnrMPGqhS5gepqrAFBW_Lc7gpZjX0nWItmi2OAA,4933
|
24
25
|
csc_cia_stne/utilitarios/functions/func_recriar_pastas.py,sha256=4whZpB3aJQaCPJ3osMAQpKrzEhqYtJbljGWlx_OvKIM,826
|
25
26
|
csc_cia_stne/utilitarios/functions/func_settings.py,sha256=XwlfqdcfocXQ8kTsDKZ6GsAtpzr0_u44AOTIMtdem7U,2059
|
26
27
|
csc_cia_stne/utilitarios/functions/func_titulo.py,sha256=bH4tYxovTARF-g2kWUK_GIzzXt8egbVdp6mWD6fc_3I,5345
|
@@ -28,11 +29,12 @@ csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py,sha256=PfCeeQquheZk
|
|
28
29
|
csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py,sha256=Q1oZTae4hDJ2TQ4sUL5Q5TkDNPoJo-DZQt6wIue2jwM,4811
|
29
30
|
csc_cia_stne/utilitarios/validations/ServiceNowValidator.py,sha256=yleKUIo1ZfyloP9fDPNjv3JJXdLcocT81WIgRSYmqEA,14423
|
30
31
|
csc_cia_stne/utilitarios/validations/__init__.py,sha256=O_qyEU2ji3u6LHUXZCXvUFsMpoMWL625qqHTXyXivTA,106
|
32
|
+
csc_cia_stne/utilitarios/validations/ftp.py,sha256=LNYyS2c8eou3ML23bBtn87xJFIKSrb8w-2acG0Zugog,4988
|
31
33
|
csc_cia_stne/utilitarios/validations/gcp_bucket.py,sha256=vqj70jBAkazydUCPXIdE3zzgoz8Te2cCJNX_rICX1aM,6096
|
32
34
|
csc_cia_stne/utilitarios/validations/waccess.py,sha256=8yfOrmIPUSLzbCt6P0F6vj3FkSgU_RgrJpJlRhlLyV0,7352
|
33
35
|
csc_cia_stne/utilitarios/validations/web_validator.py,sha256=HYKYSpDv1RvRjZIuwTPt-AbEz-9392MxM_O329iYuSA,5722
|
34
|
-
csc_cia_stne-0.0.
|
35
|
-
csc_cia_stne-0.0.
|
36
|
-
csc_cia_stne-0.0.
|
37
|
-
csc_cia_stne-0.0.
|
38
|
-
csc_cia_stne-0.0.
|
36
|
+
csc_cia_stne-0.0.96.dist-info/licenses/LICENCE,sha256=LPGMtgKki2C3KEZP7hDhA1HBrlq5JCHkIeStUCLEMx4,1073
|
37
|
+
csc_cia_stne-0.0.96.dist-info/METADATA,sha256=R8uQ09aOb_G7yhc8IbFev48OtBJR3c5pZTvgXOSI9V8,1441
|
38
|
+
csc_cia_stne-0.0.96.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
39
|
+
csc_cia_stne-0.0.96.dist-info/top_level.txt,sha256=ldo7GVv3tQx5KJvwBzdZzzQmjPys2NDVVn1rv0BOF2Q,13
|
40
|
+
csc_cia_stne-0.0.96.dist-info/RECORD,,
|
File without changes
|
File without changes
|