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.
Files changed (265) hide show
  1. {meerschaum-2.3.4/meerschaum.egg-info → meerschaum-2.3.5}/PKG-INFO +1 -1
  2. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/arguments/__init__.py +2 -5
  3. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/arguments/_parse_arguments.py +117 -9
  4. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/docs/index.py +1 -1
  5. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/entry.py +33 -15
  6. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/api.py +16 -16
  7. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/python.py +4 -0
  8. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/start.py +9 -5
  9. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/_events.py +11 -7
  10. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_actions.py +2 -90
  11. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_jobs.py +39 -19
  12. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_version.py +1 -1
  13. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/static/__init__.py +2 -0
  14. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_actions.py +22 -36
  15. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_jobs.py +1 -0
  16. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/jobs/_Job.py +31 -8
  17. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/jobs/systemd.py +21 -9
  18. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/prompt.py +1 -1
  19. {meerschaum-2.3.4 → meerschaum-2.3.5/meerschaum.egg-info}/PKG-INFO +1 -1
  20. {meerschaum-2.3.4 → meerschaum-2.3.5}/LICENSE +0 -0
  21. {meerschaum-2.3.4 → meerschaum-2.3.5}/NOTICE +0 -0
  22. {meerschaum-2.3.4 → meerschaum-2.3.5}/README.md +0 -0
  23. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/__init__.py +0 -0
  24. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/__main__.py +0 -0
  25. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/__init__.py +0 -0
  26. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/arguments/_parser.py +0 -0
  27. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/docs/__init__.py +0 -0
  28. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/__init__.py +0 -0
  29. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/app/__init__.py +0 -0
  30. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/app/_windows.py +0 -0
  31. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/app/actions.py +0 -0
  32. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/gui/app/pipes.py +0 -0
  33. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/Shell.py +0 -0
  34. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/ShellCompleter.py +0 -0
  35. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/ValidAutoSuggest.py +0 -0
  36. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/__init__.py +0 -0
  37. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/resources/__init__.py +0 -0
  38. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/shell/updates.py +0 -0
  39. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/term/TermPageHandler.py +0 -0
  40. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/term/__init__.py +0 -0
  41. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/_internal/term/tools.py +0 -0
  42. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/__init__.py +0 -0
  43. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/attach.py +0 -0
  44. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/bootstrap.py +0 -0
  45. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/clear.py +0 -0
  46. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/copy.py +0 -0
  47. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/deduplicate.py +0 -0
  48. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/delete.py +0 -0
  49. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/drop.py +0 -0
  50. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/edit.py +0 -0
  51. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/install.py +0 -0
  52. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/login.py +0 -0
  53. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/os.py +0 -0
  54. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/pause.py +0 -0
  55. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/register.py +0 -0
  56. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/reload.py +0 -0
  57. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/restart.py +0 -0
  58. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/setup.py +0 -0
  59. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/sh.py +0 -0
  60. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/show.py +0 -0
  61. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/sql.py +0 -0
  62. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/stack.py +0 -0
  63. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/stop.py +0 -0
  64. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/sync.py +0 -0
  65. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/tag.py +0 -0
  66. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/uninstall.py +0 -0
  67. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/upgrade.py +0 -0
  68. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/actions/verify.py +0 -0
  69. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/__init__.py +0 -0
  70. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/_chain.py +0 -0
  71. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/_oauth2.py +0 -0
  72. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/_websockets.py +0 -0
  73. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/__init__.py +0 -0
  74. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/actions.py +0 -0
  75. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/__init__.py +0 -0
  76. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/ansi_up.js +0 -0
  77. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/banner_1920x320.png +0 -0
  78. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/favicon.ico +0 -0
  79. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/logo_48x48.png +0 -0
  80. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/assets/logo_500x500.png +0 -0
  81. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/__init__.py +0 -0
  82. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/custom.py +0 -0
  83. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/dashboard.py +0 -0
  84. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/jobs.py +0 -0
  85. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/login.py +0 -0
  86. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/plugins.py +0 -0
  87. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/callbacks/register.py +0 -0
  88. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/components.py +0 -0
  89. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/connectors.py +0 -0
  90. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/graphs.py +0 -0
  91. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/jobs.py +0 -0
  92. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/keys.py +0 -0
  93. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/__init__.py +0 -0
  94. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/dashboard.py +0 -0
  95. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/error.py +0 -0
  96. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/login.py +0 -0
  97. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/plugins.py +0 -0
  98. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pages/register.py +0 -0
  99. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/pipes.py +0 -0
  100. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/plugins.py +0 -0
  101. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/sync.py +0 -0
  102. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/users.py +0 -0
  103. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/websockets.py +0 -0
  104. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/dash/webterm.py +0 -0
  105. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/__init__.py +0 -0
  106. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/_interfaces.py +0 -0
  107. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/_locations.py +0 -0
  108. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/_metrics.py +0 -0
  109. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/models/_pipes.py +0 -0
  110. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/__init__.py +0 -0
  111. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/__init__.py +0 -0
  112. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/__init__.py +0 -0
  113. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/bootstrap.min.css +0 -0
  114. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/dash.css +0 -0
  115. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/dbc_dark.css +0 -0
  116. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/styles.css +0 -0
  117. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/css/xterm.css +0 -0
  118. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/ico/__init__.py +0 -0
  119. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/ico/logo.ico +0 -0
  120. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/__init__.py +0 -0
  121. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/action_button.js +0 -0
  122. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/main.js +0 -0
  123. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/terminado.js +0 -0
  124. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/js/xterm.js +0 -0
  125. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/static/png/__init__.py +0 -0
  126. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/__init__.py +0 -0
  127. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/index.html +0 -0
  128. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/old_index.html +0 -0
  129. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/secret.html +0 -0
  130. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/resources/templates/termpage.html +0 -0
  131. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/__init__.py +0 -0
  132. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_connectors.py +0 -0
  133. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_index.py +0 -0
  134. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_login.py +0 -0
  135. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_misc.py +0 -0
  136. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_pipes.py +0 -0
  137. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_plugins.py +0 -0
  138. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_users.py +0 -0
  139. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_version.py +0 -0
  140. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/routes/_webterm.py +0 -0
  141. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/api/tables/__init__.py +0 -0
  142. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/__init__.py +0 -0
  143. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_dash.py +0 -0
  144. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_default.py +0 -0
  145. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_edit.py +0 -0
  146. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_environment.py +0 -0
  147. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_formatting.py +0 -0
  148. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_jobs.py +0 -0
  149. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_patch.py +0 -0
  150. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_paths.py +0 -0
  151. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_preprocess.py +0 -0
  152. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_read_config.py +0 -0
  153. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_shell.py +0 -0
  154. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/_sync.py +0 -0
  155. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/paths.py +0 -0
  156. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/resources/__init__.py +0 -0
  157. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/__init__.py +0 -0
  158. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/grafana/__init__.py +0 -0
  159. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/mosquitto/__init__.py +0 -0
  160. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/mosquitto/resources/__init__.py +0 -0
  161. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/config/stack/resources/__init__.py +0 -0
  162. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/Connector.py +0 -0
  163. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/__init__.py +0 -0
  164. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/APIConnector.py +0 -0
  165. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/__init__.py +0 -0
  166. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_fetch.py +0 -0
  167. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_login.py +0 -0
  168. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_misc.py +0 -0
  169. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_pipes.py +0 -0
  170. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_plugins.py +0 -0
  171. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_request.py +0 -0
  172. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_uri.py +0 -0
  173. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/api/_users.py +0 -0
  174. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/parse.py +0 -0
  175. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/plugin/PluginConnector.py +0 -0
  176. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/plugin/__init__.py +0 -0
  177. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/poll.py +0 -0
  178. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/SQLConnector.py +0 -0
  179. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/__init__.py +0 -0
  180. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_cli.py +0 -0
  181. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_create_engine.py +0 -0
  182. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_fetch.py +0 -0
  183. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_instance.py +0 -0
  184. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_pipes.py +0 -0
  185. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_plugins.py +0 -0
  186. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_sql.py +0 -0
  187. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_uri.py +0 -0
  188. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/_users.py +0 -0
  189. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/tables/__init__.py +0 -0
  190. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/tables/types.py +0 -0
  191. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/connectors/sql/tools.py +0 -0
  192. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/__init__.py +0 -0
  193. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_attributes.py +0 -0
  194. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_bootstrap.py +0 -0
  195. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_clear.py +0 -0
  196. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_data.py +0 -0
  197. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_deduplicate.py +0 -0
  198. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_delete.py +0 -0
  199. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_drop.py +0 -0
  200. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_dtypes.py +0 -0
  201. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_edit.py +0 -0
  202. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_fetch.py +0 -0
  203. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_register.py +0 -0
  204. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_show.py +0 -0
  205. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_sync.py +0 -0
  206. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Pipe/_verify.py +0 -0
  207. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/Plugin/__init__.py +0 -0
  208. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/User/_User.py +0 -0
  209. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/User/__init__.py +0 -0
  210. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/core/__init__.py +0 -0
  211. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/jobs/_Executor.py +0 -0
  212. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/jobs/__init__.py +0 -0
  213. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/plugins/_Plugin.py +0 -0
  214. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/plugins/__init__.py +0 -0
  215. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/plugins/bootstrap.py +0 -0
  216. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/__init__.py +0 -0
  217. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/_get_pipes.py +0 -0
  218. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/Daemon.py +0 -0
  219. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -0
  220. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/RotatingFile.py +0 -0
  221. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/StdinFile.py +0 -0
  222. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/__init__.py +0 -0
  223. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/daemon/_names.py +0 -0
  224. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/dataframe.py +0 -0
  225. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/debug.py +0 -0
  226. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/dtypes/__init__.py +0 -0
  227. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/dtypes/sql.py +0 -0
  228. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/__init__.py +0 -0
  229. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/_jobs.py +0 -0
  230. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/_pipes.py +0 -0
  231. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/_pprint.py +0 -0
  232. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/formatting/_shell.py +0 -0
  233. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/interactive.py +0 -0
  234. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/misc.py +0 -0
  235. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/networking.py +0 -0
  236. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/packages/__init__.py +0 -0
  237. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/packages/_packages.py +0 -0
  238. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/packages/lazy_loader.py +0 -0
  239. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/pool.py +0 -0
  240. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/process.py +0 -0
  241. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/schedule.py +0 -0
  242. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/sql.py +0 -0
  243. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/threading.py +0 -0
  244. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/typing.py +0 -0
  245. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/venv/_Venv.py +0 -0
  246. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/venv/__init__.py +0 -0
  247. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/warnings.py +0 -0
  248. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum/utils/yaml.py +0 -0
  249. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/SOURCES.txt +0 -0
  250. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/dependency_links.txt +0 -0
  251. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/entry_points.txt +0 -0
  252. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/requires.txt +0 -0
  253. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/top_level.txt +0 -0
  254. {meerschaum-2.3.4 → meerschaum-2.3.5}/meerschaum.egg-info/zip-safe +0 -0
  255. {meerschaum-2.3.4 → meerschaum-2.3.5}/setup.cfg +0 -0
  256. {meerschaum-2.3.4 → meerschaum-2.3.5}/setup.py +0 -0
  257. {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_actions.py +0 -0
  258. {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_arguments.py +0 -0
  259. {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_deduplicate.py +0 -0
  260. {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_jobs.py +0 -0
  261. {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_pipes_dtypes.py +0 -0
  262. {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_sql.py +0 -0
  263. {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_sync.py +0 -0
  264. {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_users.py +0 -0
  265. {meerschaum-2.3.4 → meerschaum-2.3.5}/tests/test_verify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.3.4
3
+ Version: 2.3.5
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -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
- sysargs.extend(
287
- [t[0]]
288
- + [
289
- str(item)
290
- for item in args_dict[a]
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
+ )
@@ -2,7 +2,7 @@
2
2
  # -*- coding: utf-8 -*-
3
3
  # vim:fenc=utf-8
4
4
 
5
- """
5
+ r"""
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
7
  <style>
8
8
 
@@ -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 = os.environ[_STATIC_CONFIG['environment']['systemd_result_path']]
23
- _systemd_log_path = os.environ[_STATIC_CONFIG['environment']['systemd_log_path']]
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
- with open(_systemd_result_path, 'w+', encoding='utf-8') as f:
171
- json.dump((success, msg), f)
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
- 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:
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
- if not sub_args:
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(sub_args, _patch_args=params)
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
- _check_jobs_thread = None
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
- if get_executor_keys_from_context() == 'local':
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
- if get_executor_keys_from_context() == 'local':
69
- stop_check_jobs_thread()
69
+ stop_check_jobs_thread()
70
70
 
71
- from meerschaum.api.routes._actions import _temp_jobs
72
- for name, job in _temp_jobs.items():
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,