meerschaum 3.0.0rc6__tar.gz → 3.0.0rc7__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.
- {meerschaum-3.0.0rc6/meerschaum.egg-info → meerschaum-3.0.0rc7}/PKG-INFO +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/arguments/_parser.py +9 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/cli/entry.py +40 -4
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/cli/workers.py +37 -9
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/entry.py +2 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/shell/Shell.py +54 -9
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/shell/__init__.py +4 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/term/TermPageHandler.py +1 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/term/__init__.py +40 -6
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/term/tools.py +33 -8
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/__init__.py +4 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/api.py +39 -11
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/delete.py +4 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/edit.py +27 -8
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/login.py +8 -8
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/reload.py +12 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/show.py +61 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/start.py +24 -10
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/stop.py +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/__init__.py +10 -7
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/_events.py +2 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/dashboard.py +29 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/login.py +2 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pipes.py +72 -36
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/webterm.py +14 -6
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/js/terminado.js +3 -0
- meerschaum-3.0.0rc7/meerschaum/api/resources/static/js/xterm-addon-unicode11.js +2 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/templates/termpage.html +1 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_jobs.py +23 -11
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_webterm.py +3 -3
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/__init__.py +43 -16
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_default.py +68 -63
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_edit.py +10 -8
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_formatting.py +2 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_patch.py +4 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_paths.py +124 -12
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_read_config.py +20 -10
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_version.py +1 -1
- meerschaum-3.0.0rc6/meerschaum/config/_environment.py → meerschaum-3.0.0rc7/meerschaum/config/environment.py +97 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/stack/__init__.py +4 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/__init__.py +37 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_APIConnector.py +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_jobs.py +11 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/parse.py +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_create_engine.py +3 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_pipes.py +7 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_cache.py +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Plugin/_Plugin.py +7 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Token/_Token.py +1 -1
- meerschaum-3.0.0rc7/meerschaum/jobs/_Executor.py +159 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/jobs/_Job.py +30 -7
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/jobs/systemd.py +7 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/plugins/__init__.py +277 -81
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/daemon/Daemon.py +32 -20
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/daemon/StdinFile.py +15 -6
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/daemon/__init__.py +1 -2
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/daemon/_names.py +6 -3
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/formatting/_shell.py +4 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/misc.py +0 -22
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/packages/__init__.py +15 -13
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/prompt.py +161 -142
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7/meerschaum.egg-info}/PKG-INFO +1 -1
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum.egg-info/SOURCES.txt +2 -1
- meerschaum-3.0.0rc6/meerschaum/jobs/_Executor.py +0 -75
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/LICENSE +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/MANIFEST.in +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/NOTICE +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/README.md +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/__main__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/arguments/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/arguments/_parse_arguments.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/cli/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/cli/daemons.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/docs/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/docs/index.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/shell/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/shell/updates.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/_internal/static.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/attach.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/bootstrap.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/clear.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/copy.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/deduplicate.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/drop.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/index.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/install.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/os.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/pause.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/python.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/register.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/restart.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/setup.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/sh.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/sql.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/stack.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/sync.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/tag.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/uninstall.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/upgrade.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/actions/verify.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/_chain.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/_chunks.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/_exceptions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/_oauth2.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/_websockets.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/assets/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/assets/ansi_up.js +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/assets/favicon.ico +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/custom.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/login.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/register.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/settings/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/settings/password_reset.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/callbacks/tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/components.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/connectors.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/graphs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/keys.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/dashboard.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/error.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/register.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/settings/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/settings/password_reset.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/pages/tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/sessions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/sync.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/dash/websockets.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/models/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/models/_actions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/models/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/models/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/css/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/css/dash.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/css/styles.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/css/xterm.css +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/ico/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/ico/logo.ico +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/js/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/js/action_button.js +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/js/main.js +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/js/xterm.js +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/static/png/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/templates/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/templates/index.html +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/templates/old_index.html +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/resources/templates/secret.html +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_actions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_connectors.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_index.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_login.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_misc.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/routes/_version.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/api/tables/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_dash.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_preprocess.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_shell.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/_sync.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/paths.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/stack/grafana/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/stack/resources/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/config/static.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/_Connector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_actions.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_fetch.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_login.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_misc.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_request.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_uri.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/api/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/instance/_InstanceConnector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/instance/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/instance/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/instance/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/instance/_tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/instance/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/plugin/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/poll.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_SQLConnector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_cli.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_fetch.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_instance.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_sql.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_uri.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/tables/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/tables/types.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/sql/tools.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/valkey/_ValkeyConnector.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/valkey/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/valkey/_fetch.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/valkey/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/valkey/_plugins.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/connectors/valkey/_users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_attributes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_bootstrap.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_clear.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_copy.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_data.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_deduplicate.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_delete.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_drop.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_dtypes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_edit.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_fetch.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_index.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_register.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_show.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_sync.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Pipe/_verify.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Plugin/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/Token/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/User/_User.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/User/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/core/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/jobs/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/models/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/models/pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/models/tokens.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/models/users.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/plugins/bootstrap.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/_get_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/daemon/RotatingFile.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/dataframe.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/debug.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/dtypes/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/dtypes/sql.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/formatting/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/formatting/_jobs.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/formatting/_pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/formatting/_pprint.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/interactive.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/networking.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/packages/_packages.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/packages/lazy_loader.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/pipes.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/pool.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/process.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/schedule.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/sql.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/threading.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/typing.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/venv/_Venv.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/venv/__init__.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/warnings.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum/utils/yaml.py +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum.egg-info/dependency_links.txt +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum.egg-info/entry_points.txt +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum.egg-info/requires.txt +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum.egg-info/top_level.txt +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/meerschaum.egg-info/zip-safe +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/pyproject.toml +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/setup.cfg +0 -0
- {meerschaum-3.0.0rc6 → meerschaum-3.0.0rc7}/setup.py +0 -0
@@ -140,7 +140,11 @@ def parse_help(sysargs: Union[List[str], Dict[str, Any]]) -> None:
|
|
140
140
|
### Check for subactions.
|
141
141
|
if len(args['action']) > 1:
|
142
142
|
try:
|
143
|
-
|
143
|
+
subactions = get_subactions(args['action'][0])
|
144
|
+
subaction_name = args['action'][1]
|
145
|
+
if subaction_name not in subactions:
|
146
|
+
subaction_name = subaction_name + 's'
|
147
|
+
subaction = subactions[subaction_name]
|
144
148
|
except Exception:
|
145
149
|
subaction = None
|
146
150
|
if subaction is not None:
|
@@ -389,6 +393,10 @@ groups['api'].add_argument(
|
|
389
393
|
'--host', type=str,
|
390
394
|
help="The host address to bind to for the API server. Defaults to '0.0.0.0'."
|
391
395
|
)
|
396
|
+
groups['api'].add_argument(
|
397
|
+
'--webterm-port', type=int,
|
398
|
+
help="The port on which to run the webterm server.",
|
399
|
+
)
|
392
400
|
groups['api'].add_argument(
|
393
401
|
'-w', '--workers', type=int,
|
394
402
|
help = "How many workers to run a concurrent action (e.g. running the API or syncing pipes)"
|
@@ -12,7 +12,7 @@ import shlex
|
|
12
12
|
import shutil
|
13
13
|
import traceback
|
14
14
|
import signal
|
15
|
-
from typing import Optional, Dict, List, Any
|
15
|
+
from typing import Optional, Dict, List, Any
|
16
16
|
|
17
17
|
import meerschaum as mrsm
|
18
18
|
|
@@ -30,20 +30,47 @@ def entry_with_daemon(
|
|
30
30
|
-------
|
31
31
|
A `SuccessTuple` indicating success.
|
32
32
|
"""
|
33
|
+
from meerschaum.actions import get_action
|
34
|
+
from meerschaum.plugins import load_plugins, _actions_daemon_enabled
|
33
35
|
from meerschaum._internal.entry import entry_without_daemon
|
34
36
|
from meerschaum._internal.cli.workers import ActionWorker
|
35
37
|
from meerschaum._internal.cli.daemons import (
|
36
38
|
get_available_cli_daemon_ix,
|
37
39
|
get_cli_session_id,
|
38
40
|
)
|
41
|
+
from meerschaum.config import get_possible_keys
|
42
|
+
from meerschaum._internal.arguments import split_pipeline_sysargs, split_chained_sysargs
|
39
43
|
daemon_is_ready = True
|
40
44
|
|
45
|
+
load_plugins(skip_if_loaded=True)
|
46
|
+
|
41
47
|
found_acceptable_prefix = False
|
42
48
|
found_unacceptable_prefix = False
|
43
|
-
|
44
|
-
|
49
|
+
found_disabled_action = False
|
50
|
+
allowed_prefixes = (
|
51
|
+
mrsm.get_config('system', 'cli', 'allowed_prefixes')
|
52
|
+
)
|
53
|
+
disallowed_prefixes = (
|
54
|
+
mrsm.get_config('system', 'cli', 'disallowed_prefixes')
|
55
|
+
)
|
45
56
|
refresh_seconds = mrsm.get_config('system', 'cli', 'refresh_seconds')
|
46
57
|
sysargs_str = sysargs if isinstance(sysargs, str) else shlex.join(sysargs or [])
|
58
|
+
debug = ' --debug' in sysargs_str
|
59
|
+
_sysargs = shlex.split(sysargs_str)
|
60
|
+
_sysargs, _pipeline_args = split_pipeline_sysargs(_sysargs)
|
61
|
+
_chained_sysargs = split_chained_sysargs(_sysargs)
|
62
|
+
_action_functions = {
|
63
|
+
_action_func.__name__: _action_func
|
64
|
+
for _step_sysargs in _chained_sysargs
|
65
|
+
if (_action_func := get_action(_step_sysargs))
|
66
|
+
}
|
67
|
+
for action_name, enabled in _actions_daemon_enabled.items():
|
68
|
+
if action_name not in _action_functions:
|
69
|
+
continue
|
70
|
+
if enabled:
|
71
|
+
continue
|
72
|
+
found_disabled_action = True
|
73
|
+
break
|
47
74
|
|
48
75
|
for prefix in allowed_prefixes:
|
49
76
|
if sysargs_str.startswith(prefix) or prefix == '*':
|
@@ -55,7 +82,7 @@ def entry_with_daemon(
|
|
55
82
|
found_unacceptable_prefix = True
|
56
83
|
break
|
57
84
|
|
58
|
-
if not found_acceptable_prefix or found_unacceptable_prefix:
|
85
|
+
if not found_acceptable_prefix or found_unacceptable_prefix or found_disabled_action:
|
59
86
|
daemon_is_ready = False
|
60
87
|
|
61
88
|
try:
|
@@ -87,6 +114,8 @@ def entry_with_daemon(
|
|
87
114
|
time.sleep(refresh_seconds)
|
88
115
|
|
89
116
|
if not daemon_is_ready or worker is None:
|
117
|
+
if debug:
|
118
|
+
print("Revert to entry without daemon.")
|
90
119
|
return entry_without_daemon(sysargs, _patch_args=_patch_args)
|
91
120
|
|
92
121
|
session_id = _session_id or get_cli_session_id()
|
@@ -100,6 +129,9 @@ def entry_with_daemon(
|
|
100
129
|
},
|
101
130
|
**dict(os.environ),
|
102
131
|
}
|
132
|
+
for key in get_possible_keys():
|
133
|
+
_ = mrsm.get_config(key)
|
134
|
+
config = mrsm.get_config()
|
103
135
|
|
104
136
|
worker.write_input_data({
|
105
137
|
'session_id': session_id,
|
@@ -107,6 +139,7 @@ def entry_with_daemon(
|
|
107
139
|
'sysargs': sysargs,
|
108
140
|
'patch_args': _patch_args,
|
109
141
|
'env': env,
|
142
|
+
'config': config,
|
110
143
|
})
|
111
144
|
|
112
145
|
accepted = False
|
@@ -121,6 +154,8 @@ def entry_with_daemon(
|
|
121
154
|
|
122
155
|
time.sleep(refresh_seconds)
|
123
156
|
|
157
|
+
worker.start_cli_logs_refresh_thread()
|
158
|
+
|
124
159
|
try:
|
125
160
|
log = worker.job.daemon.rotating_log
|
126
161
|
worker.job.monitor_logs(
|
@@ -178,6 +213,7 @@ def entry_with_daemon(
|
|
178
213
|
if not exit_success:
|
179
214
|
print(exit_data['traceback'])
|
180
215
|
|
216
|
+
worker.stop_cli_logs_refresh_thread()
|
181
217
|
worker.write_input_data({'increment': True})
|
182
218
|
success = (worker_data or {}).get('success', False)
|
183
219
|
message = (worker_data or {}).get('message', "Failed to retrieve message from CLI worker.")
|
@@ -7,15 +7,15 @@ Define utilities for managing the workers jobs.
|
|
7
7
|
|
8
8
|
import os
|
9
9
|
import pathlib
|
10
|
-
import time
|
11
10
|
import json
|
12
11
|
import asyncio
|
12
|
+
import time
|
13
13
|
from typing import List, Dict, Any, Union, TextIO
|
14
14
|
|
15
15
|
import meerschaum as mrsm
|
16
|
-
from meerschaum.utils.daemon import StdinFile, RotatingFile
|
17
16
|
from meerschaum.utils.warnings import warn
|
18
17
|
from meerschaum.jobs import Job
|
18
|
+
from meerschaum.utils.threading import Thread
|
19
19
|
from meerschaum._internal.static import STATIC_CONFIG
|
20
20
|
|
21
21
|
STOP_TOKEN: str = STATIC_CONFIG['jobs']['stop_token']
|
@@ -57,6 +57,7 @@ class ActionWorker:
|
|
57
57
|
if refresh_seconds is not None
|
58
58
|
else mrsm.get_config('system', 'cli', 'refresh_seconds')
|
59
59
|
)
|
60
|
+
self.refresh_logs_stop_event = asyncio.Event()
|
60
61
|
|
61
62
|
@property
|
62
63
|
def input_file_path(self) -> pathlib.Path:
|
@@ -173,7 +174,7 @@ class ActionWorker:
|
|
173
174
|
except Exception as e:
|
174
175
|
warn(f"Failed to release lock for {self}:\n{e}")
|
175
176
|
|
176
|
-
def send_signal(self, signalnum
|
177
|
+
def send_signal(self, signalnum):
|
177
178
|
"""
|
178
179
|
Send a signal to the running job.
|
179
180
|
"""
|
@@ -292,9 +293,8 @@ class ActionWorker:
|
|
292
293
|
Run the worker's process loop.
|
293
294
|
"""
|
294
295
|
from meerschaum._internal.entry import entry
|
295
|
-
from meerschaum.utils.misc import set_env
|
296
296
|
from meerschaum.config import replace_config
|
297
|
-
from meerschaum.config.
|
297
|
+
from meerschaum.config.environment import replace_env
|
298
298
|
|
299
299
|
self.create_fifos()
|
300
300
|
|
@@ -318,16 +318,15 @@ class ActionWorker:
|
|
318
318
|
action_id = input_data.get('action_id', None)
|
319
319
|
patch_args = input_data.get('patch_args', None)
|
320
320
|
env = input_data.get('env', {})
|
321
|
+
config = input_data.get('config', {})
|
321
322
|
self.write_output_data({
|
322
323
|
'state': 'accepted',
|
323
324
|
'session_id': session_id,
|
324
325
|
'action_id': action_id,
|
325
326
|
})
|
326
327
|
|
327
|
-
with
|
328
|
-
with
|
329
|
-
apply_environment_patches(env=env)
|
330
|
-
apply_environment_uris(env=env)
|
328
|
+
with replace_config(config):
|
329
|
+
with replace_env(env):
|
331
330
|
action_success, action_msg = entry(
|
332
331
|
sysargs,
|
333
332
|
_use_cli_daemon=False,
|
@@ -373,6 +372,35 @@ class ActionWorker:
|
|
373
372
|
|
374
373
|
return True, "Success"
|
375
374
|
|
375
|
+
def touch_cli_logs_loop(self):
|
376
|
+
"""
|
377
|
+
Touch the CLI daemon's logs to refresh the logs monitoring.
|
378
|
+
"""
|
379
|
+
while not self.refresh_logs_stop_event.is_set():
|
380
|
+
self.job.daemon.rotating_log.touch()
|
381
|
+
time.sleep(self.refresh_seconds)
|
382
|
+
|
383
|
+
def start_cli_logs_refresh_thread(self):
|
384
|
+
"""
|
385
|
+
Spin up a daemon thread to refresh the CLI's logs.
|
386
|
+
"""
|
387
|
+
self._logs_refresh_thread = Thread(
|
388
|
+
target=self.touch_cli_logs_loop,
|
389
|
+
daemon=True,
|
390
|
+
)
|
391
|
+
self._logs_refresh_thread.start()
|
392
|
+
|
393
|
+
def stop_cli_logs_refresh_thread(self):
|
394
|
+
"""
|
395
|
+
Stop the logs refresh thread.
|
396
|
+
"""
|
397
|
+
self.refresh_logs_stop_event.set()
|
398
|
+
thread = self.__dict__.pop('_logs_refresh_thread', None)
|
399
|
+
if thread is None:
|
400
|
+
return
|
401
|
+
|
402
|
+
thread.join()
|
403
|
+
|
376
404
|
def __repr__(self) -> str:
|
377
405
|
return self.__str__()
|
378
406
|
|
@@ -65,7 +65,7 @@ def entry(
|
|
65
65
|
sysargs_list = shlex.split(sysargs) if isinstance(sysargs, str) else sysargs
|
66
66
|
if (
|
67
67
|
not _use_cli_daemon
|
68
|
-
or not sysargs
|
68
|
+
or (not sysargs or (sysargs[0] and sysargs[0].startswith('-')))
|
69
69
|
or '--no-daemon' in sysargs_list
|
70
70
|
or '--daemon' in sysargs_list
|
71
71
|
or '-d' in sysargs_list
|
@@ -357,7 +357,7 @@ def _do_action_wrapper(
|
|
357
357
|
try:
|
358
358
|
result = action_function(**filter_keywords(action_function, **kw))
|
359
359
|
except Exception as e:
|
360
|
-
if kw.get('debug',
|
360
|
+
if kw.get('debug', True):
|
361
361
|
import traceback
|
362
362
|
traceback.print_exception(type(e), e, e.__traceback__)
|
363
363
|
result = False, (
|
@@ -82,6 +82,7 @@ ESCAPED_AND_KEY: str = STATIC_CONFIG['system']['arguments']['escaped_and_key']
|
|
82
82
|
PIPELINE_KEY: str = STATIC_CONFIG['system']['arguments']['pipeline_key']
|
83
83
|
ESCAPED_PIPELINE_KEY: str = STATIC_CONFIG['system']['arguments']['escaped_pipeline_key']
|
84
84
|
|
85
|
+
|
85
86
|
def _insert_shell_actions(
|
86
87
|
_shell: Optional['Shell'] = None,
|
87
88
|
actions: Optional[Dict[str, Callable[[Any], SuccessTuple]]] = None,
|
@@ -100,6 +101,10 @@ def _insert_shell_actions(
|
|
100
101
|
_shell_class = _shell if _shell is not None else shell_pkg.Shell
|
101
102
|
|
102
103
|
for a, f in actions.items():
|
104
|
+
existing_method = getattr(_shell_class, 'do_' + a, None)
|
105
|
+
if existing_method == f:
|
106
|
+
continue
|
107
|
+
|
103
108
|
add_method_to_class(
|
104
109
|
func = f,
|
105
110
|
class_def = _shell_class,
|
@@ -114,6 +119,35 @@ def _insert_shell_actions(
|
|
114
119
|
setattr(_shell_class, 'complete_' + a, completer)
|
115
120
|
|
116
121
|
|
122
|
+
def _remove_shell_actions(
|
123
|
+
_shell: Optional['Shell'] = None,
|
124
|
+
actions: Optional[Dict[str, Callable[[Any], SuccessTuple]]] = None,
|
125
|
+
) -> None:
|
126
|
+
"""
|
127
|
+
Remove the actions added to the shell.
|
128
|
+
"""
|
129
|
+
import meerschaum._internal.shell as shell_pkg
|
130
|
+
if actions is None:
|
131
|
+
from meerschaum.actions import actions as _actions
|
132
|
+
actions = _actions
|
133
|
+
|
134
|
+
_shell_class = _shell if _shell is not None else shell_pkg.Shell
|
135
|
+
|
136
|
+
for a, f in actions.items():
|
137
|
+
try:
|
138
|
+
delattr(_shell_class, 'do_' + a)
|
139
|
+
except AttributeError:
|
140
|
+
pass
|
141
|
+
|
142
|
+
if a in reserved_completers:
|
143
|
+
continue
|
144
|
+
|
145
|
+
try:
|
146
|
+
delattr(_shell_class, 'complete_' + a)
|
147
|
+
except AttributeError:
|
148
|
+
pass
|
149
|
+
|
150
|
+
|
117
151
|
def _completer_wrapper(
|
118
152
|
target: Callable[[Any], List[str]]
|
119
153
|
) -> Callable[['mrsm._internal.shell.Shell', str, str, int, int], Any]:
|
@@ -357,7 +391,7 @@ class Shell(cmd.Cmd):
|
|
357
391
|
shell_attrs['instance'] = instance
|
358
392
|
shell_attrs['instance_keys'] = remove_ansi(str(instance))
|
359
393
|
if shell_attrs.get('repo_keys', None) is None:
|
360
|
-
shell_attrs['repo_keys'] = get_config('meerschaum', '
|
394
|
+
shell_attrs['repo_keys'] = get_config('meerschaum', 'repository', patch=patch)
|
361
395
|
if shell_attrs.get('executor_keys', None) is None:
|
362
396
|
shell_attrs['executor_keys'] = get_executor_keys_from_context()
|
363
397
|
|
@@ -622,7 +656,7 @@ class Shell(cmd.Cmd):
|
|
622
656
|
if key == 'mrsm_instance':
|
623
657
|
default_value = get_config('meerschaum', 'instance')
|
624
658
|
elif key == 'repository':
|
625
|
-
default_value = get_config('meerschaum', '
|
659
|
+
default_value = get_config('meerschaum', 'repository')
|
626
660
|
elif key == 'executor_keys':
|
627
661
|
default_value = get_executor_keys_from_context()
|
628
662
|
else:
|
@@ -871,7 +905,7 @@ class Shell(cmd.Cmd):
|
|
871
905
|
"""
|
872
906
|
Temporarily set a default Meerschaum repository for the duration of the shell.
|
873
907
|
The default repository (mrsm.io) is loaded from the Meerschaum configuraton file
|
874
|
-
(at keys 'meerschaum
|
908
|
+
(at keys 'meerschaum.repository').
|
875
909
|
|
876
910
|
You can change the default repository with `edit config`.
|
877
911
|
|
@@ -902,7 +936,7 @@ class Shell(cmd.Cmd):
|
|
902
936
|
except (IndexError, AttributeError):
|
903
937
|
repo_keys = ''
|
904
938
|
if repo_keys == '':
|
905
|
-
repo_keys = get_config('meerschaum', '
|
939
|
+
repo_keys = get_config('meerschaum', 'repository', patch=True)
|
906
940
|
|
907
941
|
conn = parse_repo_keys(repo_keys, debug=debug)
|
908
942
|
if conn is None or not conn:
|
@@ -985,7 +1019,7 @@ class Shell(cmd.Cmd):
|
|
985
1019
|
show pipes -h
|
986
1020
|
```
|
987
1021
|
"""
|
988
|
-
from meerschaum.actions import
|
1022
|
+
from meerschaum.actions import get_action
|
989
1023
|
from meerschaum._internal.arguments._parser import parse_help
|
990
1024
|
from meerschaum._internal.arguments._parse_arguments import parse_line
|
991
1025
|
import textwrap
|
@@ -994,12 +1028,15 @@ class Shell(cmd.Cmd):
|
|
994
1028
|
del args['action']
|
995
1029
|
shell_attrs['_actions']['show'](['actions'], **args)
|
996
1030
|
return ""
|
1031
|
+
|
997
1032
|
if args['action'][0] not in shell_attrs['_actions']:
|
1033
|
+
action_func = get_action(args['action'])
|
998
1034
|
try:
|
999
|
-
print(textwrap.dedent(
|
1035
|
+
print(textwrap.dedent(action_func.__doc__))
|
1000
1036
|
except Exception:
|
1001
|
-
print(f"No help on '{args['action']
|
1037
|
+
print(f"No help on '{shlex.join(args['action'])}'.")
|
1002
1038
|
return ""
|
1039
|
+
|
1003
1040
|
parse_help(args)
|
1004
1041
|
return ""
|
1005
1042
|
|
@@ -1101,8 +1138,16 @@ def input_with_sigint(_input, session, shell: Optional[Shell] = None):
|
|
1101
1138
|
return None
|
1102
1139
|
if not shell_attrs['_update_bottom_toolbar'] and platform.system() == 'Windows':
|
1103
1140
|
return shell_attrs['_old_bottom_toolbar']
|
1104
|
-
|
1105
|
-
|
1141
|
+
try:
|
1142
|
+
size = os.get_terminal_size()
|
1143
|
+
num_cols, num_lines = size.columns, size.lines
|
1144
|
+
except Exception:
|
1145
|
+
from meerschaum.utils.misc import is_int
|
1146
|
+
num_cols, num_lines = os.environ.get('COLUMNS', 80), os.environ.get('LINES', 120)
|
1147
|
+
if is_int(str(num_cols)):
|
1148
|
+
num_cols = int(num_cols)
|
1149
|
+
if is_int(str(num_lines)):
|
1150
|
+
num_lines = int(num_lines)
|
1106
1151
|
truncation_suffix = (
|
1107
1152
|
'…'
|
1108
1153
|
if UNICODE
|
@@ -8,5 +8,8 @@ Import the Shell class definition
|
|
8
8
|
|
9
9
|
from meerschaum._internal.shell.Shell import Shell
|
10
10
|
from meerschaum._internal.shell.Shell import (
|
11
|
-
default_action_completer,
|
11
|
+
default_action_completer,
|
12
|
+
_completer_wrapper,
|
13
|
+
_insert_shell_actions,
|
14
|
+
_remove_shell_actions,
|
12
15
|
)
|
@@ -10,11 +10,10 @@ from __future__ import annotations
|
|
10
10
|
from typing import Any
|
11
11
|
|
12
12
|
import meerschaum as mrsm
|
13
|
-
from meerschaum.utils.warnings import warn
|
14
13
|
tornado_web = mrsm.attempt_import('tornado.web', lazy=False)
|
15
14
|
terminado = mrsm.attempt_import('terminado', lazy=False)
|
16
15
|
|
17
|
-
tmux_suffix = mrsm.get_config('
|
16
|
+
tmux_suffix = mrsm.get_config('api', 'webterm', 'tmux', 'session_suffix')
|
18
17
|
|
19
18
|
|
20
19
|
class TermPageHandler(tornado_web.RequestHandler):
|
@@ -8,6 +8,9 @@ Build the web console virtual terminal using Tornado and xterm.js.
|
|
8
8
|
|
9
9
|
from __future__ import annotations
|
10
10
|
|
11
|
+
import os
|
12
|
+
import json
|
13
|
+
import pathlib
|
11
14
|
from typing import Optional, Tuple
|
12
15
|
|
13
16
|
import meerschaum as mrsm
|
@@ -16,7 +19,6 @@ from meerschaum._internal.term.TermPageHandler import TermPageHandler, CustomTer
|
|
16
19
|
from meerschaum.config._paths import API_TEMPLATES_PATH, API_STATIC_PATH
|
17
20
|
from meerschaum.utils.venv import venv_executable
|
18
21
|
from meerschaum.utils.misc import is_tmux_available
|
19
|
-
from meerschaum.utils.daemon._names import get_new_daemon_name
|
20
22
|
|
21
23
|
tornado, tornado_ioloop, terminado = attempt_import(
|
22
24
|
'tornado', 'tornado.ioloop', 'terminado', lazy=False,
|
@@ -25,6 +27,8 @@ tornado, tornado_ioloop, terminado = attempt_import(
|
|
25
27
|
|
26
28
|
def get_webterm_app_and_manager(
|
27
29
|
instance_keys: Optional[str] = None,
|
30
|
+
port: Optional[int] = None,
|
31
|
+
env_path: Optional[pathlib.Path] = None,
|
28
32
|
) -> Tuple[
|
29
33
|
tornado.web.Application,
|
30
34
|
terminado.UniqueTermManager,
|
@@ -36,19 +40,49 @@ def get_webterm_app_and_manager(
|
|
36
40
|
-------
|
37
41
|
A tuple of the Tornado web application and term manager.
|
38
42
|
"""
|
43
|
+
from meerschaum.config.environment import get_env_vars
|
44
|
+
from meerschaum._internal.static import STATIC_CONFIG
|
45
|
+
if env_path is None:
|
46
|
+
from meerschaum.config.paths import WEBTERM_INTERNAL_RESOURCES_PATH
|
47
|
+
env_path = WEBTERM_INTERNAL_RESOURCES_PATH / (str(port) + '.json')
|
48
|
+
|
49
|
+
env_vars = get_env_vars()
|
50
|
+
env_dict = {
|
51
|
+
env_var: os.environ[env_var]
|
52
|
+
for env_var in env_vars
|
53
|
+
if env_var not in (
|
54
|
+
STATIC_CONFIG['environment']['systemd_log_path'],
|
55
|
+
STATIC_CONFIG['environment']['systemd_result_path'],
|
56
|
+
STATIC_CONFIG['environment']['systemd_delete_job'],
|
57
|
+
STATIC_CONFIG['environment']['systemd_stdin_path'],
|
58
|
+
STATIC_CONFIG['environment']['daemon_id'],
|
59
|
+
)
|
60
|
+
}
|
61
|
+
with open(env_path, 'w+', encoding='utf-8') as f:
|
62
|
+
json.dump(env_dict, f)
|
63
|
+
|
39
64
|
shell_kwargs_str = f"mrsm_instance='{instance_keys}'" if instance_keys else ""
|
40
65
|
commands = [
|
41
66
|
venv_executable(None),
|
42
67
|
'-c',
|
43
|
-
"import os
|
44
|
-
"
|
68
|
+
"import os\n"
|
69
|
+
"import pathlib\n"
|
70
|
+
"import json\n"
|
71
|
+
f"env_path = pathlib.Path('{env_path.as_posix()}')\n"
|
72
|
+
"with open(env_path, 'r', encoding='utf-8') as f:\n"
|
73
|
+
" env_dict = json.load(f)\n"
|
74
|
+
"os.environ.update(env_dict)\n"
|
75
|
+
"_ = os.environ.pop('COLUMNS', None)\n"
|
76
|
+
"_ = os.environ.pop('LINES', None)\n"
|
77
|
+
"from meerschaum._internal.entry import get_shell\n"
|
45
78
|
f"get_shell({shell_kwargs_str}).cmdloop()"
|
46
79
|
]
|
47
|
-
webterm_cf = mrsm.get_config('
|
80
|
+
webterm_cf = mrsm.get_config('api', 'webterm')
|
48
81
|
if webterm_cf.get('tmux', {}).get('enabled', False) and is_tmux_available():
|
49
|
-
commands = ['tmux', 'new-session', '-A', '-s', 'MRSM_SESSION'] + commands
|
82
|
+
commands = ['tmux', 'new-session', '-A', '-s', f'MRSM_SESSION--{port}'] + commands
|
50
83
|
|
51
|
-
term_manager = terminado.NamedTermManager(shell_command=commands)
|
84
|
+
term_manager = terminado.NamedTermManager(shell_command=commands, extra_env=env_dict)
|
85
|
+
term_manager._port = port
|
52
86
|
handlers = [
|
53
87
|
(
|
54
88
|
r"/websocket/(.+)/?",
|
@@ -6,13 +6,14 @@
|
|
6
6
|
Utility functions regarding the webterm.
|
7
7
|
"""
|
8
8
|
|
9
|
+
from typing import List, Optional
|
10
|
+
|
9
11
|
import meerschaum as mrsm
|
10
|
-
from meerschaum.utils.typing import List
|
11
12
|
|
12
13
|
|
13
14
|
def is_webterm_running(
|
14
|
-
host: str,
|
15
|
-
port: int,
|
15
|
+
host: Optional[str] = None,
|
16
|
+
port: Optional[int] = None,
|
16
17
|
protocol: str = 'http',
|
17
18
|
session_id: str = 'mrsm',
|
18
19
|
) -> int:
|
@@ -20,10 +21,12 @@ def is_webterm_running(
|
|
20
21
|
Determine whether the webterm service is running on a given host and port.
|
21
22
|
"""
|
22
23
|
requests = mrsm.attempt_import('requests', lazy=False)
|
24
|
+
host = host or mrsm.get_config('api', 'webterm', 'host')
|
25
|
+
port = port or mrsm.get_config('api', 'webterm', 'port')
|
23
26
|
url = f'{protocol}://{host}:{port}/webterm/{session_id}'
|
24
27
|
try:
|
25
28
|
r = requests.get(url, timeout=3)
|
26
|
-
except Exception
|
29
|
+
except Exception:
|
27
30
|
return False
|
28
31
|
if not r:
|
29
32
|
return False
|
@@ -39,22 +42,44 @@ def kill_tmux_session(session: str) -> bool:
|
|
39
42
|
return run_process(command, capture_output=True) == 0
|
40
43
|
|
41
44
|
|
42
|
-
def get_mrsm_tmux_sessions() -> List[str]:
|
45
|
+
def get_mrsm_tmux_sessions(port: Optional[int] = None) -> List[str]:
|
43
46
|
"""
|
44
47
|
Return a list of tmux sessions created by Meerschaum.
|
45
48
|
"""
|
46
49
|
from meerschaum.utils.process import run_process
|
47
|
-
tmux_suffix = mrsm.get_config('
|
50
|
+
tmux_suffix = mrsm.get_config('api', 'webterm', 'tmux', 'session_suffix')
|
48
51
|
command = ['tmux', 'ls']
|
49
52
|
proc = run_process(command, capture_output=True, as_proc=True)
|
50
53
|
if proc.returncode != 0:
|
51
54
|
return []
|
55
|
+
|
56
|
+
port = port or mrsm.get_config('api', 'webterm', 'port')
|
57
|
+
|
52
58
|
sessions = [
|
53
59
|
line.split(':', maxsplit=1)[0]
|
54
60
|
for line in proc.stdout.read().decode('utf-8').split('\n')
|
55
61
|
]
|
62
|
+
mrsm_sessions_ports = []
|
63
|
+
for session in sessions:
|
64
|
+
if '--' not in session:
|
65
|
+
continue
|
66
|
+
|
67
|
+
parts = session.split('--', maxsplit=1)
|
68
|
+
if len(parts) != 2:
|
69
|
+
continue
|
70
|
+
|
71
|
+
if not parts[0].endswith(tmux_suffix):
|
72
|
+
continue
|
73
|
+
|
74
|
+
try:
|
75
|
+
session_port = int(parts[1])
|
76
|
+
except Exception:
|
77
|
+
continue
|
78
|
+
|
79
|
+
mrsm_sessions_ports.append((session, session_port))
|
80
|
+
|
56
81
|
return [
|
57
82
|
session
|
58
|
-
for session in
|
59
|
-
if
|
83
|
+
for session, session_port in mrsm_sessions_ports
|
84
|
+
if session_port == port
|
60
85
|
]
|
@@ -9,7 +9,6 @@ Default actions available to the mrsm CLI.
|
|
9
9
|
from __future__ import annotations
|
10
10
|
from meerschaum.utils.typing import Callable, Any, Optional, Union, List, Dict, SuccessTuple
|
11
11
|
from meerschaum.utils.packages import get_modules_from_package
|
12
|
-
_custom_actions = []
|
13
12
|
|
14
13
|
__all__ = (
|
15
14
|
'get_action',
|
@@ -307,6 +306,8 @@ __all__ = ['actions', 'get_subactions', 'get_action', 'get_main_action_name', 'g
|
|
307
306
|
### functions that do not begin with '_' from all submodules.
|
308
307
|
from inspect import getmembers, isfunction
|
309
308
|
actions = {}
|
309
|
+
_custom_actions_plugins: Dict[str, str] = {}
|
310
|
+
_plugins_actions: Dict[str, List[str]] = {}
|
310
311
|
|
311
312
|
for module in modules:
|
312
313
|
### A couple important things happening here:
|
@@ -362,4 +363,5 @@ __pdoc__ = {
|
|
362
363
|
}
|
363
364
|
for a in actions:
|
364
365
|
__pdoc__[a] = False
|
365
|
-
|
366
|
+
|
367
|
+
meerschaum.plugins.load_plugins(skip_if_loaded=True)
|