csc-cia-stne 0.0.95__tar.gz → 0.0.97__tar.gz

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.
Files changed (47) hide show
  1. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/PKG-INFO +2 -2
  2. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/pyproject.toml +2 -2
  3. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/__init__.py +3 -1
  4. csc_cia_stne-0.0.97/src/csc_cia_stne/ftp.py +306 -0
  5. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/functions/__init__.py +4 -3
  6. csc_cia_stne-0.0.97/src/csc_cia_stne/utilitarios/functions/func_rdp.py +147 -0
  7. csc_cia_stne-0.0.97/src/csc_cia_stne/utilitarios/validations/ftp.py +109 -0
  8. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne.egg-info/PKG-INFO +2 -2
  9. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne.egg-info/SOURCES.txt +2 -0
  10. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne.egg-info/requires.txt +1 -1
  11. csc_cia_stne-0.0.95/src/csc_cia_stne/utilitarios/functions/func_rdp.py +0 -147
  12. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/LICENCE +0 -0
  13. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/README.md +0 -0
  14. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/README_PYPI.md +0 -0
  15. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/setup.cfg +0 -0
  16. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/bc_correios.py +0 -0
  17. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/bc_sta.py +0 -0
  18. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/email.py +0 -0
  19. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/gcp_bigquery.py +0 -0
  20. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/gcp_bucket.py +0 -0
  21. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/google_drive.py +0 -0
  22. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/karavela.py +0 -0
  23. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/logger_json.py +0 -0
  24. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/logger_rich.py +0 -0
  25. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/provio.py +0 -0
  26. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/servicenow.py +0 -0
  27. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/slack.py +0 -0
  28. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/stne_admin.py +0 -0
  29. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/__init__.py +0 -0
  30. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/functions/func_b64.py +0 -0
  31. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/functions/func_converters.py +0 -0
  32. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/functions/func_datetime.py +0 -0
  33. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/functions/func_get_secret.py +0 -0
  34. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/functions/func_recriar_pastas.py +0 -0
  35. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/functions/func_settings.py +0 -0
  36. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/functions/func_titulo.py +0 -0
  37. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py +0 -0
  38. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py +0 -0
  39. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/validations/ServiceNowValidator.py +0 -0
  40. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/validations/__init__.py +0 -0
  41. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/validations/gcp_bucket.py +0 -0
  42. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/validations/waccess.py +0 -0
  43. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/utilitarios/validations/web_validator.py +0 -0
  44. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/wacess.py +0 -0
  45. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne/web.py +0 -0
  46. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne.egg-info/dependency_links.txt +0 -0
  47. {csc_cia_stne-0.0.95 → csc_cia_stne-0.0.97}/src/csc_cia_stne.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csc_cia_stne
3
- Version: 0.0.95
3
+ Version: 0.0.97
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,7 @@ Requires-Dist: email-validator
30
30
  Requires-Dist: botcity-maestro-sdk
31
31
  Requires-Dist: psutil
32
32
  Requires-Dist: cryptography
33
- Requires-Dist: pyautogui
33
+ Requires-Dist: pycurl
34
34
  Dynamic: license-file
35
35
 
36
36
  Essa biblioteca é desenvolvida e atualizada pelo time **CSC-CIA** da **Stone**
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "csc_cia_stne"
7
- version = "0.0.95"
7
+ version = "0.0.97"
8
8
  license = { text = "MIT" }
9
9
  description = "Biblioteca do time CSC-CIA utilizada no desenvolvimento de RPAs"
10
10
  keywords = ["karavela", "csc", "cia", "stone", "rpa", "botcity", "stne"]
@@ -36,5 +36,5 @@ dependencies = [
36
36
  "botcity-maestro-sdk",
37
37
  "psutil",
38
38
  "cryptography",
39
- "pyautogui"
39
+ "pycurl"
40
40
  ]
@@ -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()
@@ -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
+ }
@@ -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
  ]
@@ -0,0 +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__')
10
+
11
+ # def obter_ip_conexao_rdp():
12
+ # """Retorna o ip da conexão RDP
13
+
14
+ # Returns:
15
+ # str: ip
16
+ # """
17
+
18
+ # for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
19
+
20
+ # if proc.info['name'] == 'mstsc.exe' and proc.info['cmdline']:
21
+
22
+ # for arg in proc.info['cmdline']:
23
+
24
+ # if arg.startswith("/v:"): # O argumento '/v:' contém o IP
25
+
26
+ # return arg.replace("/v:", "").strip()
27
+
28
+ # return None
29
+
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
+
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
+
42
+ # return False
43
+
44
+ # def conectar_rdp(host:str, usuario:str, senha:str)->bool:
45
+ # """Conecta via RDP em uma máquina remota
46
+
47
+ # Args:
48
+
49
+ # host (str): ip/host destino
50
+ # usuario (str): usuário
51
+ # senha (str): senha
52
+
53
+ # Returns:
54
+ # bool: True/False
55
+ # """
56
+
57
+ # sistema = platform.system()
58
+
59
+ # if sistema == "Windows":
60
+
61
+ # try:
62
+
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
+
84
+ # return caminho_rdp
85
+
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
+
104
+ # except Exception as e:
105
+
106
+ # log.error(f"Erro ao conectar à área de trabalho remota:\n{e}")
107
+ # return False
108
+
109
+ # elif sistema == "Linux":
110
+
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
+
115
+ # # Executar o comando e capturar saída
116
+ # try:
117
+
118
+ # processo_rdp = subprocess.Popen(
119
+ # comando_rdp,
120
+ # shell=True,
121
+ # stdout=subprocess.PIPE,
122
+ # stderr=subprocess.PIPE,
123
+ # text=True
124
+ # )
125
+
126
+ # except Exception as e:
127
+
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
+
130
+ # # Aguarda 10 segundos, para aparecer o banner azul
131
+ # time.sleep(10)
132
+
133
+ # # Se a conexão foi bem-sucedida, retornar True
134
+ # if processo_rdp.poll() is None:
135
+
136
+ # # Clica no 'enter', no banner azul
137
+ # pyautogui.press('enter')
138
+ # return True
139
+
140
+ # else:
141
+
142
+ # return False
143
+
144
+ # else:
145
+
146
+ # raise Exception("Sistema operacional não suportado (Somente 'Windows' ou 'Linux').")
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.95
3
+ Version: 0.0.97
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,7 @@ Requires-Dist: email-validator
30
30
  Requires-Dist: botcity-maestro-sdk
31
31
  Requires-Dist: psutil
32
32
  Requires-Dist: cryptography
33
- Requires-Dist: pyautogui
33
+ Requires-Dist: pycurl
34
34
  Dynamic: license-file
35
35
 
36
36
  Essa biblioteca é desenvolvida e atualizada pelo time **CSC-CIA** da **Stone**
@@ -6,6 +6,7 @@ src/csc_cia_stne/__init__.py
6
6
  src/csc_cia_stne/bc_correios.py
7
7
  src/csc_cia_stne/bc_sta.py
8
8
  src/csc_cia_stne/email.py
9
+ src/csc_cia_stne/ftp.py
9
10
  src/csc_cia_stne/gcp_bigquery.py
10
11
  src/csc_cia_stne/gcp_bucket.py
11
12
  src/csc_cia_stne/google_drive.py
@@ -37,6 +38,7 @@ src/csc_cia_stne/utilitarios/validations/GcpBigQueryValidator.py
37
38
  src/csc_cia_stne/utilitarios/validations/GoogleDriveValidator.py
38
39
  src/csc_cia_stne/utilitarios/validations/ServiceNowValidator.py
39
40
  src/csc_cia_stne/utilitarios/validations/__init__.py
41
+ src/csc_cia_stne/utilitarios/validations/ftp.py
40
42
  src/csc_cia_stne/utilitarios/validations/gcp_bucket.py
41
43
  src/csc_cia_stne/utilitarios/validations/waccess.py
42
44
  src/csc_cia_stne/utilitarios/validations/web_validator.py
@@ -22,4 +22,4 @@ email-validator
22
22
  botcity-maestro-sdk
23
23
  psutil
24
24
  cryptography
25
- pyautogui
25
+ pycurl
@@ -1,147 +0,0 @@
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
-
11
- def obter_ip_conexao_rdp():
12
- """Retorna o ip da conexão RDP
13
-
14
- Returns:
15
- str: ip
16
- """
17
-
18
- for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
19
-
20
- if proc.info['name'] == 'mstsc.exe' and proc.info['cmdline']:
21
-
22
- for arg in proc.info['cmdline']:
23
-
24
- if arg.startswith("/v:"): # O argumento '/v:' contém o IP
25
-
26
- return arg.replace("/v:", "").strip()
27
-
28
- return None
29
-
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
-
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
-
42
- return False
43
-
44
- def conectar_rdp(host:str, usuario:str, senha:str)->bool:
45
- """Conecta via RDP em uma máquina remota
46
-
47
- Args:
48
-
49
- host (str): ip/host destino
50
- usuario (str): usuário
51
- senha (str): senha
52
-
53
- Returns:
54
- bool: True/False
55
- """
56
-
57
- sistema = platform.system()
58
-
59
- if sistema == "Windows":
60
-
61
- try:
62
-
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
-
84
- return caminho_rdp
85
-
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
-
104
- except Exception as e:
105
-
106
- log.error(f"Erro ao conectar à área de trabalho remota:\n{e}")
107
- return False
108
-
109
- elif sistema == "Linux":
110
-
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
-
115
- # Executar o comando e capturar saída
116
- try:
117
-
118
- processo_rdp = subprocess.Popen(
119
- comando_rdp,
120
- shell=True,
121
- stdout=subprocess.PIPE,
122
- stderr=subprocess.PIPE,
123
- text=True
124
- )
125
-
126
- except Exception as e:
127
-
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
-
130
- # Aguarda 10 segundos, para aparecer o banner azul
131
- time.sleep(10)
132
-
133
- # Se a conexão foi bem-sucedida, retornar True
134
- if processo_rdp.poll() is None:
135
-
136
- # Clica no 'enter', no banner azul
137
- pyautogui.press('enter')
138
- return True
139
-
140
- else:
141
-
142
- return False
143
-
144
- else:
145
-
146
- raise Exception("Sistema operacional não suportado (Somente 'Windows' ou 'Linux').")
147
-
File without changes
File without changes
File without changes