dbcli/litecli

Litecli crashes in non root containerized environment without home directory

Closed this issue · 7 comments

Looks like on startup litecli assumes it should be able to create the home directory of the current user. There is no home directory for this user and the filesystem is for the most part read only except for a few volumes. I can make a PR but wondering if anyone here has any thoughts.

This is in a nonroot container.

litecli /database/sqlite3.db
Traceback (most recent call last):
  File "/usr/local/bin/litecli", line 8, in <module>
    sys.exit(cli())
             ^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/litecli/main.py", line 921, in cli
    litecli = LiteCli(
              ^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/litecli/main.py", line 78, in __init__
    c = self.config = get_config(liteclirc)
                      ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/litecli/config.py", line 60, in get_config
    write_default_config(default_config, liteclirc_file)
  File "/usr/local/lib/python3.11/dist-packages/litecli/config.py", line 42, in write_default_config
    ensure_dir_exists(destination)
  File "/usr/local/lib/python3.11/dist-packages/litecli/config.py", line 30, in ensure_dir_exists
    os.makedirs(parent_dir)
  File "<frozen os>", line 215, in makedirs
  File "<frozen os>", line 215, in makedirs
  File "<frozen os>", line 225, in makedirs
PermissionError: [Errno 13] Permission denied: '/nonexistent'

Litecli writes the default config file to ~/.config/litecli/config and it also uses that location to store the log files.

Can you try copying the liteclirc file into a location and launch litecli using:

litecli --liteclirc <PATH-TO-RC>

and see if that works?

@amjith same issue when

litecli --liteclirc /database/liteclirc

Traceback (most recent call last):
  File "/usr/local/bin/litecli", line 8, in <module>
    sys.exit(cli())
             ^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/litecli/main.py", line 921, in cli
    litecli = LiteCli(
              ^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/litecli/main.py", line 123, in __init__
    self.initialize_logging()
  File "/usr/local/lib/python3.11/dist-packages/litecli/main.py", line 242, in initialize_logging
    ensure_dir_exists(log_file)
  File "/usr/local/lib/python3.11/dist-packages/litecli/config.py", line 30, in ensure_dir_exists
    os.makedirs(parent_dir)
  File "<frozen os>", line 215, in makedirs
  File "<frozen os>", line 215, in makedirs
  File "<frozen os>", line 225, in makedirs
PermissionError: [Errno 13] Permission denied: '/nonexistent'

Can you try editing the log file location in your literc file?

https://github.com/dbcli/litecli/blob/main/litecli/liteclirc#L19

Set it to a location that is available in the docker container and see if that gets around it?

After creating the default, this ends up giving me.

nextjs@f095bfc4d0fe:/app$ litecli --liteclirc /tmp/liteclirc --logfile /tmp/txt.log
Traceback (most recent call last):
  File "/usr/local/bin/litecli", line 8, in <module>
    sys.exit(cli())
             ^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1157, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1078, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1434, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 783, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/litecli/main.py", line 921, in cli
    litecli = LiteCli(
              ^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/litecli/main.py", line 78, in __init__
    c = self.config = get_config(liteclirc)
                      ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/litecli/config.py", line 62, in get_config
    return load_config(liteclirc_file, default_config)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/litecli/config.py", line 21, in load_config
    cfg.merge(ConfigObj(expanduser(usr_cfg), interpolation=False, encoding="utf-8"))
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/configobj/__init__.py", line 1229, in __init__
    self._load(infile, configspec)
  File "/usr/local/lib/python3.11/dist-packages/configobj/__init__.py", line 1318, in _load
    raise error
configobj.ConfigObjError: Parsing failed with several errors.
First error at line 129.
nextjs@f095bfc4d0fe:/app$ 

You're right that it shouldn't crash when it can't create the necessary folders. It'll be nice to print a warning that it failed to create them when the app starts so the user is aware.

If you're interested in contributing a PR, I'll be happy to merge it. If not, I'll take some time this upcoming week to implement it. Let me know what you prefer.

Can you try this branch and tell me if it work?

pip install -U https://github.com/dbcli/litecli/archive/refs/heads/optional-config.zip

@amjith I can confirm this works ty!!!