machineconfig 5.15__py3-none-any.whl → 7.98__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.
- machineconfig/__init__.py +0 -28
- machineconfig/cluster/remote/cloud_manager.py +1 -1
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- machineconfig/cluster/remote/script_execution.py +0 -1
- machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
- machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
- machineconfig/cluster/sessions_managers/wt_local.py +114 -289
- machineconfig/cluster/sessions_managers/wt_local_manager.py +70 -210
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
- machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
- machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
- machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
- machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +25 -170
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
- machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
- machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
- machineconfig/jobs/{python → installer}/check_installations.py +2 -3
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/hx.py +76 -19
- machineconfig/jobs/installer/custom/yazi.py +119 -0
- machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
- machineconfig/jobs/installer/custom_dev/brave.py +5 -9
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +4 -1
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
- machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
- machineconfig/jobs/installer/custom_dev/winget.py +10 -14
- machineconfig/jobs/installer/installer_data.json +1487 -229
- machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
- machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
- machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/q.sh +10 -6
- machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
- machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
- machineconfig/jobs/installer/package_groups.py +106 -177
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +62 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +147 -0
- machineconfig/profile/mapper.toml +263 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +46 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +123 -117
- machineconfig/scripts/python/ai/initai.py +3 -28
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
- machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +28 -5
- machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
- machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +137 -113
- machineconfig/scripts/python/devops.py +61 -101
- machineconfig/scripts/python/devops_navigator.py +6 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -0
- machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
- machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
- machineconfig/scripts/python/fire_jobs.py +110 -150
- machineconfig/scripts/python/ftpx.py +51 -24
- machineconfig/scripts/python/helpers/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/qr_code.py +166 -0
- machineconfig/scripts/python/helpers/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/run_py_script.py +79 -0
- machineconfig/scripts/python/helpers/symantic_search.py +25 -0
- machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
- machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
- machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +29 -35
- machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +8 -9
- machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
- machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
- machineconfig/scripts/python/helpers_devops/cli_nw.py +214 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
- machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
- machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
- machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
- machineconfig/scripts/python/helpers_devops/devops_status.py +499 -0
- machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
- machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
- machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +3 -3
- machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
- machineconfig/scripts/python/helpers_fire_command/f.py +0 -0
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
- machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +121 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
- machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
- machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
- machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
- machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
- machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
- machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
- machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
- machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
- machineconfig/scripts/python/helpers_network/__init__.py +0 -0
- machineconfig/scripts/python/helpers_network/address.py +132 -0
- machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
- machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
- machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
- machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
- machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
- machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
- machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
- machineconfig/scripts/python/helpers_repos/action.py +209 -0
- machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
- machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
- machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
- machineconfig/scripts/python/helpers_repos/grource.py +340 -0
- machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
- machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
- machineconfig/scripts/python/helpers_repos/sync.py +66 -0
- machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
- machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +65 -0
- machineconfig/scripts/python/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers_utils/path.py +185 -0
- machineconfig/scripts/python/interactive.py +64 -84
- machineconfig/scripts/python/mcfg_entry.py +58 -0
- machineconfig/scripts/python/msearch.py +71 -0
- machineconfig/scripts/python/sessions.py +119 -45
- machineconfig/scripts/python/terminal.py +133 -0
- machineconfig/scripts/python/utils.py +64 -0
- machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
- machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
- machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
- machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
- machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
- machineconfig/settings/broot/br.sh +0 -4
- machineconfig/settings/broot/conf.toml +1 -1
- machineconfig/settings/helix/config.toml +16 -0
- machineconfig/settings/helix/languages.toml +13 -4
- machineconfig/settings/helix/yazi-picker.sh +12 -0
- machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
- machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
- machineconfig/settings/lf/linux/lfrc +10 -12
- machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
- machineconfig/settings/lf/windows/lfrc +18 -38
- machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
- machineconfig/settings/linters/.ruff.toml +1 -1
- machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
- machineconfig/settings/marimo/marimo.toml +80 -0
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/pistol/pistol.conf +1 -1
- machineconfig/settings/shells/bash/init.sh +82 -31
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
- machineconfig/settings/shells/nushell/config.nu +2 -35
- machineconfig/settings/shells/nushell/env.nu +45 -6
- machineconfig/settings/shells/nushell/init.nu +314 -0
- machineconfig/settings/shells/pwsh/init.ps1 +61 -43
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
- machineconfig/settings/shells/wt/settings.json +32 -17
- machineconfig/settings/shells/zsh/init.sh +89 -0
- machineconfig/settings/svim/linux/init.toml +0 -4
- machineconfig/settings/svim/windows/init.toml +0 -3
- machineconfig/settings/television/cable_unix/alias.toml +8 -0
- machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
- machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
- machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
- machineconfig/settings/television/cable_unix/channels.toml +19 -0
- machineconfig/settings/television/cable_unix/dirs.toml +13 -0
- machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
- machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
- machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_unix/env.toml +17 -0
- machineconfig/settings/television/cable_unix/files.toml +11 -0
- machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
- machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
- machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
- machineconfig/settings/television/cable_unix/git-log.toml +12 -0
- machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
- machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
- machineconfig/settings/television/cable_unix/guix.toml +20 -0
- machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
- machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
- machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
- machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
- machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
- machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
- machineconfig/settings/television/cable_unix/procs.toml +20 -0
- machineconfig/settings/television/cable_unix/text.toml +17 -0
- machineconfig/settings/television/cable_unix/tldr.toml +18 -0
- machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
- machineconfig/settings/television/cable_windows/alias.toml +7 -0
- machineconfig/settings/television/cable_windows/dirs.toml +13 -0
- machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
- machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_windows/env.toml +17 -0
- machineconfig/settings/television/cable_windows/files.toml +14 -0
- machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
- machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
- machineconfig/settings/television/cable_windows/git-log.toml +11 -0
- machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
- machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
- machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
- machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
- machineconfig/settings/television/cable_windows/text.toml +17 -0
- machineconfig/settings/yazi/init.lua +61 -0
- machineconfig/settings/yazi/keymap_linux.toml +94 -0
- machineconfig/settings/yazi/keymap_windows.toml +78 -0
- machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
- machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
- machineconfig/settings/yazi/theme.toml +4 -0
- machineconfig/settings/yazi/yazi_linux.toml +84 -0
- machineconfig/settings/yazi/yazi_windows.toml +58 -0
- machineconfig/setup_linux/__init__.py +11 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
- machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
- machineconfig/setup_linux/uv.sh +15 -0
- machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
- machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
- machineconfig/setup_mac/__init__.py +16 -0
- machineconfig/setup_mac/apps_gui.sh +248 -0
- machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
- machineconfig/setup_mac/uv.sh +36 -0
- machineconfig/setup_windows/__init__.py +11 -0
- machineconfig/setup_windows/others/power_options.ps1 +7 -0
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
- machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
- machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
- machineconfig/setup_windows/uv.ps1 +17 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +155 -105
- machineconfig/utils/files/art/fat_croco.txt +10 -0
- machineconfig/utils/files/art/halfwit_croco.txt +9 -0
- machineconfig/utils/files/art/happy_croco.txt +22 -0
- machineconfig/utils/files/art/water_croco.txt +11 -0
- machineconfig/utils/files/ascii_art.py +1 -1
- machineconfig/utils/files/dbms.py +257 -0
- machineconfig/utils/files/headers.py +11 -14
- machineconfig/utils/files/ouch/__init__.py +0 -0
- machineconfig/utils/files/ouch/decompress.py +45 -0
- machineconfig/utils/files/read.py +10 -18
- machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
- machineconfig/utils/installer_utils/install_from_url.py +183 -0
- machineconfig/utils/installer_utils/installer_class.py +64 -181
- machineconfig/utils/installer_utils/installer_cli.py +175 -0
- machineconfig/utils/installer_utils/installer_helper.py +129 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +254 -162
- machineconfig/utils/meta.py +256 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +46 -18
- machineconfig/utils/options_tv.py +119 -0
- machineconfig/utils/path_extended.py +48 -101
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +50 -70
- machineconfig/utils/scheduler.py +88 -124
- machineconfig/utils/scheduling.py +0 -3
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +1 -1
- machineconfig/utils/source_of_truth.py +3 -6
- machineconfig/utils/ssh.py +263 -274
- machineconfig/utils/ssh_utils/abc.py +5 -0
- machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
- machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
- machineconfig/utils/ssh_utils/utils.py +142 -0
- machineconfig/utils/ssh_utils/wsl.py +210 -0
- machineconfig/utils/terminal.py +3 -113
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +114 -28
- machineconfig/utils/ve.py +12 -4
- machineconfig-7.98.dist-info/METADATA +132 -0
- machineconfig-7.98.dist-info/RECORD +504 -0
- machineconfig-7.98.dist-info/entry_points.txt +13 -0
- machineconfig/cluster/sessions_managers/ffile.py +0 -4
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
- machineconfig/jobs/python/python_ve_symlink.py +0 -37
- machineconfig/jobs/python/vscode/api.py +0 -57
- machineconfig/jobs/python/vscode/sync_code.py +0 -73
- machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
- machineconfig/jobs/windows/start_terminal.ps1 +0 -6
- machineconfig/jobs/windows/startup_file.cmd +0 -2
- machineconfig/profile/create.py +0 -303
- machineconfig/profile/shell.py +0 -176
- machineconfig/scripts/cloud/init.sh +0 -119
- machineconfig/scripts/linux/agents +0 -2
- machineconfig/scripts/linux/choose_wezterm_theme +0 -3
- machineconfig/scripts/linux/cloud_copy +0 -2
- machineconfig/scripts/linux/cloud_mount +0 -2
- machineconfig/scripts/linux/cloud_repo_sync +0 -2
- machineconfig/scripts/linux/cloud_sync +0 -2
- machineconfig/scripts/linux/croshell +0 -3
- machineconfig/scripts/linux/devops +0 -2
- machineconfig/scripts/linux/fire +0 -2
- machineconfig/scripts/linux/ftpx +0 -2
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzfag +0 -17
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/fzfrga +0 -21
- machineconfig/scripts/linux/gh_models +0 -2
- machineconfig/scripts/linux/initai +0 -2
- machineconfig/scripts/linux/kill_process +0 -2
- machineconfig/scripts/linux/scheduler +0 -2
- machineconfig/scripts/linux/sessions +0 -2
- machineconfig/scripts/linux/share_smb +0 -1
- machineconfig/scripts/linux/skrg +0 -4
- machineconfig/scripts/linux/start_slidev +0 -2
- machineconfig/scripts/linux/start_terminals +0 -3
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/wifi_conn +0 -2
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/generate_files.py +0 -83
- machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
- machineconfig/scripts/python/cloud_repo_sync.py +0 -190
- machineconfig/scripts/python/count_lines_frontend.py +0 -16
- machineconfig/scripts/python/devops_add_ssh_key.py +0 -120
- machineconfig/scripts/python/dotfile.py +0 -78
- machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
- machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
- machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
- machineconfig/scripts/python/get_zellij_cmd.py +0 -15
- machineconfig/scripts/python/gh_models.py +0 -104
- machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
- machineconfig/scripts/python/repos.py +0 -132
- machineconfig/scripts/python/repos_helper_action.py +0 -378
- machineconfig/scripts/python/snapshot.py +0 -25
- machineconfig/scripts/python/start_terminals.py +0 -121
- machineconfig/scripts/python/t4.py +0 -17
- machineconfig/scripts/windows/agents.ps1 +0 -1
- machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
- machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
- machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
- machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
- machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
- machineconfig/scripts/windows/croshell.ps1 +0 -1
- machineconfig/scripts/windows/devops.ps1 +0 -1
- machineconfig/scripts/windows/dotfile.ps1 +0 -1
- machineconfig/scripts/windows/fire.ps1 +0 -1
- machineconfig/scripts/windows/ftpx.ps1 +0 -1
- machineconfig/scripts/windows/fzfb.ps1 +0 -3
- machineconfig/scripts/windows/fzfg.ps1 +0 -2
- machineconfig/scripts/windows/fzfrga.bat +0 -20
- machineconfig/scripts/windows/gpt.ps1 +0 -1
- machineconfig/scripts/windows/grep.ps1 +0 -2
- machineconfig/scripts/windows/initai.ps1 +0 -1
- machineconfig/scripts/windows/kill_process.ps1 +0 -1
- machineconfig/scripts/windows/nano.ps1 +0 -3
- machineconfig/scripts/windows/pomodoro.ps1 +0 -1
- machineconfig/scripts/windows/reload_path.ps1 +0 -3
- machineconfig/scripts/windows/scheduler.ps1 +0 -1
- machineconfig/scripts/windows/sessions.ps1 +0 -1
- machineconfig/scripts/windows/snapshot.ps1 +0 -1
- machineconfig/scripts/windows/start_slidev.ps1 +0 -1
- machineconfig/scripts/windows/start_terminals.ps1 +0 -1
- machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
- machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
- machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
- machineconfig/settings/lf/windows/tst.ps1 +0 -1
- machineconfig/settings/yazi/yazi.toml +0 -4
- machineconfig/setup_linux/nix/cli_installation.sh +0 -157
- machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
- machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
- machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
- machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
- machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
- machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
- machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
- machineconfig/utils/ai/generate_file_checklist.py +0 -68
- machineconfig/utils/installer_utils/installer.py +0 -189
- machineconfig-5.15.dist-info/METADATA +0 -188
- machineconfig-5.15.dist-info/RECORD +0 -415
- machineconfig-5.15.dist-info/entry_points.txt +0 -18
- machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
- machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
- machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
- machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
- machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_agents/agentic_frameworks/__init__.py} +0 -0
- machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
- machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_cloud/__init__.py} +0 -0
- machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
- /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_croshell/__init__.py} +0 -0
- /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
- /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
- /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
- /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
- /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_devops/themes/__init__.py} +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_network}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_network}/mount_smb +0 -0
- /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
- /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
- /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
- /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
- /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
from datetime import datetime
|
|
3
|
-
import json
|
|
4
|
-
import uuid
|
|
5
3
|
import logging
|
|
6
4
|
import subprocess
|
|
7
5
|
import time
|
|
8
|
-
from
|
|
9
|
-
from typing import Optional, List
|
|
6
|
+
from typing import Optional
|
|
10
7
|
|
|
11
8
|
from rich.console import Console
|
|
12
9
|
|
|
@@ -14,13 +11,13 @@ from machineconfig.cluster.sessions_managers.zellij_utils.monitoring_types impor
|
|
|
14
11
|
from machineconfig.utils.scheduler import Scheduler
|
|
15
12
|
from machineconfig.cluster.sessions_managers.zellij_local import ZellijLayoutGenerator
|
|
16
13
|
from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
|
|
14
|
+
from machineconfig.cluster.sessions_managers.zellij_utils import zellij_local_manager_helper as helper
|
|
17
15
|
|
|
18
16
|
|
|
19
17
|
logging.basicConfig(level=logging.INFO)
|
|
20
18
|
logger = logging.getLogger(__name__)
|
|
21
19
|
console = Console()
|
|
22
20
|
|
|
23
|
-
TMP_SERIALIZATION_DIR = Path.home().joinpath("tmp_results", "session_manager", "zellij", "local_manager")
|
|
24
21
|
|
|
25
22
|
|
|
26
23
|
class ZellijLocalManager:
|
|
@@ -29,22 +26,23 @@ class ZellijLocalManager:
|
|
|
29
26
|
def __init__(self, session_layouts: list[LayoutConfig]):
|
|
30
27
|
self.session_name_prefix = "LocalJobMgr"
|
|
31
28
|
self.session_layouts = session_layouts # Store the original config
|
|
32
|
-
self.managers:
|
|
29
|
+
self.managers: list[ZellijLayoutGenerator] = []
|
|
33
30
|
|
|
34
31
|
# Create a ZellijLayoutGenerator for each session
|
|
35
32
|
for layout_config in session_layouts:
|
|
36
33
|
session_name = layout_config["layoutName"].replace(" ", "_")
|
|
37
|
-
manager = ZellijLayoutGenerator()
|
|
38
34
|
full_session_name = f"{self.session_name_prefix}_{session_name}"
|
|
39
|
-
manager
|
|
35
|
+
manager = ZellijLayoutGenerator(layout_config=layout_config, session_name=full_session_name)
|
|
36
|
+
manager.create_layout_file()
|
|
37
|
+
|
|
40
38
|
self.managers.append(manager)
|
|
41
39
|
|
|
42
40
|
# Enhanced Rich logging for initialization
|
|
43
41
|
console.print(f"[bold green]🔧 Initialized ZellijLocalManager[/bold green] [dim]with[/dim] [bright_green]{len(self.managers)} sessions[/bright_green]")
|
|
44
42
|
|
|
45
|
-
def get_all_session_names(self) ->
|
|
43
|
+
def get_all_session_names(self) -> list[str]:
|
|
46
44
|
"""Get all managed session names."""
|
|
47
|
-
return
|
|
45
|
+
return helper.get_all_session_names(self.managers)
|
|
48
46
|
|
|
49
47
|
def start_all_sessions(self, poll_seconds: float, poll_interval: float) -> dict[str, StartResult]:
|
|
50
48
|
"""Start all zellij sessions with their layouts without blocking on the interactive TUI.
|
|
@@ -66,8 +64,6 @@ class ZellijLocalManager:
|
|
|
66
64
|
for manager in self.managers:
|
|
67
65
|
session_name = manager.session_name
|
|
68
66
|
try:
|
|
69
|
-
if session_name is None:
|
|
70
|
-
continue
|
|
71
67
|
layout_path = manager.layout_path
|
|
72
68
|
if not layout_path:
|
|
73
69
|
results[session_name] = {"success": False, "error": "No layout file path available"}
|
|
@@ -88,6 +84,7 @@ class ZellijLocalManager:
|
|
|
88
84
|
# ZELLIJ_AUTO_ATTACH=0 prevents auto-attach if compiled with that feature; harmless otherwise.
|
|
89
85
|
start_cmd = ["bash", "-lc", f"ZELLIJ_AUTO_ATTACH=0 zellij --layout {layout_path} attach {session_name} --create >/dev/null 2>&1 &"]
|
|
90
86
|
console.print(f"[bold cyan]🚀 Starting session[/bold cyan] [yellow]'{session_name}'[/yellow] with layout [blue]{layout_path}[/blue] (non-blocking)...")
|
|
87
|
+
console.print(f"[dim] Command: {' '.join(start_cmd)}[/dim]")
|
|
91
88
|
subprocess.Popen(start_cmd)
|
|
92
89
|
|
|
93
90
|
# 3. Poll for presence
|
|
@@ -114,23 +111,7 @@ class ZellijLocalManager:
|
|
|
114
111
|
|
|
115
112
|
def kill_all_sessions(self) -> dict[str, StartResult]:
|
|
116
113
|
"""Kill all managed zellij sessions."""
|
|
117
|
-
|
|
118
|
-
for manager in self.managers:
|
|
119
|
-
try:
|
|
120
|
-
session_name = manager.session_name
|
|
121
|
-
if session_name is None:
|
|
122
|
-
continue # Skip managers without a session name
|
|
123
|
-
cmd = f"zellij delete-session --force {session_name}"
|
|
124
|
-
logger.info(f"Killing session '{session_name}'")
|
|
125
|
-
result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=10)
|
|
126
|
-
results[session_name] = {"success": result.returncode == 0, "message": "Session killed" if result.returncode == 0 else result.stderr}
|
|
127
|
-
|
|
128
|
-
except Exception as e:
|
|
129
|
-
# Use a fallback key since session_name might not be defined here
|
|
130
|
-
key = getattr(manager, "session_name", None) or f"manager_{self.managers.index(manager)}"
|
|
131
|
-
results[key] = {"success": False, "error": str(e)}
|
|
132
|
-
|
|
133
|
-
return results
|
|
114
|
+
return helper.kill_all_sessions(self.managers)
|
|
134
115
|
|
|
135
116
|
def attach_to_session(self, session_name: Optional[str]) -> str:
|
|
136
117
|
"""
|
|
@@ -142,20 +123,7 @@ class ZellijLocalManager:
|
|
|
142
123
|
Returns:
|
|
143
124
|
Command string to attach to session(s)
|
|
144
125
|
"""
|
|
145
|
-
|
|
146
|
-
# Find the specific session
|
|
147
|
-
for manager in self.managers:
|
|
148
|
-
if manager.session_name == session_name:
|
|
149
|
-
return f"zellij attach {session_name}"
|
|
150
|
-
raise ValueError(f"Session '{session_name}' not found")
|
|
151
|
-
else:
|
|
152
|
-
# Return commands for all sessions
|
|
153
|
-
commands: list[str] = []
|
|
154
|
-
for manager in self.managers:
|
|
155
|
-
commands.append(f"# Attach to session '{manager.session_name}':")
|
|
156
|
-
commands.append(f"zellij attach {manager.session_name}")
|
|
157
|
-
commands.append("")
|
|
158
|
-
return "\n".join(commands)
|
|
126
|
+
return helper.attach_to_session(self.managers, session_name)
|
|
159
127
|
|
|
160
128
|
def check_all_sessions_status(self) -> dict[str, SessionReport]:
|
|
161
129
|
"""Check the status of all sessions and their commands."""
|
|
@@ -163,11 +131,10 @@ class ZellijLocalManager:
|
|
|
163
131
|
|
|
164
132
|
for manager in self.managers:
|
|
165
133
|
session_name = manager.session_name
|
|
166
|
-
if session_name is None:
|
|
167
|
-
continue # Skip managers without a session name
|
|
168
134
|
|
|
169
|
-
# Get session status
|
|
170
|
-
|
|
135
|
+
# Get session status using the helper function
|
|
136
|
+
from machineconfig.cluster.sessions_managers.zellij_utils.zellij_local_helper import check_zellij_session_status
|
|
137
|
+
session_status = check_zellij_session_status(session_name)
|
|
171
138
|
|
|
172
139
|
# Get commands status for this session
|
|
173
140
|
commands_status = manager.check_all_commands_status()
|
|
@@ -245,7 +212,7 @@ class ZellijLocalManager:
|
|
|
245
212
|
|
|
246
213
|
if cmd_status.get("processes"):
|
|
247
214
|
for proc in cmd_status["processes"][:2]: # Show first 2 processes
|
|
248
|
-
print(f" └─ PID {proc['pid']}: {proc['name']} ({proc['status']})")
|
|
215
|
+
console.print(f" [dim]└─[/dim] PID {proc['pid']}: {proc['name']} ({proc['status']})")
|
|
249
216
|
print()
|
|
250
217
|
|
|
251
218
|
print("=" * 80)
|
|
@@ -309,148 +276,36 @@ class ZellijLocalManager:
|
|
|
309
276
|
print(f"📊 Quick Summary: {global_summary['running_commands']}/{global_summary['total_commands']} commands running across {global_summary['healthy_sessions']}/{global_summary['total_sessions']} sessions")
|
|
310
277
|
|
|
311
278
|
logger.info(f"Starting monitoring routine with {wait_ms}ms intervals")
|
|
312
|
-
|
|
279
|
+
from machineconfig.utils.scheduler import LoggerTemplate
|
|
280
|
+
from typing import cast
|
|
281
|
+
sched = Scheduler(routine=routine, wait_ms=wait_ms, logger=cast(LoggerTemplate, logger))
|
|
313
282
|
sched.run()
|
|
314
283
|
|
|
315
284
|
def save(self, session_id: Optional[str]) -> str:
|
|
316
285
|
"""Save the manager state to disk."""
|
|
317
|
-
|
|
318
|
-
session_id = str(uuid.uuid4())[:8]
|
|
319
|
-
|
|
320
|
-
# Create session directory
|
|
321
|
-
session_dir = TMP_SERIALIZATION_DIR / session_id
|
|
322
|
-
session_dir.mkdir(parents=True, exist_ok=True)
|
|
323
|
-
|
|
324
|
-
# Save the session_layouts configuration
|
|
325
|
-
config_file = session_dir / "session_layouts.json"
|
|
326
|
-
text = json.dumps(self.session_layouts, indent=2, ensure_ascii=False)
|
|
327
|
-
config_file.write_text(text, encoding="utf-8")
|
|
328
|
-
|
|
329
|
-
# Save metadata
|
|
330
|
-
metadata = {"session_name_prefix": self.session_name_prefix, "created_at": str(datetime.now()), "num_managers": len(self.managers), "sessions": [item["layoutName"] for item in self.session_layouts], "manager_type": "ZellijLocalManager"}
|
|
331
|
-
metadata_file = session_dir / "metadata.json"
|
|
332
|
-
text = json.dumps(metadata, indent=2, ensure_ascii=False)
|
|
333
|
-
metadata_file.write_text(text, encoding="utf-8")
|
|
334
|
-
|
|
335
|
-
# Save each manager's state
|
|
336
|
-
managers_dir = session_dir / "managers"
|
|
337
|
-
managers_dir.mkdir(exist_ok=True)
|
|
338
|
-
|
|
339
|
-
for i, manager in enumerate(self.managers):
|
|
340
|
-
manager_data = {"session_name": manager.session_name, "layout_config": manager.layout_config, "layout_path": manager.layout_path}
|
|
341
|
-
manager_file = managers_dir / f"manager_{i}_{manager.session_name}.json"
|
|
342
|
-
text = json.dumps(manager_data, indent=2, ensure_ascii=False)
|
|
343
|
-
manager_file.write_text(text, encoding="utf-8")
|
|
344
|
-
|
|
345
|
-
logger.info(f"✅ Saved ZellijLocalManager session to: {session_dir}")
|
|
346
|
-
return session_id
|
|
286
|
+
return helper.save_manager(self.session_layouts, self.managers, self.session_name_prefix, session_id)
|
|
347
287
|
|
|
348
288
|
@classmethod
|
|
349
289
|
def load(cls, session_id: str) -> "ZellijLocalManager":
|
|
350
290
|
"""Load a saved manager state from disk."""
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
if not session_dir.exists():
|
|
354
|
-
raise FileNotFoundError(f"Session directory not found: {session_dir}")
|
|
355
|
-
|
|
356
|
-
# Load configuration
|
|
357
|
-
config_file = session_dir / "session_layouts.json"
|
|
358
|
-
if not config_file.exists():
|
|
359
|
-
raise FileNotFoundError(f"Configuration file not found: {config_file}")
|
|
360
|
-
|
|
361
|
-
text = config_file.read_text(encoding="utf-8")
|
|
362
|
-
session_layouts = json.loads(text)
|
|
363
|
-
|
|
364
|
-
# Create new instance
|
|
291
|
+
session_layouts, managers = helper.load_manager(session_id)
|
|
365
292
|
instance = cls(session_layouts=session_layouts)
|
|
366
|
-
|
|
367
|
-
# Load saved manager states
|
|
368
|
-
managers_dir = session_dir / "managers"
|
|
369
|
-
if managers_dir.exists():
|
|
370
|
-
instance.managers = []
|
|
371
|
-
manager_files = sorted(managers_dir.glob("manager_*.json"))
|
|
372
|
-
|
|
373
|
-
for manager_file in manager_files:
|
|
374
|
-
try:
|
|
375
|
-
text = manager_file.read_text(encoding="utf-8")
|
|
376
|
-
manager_data = json.loads(text)
|
|
377
|
-
|
|
378
|
-
# Recreate the manager
|
|
379
|
-
manager = ZellijLayoutGenerator()
|
|
380
|
-
manager.session_name = manager_data["session_name"]
|
|
381
|
-
manager.layout_config = manager_data["layout_config"]
|
|
382
|
-
manager.layout_path = manager_data["layout_path"]
|
|
383
|
-
|
|
384
|
-
instance.managers.append(manager)
|
|
385
|
-
|
|
386
|
-
except Exception as e:
|
|
387
|
-
logger.warning(f"Failed to load manager from {manager_file}: {e}")
|
|
388
|
-
|
|
389
|
-
logger.info(f"✅ Loaded ZellijLocalManager session from: {session_dir}")
|
|
293
|
+
instance.managers = managers
|
|
390
294
|
return instance
|
|
391
295
|
|
|
392
296
|
@staticmethod
|
|
393
|
-
def list_saved_sessions() ->
|
|
297
|
+
def list_saved_sessions() -> list[str]:
|
|
394
298
|
"""List all saved session IDs."""
|
|
395
|
-
|
|
396
|
-
return []
|
|
397
|
-
|
|
398
|
-
sessions = []
|
|
399
|
-
for item in TMP_SERIALIZATION_DIR.iterdir():
|
|
400
|
-
if item.is_dir() and (item / "metadata.json").exists():
|
|
401
|
-
sessions.append(item.name)
|
|
402
|
-
|
|
403
|
-
return sorted(sessions)
|
|
299
|
+
return helper.list_saved_sessions()
|
|
404
300
|
|
|
405
301
|
@staticmethod
|
|
406
302
|
def delete_session(session_id: str) -> bool:
|
|
407
303
|
"""Delete a saved session."""
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
if not session_dir.exists():
|
|
411
|
-
logger.warning(f"Session directory not found: {session_dir}")
|
|
412
|
-
return False
|
|
413
|
-
|
|
414
|
-
try:
|
|
415
|
-
import shutil
|
|
416
|
-
|
|
417
|
-
shutil.rmtree(session_dir)
|
|
418
|
-
logger.info(f"✅ Deleted session: {session_id}")
|
|
419
|
-
return True
|
|
420
|
-
except Exception as e:
|
|
421
|
-
logger.error(f"Failed to delete session {session_id}: {e}")
|
|
422
|
-
return False
|
|
304
|
+
return helper.delete_session(session_id)
|
|
423
305
|
|
|
424
306
|
def list_active_sessions(self) -> list[ActiveSessionInfo]:
|
|
425
307
|
"""List currently active zellij sessions managed by this instance."""
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
try:
|
|
429
|
-
# Get all running zellij sessions
|
|
430
|
-
result = subprocess.run(["zellij", "list-sessions"], capture_output=True, text=True, timeout=10)
|
|
431
|
-
|
|
432
|
-
if result.returncode == 0:
|
|
433
|
-
all_sessions = result.stdout.strip().split("\n") if result.stdout.strip() else []
|
|
434
|
-
|
|
435
|
-
# Filter to only our managed sessions
|
|
436
|
-
for manager in self.managers:
|
|
437
|
-
session_name = manager.session_name
|
|
438
|
-
if session_name is None:
|
|
439
|
-
continue # Skip managers without a session name
|
|
440
|
-
is_active = any(session_name in session for session in all_sessions)
|
|
441
|
-
|
|
442
|
-
tab_info = []
|
|
443
|
-
tab_count = 0
|
|
444
|
-
if manager.layout_config:
|
|
445
|
-
tab_count = len(manager.layout_config["layoutTabs"])
|
|
446
|
-
tab_info = [tab["tabName"] for tab in manager.layout_config["layoutTabs"]]
|
|
447
|
-
|
|
448
|
-
active_sessions.append({"session_name": session_name, "is_active": is_active, "tab_count": tab_count, "tabs": tab_info})
|
|
449
|
-
|
|
450
|
-
except Exception as e:
|
|
451
|
-
logger.error(f"Error listing active sessions: {e}")
|
|
452
|
-
|
|
453
|
-
return active_sessions
|
|
308
|
+
return helper.list_active_sessions(self.managers)
|
|
454
309
|
|
|
455
310
|
|
|
456
311
|
if __name__ == "__main__":
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
from typing import
|
|
2
|
+
from typing import Optional, Any
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
import logging
|
|
5
5
|
import json
|
|
@@ -22,10 +22,10 @@ TMP_LAYOUT_DIR = Path.home().joinpath("tmp_results", "zellij_layouts", "layout_m
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
class ZellijRemoteLayoutGenerator:
|
|
25
|
-
def __init__(self, remote_name: str,
|
|
26
|
-
self.remote_name = remote_name
|
|
27
|
-
self.session_name =
|
|
28
|
-
self.layout_config:
|
|
25
|
+
def __init__(self, layout_config: LayoutConfig, remote_name: str, session_name: str):
|
|
26
|
+
self.remote_name: str = remote_name
|
|
27
|
+
self.session_name: str = session_name
|
|
28
|
+
self.layout_config: LayoutConfig = layout_config.copy()
|
|
29
29
|
self.layout_path: Optional[str] = None
|
|
30
30
|
|
|
31
31
|
# Initialize modular components
|
|
@@ -35,23 +35,27 @@ class ZellijRemoteLayoutGenerator:
|
|
|
35
35
|
self.session_manager = SessionManager(self.remote_executor, self.session_name, TMP_LAYOUT_DIR)
|
|
36
36
|
self.status_reporter = StatusReporter(self.process_monitor, self.session_manager)
|
|
37
37
|
|
|
38
|
-
def
|
|
38
|
+
def create_layout_file(self) -> bool:
|
|
39
|
+
"""Create Zellij layout file and return success status."""
|
|
39
40
|
# Enhanced Rich logging for remote layout creation
|
|
40
|
-
tab_count = len(layout_config["layoutTabs"])
|
|
41
|
-
layout_name = layout_config["layoutName"]
|
|
41
|
+
tab_count = len(self.layout_config["layoutTabs"])
|
|
42
|
+
layout_name = self.layout_config["layoutName"]
|
|
42
43
|
console.print(f"[bold cyan]📋 Creating Zellij layout[/bold cyan] [bright_green]'{layout_name}' with {tab_count} tabs[/bright_green] [magenta]for remote[/magenta] [bold yellow]'{self.remote_name}'[/bold yellow]")
|
|
43
44
|
|
|
44
45
|
# Display tab summary for remote
|
|
45
|
-
for tab in layout_config["layoutTabs"]:
|
|
46
|
+
for tab in self.layout_config["layoutTabs"]:
|
|
46
47
|
console.print(f" [yellow]→[/yellow] [bold]{tab['tabName']}[/bold] [dim]in[/dim] [blue]{tab['startDir']}[/blue] [dim]on[/dim] [yellow]{self.remote_name}[/yellow]")
|
|
47
48
|
|
|
48
|
-
self.layout_config =
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
49
|
+
layout_content = self.layout_generator.create_layout_file(self.layout_config, session_name=self.session_name)
|
|
50
|
+
|
|
51
|
+
# Write to file
|
|
52
|
+
TMP_LAYOUT_DIR.mkdir(parents=True, exist_ok=True)
|
|
53
|
+
layout_file = TMP_LAYOUT_DIR / f"zellij_layout_{self.session_name}.kdl"
|
|
54
|
+
layout_file.write_text(layout_content, encoding="utf-8")
|
|
55
|
+
self.layout_path = str(layout_file.absolute())
|
|
56
|
+
|
|
57
|
+
console.print(f"[bold green]✅ Remote layout created:[/bold green] [cyan]{self.layout_path}[/cyan]")
|
|
58
|
+
return True
|
|
55
59
|
|
|
56
60
|
# Static methods for backward compatibility
|
|
57
61
|
@staticmethod
|
|
@@ -59,10 +63,10 @@ class ZellijRemoteLayoutGenerator:
|
|
|
59
63
|
executor = RemoteExecutor(remote_name)
|
|
60
64
|
return executor.run_command(command, timeout)
|
|
61
65
|
|
|
62
|
-
def to_dict(self) ->
|
|
66
|
+
def to_dict(self) -> dict[str, Any]:
|
|
63
67
|
return {"remote_name": self.remote_name, "session_name": self.session_name, "layout_config": self.layout_config, "layout_path": self.layout_path, "created_at": datetime.now().isoformat(), "class_name": self.__class__.__name__}
|
|
64
68
|
|
|
65
|
-
def to_json(self, file_path: Optional[
|
|
69
|
+
def to_json(self, file_path: Optional[str | Path]) -> str:
|
|
66
70
|
# Generate file path if not provided
|
|
67
71
|
if file_path is None:
|
|
68
72
|
random_id = str(uuid.uuid4())[:8]
|
|
@@ -89,7 +93,7 @@ class ZellijRemoteLayoutGenerator:
|
|
|
89
93
|
return str(file_path_obj)
|
|
90
94
|
|
|
91
95
|
@classmethod
|
|
92
|
-
def from_json(cls, file_path:
|
|
96
|
+
def from_json(cls, file_path: str | Path) -> "ZellijRemoteLayoutGenerator":
|
|
93
97
|
file_path = Path(file_path)
|
|
94
98
|
|
|
95
99
|
# Ensure .json extension
|
|
@@ -108,25 +112,18 @@ class ZellijRemoteLayoutGenerator:
|
|
|
108
112
|
logger.warning(f"Class name mismatch: expected {cls.__name__}, got {data.get('class_name')}")
|
|
109
113
|
|
|
110
114
|
# Create new instance
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
session_name_prefix = session_name
|
|
117
|
-
|
|
118
|
-
instance = cls(remote_name=data["remote_name"], session_name_prefix=session_name_prefix)
|
|
119
|
-
|
|
120
|
-
# Restore state
|
|
121
|
-
instance.session_name = data["session_name"]
|
|
122
|
-
instance.layout_config = data["layout_config"]
|
|
115
|
+
instance = cls(
|
|
116
|
+
layout_config=data["layout_config"],
|
|
117
|
+
remote_name=data["remote_name"],
|
|
118
|
+
session_name=data["session_name"]
|
|
119
|
+
)
|
|
123
120
|
instance.layout_path = data["layout_path"]
|
|
124
121
|
|
|
125
122
|
logger.info(f"✅ Loaded ZellijRemoteLayoutGenerator from: {file_path}")
|
|
126
123
|
return instance
|
|
127
124
|
|
|
128
125
|
@staticmethod
|
|
129
|
-
def list_saved_sessions(directory_path: Optional[
|
|
126
|
+
def list_saved_sessions(directory_path: Optional[str | Path]) -> list[str]:
|
|
130
127
|
if directory_path is None:
|
|
131
128
|
directory_path = Path.home() / "tmp_results" / "zellij_sessions" / "serialized"
|
|
132
129
|
else:
|
|
@@ -144,8 +141,8 @@ if __name__ == "__main__":
|
|
|
144
141
|
sample_layout: LayoutConfig = {
|
|
145
142
|
"layoutName": "RemoteBots",
|
|
146
143
|
"layoutTabs": [
|
|
147
|
-
{"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "
|
|
148
|
-
{"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "
|
|
144
|
+
{"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "fire -mO go1.py bot1 -- --create_new_bot=True"},
|
|
145
|
+
{"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "fire -mO go2.py bot2 -- --create_new_bot=True"},
|
|
149
146
|
{"tabName": "📊Monitor", "startDir": "~", "command": "htop"},
|
|
150
147
|
{"tabName": "📝Logs", "startDir": "/var/log", "command": "tail -f /var/log/app.log"},
|
|
151
148
|
],
|
|
@@ -157,9 +154,14 @@ if __name__ == "__main__":
|
|
|
157
154
|
|
|
158
155
|
try:
|
|
159
156
|
# Create layout using the remote generator
|
|
160
|
-
generator = ZellijRemoteLayoutGenerator(
|
|
161
|
-
|
|
162
|
-
|
|
157
|
+
generator = ZellijRemoteLayoutGenerator(
|
|
158
|
+
layout_config=sample_layout,
|
|
159
|
+
remote_name=remote_name,
|
|
160
|
+
session_name=session_name
|
|
161
|
+
)
|
|
162
|
+
generator.create_layout_file()
|
|
163
|
+
|
|
164
|
+
print(f"✅ Remote layout created successfully: {generator.layout_path}")
|
|
163
165
|
|
|
164
166
|
# Demonstrate serialization
|
|
165
167
|
print("\n💾 Demonstrating serialization...")
|
|
@@ -179,10 +181,7 @@ if __name__ == "__main__":
|
|
|
179
181
|
|
|
180
182
|
# Demonstrate status checking
|
|
181
183
|
print(f"\n🔍 Checking command status on remote '{remote_name}':")
|
|
182
|
-
|
|
183
|
-
console.print("[bold red]❌ No layout config available[/bold red]")
|
|
184
|
-
else:
|
|
185
|
-
generator.status_reporter.print_status_report(generator.layout_config)
|
|
184
|
+
generator.status_reporter.print_status_report(generator.layout_config)
|
|
186
185
|
|
|
187
186
|
# Start the session (uncomment to actually start)
|
|
188
187
|
# start_result = generator.start_zellij_session()
|
|
@@ -2,7 +2,7 @@ from datetime import datetime
|
|
|
2
2
|
import json
|
|
3
3
|
import uuid
|
|
4
4
|
from pathlib import Path
|
|
5
|
-
from typing import Optional
|
|
5
|
+
from typing import Optional
|
|
6
6
|
from machineconfig.utils.scheduler import Scheduler
|
|
7
7
|
from machineconfig.cluster.sessions_managers.zellij_local import run_command_in_zellij_tab
|
|
8
8
|
from machineconfig.cluster.sessions_managers.zellij_remote import ZellijRemoteLayoutGenerator
|
|
@@ -10,18 +10,24 @@ from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
|
|
|
10
10
|
from machineconfig.logger import get_logger
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
TMP_SERIALIAZATION_DIR = Path.home().joinpath("tmp_results", "session_manager", "zellij", "remote_manager")
|
|
14
13
|
logger = get_logger("cluster.sessions_managers.zellij_remote_manager")
|
|
14
|
+
TMP_SERIALIAZATION_DIR = Path.home() / "tmp_results" / "zellij_sessions" / "serialized"
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class ZellijSessionManager:
|
|
18
|
-
def __init__(self, machine_layouts:
|
|
18
|
+
def __init__(self, machine_layouts: dict[str, LayoutConfig], session_name_prefix: str):
|
|
19
19
|
self.session_name_prefix = session_name_prefix
|
|
20
20
|
self.machine_layouts = machine_layouts # Store the original config
|
|
21
21
|
self.managers: list[ZellijRemoteLayoutGenerator] = []
|
|
22
22
|
for machine, layout_config in machine_layouts.items():
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
from machineconfig.cluster.sessions_managers.zellij_utils.layout_generator import LayoutGenerator
|
|
24
|
+
session_name = f"{self.session_name_prefix}_{LayoutGenerator.generate_random_suffix(8)}"
|
|
25
|
+
an_m = ZellijRemoteLayoutGenerator(
|
|
26
|
+
layout_config=layout_config,
|
|
27
|
+
remote_name=machine,
|
|
28
|
+
session_name=session_name
|
|
29
|
+
)
|
|
30
|
+
an_m.create_layout_file()
|
|
25
31
|
self.managers.append(an_m)
|
|
26
32
|
|
|
27
33
|
def ssh_to_all_machines(self) -> str:
|
|
@@ -51,10 +57,7 @@ class ZellijSessionManager:
|
|
|
51
57
|
if scheduler.cycle % 2 == 0:
|
|
52
58
|
statuses = []
|
|
53
59
|
for _idx, an_m in enumerate(self.managers):
|
|
54
|
-
|
|
55
|
-
a_status = {}
|
|
56
|
-
else:
|
|
57
|
-
a_status = an_m.process_monitor.check_all_commands_status(an_m.layout_config)
|
|
60
|
+
a_status = an_m.process_monitor.check_all_commands_status(an_m.layout_config)
|
|
58
61
|
statuses.append(a_status)
|
|
59
62
|
keys = []
|
|
60
63
|
for item in statuses:
|
|
@@ -71,7 +74,7 @@ class ZellijSessionManager:
|
|
|
71
74
|
# Check if all stopped
|
|
72
75
|
running_count = sum(1 for item in status_data if item.get("status", {}).get("running", False))
|
|
73
76
|
if running_count == 0: # they all stopped
|
|
74
|
-
|
|
77
|
+
scheduler.max_cycles = scheduler.cycle # stop the scheduler from calling this routine again
|
|
75
78
|
|
|
76
79
|
# Print status
|
|
77
80
|
for item in status_data:
|
|
@@ -85,8 +88,9 @@ class ZellijSessionManager:
|
|
|
85
88
|
# Print statuses
|
|
86
89
|
for i, status in enumerate(statuses):
|
|
87
90
|
print(f"Manager {i}: {status}")
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
from machineconfig.utils.scheduler import LoggerTemplate
|
|
92
|
+
from typing import cast
|
|
93
|
+
sched = Scheduler(routine=routine, wait_ms=60_000, logger=cast(LoggerTemplate, logger))
|
|
90
94
|
sched.run()
|
|
91
95
|
|
|
92
96
|
def save(self, session_id: Optional[str]) -> str:
|
|
@@ -17,8 +17,8 @@ def example_usage():
|
|
|
17
17
|
sample_layout: LayoutConfig = {
|
|
18
18
|
"layoutName": "ExampleRemoteSession",
|
|
19
19
|
"layoutTabs": [
|
|
20
|
-
{"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "
|
|
21
|
-
{"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "
|
|
20
|
+
{"tabName": "🤖Bot1", "startDir": "~/code/bytesense/bithence", "command": "fire -mO go1.py bot1 -- --create_new_bot=True"},
|
|
21
|
+
{"tabName": "🤖Bot2", "startDir": "~/code/bytesense/bithence", "command": "fire -mO go2.py bot2 -- --create_new_bot=True"},
|
|
22
22
|
{"tabName": "📊Monitor", "startDir": "~", "command": "htop"},
|
|
23
23
|
{"tabName": "📝Logs", "startDir": "/var/log", "command": "tail -f /var/log/app.log"},
|
|
24
24
|
],
|
|
@@ -30,12 +30,8 @@ def example_usage():
|
|
|
30
30
|
|
|
31
31
|
try:
|
|
32
32
|
# Create layout using the remote generator
|
|
33
|
-
generator = ZellijRemoteLayoutGenerator(remote_name=remote_name,
|
|
34
|
-
|
|
35
|
-
# Create layout file
|
|
36
|
-
layout_path = generator.create_zellij_layout(sample_layout, None)
|
|
37
|
-
print(f"✅ Remote layout created successfully: {layout_path}")
|
|
38
|
-
|
|
33
|
+
generator = ZellijRemoteLayoutGenerator(remote_name=remote_name, session_name=session_name, layout_config=sample_layout)
|
|
34
|
+
generator.create_layout_file()
|
|
39
35
|
# Preview the layout content
|
|
40
36
|
preview = generator.layout_generator.generate_layout_content(sample_layout)
|
|
41
37
|
print(f"📄 Layout preview:\n{preview}")
|
|
@@ -7,7 +7,6 @@ import shlex
|
|
|
7
7
|
import random
|
|
8
8
|
import string
|
|
9
9
|
from typing import List, Tuple
|
|
10
|
-
from pathlib import Path
|
|
11
10
|
import logging
|
|
12
11
|
|
|
13
12
|
from rich.console import Console
|
|
@@ -116,26 +115,12 @@ class LayoutGenerator:
|
|
|
116
115
|
|
|
117
116
|
return layout_content
|
|
118
117
|
|
|
119
|
-
def create_layout_file(self, layout_config: LayoutConfig,
|
|
120
|
-
"""Create
|
|
118
|
+
def create_layout_file(self, layout_config: LayoutConfig, session_name: str) -> str:
|
|
119
|
+
"""Create layout content and return it as string."""
|
|
121
120
|
self.validate_tab_config(layout_config)
|
|
122
121
|
|
|
123
|
-
# Generate unique suffix for this layout
|
|
124
|
-
random_suffix = self.generate_random_suffix(8)
|
|
125
122
|
layout_content = self.generate_layout_content(layout_config)
|
|
126
123
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
layout_file = output_dir / f"zellij_layout_{session_name}_{random_suffix}.kdl"
|
|
131
|
-
|
|
132
|
-
# Write layout file
|
|
133
|
-
layout_file.write_text(layout_content, encoding="utf-8")
|
|
134
|
-
|
|
135
|
-
# Enhanced Rich logging
|
|
136
|
-
console.print(f"[bold green]✅ Zellij layout file created:[/bold green] [cyan]{layout_file.absolute()}[/cyan]")
|
|
137
|
-
return str(layout_file.absolute())
|
|
138
|
-
|
|
139
|
-
except OSError as e:
|
|
140
|
-
logger.error(f"Failed to create layout file: {e}")
|
|
141
|
-
raise
|
|
124
|
+
# Enhanced Rich logging
|
|
125
|
+
console.print("[bold green]✅ Zellij layout content generated[/bold green]")
|
|
126
|
+
return layout_content
|
|
@@ -51,12 +51,10 @@ class ProcessMonitor:
|
|
|
51
51
|
return {"status": "unknown", "error": f"Tab '{tab_name}' not found in layout config", "running": False, "command": "", "tab_name": tab_name, "processes": [], "remote": self.remote_executor.remote_name}
|
|
52
52
|
|
|
53
53
|
command = tab_config["command"]
|
|
54
|
-
|
|
55
54
|
try:
|
|
56
55
|
check_script = self._create_process_check_script(command)
|
|
57
|
-
remote_cmd = f"$HOME
|
|
56
|
+
remote_cmd = f"$HOME/.local/bin devops self python -c {shlex.quote(check_script)}"
|
|
58
57
|
result = self.remote_executor.run_command(remote_cmd, timeout=15)
|
|
59
|
-
|
|
60
58
|
if result.returncode == 0:
|
|
61
59
|
try:
|
|
62
60
|
matching_processes = json.loads(result.stdout.strip())
|
|
@@ -127,16 +125,12 @@ if __name__ == "__main__":
|
|
|
127
125
|
|
|
128
126
|
def force_fresh_process_check(self, tab_name: str, layout_config: LayoutConfig) -> CommandStatus:
|
|
129
127
|
"""Force a fresh process check with additional validation."""
|
|
130
|
-
# Find the tab with the given name
|
|
131
|
-
tab_config = None
|
|
132
128
|
for tab in layout_config["layoutTabs"]:
|
|
133
129
|
if tab["tabName"] == tab_name:
|
|
134
130
|
tab_config = tab
|
|
135
131
|
break
|
|
136
|
-
|
|
137
|
-
if tab_config is None:
|
|
132
|
+
else:
|
|
138
133
|
return {"status": "unknown", "error": f"Tab '{tab_name}' not found in layout config", "running": False, "command": "", "tab_name": tab_name, "processes": [], "remote": self.remote_executor.remote_name}
|
|
139
|
-
|
|
140
134
|
command = tab_config["command"]
|
|
141
135
|
|
|
142
136
|
try:
|
|
@@ -145,7 +139,7 @@ if __name__ == "__main__":
|
|
|
145
139
|
check_timestamp = timestamp_result.stdout.strip() if timestamp_result.returncode == 0 else "unknown"
|
|
146
140
|
|
|
147
141
|
check_script = self._create_fresh_check_script(command)
|
|
148
|
-
remote_cmd = f"$HOME
|
|
142
|
+
remote_cmd = f"$HOME/.local/bin/devops self python -c {shlex.quote(check_script)}"
|
|
149
143
|
result = self.remote_executor.run_command(remote_cmd, timeout=15)
|
|
150
144
|
|
|
151
145
|
if result.returncode == 0:
|
|
@@ -5,11 +5,13 @@ Status reporting utilities for Zellij remote layouts.
|
|
|
5
5
|
|
|
6
6
|
import logging
|
|
7
7
|
from typing import Dict, Any
|
|
8
|
+
from rich.console import Console
|
|
8
9
|
from machineconfig.cluster.sessions_managers.zellij_utils.process_monitor import ProcessMonitor
|
|
9
10
|
from machineconfig.cluster.sessions_managers.zellij_utils.session_manager import SessionManager
|
|
10
11
|
from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
|
|
11
12
|
|
|
12
13
|
logger = logging.getLogger(__name__)
|
|
14
|
+
console = Console()
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
class StatusReporter:
|
|
@@ -70,7 +72,7 @@ class StatusReporter:
|
|
|
70
72
|
print(f"✅ {tab_name}: Running on {remote_name}")
|
|
71
73
|
if cmd_status.get("processes"):
|
|
72
74
|
for proc in cmd_status["processes"][:2]: # Show first 2 processes
|
|
73
|
-
print(f" └─ PID {proc['pid']}: {proc['name']} ({proc['status']})")
|
|
75
|
+
console.print(f" [dim]└─[/dim] PID {proc['pid']}: {proc['name']} ({proc['status']})")
|
|
74
76
|
else:
|
|
75
77
|
print(f"❌ {tab_name}: Not running on {remote_name}")
|
|
76
78
|
print(f" Command: {cmd_status.get('command', 'Unknown')}")
|