machineconfig 1.95__py3-none-any.whl → 1.97__py3-none-any.whl
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.
Potentially problematic release.
This version of machineconfig might be problematic. Click here for more details.
- machineconfig/cluster/cloud_manager.py +445 -343
- machineconfig/cluster/data_transfer.py +63 -57
- machineconfig/cluster/distribute.py +284 -280
- machineconfig/cluster/file_manager.py +234 -237
- machineconfig/cluster/job_params.py +133 -133
- machineconfig/cluster/loader_runner.py +183 -149
- machineconfig/cluster/remote_machine.py +269 -252
- machineconfig/cluster/script_execution.py +215 -209
- machineconfig/cluster/script_notify_upon_completion.py +50 -43
- machineconfig/cluster/self_ssh.py +52 -54
- machineconfig/cluster/sessions_managers/__init__.py +0 -0
- machineconfig/cluster/sessions_managers/archive/__init__.py +0 -0
- machineconfig/{jobs/python → cluster/sessions_managers/archive}/create_zellij_template.py +5 -3
- machineconfig/cluster/sessions_managers/archive/session_managers.py +184 -0
- machineconfig/cluster/sessions_managers/demo_rich_zellij.py +0 -0
- machineconfig/cluster/sessions_managers/enhanced_command_runner.py +160 -0
- machineconfig/cluster/sessions_managers/wt_local.py +494 -0
- machineconfig/cluster/sessions_managers/wt_local_manager.py +577 -0
- machineconfig/cluster/sessions_managers/wt_remote.py +288 -0
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +483 -0
- machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +196 -0
- machineconfig/cluster/sessions_managers/wt_utils/process_monitor.py +418 -0
- machineconfig/cluster/sessions_managers/wt_utils/remote_executor.py +175 -0
- machineconfig/cluster/sessions_managers/wt_utils/session_manager.py +300 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +228 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +418 -0
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +533 -0
- machineconfig/cluster/sessions_managers/zellij_remote.py +229 -0
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +188 -0
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +64 -0
- machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +126 -0
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +334 -0
- machineconfig/cluster/sessions_managers/zellij_utils/remote_executor.py +68 -0
- machineconfig/cluster/sessions_managers/zellij_utils/session_manager.py +119 -0
- machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +85 -0
- machineconfig/cluster/templates/cli_click.py +0 -1
- machineconfig/cluster/templates/cli_gooey.py +102 -104
- machineconfig/cluster/templates/run_cloud.py +51 -51
- machineconfig/cluster/templates/run_cluster.py +103 -59
- machineconfig/cluster/templates/run_remote.py +57 -58
- machineconfig/cluster/templates/utils.py +69 -36
- machineconfig/jobs/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python/check_installations.py +258 -190
- machineconfig/jobs/python/create_bootable_media.py +7 -3
- machineconfig/jobs/python/python_cargo_build_share.py +50 -50
- machineconfig/jobs/python/python_ve_symlink.py +6 -6
- machineconfig/jobs/python/vscode/__pycache__/select_interpreter.cpython-311.pyc +0 -0
- machineconfig/jobs/python/vscode/api.py +1 -1
- machineconfig/jobs/python/vscode/link_ve.py +2 -2
- machineconfig/jobs/python/vscode/select_interpreter.py +9 -5
- machineconfig/jobs/python/vscode/sync_code.py +8 -5
- machineconfig/jobs/python_custom_installers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python_custom_installers/archive/ngrok.py +1 -1
- machineconfig/jobs/python_custom_installers/dev/alacritty.py +3 -2
- machineconfig/jobs/python_custom_installers/dev/brave.py +7 -3
- machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +3 -4
- machineconfig/jobs/python_custom_installers/dev/code.py +3 -1
- machineconfig/jobs/python_custom_installers/dev/cursor.py +66 -5
- machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -1
- machineconfig/jobs/python_custom_installers/dev/espanso.py +13 -9
- machineconfig/jobs/python_custom_installers/dev/goes.py +2 -8
- machineconfig/jobs/python_custom_installers/dev/lvim.py +3 -2
- machineconfig/jobs/python_custom_installers/dev/nerdfont.py +1 -1
- machineconfig/jobs/python_custom_installers/dev/redis.py +7 -3
- machineconfig/jobs/python_custom_installers/dev/wezterm.py +8 -4
- machineconfig/jobs/python_custom_installers/dev/winget.py +194 -0
- machineconfig/jobs/python_custom_installers/{dev/docker.py → docker.py} +8 -3
- machineconfig/jobs/python_custom_installers/gh.py +4 -3
- machineconfig/jobs/python_custom_installers/hx.py +9 -8
- machineconfig/jobs/python_custom_installers/scripts/linux/vscode.sh +97 -30
- machineconfig/jobs/python_custom_installers/{dev/warp-cli.py → warp-cli.py} +1 -1
- machineconfig/jobs/python_generic_installers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python_generic_installers/config.json +133 -9
- machineconfig/jobs/python_generic_installers/dev/config.json +208 -37
- machineconfig/jobs/python_generic_installers/update.py +3 -0
- machineconfig/jobs/python_linux_installers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/jobs/python_linux_installers/config.json +42 -6
- machineconfig/jobs/python_linux_installers/dev/config.json +79 -11
- machineconfig/jobs/python_windows_installers/config.json +6 -0
- machineconfig/profile/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/profile/__pycache__/create.cpython-311.pyc +0 -0
- machineconfig/profile/__pycache__/shell.cpython-311.pyc +0 -0
- machineconfig/profile/create.py +5 -5
- machineconfig/profile/create_hardlinks.py +5 -5
- machineconfig/profile/shell.py +44 -17
- machineconfig/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
- machineconfig/scripts/linux/fire_agents +27 -0
- machineconfig/scripts/linux/mcinit +27 -0
- machineconfig/scripts/linux/wifi_conn +24 -0
- machineconfig/scripts/python/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/__init__.cpython-313.pyc +0 -0
- machineconfig/scripts/python/__pycache__/cloud_copy.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/cloud_mount.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/cloud_sync.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/croshell.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/devops.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/devops_backup_retrieve.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/devops_devapps_install.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/devops_update_repos.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/fire_agents.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/fire_jobs.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/fire_jobs.cpython-313.pyc +0 -0
- machineconfig/scripts/python/__pycache__/get_zellij_cmd.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/repos.cpython-311.pyc +0 -0
- machineconfig/scripts/python/ai/__pycache__/init.cpython-311.pyc +0 -0
- machineconfig/scripts/python/ai/init.py +56 -0
- machineconfig/scripts/python/ai/rules/python/dev.md +31 -0
- machineconfig/scripts/python/archive/im2text.py +1 -3
- machineconfig/scripts/python/choose_wezterm_theme.py +3 -3
- machineconfig/scripts/python/cloud_copy.py +10 -10
- machineconfig/scripts/python/cloud_manager.py +77 -99
- machineconfig/scripts/python/cloud_mount.py +13 -12
- machineconfig/scripts/python/cloud_repo_sync.py +14 -11
- machineconfig/scripts/python/croshell.py +24 -21
- machineconfig/scripts/python/devops.py +12 -17
- machineconfig/scripts/python/devops_add_identity.py +32 -10
- machineconfig/scripts/python/devops_add_ssh_key.py +10 -10
- machineconfig/scripts/python/devops_backup_retrieve.py +9 -8
- machineconfig/scripts/python/devops_devapps_install.py +6 -6
- machineconfig/scripts/python/devops_update_repos.py +4 -3
- machineconfig/scripts/python/dotfile.py +10 -7
- machineconfig/scripts/python/fire_agents.py +69 -0
- machineconfig/scripts/python/fire_jobs.py +62 -65
- machineconfig/scripts/python/ftpx.py +8 -8
- machineconfig/scripts/python/get_zellij_cmd.py +3 -3
- machineconfig/scripts/python/gh_models.py +6 -4
- machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-313.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/cloud_helpers.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/helpers2.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-313.pyc +0 -0
- machineconfig/scripts/python/helpers/__pycache__/repo_sync_helpers.cpython-311.pyc +0 -0
- machineconfig/scripts/python/helpers/cloud_helpers.py +12 -12
- machineconfig/scripts/python/helpers/helpers2.py +9 -8
- machineconfig/scripts/python/helpers/helpers4.py +23 -35
- machineconfig/scripts/python/helpers/repo_sync_helpers.py +17 -16
- machineconfig/scripts/python/mount_nfs.py +8 -11
- machineconfig/scripts/python/mount_nw_drive.py +4 -4
- machineconfig/scripts/python/mount_ssh.py +2 -2
- machineconfig/scripts/python/onetimeshare.py +56 -57
- machineconfig/scripts/python/pomodoro.py +55 -55
- machineconfig/scripts/python/repos.py +26 -18
- machineconfig/scripts/python/scheduler.py +70 -53
- machineconfig/scripts/python/snapshot.py +21 -24
- machineconfig/scripts/python/start_slidev.py +6 -5
- machineconfig/scripts/python/start_terminals.py +3 -1
- machineconfig/scripts/python/viewer.py +5 -4
- machineconfig/scripts/python/viewer_template.py +138 -140
- machineconfig/scripts/python/wifi_conn.py +412 -60
- machineconfig/scripts/python/wsl_windows_transfer.py +18 -3
- machineconfig/scripts/windows/mcinit.ps1 +4 -0
- machineconfig/settings/linters/.pylintrc +6 -7
- machineconfig/settings/lvim/windows/config.lua +0 -0
- machineconfig/settings/shells/bash/init.sh +6 -0
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +7 -6
- machineconfig/settings/shells/pwsh/init.ps1 +6 -6
- machineconfig/settings/shells/wt/settings.json +51 -266
- machineconfig/setup_linux/web_shortcuts/interactive.sh +5 -2
- machineconfig/setup_windows/wt_and_pwsh/set_pwsh_theme.py +3 -6
- machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +11 -9
- machineconfig/utils/ai/url2md.py +2 -2
- machineconfig/utils/cloud/onedrive/setup_oauth.py +59 -0
- machineconfig/utils/cloud/onedrive/transaction.py +796 -0
- machineconfig/utils/code.py +22 -13
- machineconfig/utils/installer.py +78 -35
- machineconfig/utils/installer_utils/installer_abc.py +7 -6
- machineconfig/utils/installer_utils/installer_class.py +44 -25
- machineconfig/utils/io_save.py +107 -0
- machineconfig/utils/links.py +19 -15
- machineconfig/utils/options.py +4 -8
- machineconfig/utils/path.py +91 -78
- machineconfig/utils/path_reduced.py +608 -0
- machineconfig/utils/procs.py +110 -45
- machineconfig/utils/scheduling.py +312 -222
- machineconfig/utils/utils.py +7 -7
- machineconfig/utils/utils2.py +42 -0
- machineconfig/utils/utils5.py +84 -0
- machineconfig/utils/ve.py +49 -87
- {machineconfig-1.95.dist-info → machineconfig-1.97.dist-info}/METADATA +2 -2
- machineconfig-1.97.dist-info/RECORD +442 -0
- machineconfig/cluster/session_managers.py +0 -183
- machineconfig/cluster/templates/f.py +0 -4
- machineconfig/jobs/python/__pycache__/check_installations.cpython-311.pyc +0 -0
- machineconfig/jobs/python/__pycache__/checkout_version.cpython-311.pyc +0 -0
- machineconfig/jobs/python/__pycache__/python_ve_symlink.cpython-311.pyc +0 -0
- machineconfig/jobs/python/checkout_version.py +0 -123
- machineconfig/jobs/python/vscode/__pycache__/api.cpython-311.pyc +0 -0
- machineconfig/jobs/python/vscode/__pycache__/link_ve.cpython-311.pyc +0 -0
- machineconfig/jobs/python_custom_installers/__pycache__/hx.cpython-311.pyc +0 -0
- machineconfig/jobs/python_windows_installers/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/scripts/python/.mypy_cache/.gitignore +0 -2
- machineconfig/scripts/python/.mypy_cache/3.11/@plugins_snapshot.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/__future__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/__future__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_ast.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_ast.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_bz2.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_bz2.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_codecs.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_codecs.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_compression.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_compression.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_decimal.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_decimal.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_io.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_io.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_locale.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_locale.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_stat.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_stat.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_struct.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_struct.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_thread.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_thread.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_warnings.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_warnings.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_weakref.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_weakref.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/argparse.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/argparse.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/ast.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/ast.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/binascii.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/binascii.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/builtins.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/builtins.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/bz2.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/bz2.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/calendar.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/calendar.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/codecs.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/codecs.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/configparser.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/configparser.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/contextlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/contextlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/datetime.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/datetime.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/decimal.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/decimal.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/dis.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/dis.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/charset.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/charset.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/errors.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/errors.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/header.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/header.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/message.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/message.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/policy.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/email/policy.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/enum.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/enum.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/functools.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/functools.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/gc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/gc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/genericpath.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/genericpath.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/getpass.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/getpass.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/compat.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/compat.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/config.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/config.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/db.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/db.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/diff.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/diff.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/exc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/exc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/remote.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/remote.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/types.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/types.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/util.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/git/util.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/glob.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/glob.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/gzip.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/gzip.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/inspect.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/inspect.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/io.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/io.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/itertools.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/itertools.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/locale.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/locale.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/mmap.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/mmap.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/numbers.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/numbers.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/opcode.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/opcode.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/os/path.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/os/path.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/pathlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/pathlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/platform.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/platform.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/posixpath.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/posixpath.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/re.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/re.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/resource.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/resource.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/shlex.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/shlex.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/shutil.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/shutil.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/signal.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/signal.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/stat.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/stat.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/string.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/string.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/struct.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/struct.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/subprocess.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/subprocess.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/tarfile.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/tarfile.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/tempfile.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/tempfile.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/textwrap.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/textwrap.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/threading.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/threading.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/time.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/time.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/types.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/types.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/typing.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/typing.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/uuid.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/uuid.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/warnings.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/warnings.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/weakref.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/weakref.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/zlib.data.json +0 -1
- machineconfig/scripts/python/.mypy_cache/3.11/zlib.meta.json +0 -1
- machineconfig/scripts/python/.mypy_cache/CACHEDIR.TAG +0 -3
- machineconfig/scripts/python/__pycache__/cloud_repo_sync.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/gh_models.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/url2md.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/viewer.cpython-311.pyc +0 -0
- machineconfig/scripts/python/__pycache__/vscode_api.cpython-311.pyc +0 -0
- machineconfig/settings/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/settings/linters/.ruff_cache/.gitignore +0 -2
- machineconfig/settings/linters/.ruff_cache/CACHEDIR.TAG +0 -1
- machineconfig/settings/shells/ipy/profiles/default/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/__init__.cpython-311.pyc +0 -0
- machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/playext.cpython-311.pyc +0 -0
- machineconfig/utils/ve_utils/ve1.py +0 -111
- machineconfig/utils/ve_utils/ve2.py +0 -155
- machineconfig-1.95.dist-info/RECORD +0 -712
- {machineconfig-1.95.dist-info → machineconfig-1.97.dist-info}/WHEEL +0 -0
- {machineconfig-1.95.dist-info → machineconfig-1.97.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Process monitoring and status checking utilities for remote commands.
|
|
4
|
+
"""
|
|
5
|
+
import json
|
|
6
|
+
import shlex
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Dict, Tuple, Any
|
|
9
|
+
from .remote_executor import RemoteExecutor
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ProcessMonitor:
|
|
15
|
+
"""Handles process status checking and verification on remote machines."""
|
|
16
|
+
|
|
17
|
+
def __init__(self, remote_executor: RemoteExecutor):
|
|
18
|
+
self.remote_executor = remote_executor
|
|
19
|
+
|
|
20
|
+
def check_command_status(self, tab_name: str, tab_config: Dict[str, Tuple[str, str]],
|
|
21
|
+
use_verification: bool = True) -> Dict[str, Any]:
|
|
22
|
+
"""Check command status with optional process verification."""
|
|
23
|
+
if tab_name not in tab_config:
|
|
24
|
+
return {
|
|
25
|
+
"status": "unknown",
|
|
26
|
+
"error": f"Tab '{tab_name}' not found in tracked configuration",
|
|
27
|
+
"running": False,
|
|
28
|
+
"pid": None,
|
|
29
|
+
"command": None,
|
|
30
|
+
"remote": self.remote_executor.remote_name
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
# Use the verified method by default for more accurate results
|
|
34
|
+
if use_verification:
|
|
35
|
+
return self.get_verified_process_status(tab_name, tab_config)
|
|
36
|
+
|
|
37
|
+
return self._basic_process_check(tab_name, tab_config)
|
|
38
|
+
|
|
39
|
+
def _basic_process_check(self, tab_name: str, tab_config: Dict[str, Tuple[str, str]]) -> Dict[str, Any]:
|
|
40
|
+
"""Basic process checking without verification."""
|
|
41
|
+
_, command = tab_config[tab_name]
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
check_script = self._create_process_check_script(command)
|
|
45
|
+
remote_cmd = f"$HOME/venvs/ve/bin/python -c {shlex.quote(check_script)}"
|
|
46
|
+
result = self.remote_executor.run_command(remote_cmd, timeout=15)
|
|
47
|
+
|
|
48
|
+
if result.returncode == 0:
|
|
49
|
+
try:
|
|
50
|
+
matching_processes = json.loads(result.stdout.strip())
|
|
51
|
+
|
|
52
|
+
if matching_processes:
|
|
53
|
+
return {
|
|
54
|
+
"status": "running",
|
|
55
|
+
"running": True,
|
|
56
|
+
"processes": matching_processes,
|
|
57
|
+
"command": command,
|
|
58
|
+
"tab_name": tab_name,
|
|
59
|
+
"remote": self.remote_executor.remote_name
|
|
60
|
+
}
|
|
61
|
+
else:
|
|
62
|
+
return {
|
|
63
|
+
"status": "not_running",
|
|
64
|
+
"running": False,
|
|
65
|
+
"processes": [],
|
|
66
|
+
"command": command,
|
|
67
|
+
"tab_name": tab_name,
|
|
68
|
+
"remote": self.remote_executor.remote_name
|
|
69
|
+
}
|
|
70
|
+
except json.JSONDecodeError as e:
|
|
71
|
+
logger.error(f"Failed to parse remote process check output: {e}")
|
|
72
|
+
return {
|
|
73
|
+
"status": "error",
|
|
74
|
+
"error": f"Failed to parse remote output: {e}",
|
|
75
|
+
"running": False,
|
|
76
|
+
"command": command,
|
|
77
|
+
"tab_name": tab_name,
|
|
78
|
+
"remote": self.remote_executor.remote_name
|
|
79
|
+
}
|
|
80
|
+
else:
|
|
81
|
+
return {
|
|
82
|
+
"status": "error",
|
|
83
|
+
"error": f"Remote command failed: {result.stderr}",
|
|
84
|
+
"running": False,
|
|
85
|
+
"command": command,
|
|
86
|
+
"tab_name": tab_name,
|
|
87
|
+
"remote": self.remote_executor.remote_name
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
except Exception as e:
|
|
91
|
+
logger.error(f"Error checking command status for tab '{tab_name}': {e}")
|
|
92
|
+
return {
|
|
93
|
+
"status": "error",
|
|
94
|
+
"error": str(e),
|
|
95
|
+
"running": False,
|
|
96
|
+
"command": command,
|
|
97
|
+
"tab_name": tab_name,
|
|
98
|
+
"remote": self.remote_executor.remote_name
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
def _create_process_check_script(self, command: str) -> str:
|
|
102
|
+
"""Create Python script for checking processes on remote machine."""
|
|
103
|
+
return f"""
|
|
104
|
+
import psutil
|
|
105
|
+
import json
|
|
106
|
+
import os
|
|
107
|
+
|
|
108
|
+
def check_process():
|
|
109
|
+
matching_processes = []
|
|
110
|
+
full_command = '{command}'
|
|
111
|
+
cmd_parts = [part for part in full_command.split() if len(part) > 2]
|
|
112
|
+
current_pid = os.getpid()
|
|
113
|
+
|
|
114
|
+
primary_cmd = cmd_parts[0] if cmd_parts else ''
|
|
115
|
+
|
|
116
|
+
for proc in psutil.process_iter(['pid', 'name', 'cmdline', 'status', 'create_time']):
|
|
117
|
+
try:
|
|
118
|
+
if proc.info['pid'] == current_pid:
|
|
119
|
+
continue
|
|
120
|
+
|
|
121
|
+
if proc.info['cmdline'] and len(proc.info['cmdline']) > 0:
|
|
122
|
+
cmdline_str = ' '.join(proc.info['cmdline'])
|
|
123
|
+
|
|
124
|
+
if 'check_process()' in cmdline_str or 'psutil.process_iter' in cmdline_str:
|
|
125
|
+
continue
|
|
126
|
+
|
|
127
|
+
matches_primary = primary_cmd in cmdline_str
|
|
128
|
+
matches_parts = sum(1 for part in cmd_parts[1:] if part in cmdline_str)
|
|
129
|
+
|
|
130
|
+
if (matches_primary and matches_parts >= 2) or \\
|
|
131
|
+
(full_command in cmdline_str and not any(python_indicator in cmdline_str.lower()
|
|
132
|
+
for python_indicator in ['python -c', 'import psutil', 'def check_process'])):
|
|
133
|
+
matching_processes.append({{
|
|
134
|
+
"pid": proc.info['pid'],
|
|
135
|
+
"name": proc.info['name'],
|
|
136
|
+
"cmdline": proc.info['cmdline'],
|
|
137
|
+
"status": proc.info['status'],
|
|
138
|
+
"cmdline_str": cmdline_str,
|
|
139
|
+
"create_time": proc.info['create_time']
|
|
140
|
+
}})
|
|
141
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
142
|
+
continue
|
|
143
|
+
|
|
144
|
+
return matching_processes
|
|
145
|
+
|
|
146
|
+
if __name__ == "__main__":
|
|
147
|
+
processes = check_process()
|
|
148
|
+
print(json.dumps(processes))
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
def force_fresh_process_check(self, tab_name: str, tab_config: Dict[str, Tuple[str, str]]) -> Dict[str, Any]:
|
|
152
|
+
"""Force a fresh process check with additional validation."""
|
|
153
|
+
if tab_name not in tab_config:
|
|
154
|
+
return {
|
|
155
|
+
"status": "unknown",
|
|
156
|
+
"error": f"Tab '{tab_name}' not found in tracked configuration",
|
|
157
|
+
"running": False,
|
|
158
|
+
"command": None,
|
|
159
|
+
"remote": self.remote_executor.remote_name
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
_, command = tab_config[tab_name]
|
|
163
|
+
|
|
164
|
+
try:
|
|
165
|
+
# Get timestamp for freshness validation
|
|
166
|
+
timestamp_result = self.remote_executor.run_command("date +%s", timeout=5)
|
|
167
|
+
check_timestamp = timestamp_result.stdout.strip() if timestamp_result.returncode == 0 else "unknown"
|
|
168
|
+
|
|
169
|
+
check_script = self._create_fresh_check_script(command)
|
|
170
|
+
remote_cmd = f"$HOME/venvs/ve/bin/python -c {shlex.quote(check_script)}"
|
|
171
|
+
result = self.remote_executor.run_command(remote_cmd, timeout=15)
|
|
172
|
+
|
|
173
|
+
if result.returncode == 0:
|
|
174
|
+
try:
|
|
175
|
+
check_result = json.loads(result.stdout.strip())
|
|
176
|
+
matching_processes = check_result.get("processes", [])
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
"status": "running" if matching_processes else "not_running",
|
|
180
|
+
"running": bool(matching_processes),
|
|
181
|
+
"processes": matching_processes,
|
|
182
|
+
"command": command,
|
|
183
|
+
"tab_name": tab_name,
|
|
184
|
+
"remote": self.remote_executor.remote_name,
|
|
185
|
+
"check_timestamp": check_timestamp,
|
|
186
|
+
"method": "force_fresh_check"
|
|
187
|
+
}
|
|
188
|
+
except json.JSONDecodeError as e:
|
|
189
|
+
logger.error(f"Failed to parse fresh check output: {e}")
|
|
190
|
+
return {
|
|
191
|
+
"status": "error",
|
|
192
|
+
"error": f"Failed to parse output: {e}",
|
|
193
|
+
"running": False,
|
|
194
|
+
"command": command,
|
|
195
|
+
"tab_name": tab_name,
|
|
196
|
+
"remote": self.remote_executor.remote_name,
|
|
197
|
+
"raw_output": result.stdout
|
|
198
|
+
}
|
|
199
|
+
else:
|
|
200
|
+
return {
|
|
201
|
+
"status": "error",
|
|
202
|
+
"error": f"Remote command failed: {result.stderr}",
|
|
203
|
+
"running": False,
|
|
204
|
+
"command": command,
|
|
205
|
+
"tab_name": tab_name,
|
|
206
|
+
"remote": self.remote_executor.remote_name
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
except Exception as e:
|
|
210
|
+
logger.error(f"Error in fresh process check for tab '{tab_name}': {e}")
|
|
211
|
+
return {
|
|
212
|
+
"status": "error",
|
|
213
|
+
"error": str(e),
|
|
214
|
+
"running": False,
|
|
215
|
+
"command": command,
|
|
216
|
+
"tab_name": tab_name,
|
|
217
|
+
"remote": self.remote_executor.remote_name
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
def _create_fresh_check_script(self, command: str) -> str:
|
|
221
|
+
"""Create enhanced process checking script with freshness validation."""
|
|
222
|
+
escaped_command = command.replace("'", "\\'").replace('"', '\\"')
|
|
223
|
+
|
|
224
|
+
return f'''
|
|
225
|
+
import psutil
|
|
226
|
+
import json
|
|
227
|
+
import os
|
|
228
|
+
import time
|
|
229
|
+
|
|
230
|
+
def force_fresh_check():
|
|
231
|
+
time.sleep(0.1)
|
|
232
|
+
|
|
233
|
+
matching_processes = []
|
|
234
|
+
full_command = '{escaped_command}'
|
|
235
|
+
cmd_parts = [part for part in full_command.split() if len(part) > 2]
|
|
236
|
+
current_pid = os.getpid()
|
|
237
|
+
primary_cmd = cmd_parts[0] if cmd_parts else ''
|
|
238
|
+
|
|
239
|
+
check_time = time.time()
|
|
240
|
+
|
|
241
|
+
for proc in psutil.process_iter(['pid', 'name', 'cmdline', 'status', 'create_time']):
|
|
242
|
+
try:
|
|
243
|
+
if proc.info['pid'] == current_pid:
|
|
244
|
+
continue
|
|
245
|
+
|
|
246
|
+
if proc.info['cmdline'] and len(proc.info['cmdline']) > 0:
|
|
247
|
+
cmdline_str = ' '.join(proc.info['cmdline'])
|
|
248
|
+
|
|
249
|
+
if any(indicator in cmdline_str for indicator in [
|
|
250
|
+
'check_process()', 'psutil.process_iter', 'force_fresh_check',
|
|
251
|
+
'import psutil', 'def check_process'
|
|
252
|
+
]):
|
|
253
|
+
continue
|
|
254
|
+
|
|
255
|
+
if proc.info['create_time'] and proc.info['create_time'] > check_time - 5:
|
|
256
|
+
continue
|
|
257
|
+
|
|
258
|
+
matches_primary = primary_cmd in cmdline_str and primary_cmd != 'python'
|
|
259
|
+
matches_parts = sum(1 for part in cmd_parts[1:] if part in cmdline_str)
|
|
260
|
+
|
|
261
|
+
if matches_primary and matches_parts >= 2:
|
|
262
|
+
script_indicators = ['-c', 'import ', 'def ', 'psutil']
|
|
263
|
+
is_direct_command = not any(script_indicator in cmdline_str.lower()
|
|
264
|
+
for script_indicator in script_indicators)
|
|
265
|
+
|
|
266
|
+
if is_direct_command or (full_command in cmdline_str and 'python -c' not in cmdline_str):
|
|
267
|
+
matching_processes.append({{
|
|
268
|
+
"pid": proc.info['pid'],
|
|
269
|
+
"name": proc.info['name'],
|
|
270
|
+
"cmdline": proc.info['cmdline'],
|
|
271
|
+
"status": proc.info['status'],
|
|
272
|
+
"cmdline_str": cmdline_str,
|
|
273
|
+
"create_time": proc.info['create_time'],
|
|
274
|
+
"is_direct_command": is_direct_command
|
|
275
|
+
}})
|
|
276
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
277
|
+
continue
|
|
278
|
+
|
|
279
|
+
return {{
|
|
280
|
+
"processes": matching_processes,
|
|
281
|
+
"check_timestamp": check_time,
|
|
282
|
+
"search_command": full_command,
|
|
283
|
+
"search_parts": cmd_parts
|
|
284
|
+
}}
|
|
285
|
+
|
|
286
|
+
if __name__ == "__main__":
|
|
287
|
+
result = force_fresh_check()
|
|
288
|
+
print(json.dumps(result))
|
|
289
|
+
'''
|
|
290
|
+
|
|
291
|
+
def verify_process_alive(self, pid: int) -> bool:
|
|
292
|
+
"""Verify if a process with given PID is actually alive."""
|
|
293
|
+
try:
|
|
294
|
+
verify_cmd = f"kill -0 {pid} 2>/dev/null && echo 'alive' || echo 'dead'"
|
|
295
|
+
result = self.remote_executor.run_command(verify_cmd, timeout=5)
|
|
296
|
+
|
|
297
|
+
if result.returncode == 0:
|
|
298
|
+
return result.stdout.strip() == 'alive'
|
|
299
|
+
return False
|
|
300
|
+
except Exception:
|
|
301
|
+
return False
|
|
302
|
+
|
|
303
|
+
def get_verified_process_status(self, tab_name: str, tab_config: Dict[str, Tuple[str, str]]) -> Dict[str, Any]:
|
|
304
|
+
"""Get process status with additional verification that processes are actually alive."""
|
|
305
|
+
status = self.force_fresh_process_check(tab_name, tab_config)
|
|
306
|
+
|
|
307
|
+
if status.get("running") and status.get("processes"):
|
|
308
|
+
verified_processes = []
|
|
309
|
+
for proc in status["processes"]:
|
|
310
|
+
pid = proc.get("pid")
|
|
311
|
+
if pid and self.verify_process_alive(pid):
|
|
312
|
+
proc["verified_alive"] = True
|
|
313
|
+
verified_processes.append(proc)
|
|
314
|
+
else:
|
|
315
|
+
proc["verified_alive"] = False
|
|
316
|
+
logger.warning(f"Process PID {pid} found in process list but not actually alive")
|
|
317
|
+
|
|
318
|
+
status["processes"] = verified_processes
|
|
319
|
+
status["running"] = bool(verified_processes)
|
|
320
|
+
status["status"] = "running" if verified_processes else "not_running"
|
|
321
|
+
status["verification_method"] = "kill_signal_check"
|
|
322
|
+
|
|
323
|
+
return status
|
|
324
|
+
|
|
325
|
+
def check_all_commands_status(self, tab_config: Dict[str, Tuple[str, str]]) -> Dict[str, Dict[str, Any]]:
|
|
326
|
+
"""Check status of all commands in the tab configuration."""
|
|
327
|
+
if not tab_config:
|
|
328
|
+
logger.warning("No tab configuration provided.")
|
|
329
|
+
return {}
|
|
330
|
+
|
|
331
|
+
status_report = {}
|
|
332
|
+
for tab_name in tab_config:
|
|
333
|
+
status_report[tab_name] = self.check_command_status(tab_name, tab_config)
|
|
334
|
+
return status_report
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Remote command execution utilities for SSH operations.
|
|
4
|
+
"""
|
|
5
|
+
import subprocess
|
|
6
|
+
import logging
|
|
7
|
+
from typing import Dict, Any
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class RemoteExecutor:
|
|
13
|
+
"""Handles SSH command execution on remote machines."""
|
|
14
|
+
|
|
15
|
+
def __init__(self, remote_name: str):
|
|
16
|
+
self.remote_name = remote_name
|
|
17
|
+
|
|
18
|
+
def run_command(self, command: str, timeout: int = 30) -> subprocess.CompletedProcess[str]:
|
|
19
|
+
"""Execute a command on the remote machine via SSH."""
|
|
20
|
+
ssh_cmd = ["ssh", self.remote_name, command]
|
|
21
|
+
try:
|
|
22
|
+
result = subprocess.run(
|
|
23
|
+
ssh_cmd,
|
|
24
|
+
capture_output=True,
|
|
25
|
+
text=True,
|
|
26
|
+
timeout=timeout
|
|
27
|
+
)
|
|
28
|
+
return result
|
|
29
|
+
except subprocess.TimeoutExpired:
|
|
30
|
+
logger.error(f"SSH command timed out after {timeout}s: {command}")
|
|
31
|
+
raise
|
|
32
|
+
except Exception as e:
|
|
33
|
+
logger.error(f"SSH command failed: {e}")
|
|
34
|
+
raise
|
|
35
|
+
|
|
36
|
+
def copy_file_to_remote(self, local_file: str, remote_path: str) -> Dict[str, Any]:
|
|
37
|
+
"""Copy a file to the remote machine using SCP."""
|
|
38
|
+
scp_cmd = ["scp", local_file, f"{self.remote_name}:{remote_path}"]
|
|
39
|
+
try:
|
|
40
|
+
result = subprocess.run(scp_cmd, capture_output=True, text=True)
|
|
41
|
+
if result.returncode == 0:
|
|
42
|
+
logger.info(f"File copied successfully to {self.remote_name}:{remote_path}")
|
|
43
|
+
return {"success": True, "remote_path": remote_path}
|
|
44
|
+
else:
|
|
45
|
+
logger.error(f"SCP failed: {result.stderr}")
|
|
46
|
+
return {"success": False, "error": result.stderr}
|
|
47
|
+
except Exception as e:
|
|
48
|
+
logger.error(f"SCP operation failed: {e}")
|
|
49
|
+
return {"success": False, "error": str(e)}
|
|
50
|
+
|
|
51
|
+
def create_remote_directory(self, remote_dir: str) -> bool:
|
|
52
|
+
"""Create a directory on the remote machine."""
|
|
53
|
+
try:
|
|
54
|
+
result = self.run_command(f"mkdir -p {remote_dir}")
|
|
55
|
+
return result.returncode == 0
|
|
56
|
+
except Exception as e:
|
|
57
|
+
logger.error(f"Failed to create remote directory {remote_dir}: {e}")
|
|
58
|
+
return False
|
|
59
|
+
|
|
60
|
+
def attach_to_session_interactive(self, session_name: str) -> None:
|
|
61
|
+
"""Attach to a Zellij session interactively via SSH."""
|
|
62
|
+
try:
|
|
63
|
+
attach_cmd = ["ssh", "-t", self.remote_name, f"zellij attach {session_name}"]
|
|
64
|
+
logger.info(f"Attaching to Zellij session '{session_name}' on {self.remote_name}")
|
|
65
|
+
subprocess.run(attach_cmd)
|
|
66
|
+
except Exception as e:
|
|
67
|
+
logger.error(f"Failed to attach to session: {e}")
|
|
68
|
+
raise
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Zellij session management utilities for remote operations.
|
|
4
|
+
"""
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Dict, Any, Optional
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from rich.console import Console
|
|
10
|
+
|
|
11
|
+
from .remote_executor import RemoteExecutor
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
console = Console()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class SessionManager:
|
|
18
|
+
"""Handles Zellij session operations on remote machines."""
|
|
19
|
+
|
|
20
|
+
def __init__(self, remote_executor: RemoteExecutor, session_name: str, tmp_layout_dir: Path):
|
|
21
|
+
self.remote_executor = remote_executor
|
|
22
|
+
self.session_name = session_name
|
|
23
|
+
self.tmp_layout_dir = tmp_layout_dir
|
|
24
|
+
|
|
25
|
+
def copy_layout_to_remote(self, local_layout_file: Path, random_suffix: str) -> str:
|
|
26
|
+
"""Copy the layout file to the remote machine and return the remote path."""
|
|
27
|
+
remote_layout_dir = f"~/{self.tmp_layout_dir.relative_to(Path.home())}"
|
|
28
|
+
remote_layout_file = f"{remote_layout_dir}/zellij_layout_{self.session_name}_{random_suffix}.kdl"
|
|
29
|
+
|
|
30
|
+
# Create remote directory
|
|
31
|
+
if not self.remote_executor.create_remote_directory(remote_layout_dir):
|
|
32
|
+
raise RuntimeError(f"Failed to create remote directory: {remote_layout_dir}")
|
|
33
|
+
|
|
34
|
+
# Copy layout file to remote machine
|
|
35
|
+
copy_result = self.remote_executor.copy_file_to_remote(str(local_layout_file), remote_layout_file)
|
|
36
|
+
if not copy_result["success"]:
|
|
37
|
+
raise RuntimeError(f"Failed to copy layout file to remote: {copy_result['error']}")
|
|
38
|
+
|
|
39
|
+
# Enhanced Rich logging
|
|
40
|
+
console.print(f"[bold green]📁 Zellij layout file copied to remote:[/bold green] [yellow]{self.remote_executor.remote_name}[/yellow][cyan]:{remote_layout_file}[/cyan]")
|
|
41
|
+
return remote_layout_file
|
|
42
|
+
|
|
43
|
+
def check_zellij_session_status(self) -> Dict[str, Any]:
|
|
44
|
+
"""Check if the Zellij session exists and is running."""
|
|
45
|
+
try:
|
|
46
|
+
result = self.remote_executor.run_command('zellij list-sessions', timeout=10)
|
|
47
|
+
|
|
48
|
+
if result.returncode == 0:
|
|
49
|
+
sessions = result.stdout.strip().split('\n') if result.stdout.strip() else []
|
|
50
|
+
session_running = any(self.session_name in session for session in sessions)
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
"zellij_running": True,
|
|
54
|
+
"session_exists": session_running,
|
|
55
|
+
"session_name": self.session_name,
|
|
56
|
+
"all_sessions": sessions,
|
|
57
|
+
"remote": self.remote_executor.remote_name
|
|
58
|
+
}
|
|
59
|
+
else:
|
|
60
|
+
return {
|
|
61
|
+
"zellij_running": False,
|
|
62
|
+
"error": result.stderr,
|
|
63
|
+
"session_name": self.session_name,
|
|
64
|
+
"remote": self.remote_executor.remote_name
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
except Exception as e:
|
|
68
|
+
return {
|
|
69
|
+
"zellij_running": False,
|
|
70
|
+
"error": str(e),
|
|
71
|
+
"session_name": self.session_name,
|
|
72
|
+
"remote": self.remote_executor.remote_name
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
def start_zellij_session(self, layout_file_path: Optional[str] = None) -> Dict[str, Any]:
|
|
76
|
+
"""Start a Zellij session on the remote machine with the generated layout."""
|
|
77
|
+
try:
|
|
78
|
+
if layout_file_path:
|
|
79
|
+
layout_filename = Path(layout_file_path).name
|
|
80
|
+
remote_layout_file = f"~/{self.tmp_layout_dir.relative_to(Path.home())}/{layout_filename}"
|
|
81
|
+
else:
|
|
82
|
+
raise ValueError("No layout file path provided.")
|
|
83
|
+
|
|
84
|
+
# Enhanced Rich logging for session start
|
|
85
|
+
console.print(f"[bold cyan]🚀 Starting Zellij session[/bold cyan] [yellow]'{self.session_name}'[/yellow] [dim]on remote[/dim] [bold yellow]'{self.remote_executor.remote_name}'[/bold yellow] [dim]with layout:[/dim] [blue]{remote_layout_file}[/blue]")
|
|
86
|
+
|
|
87
|
+
# Start Zellij session with layout
|
|
88
|
+
start_cmd = f"zellij --layout {remote_layout_file} a -b {self.session_name}"
|
|
89
|
+
console.print(f"[dim]Executing:[/dim] [green]{start_cmd}[/green]")
|
|
90
|
+
result = self.remote_executor.run_command(start_cmd, timeout=30)
|
|
91
|
+
|
|
92
|
+
if result.returncode == 0:
|
|
93
|
+
console.print(f"[bold green]✅ Zellij session[/bold green] [yellow]'{self.session_name}'[/yellow] [green]started successfully on[/green] [bold yellow]{self.remote_executor.remote_name}[/bold yellow]")
|
|
94
|
+
return {
|
|
95
|
+
"success": True,
|
|
96
|
+
"session_name": self.session_name,
|
|
97
|
+
"remote": self.remote_executor.remote_name,
|
|
98
|
+
"message": "Session started successfully"
|
|
99
|
+
}
|
|
100
|
+
else:
|
|
101
|
+
return {
|
|
102
|
+
"success": False,
|
|
103
|
+
"error": result.stderr,
|
|
104
|
+
"session_name": self.session_name,
|
|
105
|
+
"remote": self.remote_executor.remote_name
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
except Exception as e:
|
|
109
|
+
logger.error(f"Failed to start Zellij session on {self.remote_executor.remote_name}: {e}")
|
|
110
|
+
return {
|
|
111
|
+
"success": False,
|
|
112
|
+
"error": str(e),
|
|
113
|
+
"session_name": self.session_name,
|
|
114
|
+
"remote": self.remote_executor.remote_name
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
def attach_to_session(self) -> None:
|
|
118
|
+
"""Attach to the Zellij session on the remote machine via SSH."""
|
|
119
|
+
self.remote_executor.attach_to_session_interactive(self.session_name)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Status reporting utilities for Zellij remote layouts.
|
|
4
|
+
"""
|
|
5
|
+
import logging
|
|
6
|
+
from typing import Dict, Any, Tuple
|
|
7
|
+
from .process_monitor import ProcessMonitor
|
|
8
|
+
from .session_manager import SessionManager
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class StatusReporter:
|
|
14
|
+
"""Handles comprehensive status reporting for Zellij remote sessions."""
|
|
15
|
+
|
|
16
|
+
def __init__(self, process_monitor: ProcessMonitor, session_manager: SessionManager):
|
|
17
|
+
self.process_monitor = process_monitor
|
|
18
|
+
self.session_manager = session_manager
|
|
19
|
+
|
|
20
|
+
def get_comprehensive_status(self, tab_config: Dict[str, Tuple[str, str]]) -> Dict[str, Any]:
|
|
21
|
+
"""Get comprehensive status including Zellij session and all commands."""
|
|
22
|
+
zellij_status = self.session_manager.check_zellij_session_status()
|
|
23
|
+
commands_status = self.process_monitor.check_all_commands_status(tab_config)
|
|
24
|
+
|
|
25
|
+
running_count = sum(1 for status in commands_status.values() if status.get("running", False))
|
|
26
|
+
total_count = len(commands_status)
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
"zellij_session": zellij_status,
|
|
30
|
+
"commands": commands_status,
|
|
31
|
+
"summary": {
|
|
32
|
+
"total_commands": total_count,
|
|
33
|
+
"running_commands": running_count,
|
|
34
|
+
"stopped_commands": total_count - running_count,
|
|
35
|
+
"session_healthy": zellij_status.get("session_exists", False),
|
|
36
|
+
"remote": self.session_manager.remote_executor.remote_name
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
def print_status_report(self, tab_config: Dict[str, Tuple[str, str]]) -> None:
|
|
41
|
+
"""Print a formatted status report to console."""
|
|
42
|
+
status = self.get_comprehensive_status(tab_config)
|
|
43
|
+
remote_name = self.session_manager.remote_executor.remote_name
|
|
44
|
+
session_name = self.session_manager.session_name
|
|
45
|
+
|
|
46
|
+
print("=" * 60)
|
|
47
|
+
print(f"🔍 ZELLIJ REMOTE LAYOUT STATUS REPORT ({remote_name})")
|
|
48
|
+
print("=" * 60)
|
|
49
|
+
|
|
50
|
+
# Zellij session status
|
|
51
|
+
zellij = status["zellij_session"]
|
|
52
|
+
if zellij.get("zellij_running", False):
|
|
53
|
+
if zellij.get("session_exists", False):
|
|
54
|
+
print(f"✅ Zellij session '{session_name}' is running on {remote_name}")
|
|
55
|
+
else:
|
|
56
|
+
print(f"⚠️ Zellij is running on {remote_name} but session '{session_name}' not found")
|
|
57
|
+
else:
|
|
58
|
+
print(f"❌ Zellij session issue on {remote_name}: {zellij.get('error', 'Unknown error')}")
|
|
59
|
+
|
|
60
|
+
print()
|
|
61
|
+
|
|
62
|
+
# Commands status
|
|
63
|
+
print("📋 COMMAND STATUS:")
|
|
64
|
+
print("-" * 40)
|
|
65
|
+
|
|
66
|
+
for tab_name, cmd_status in status["commands"].items():
|
|
67
|
+
if cmd_status.get("running", False):
|
|
68
|
+
print(f"✅ {tab_name}: Running on {remote_name}")
|
|
69
|
+
if cmd_status.get("processes"):
|
|
70
|
+
for proc in cmd_status["processes"][:2]: # Show first 2 processes
|
|
71
|
+
print(f" └─ PID {proc['pid']}: {proc['name']} ({proc['status']})")
|
|
72
|
+
else:
|
|
73
|
+
print(f"❌ {tab_name}: Not running on {remote_name}")
|
|
74
|
+
print(f" Command: {cmd_status.get('command', 'Unknown')}")
|
|
75
|
+
print()
|
|
76
|
+
|
|
77
|
+
# Summary
|
|
78
|
+
summary = status["summary"]
|
|
79
|
+
print("📊 SUMMARY:")
|
|
80
|
+
print(f" Remote machine: {remote_name}")
|
|
81
|
+
print(f" Total commands: {summary['total_commands']}")
|
|
82
|
+
print(f" Running: {summary['running_commands']}")
|
|
83
|
+
print(f" Stopped: {summary['stopped_commands']}")
|
|
84
|
+
print(f" Session healthy: {'✅' if summary['session_healthy'] else '❌'}")
|
|
85
|
+
print("=" * 60)
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
# #
|
|
6
6
|
# # from machineconfig.cluster.distribute import Cluster, WorkloadParams
|
|
7
7
|
# from machineconfig.cluster.remote_machine import RemoteMachineConfig, RemoteMachine, CloudManager
|
|
8
|
-
# from crocodile.file_management import Read
|
|
9
8
|
# from machineconfig.cluster.templates.run_cloud import to_email_default, email_config_name_default, default_cloud
|
|
10
9
|
# import click
|
|
11
10
|
# # from trogon import tui
|