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 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
+ }
@@ -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=60)
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
- """Retorna o ip da conexão RDP
11
+ # def obter_ip_conexao_rdp():
12
+ # """Retorna o ip da conexão RDP
13
13
 
14
- Returns:
15
- str: ip
16
- """
14
+ # Returns:
15
+ # str: ip
16
+ # """
17
17
 
18
- for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
18
+ # for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
19
19
 
20
- if proc.info['name'] == 'mstsc.exe' and proc.info['cmdline']:
20
+ # if proc.info['name'] == 'mstsc.exe' and proc.info['cmdline']:
21
21
 
22
- for arg in proc.info['cmdline']:
22
+ # for arg in proc.info['cmdline']:
23
23
 
24
- if arg.startswith("/v:"): # O argumento '/v:' contém o IP
24
+ # if arg.startswith("/v:"): # O argumento '/v:' contém o IP
25
25
 
26
- return arg.replace("/v:", "").strip()
26
+ # return arg.replace("/v:", "").strip()
27
27
 
28
- return None
28
+ # return None
29
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
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
- # 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
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
- return False
42
+ # return False
43
43
 
44
- def conectar_rdp(host:str, usuario:str, senha:str)->bool:
45
- """Conecta via RDP em uma máquina remota
44
+ # def conectar_rdp(host:str, usuario:str, senha:str)->bool:
45
+ # """Conecta via RDP em uma máquina remota
46
46
 
47
- Args:
47
+ # Args:
48
48
 
49
- host (str): ip/host destino
50
- usuario (str): usuário
51
- senha (str): senha
49
+ # host (str): ip/host destino
50
+ # usuario (str): usuário
51
+ # senha (str): senha
52
52
 
53
- Returns:
54
- bool: True/False
55
- """
53
+ # Returns:
54
+ # bool: True/False
55
+ # """
56
56
 
57
- sistema = platform.system()
57
+ # sistema = platform.system()
58
58
 
59
- if sistema == "Windows":
59
+ # if sistema == "Windows":
60
60
 
61
- try:
61
+ # try:
62
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())
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
- return caminho_rdp
84
+ # return caminho_rdp
85
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()
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
- except Exception as e:
104
+ # except Exception as e:
105
105
 
106
- log.error(f"Erro ao conectar à área de trabalho remota:\n{e}")
107
- return False
106
+ # log.error(f"Erro ao conectar à área de trabalho remota:\n{e}")
107
+ # return False
108
108
 
109
- elif sistema == "Linux":
109
+ # elif sistema == "Linux":
110
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"""
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
- # Executar o comando e capturar saída
116
- try:
115
+ # # Executar o comando e capturar saída
116
+ # try:
117
117
 
118
- processo_rdp = subprocess.Popen(
119
- comando_rdp,
120
- shell=True,
121
- stdout=subprocess.PIPE,
122
- stderr=subprocess.PIPE,
123
- text=True
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
- except Exception as e:
126
+ # except Exception as e:
127
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)}")
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
- # Aguarda 10 segundos, para aparecer o banner azul
131
- time.sleep(10)
130
+ # # Aguarda 10 segundos, para aparecer o banner azul
131
+ # time.sleep(10)
132
132
 
133
- # Se a conexão foi bem-sucedida, retornar True
134
- if processo_rdp.poll() is None:
133
+ # # Se a conexão foi bem-sucedida, retornar True
134
+ # if processo_rdp.poll() is None:
135
135
 
136
- # Clica no 'enter', no banner azul
137
- pyautogui.press('enter')
138
- return True
136
+ # # Clica no 'enter', no banner azul
137
+ # pyautogui.press('enter')
138
+ # return True
139
139
 
140
- else:
140
+ # else:
141
141
 
142
- return False
142
+ # return False
143
143
 
144
- else:
144
+ # else:
145
145
 
146
- raise Exception("Sistema operacional não suportado (Somente 'Windows' ou 'Linux').")
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.94
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: pyautogui
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=mJsIonLLjMtAmJcVGiEcvtGchVIk5soOR9VO7D9oaCY,2606
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=cQPGnLTVEgcR18U6qEwxx0pR-zEaqJ_vB0onJpEu7jY,24219
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=vdiPAyPmUDGDhtecJmcrXADGPW2yKD-aV3wP9SyLYbE,574
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=bHzMEv2mofRLMB0DswW1-mLtYqQdrGPz3Lnt6xQNxFA,4713
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.94.dist-info/licenses/LICENCE,sha256=LPGMtgKki2C3KEZP7hDhA1HBrlq5JCHkIeStUCLEMx4,1073
35
- csc_cia_stne-0.0.94.dist-info/METADATA,sha256=FkD61mTHmc7wwlftswSQY3Jynlz0AxCmIR3t9AhY31M,1422
36
- csc_cia_stne-0.0.94.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
37
- csc_cia_stne-0.0.94.dist-info/top_level.txt,sha256=ldo7GVv3tQx5KJvwBzdZzzQmjPys2NDVVn1rv0BOF2Q,13
38
- csc_cia_stne-0.0.94.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.4.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5