Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FTP Connection Problem in 'Directory' Initialization #187

Open
MarceloNG opened this issue Jan 17, 2024 · 0 comments
Open

FTP Connection Problem in 'Directory' Initialization #187

MarceloNG opened this issue Jan 17, 2024 · 0 comments

Comments

@MarceloNG
Copy link

MarceloNG commented Jan 17, 2024

Description
I'm encountering a domain name resolution issue when importing the download function from the pysus.online_data.SIA module. The error seems to be related to an attempt to establish an FTP connection within the new method of the Directory class. This behavior can cause failures in environments with limited or unstable connectivity.

Complete Error Message

Traceback (most recent call last):
  File "/home/asdf/.cache/pypoetry/virtualenvs/sus-ZSlS6Gat-py3.11/lib/python3.11/site-packages/pysus/ftp/__init__.py", line 267, in __new__
    directory = CACHE[path]  # Recursive and cached instantiation
                ~~~~~^^^^^^
KeyError: '/dissemin/publicos/SIASUS/199407_200712/Dados'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/asdf/.cache/pypoetry/virtualenvs/sus-ZSlS6Gat-py3.11/lib/python3.11/site-packages/pysus/ftp/__init__.py", line 267, in __new__
    directory = CACHE[path]  # Recursive and cached instantiation
                ~~~~~^^^^^^
KeyError: '/dissemin/publicos/SIASUS/199407_200712'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/asdf/repositorios/sus/magica.py", line 8, in <module>
    from pysus.online_data.SIA import download
  File "/home/asdf/.cache/pypoetry/virtualenvs/sus-ZSlS6Gat-py3.11/lib/python3.11/site-packages/pysus/online_data/SIA.py", line 15, in <module>
    from pysus.ftp.databases.sia import SIA
  File "/home/asdf/.cache/pypoetry/virtualenvs/sus-ZSlS6Gat-py3.11/lib/python3.11/site-packages/pysus/ftp/databases/sia.py", line 7, in <module>
    class SIA(Database):
  File "/home/asdf/.cache/pypoetry/virtualenvs/sus-ZSlS6Gat-py3.11/lib/python3.11/site-packages/pysus/ftp/databases/sia.py", line 10, in SIA
    Directory("/dissemin/publicos/SIASUS/199407_200712/Dados"),
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/asdf/.cache/pypoetry/virtualenvs/sus-ZSlS6Gat-py3.11/lib/python3.11/site-packages/pysus/ftp/__init__.py", line 293, in __new__
    directory.parent = Directory(parent_path)  # Recursive
                       ^^^^^^^^^^^^^^^^^^^^^^
  File "/home/asdf/.cache/pypoetry/virtualenvs/sus-ZSlS6Gat-py3.11/lib/python3.11/site-packages/pysus/ftp/__init__.py", line 285, in __new__
    raise exc
  File "/home/asdf/.cache/pypoetry/virtualenvs/sus-ZSlS6Gat-py3.11/lib/python3.11/site-packages/pysus/ftp/__init__.py", line 270, in __new__
    ftp.connect()
  File "/home/asdf/.pyenv/versions/3.11.5/lib/python3.11/ftplib.py", line 158, in connect
    self.sock = socket.create_connection((self.host, self.port), self.timeout,
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/asdf/.pyenv/versions/3.11.5/lib/python3.11/socket.py", line 827, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/asdf/.pyenv/versions/3.11.5/lib/python3.11/socket.py", line 962, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
socket.gaierror: [Errno -3] Temporary failure in name resolution

Implementation of the Directory Class

class Directory:
    name: str
    path: str
    parent: Directory
    loaded: bool = False
    __content__: Dict = {}

   def __new__(cls, path: str, _is_root_child=False) -> Directory:
        ftp = FTP("ftp.datasus.gov.br")
        # ... [resto do código omitido para brevidade]
        try:
            ftp.connect()
            ftp.login()
            ftp.cwd(path)  # Checks if parent dir exists on DATASUS
        # ... [tratamento de exceções e restante do método]

Preliminary Analysis:
The attempt to establish an FTP connection within the new method of the Directory class appears to be the cause of the problem. Typically, importing a module is not expected to immediately attempt a network connection, as this can be problematic in certain environments.

Suggestion for Resolution:
A possible solution could be restructuring the logic so that the FTP connection is not established during the initialization of the Directory class, but rather when explicitly needed. This could prevent connectivity failures during import and make the library more robust in different network environments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant