meerschaum 2.3.4__tar.gz → 2.3.5__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-2.3.4/meerschaum.egg-info → meerschaum-2.3.5}/PKG-INFO +1 -1
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/arguments/__init__.py +2 -5
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/arguments/_parse_arguments.py +117 -9
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/docs/index.py +1 -1
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/entry.py +33 -15
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/api.py +16 -16
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/python.py +4 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/start.py +9 -5
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/_events.py +11 -7
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_actions.py +2 -90
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_jobs.py +39 -19
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_version.py +1 -1
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/static/__init__.py +2 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_actions.py +22 -36
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_jobs.py +1 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/jobs/_Job.py +31 -8
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/jobs/systemd.py +21 -9
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/prompt.py +1 -1
- {meerschaum-2.3.4 → meerschaum-2.3.5/meerschaum.egg-info}/PKG-INFO +1 -1
- {meerschaum-2.3.4 → meerschaum-2.3.5}/LICENSE +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/NOTICE +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/README.md +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/__main__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/arguments/_parser.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/docs/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/app/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/app/_windows.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/app/actions.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/app/pipes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/Shell.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/resources/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/updates.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/term/TermPageHandler.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/term/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/term/tools.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/attach.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/bootstrap.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/clear.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/copy.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/deduplicate.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/delete.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/drop.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/edit.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/install.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/login.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/os.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/pause.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/register.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/reload.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/restart.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/setup.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/sh.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/show.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/sql.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/stack.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/stop.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/sync.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/tag.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/uninstall.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/upgrade.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/verify.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/_chain.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/_oauth2.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/_websockets.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/actions.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/ansi_up.js +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/favicon.ico +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/custom.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/jobs.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/login.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/plugins.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/register.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/components.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/connectors.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/graphs.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/jobs.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/keys.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/dashboard.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/error.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/login.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/plugins.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/register.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pipes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/plugins.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/sync.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/users.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/websockets.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/webterm.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/_interfaces.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/_locations.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/_metrics.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/_pipes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/dash.css +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/styles.css +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/xterm.css +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/ico/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/ico/logo.ico +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/action_button.js +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/main.js +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/terminado.js +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/xterm.js +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/png/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/index.html +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/old_index.html +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/secret.html +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/termpage.html +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_connectors.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_index.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_login.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_misc.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_pipes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_plugins.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_users.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_version.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_webterm.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/tables/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_dash.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_default.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_edit.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_environment.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_formatting.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_jobs.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_patch.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_paths.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_preprocess.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_read_config.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_shell.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_sync.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/paths.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/resources/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/grafana/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/resources/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/Connector.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/APIConnector.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_fetch.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_login.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_misc.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_pipes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_plugins.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_request.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_uri.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_users.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/parse.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/plugin/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/poll.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/SQLConnector.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_cli.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_create_engine.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_fetch.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_instance.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_pipes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_plugins.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_sql.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_uri.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_users.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/tables/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/tables/types.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/tools.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_attributes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_bootstrap.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_clear.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_data.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_deduplicate.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_delete.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_drop.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_dtypes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_edit.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_fetch.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_register.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_show.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_sync.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_verify.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Plugin/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/User/_User.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/User/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/jobs/_Executor.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/jobs/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/plugins/_Plugin.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/plugins/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/plugins/bootstrap.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/_get_pipes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/Daemon.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/RotatingFile.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/StdinFile.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/_names.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/dataframe.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/debug.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/dtypes/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/dtypes/sql.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/_jobs.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/_pipes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/_pprint.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/_shell.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/interactive.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/misc.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/networking.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/packages/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/packages/_packages.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/packages/lazy_loader.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/pool.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/process.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/schedule.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/sql.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/threading.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/typing.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/venv/_Venv.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/venv/__init__.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/warnings.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/yaml.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/SOURCES.txt +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/dependency_links.txt +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/entry_points.txt +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/requires.txt +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/top_level.txt +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/zip-safe +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/setup.cfg +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/setup.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_actions.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_arguments.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_deduplicate.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_jobs.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_pipes_dtypes.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_sql.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_sync.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_users.py +0 -0
- {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_verify.py +0 -0
@@ -9,11 +9,8 @@ This package includes argument parsing utilities.
|
|
9
9
|
from meerschaum._internal.arguments._parse_arguments import (
|
10
10
|
parse_arguments, parse_line, remove_leading_action,
|
11
11
|
parse_dict_to_sysargs, split_chained_sysargs, split_pipeline_sysargs,
|
12
|
+
sysargs_has_api_executor_keys, get_pipeline_sysargs,
|
13
|
+
compress_pipeline_sysargs, remove_api_executor_keys,
|
12
14
|
)
|
13
15
|
from meerschaum._internal.arguments._parser import parser
|
14
16
|
from meerschaum.plugins import add_plugin_argument
|
15
|
-
|
16
|
-
__all__ = [
|
17
|
-
'parser', 'parse_arguments', 'parse_line', 'add_plugin_argument', 'parse_dict_to_sysargs',
|
18
|
-
'remove_leading_action',
|
19
|
-
]
|
@@ -283,18 +283,29 @@ def parse_dict_to_sysargs(
|
|
283
283
|
### Add list flags
|
284
284
|
if isinstance(args_dict[a], (list, tuple)):
|
285
285
|
if len(args_dict[a]) > 0:
|
286
|
-
|
287
|
-
[
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
286
|
+
if a == 'sub_args' and args_dict[a] != ['']:
|
287
|
+
print(f"{args_dict[a]=}")
|
288
|
+
sysargs.extend(
|
289
|
+
[
|
290
|
+
'-A',
|
291
|
+
shlex.join([
|
292
|
+
str(item) for item in args_dict[a]
|
293
|
+
]),
|
294
|
+
]
|
295
|
+
)
|
296
|
+
else:
|
297
|
+
sysargs.extend(
|
298
|
+
[t[0]]
|
299
|
+
+ [
|
300
|
+
str(item)
|
301
|
+
for item in args_dict[a]
|
302
|
+
]
|
303
|
+
)
|
293
304
|
|
294
305
|
### Add dict flags
|
295
306
|
elif isinstance(args_dict[a], dict):
|
296
307
|
if len(args_dict[a]) > 0:
|
297
|
-
sysargs += [t[0], json.dumps(args_dict[a])]
|
308
|
+
sysargs += [t[0], json.dumps(args_dict[a], separators=(',', ':'))]
|
298
309
|
|
299
310
|
### Account for None and other values
|
300
311
|
elif (args_dict[a] is not None) or (args_dict[a] is None and a in allow_none_args):
|
@@ -403,4 +414,101 @@ def load_plugin_args() -> None:
|
|
403
414
|
to_import.append(plugin.name)
|
404
415
|
if not to_import:
|
405
416
|
return
|
406
|
-
import_plugins(*to_import)
|
417
|
+
import_plugins(*to_import)
|
418
|
+
|
419
|
+
|
420
|
+
def sysargs_has_api_executor_keys(sysargs: List[str]) -> bool:
|
421
|
+
"""
|
422
|
+
Check whether a `sysargs` list contains an `api` executor.
|
423
|
+
"""
|
424
|
+
if '-e' not in sysargs and '--executor-keys' not in sysargs:
|
425
|
+
return False
|
426
|
+
|
427
|
+
for i, arg in enumerate(sysargs):
|
428
|
+
if arg not in ('-e', '--executor-keys'):
|
429
|
+
continue
|
430
|
+
|
431
|
+
executor_keys_ix = i + 1
|
432
|
+
if len(sysargs) <= executor_keys_ix:
|
433
|
+
return False
|
434
|
+
|
435
|
+
executor_keys = sysargs[executor_keys_ix]
|
436
|
+
if executor_keys.startswith('api:'):
|
437
|
+
return True
|
438
|
+
|
439
|
+
return False
|
440
|
+
|
441
|
+
|
442
|
+
def remove_api_executor_keys(sysargs: List[str]) -> List[str]:
|
443
|
+
"""
|
444
|
+
Remove any api executor keys from `sysargs`.
|
445
|
+
"""
|
446
|
+
from meerschaum.utils.misc import flatten_list
|
447
|
+
|
448
|
+
if not sysargs_has_api_executor_keys(sysargs):
|
449
|
+
return sysargs
|
450
|
+
|
451
|
+
skip_indices = set(flatten_list(
|
452
|
+
[
|
453
|
+
[i, i+1]
|
454
|
+
for i, arg in enumerate(sysargs)
|
455
|
+
if arg in ('-e', '--executor-keys')
|
456
|
+
]
|
457
|
+
))
|
458
|
+
|
459
|
+
return [
|
460
|
+
arg
|
461
|
+
for i, arg in enumerate(sysargs)
|
462
|
+
if i not in skip_indices
|
463
|
+
]
|
464
|
+
|
465
|
+
|
466
|
+
def get_pipeline_sysargs(
|
467
|
+
sysargs: List[str],
|
468
|
+
pipeline_args: List[str],
|
469
|
+
_patch_args: Optional[Dict[str, Any]] = None,
|
470
|
+
) -> List[str]:
|
471
|
+
"""
|
472
|
+
Parse `sysargs` and `pipeline_args` into a single `start pipeline` sysargs.
|
473
|
+
"""
|
474
|
+
import shlex
|
475
|
+
start_pipeline_params = {
|
476
|
+
'sub_args_line': shlex.join(sysargs),
|
477
|
+
'patch_args': _patch_args,
|
478
|
+
}
|
479
|
+
return (
|
480
|
+
['start', 'pipeline']
|
481
|
+
+ [str(arg) for arg in pipeline_args]
|
482
|
+
+ ['-P', json.dumps(start_pipeline_params, separators=(',', ':'))]
|
483
|
+
)
|
484
|
+
|
485
|
+
|
486
|
+
def compress_pipeline_sysargs(pipeline_sysargs: List[str]) -> List[str]:
|
487
|
+
"""
|
488
|
+
Given a `start pipeline` sysargs, return a condensed syntax rendition.
|
489
|
+
"""
|
490
|
+
import shlex
|
491
|
+
|
492
|
+
if pipeline_sysargs[:2] != ['start', 'pipeline']:
|
493
|
+
return pipeline_sysargs
|
494
|
+
|
495
|
+
if '-P' not in pipeline_sysargs:
|
496
|
+
return pipeline_sysargs
|
497
|
+
|
498
|
+
params_ix = pipeline_sysargs.index('-P')
|
499
|
+
pipeline_args = pipeline_sysargs[2:params_ix]
|
500
|
+
params_str = pipeline_sysargs[-1]
|
501
|
+
try:
|
502
|
+
start_pipeline_params = json.loads(params_str)
|
503
|
+
except Exception:
|
504
|
+
return pipeline_sysargs
|
505
|
+
|
506
|
+
sub_args_line = start_pipeline_params.get('sub_args_line', None)
|
507
|
+
if not sub_args_line:
|
508
|
+
return pipeline_sysargs
|
509
|
+
|
510
|
+
return (
|
511
|
+
shlex.split(sub_args_line)
|
512
|
+
+ [':']
|
513
|
+
+ pipeline_args
|
514
|
+
)
|
@@ -11,6 +11,8 @@ from __future__ import annotations
|
|
11
11
|
|
12
12
|
import os
|
13
13
|
import sys
|
14
|
+
import pathlib
|
15
|
+
|
14
16
|
from meerschaum.utils.typing import SuccessTuple, List, Optional, Dict, Callable, Any
|
15
17
|
from meerschaum.config.static import STATIC_CONFIG as _STATIC_CONFIG
|
16
18
|
|
@@ -19,8 +21,17 @@ if (_STATIC_CONFIG['environment']['systemd_log_path']) in os.environ:
|
|
19
21
|
from meerschaum.utils.daemon import RotatingFile as _RotatingFile, StdinFile as _StdinFile
|
20
22
|
from meerschaum.config import get_config as _get_config
|
21
23
|
|
22
|
-
_systemd_result_path =
|
23
|
-
|
24
|
+
_systemd_result_path = pathlib.Path(
|
25
|
+
os.environ[_STATIC_CONFIG['environment']['systemd_result_path']]
|
26
|
+
)
|
27
|
+
_systemd_log_path = pathlib.Path(
|
28
|
+
os.environ[_STATIC_CONFIG['environment']['systemd_log_path']]
|
29
|
+
)
|
30
|
+
_systemd_delete_job = (
|
31
|
+
(os.environ.get(_STATIC_CONFIG['environment']['systemd_delete_job'], None) or '0')
|
32
|
+
not in (None, '0', 'false')
|
33
|
+
)
|
34
|
+
_job_name = os.environ[_STATIC_CONFIG['environment']['daemon_id']]
|
24
35
|
_systemd_log = _RotatingFile(
|
25
36
|
_systemd_log_path,
|
26
37
|
write_timestamps=True,
|
@@ -50,6 +61,8 @@ def entry(
|
|
50
61
|
parse_arguments,
|
51
62
|
split_chained_sysargs,
|
52
63
|
split_pipeline_sysargs,
|
64
|
+
sysargs_has_api_executor_keys,
|
65
|
+
get_pipeline_sysargs,
|
53
66
|
)
|
54
67
|
from meerschaum.config.static import STATIC_CONFIG
|
55
68
|
if sysargs is None:
|
@@ -63,22 +76,15 @@ def entry(
|
|
63
76
|
|
64
77
|
has_daemon = '-d' in sysargs or '--daemon' in sysargs
|
65
78
|
has_start_job = sysargs[:2] == ['start', 'job']
|
79
|
+
pipeline_has_api_executor_keys = sysargs_has_api_executor_keys(pipeline_args)
|
80
|
+
|
66
81
|
chained_sysargs = (
|
67
82
|
[sysargs]
|
68
|
-
if has_daemon or has_start_job
|
83
|
+
if has_daemon or has_start_job or pipeline_has_api_executor_keys
|
69
84
|
else split_chained_sysargs(sysargs)
|
70
85
|
)
|
71
86
|
if pipeline_args:
|
72
|
-
chained_sysargs = [
|
73
|
-
['start', 'pipeline']
|
74
|
-
+ [str(arg) for arg in pipeline_args]
|
75
|
-
+ (
|
76
|
-
['--params', json.dumps(_patch_args)]
|
77
|
-
if _patch_args
|
78
|
-
else []
|
79
|
-
)
|
80
|
-
+ ['--sub-args', shlex.join(sysargs)]
|
81
|
-
]
|
87
|
+
chained_sysargs = [get_pipeline_sysargs(sysargs, pipeline_args, _patch_args=_patch_args)]
|
82
88
|
|
83
89
|
results: List[SuccessTuple] = []
|
84
90
|
|
@@ -167,8 +173,20 @@ def entry(
|
|
167
173
|
|
168
174
|
if _systemd_result_path:
|
169
175
|
import json
|
170
|
-
|
171
|
-
|
176
|
+
from meerschaum.utils.warnings import warn
|
177
|
+
import meerschaum as mrsm
|
178
|
+
|
179
|
+
job = mrsm.Job(_job_name, executor_keys='systemd')
|
180
|
+
if job.delete_after_completion:
|
181
|
+
delete_success, delete_msg = job.delete()
|
182
|
+
mrsm.pprint((delete_success, delete_msg))
|
183
|
+
else:
|
184
|
+
try:
|
185
|
+
if _systemd_result_path.parent.exists():
|
186
|
+
with open(_systemd_result_path, 'w+', encoding='utf-8') as f:
|
187
|
+
json.dump((success, msg), f)
|
188
|
+
except Exception as e:
|
189
|
+
warn(f"Failed to write job result:\n{e}")
|
172
190
|
|
173
191
|
return success, msg
|
174
192
|
|
@@ -89,22 +89,22 @@ def api(
|
|
89
89
|
return success, message
|
90
90
|
|
91
91
|
def _api_start(
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
92
|
+
action: Optional[List[str]] = None,
|
93
|
+
host: Optional[str] = None,
|
94
|
+
port: Optional[int] = None,
|
95
|
+
workers: Optional[int] = None,
|
96
|
+
mrsm_instance: Optional[str] = None,
|
97
|
+
no_dash: bool = False,
|
98
|
+
no_auth: bool = False,
|
99
|
+
private: bool = False,
|
100
|
+
secure: bool = False,
|
101
|
+
debug: bool = False,
|
102
|
+
nopretty: bool = False,
|
103
|
+
production: bool = False,
|
104
|
+
keyfile: Optional[str] = None,
|
105
|
+
certfile: Optional[str] = None,
|
106
|
+
**kw: Any
|
107
|
+
) -> SuccessTuple:
|
108
108
|
"""Start the API server.
|
109
109
|
|
110
110
|
Parameters
|
@@ -14,6 +14,7 @@ def python(
|
|
14
14
|
nopretty: bool = False,
|
15
15
|
noask: bool = False,
|
16
16
|
venv: Optional[str] = None,
|
17
|
+
executor_keys: Optional[str] = None,
|
17
18
|
debug: bool = False,
|
18
19
|
**kw: Any
|
19
20
|
) -> SuccessTuple:
|
@@ -53,6 +54,9 @@ def python(
|
|
53
54
|
from meerschaum.utils.packages import run_python_package, attempt_import
|
54
55
|
from meerschaum.utils.process import run_process
|
55
56
|
|
57
|
+
if executor_keys and executor_keys.startswith('api:'):
|
58
|
+
warn("Cannot open a Python REPL remotely, falling back to local...", stack=False)
|
59
|
+
|
56
60
|
if action is None:
|
57
61
|
action = []
|
58
62
|
|
@@ -7,7 +7,7 @@ Start subsystems (API server, logging daemon, etc.).
|
|
7
7
|
"""
|
8
8
|
|
9
9
|
from __future__ import annotations
|
10
|
-
from meerschaum.utils.typing import SuccessTuple, Optional, List, Any, Union
|
10
|
+
from meerschaum.utils.typing import SuccessTuple, Optional, List, Any, Union, Dict
|
11
11
|
|
12
12
|
def start(
|
13
13
|
action: Optional[List[str]] = None,
|
@@ -89,6 +89,7 @@ def _start_jobs(
|
|
89
89
|
name: Optional[str] = None,
|
90
90
|
sysargs: Optional[List[str]] = None,
|
91
91
|
executor_keys: Optional[str] = None,
|
92
|
+
rm: bool = False,
|
92
93
|
debug: bool = False,
|
93
94
|
**kw
|
94
95
|
) -> SuccessTuple:
|
@@ -210,7 +211,7 @@ def _start_jobs(
|
|
210
211
|
|
211
212
|
def _run_new_job(name: Optional[str] = None):
|
212
213
|
name = name or get_new_daemon_name()
|
213
|
-
job = Job(name, sysargs, executor_keys=executor_keys)
|
214
|
+
job = Job(name, sysargs, executor_keys=executor_keys, delete_after_completion=rm)
|
214
215
|
return job.start(debug=debug), name
|
215
216
|
|
216
217
|
def _run_existing_job(name: str):
|
@@ -539,7 +540,6 @@ def _complete_start_connectors(**kw) -> List[str]:
|
|
539
540
|
|
540
541
|
def _start_pipeline(
|
541
542
|
action: Optional[List[str]] = None,
|
542
|
-
sub_args: Optional[List[str]] = None,
|
543
543
|
loop: bool = False,
|
544
544
|
min_seconds: Union[float, int, None] = 1.0,
|
545
545
|
params: Optional[Dict[str, Any]] = None,
|
@@ -569,7 +569,11 @@ def _start_pipeline(
|
|
569
569
|
else 1
|
570
570
|
)
|
571
571
|
|
572
|
-
|
572
|
+
params = params or {}
|
573
|
+
sub_args_line = params.get('sub_args_line', None)
|
574
|
+
patch_args = params.get('patch_args', None)
|
575
|
+
|
576
|
+
if not sub_args_line:
|
573
577
|
return False, "Nothing to do."
|
574
578
|
|
575
579
|
if min_seconds is None:
|
@@ -580,7 +584,7 @@ def _start_pipeline(
|
|
580
584
|
def run_loop():
|
581
585
|
nonlocal ran_n_times, success, msg
|
582
586
|
while True:
|
583
|
-
success, msg = entry(
|
587
|
+
success, msg = entry(sub_args_line, _patch_args=patch_args)
|
584
588
|
ran_n_times += 1
|
585
589
|
|
586
590
|
if not loop and do_n_times == 1:
|
@@ -20,12 +20,14 @@ from meerschaum.connectors.poll import retry_connect
|
|
20
20
|
from meerschaum.utils.warnings import warn
|
21
21
|
from meerschaum._internal.term.tools import is_webterm_running
|
22
22
|
from meerschaum.jobs import (
|
23
|
+
get_jobs,
|
23
24
|
start_check_jobs_thread,
|
24
25
|
stop_check_jobs_thread,
|
25
26
|
get_executor_keys_from_context,
|
26
27
|
)
|
28
|
+
from meerschaum.config.static import STATIC_CONFIG
|
27
29
|
|
28
|
-
|
30
|
+
TEMP_PREFIX: str = STATIC_CONFIG['api']['jobs']['temp_prefix']
|
29
31
|
|
30
32
|
@app.on_event("startup")
|
31
33
|
async def startup():
|
@@ -51,8 +53,7 @@ async def startup():
|
|
51
53
|
await shutdown()
|
52
54
|
os._exit(1)
|
53
55
|
|
54
|
-
|
55
|
-
start_check_jobs_thread()
|
56
|
+
start_check_jobs_thread()
|
56
57
|
|
57
58
|
|
58
59
|
@app.on_event("shutdown")
|
@@ -65,11 +66,14 @@ async def shutdown():
|
|
65
66
|
if get_api_connector().type == 'sql':
|
66
67
|
get_api_connector().engine.dispose()
|
67
68
|
|
68
|
-
|
69
|
-
stop_check_jobs_thread()
|
69
|
+
stop_check_jobs_thread()
|
70
70
|
|
71
|
-
|
72
|
-
|
71
|
+
temp_jobs = {
|
72
|
+
name: job
|
73
|
+
for name, job in get_jobs(include_hidden=True).items()
|
74
|
+
if name.startswith(TEMP_PREFIX)
|
75
|
+
}
|
76
|
+
for job in temp_jobs.values():
|
73
77
|
job.delete()
|
74
78
|
|
75
79
|
### Terminate any running jobs left over.
|
@@ -14,6 +14,7 @@ from functools import partial
|
|
14
14
|
from datetime import datetime, timezone
|
15
15
|
|
16
16
|
from fastapi import WebSocket, WebSocketDisconnect
|
17
|
+
from websockets.exceptions import ConnectionClosedError
|
17
18
|
|
18
19
|
from meerschaum.utils.misc import generate_password
|
19
20
|
from meerschaum.jobs import Job
|
@@ -27,6 +28,7 @@ import meerschaum.core
|
|
27
28
|
from meerschaum.config import get_config
|
28
29
|
from meerschaum._internal.arguments._parse_arguments import parse_dict_to_sysargs, parse_arguments
|
29
30
|
from meerschaum.api.routes._jobs import clean_sysargs
|
31
|
+
from meerschaum.jobs._Job import StopMonitoringLogs
|
30
32
|
|
31
33
|
actions_endpoint = endpoints['actions']
|
32
34
|
|
@@ -65,96 +67,6 @@ def get_actions(
|
|
65
67
|
return list(actions)
|
66
68
|
|
67
69
|
|
68
|
-
async def notify_client(client, content: str):
|
69
|
-
"""
|
70
|
-
Send a line of text to a client.
|
71
|
-
"""
|
72
|
-
try:
|
73
|
-
await client.send_text(content)
|
74
|
-
except WebSocketDisconnect:
|
75
|
-
pass
|
76
|
-
|
77
|
-
_temp_jobs = {}
|
78
|
-
@app.websocket(actions_endpoint + '/ws')
|
79
|
-
async def do_action_websocket(websocket: WebSocket):
|
80
|
-
"""
|
81
|
-
Execute an action and stream the output to the client.
|
82
|
-
"""
|
83
|
-
await websocket.accept()
|
84
|
-
|
85
|
-
stop_event = asyncio.Event()
|
86
|
-
|
87
|
-
async def monitor_logs(job):
|
88
|
-
success, msg = job.start()
|
89
|
-
await job.monitor_logs_async(
|
90
|
-
partial(notify_client, websocket),
|
91
|
-
stop_event=stop_event,
|
92
|
-
stop_on_exit=True,
|
93
|
-
)
|
94
|
-
|
95
|
-
job = None
|
96
|
-
job_name = '.' + generate_password(12)
|
97
|
-
try:
|
98
|
-
token = await websocket.receive_text()
|
99
|
-
user = await manager.get_current_user(token) if not no_auth else None
|
100
|
-
if user is None and not no_auth:
|
101
|
-
raise fastapi.HTTPException(
|
102
|
-
status_code=401,
|
103
|
-
detail="Invalid credentials.",
|
104
|
-
)
|
105
|
-
|
106
|
-
auth_success, auth_msg = (
|
107
|
-
is_user_allowed_to_execute(user)
|
108
|
-
if not no_auth
|
109
|
-
else (True, "Success")
|
110
|
-
)
|
111
|
-
auth_payload = {
|
112
|
-
'is_authenticated': auth_success,
|
113
|
-
'timestamp': datetime.now(timezone.utc).isoformat(),
|
114
|
-
}
|
115
|
-
await websocket.send_json(auth_payload)
|
116
|
-
if not auth_success:
|
117
|
-
await websocket.close()
|
118
|
-
|
119
|
-
sysargs = clean_sysargs(await websocket.receive_json())
|
120
|
-
# kwargs = parse_arguments(sysargs)
|
121
|
-
# _ = kwargs.pop('executor_keys', None)
|
122
|
-
# _ = kwargs.pop('shell', None)
|
123
|
-
# sysargs = parse_dict_to_sysargs(kwargs)
|
124
|
-
|
125
|
-
job = Job(
|
126
|
-
job_name,
|
127
|
-
sysargs,
|
128
|
-
executor_keys='local',
|
129
|
-
_properties={
|
130
|
-
'logs': {
|
131
|
-
'write_timestamps': False,
|
132
|
-
},
|
133
|
-
},
|
134
|
-
)
|
135
|
-
_temp_jobs[job_name] = job
|
136
|
-
monitor_task = asyncio.create_task(monitor_logs(job))
|
137
|
-
await monitor_task
|
138
|
-
try:
|
139
|
-
await websocket.close()
|
140
|
-
except RuntimeError:
|
141
|
-
pass
|
142
|
-
except fastapi.HTTPException:
|
143
|
-
await websocket.send_text("Invalid credentials.")
|
144
|
-
await websocket.close()
|
145
|
-
except WebSocketDisconnect:
|
146
|
-
pass
|
147
|
-
except asyncio.CancelledError:
|
148
|
-
pass
|
149
|
-
except Exception:
|
150
|
-
warn(f"Error in logs websocket:\n{traceback.format_exc()}")
|
151
|
-
finally:
|
152
|
-
if job is not None:
|
153
|
-
job.delete()
|
154
|
-
_ = _temp_jobs.pop(job_name, None)
|
155
|
-
stop_event.set()
|
156
|
-
|
157
|
-
|
158
70
|
@app.post(actions_endpoint + "/{action}", tags=['Actions'])
|
159
71
|
def do_action_legacy(
|
160
72
|
action: str,
|