machineconfig 7.98__py3-none-any.whl → 8.51__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/cluster/remote/run_cluster.py +1 -1
- machineconfig/cluster/remote/run_remote.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +10 -8
- machineconfig/cluster/sessions_managers/wt_local.py +1 -1
- machineconfig/cluster/sessions_managers/wt_local_manager.py +1 -1
- machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +1 -1
- machineconfig/jobs/installer/checks/check_installations.py +133 -0
- machineconfig/jobs/installer/checks/install_utils.py +132 -0
- machineconfig/jobs/installer/checks/report_utils.py +39 -0
- machineconfig/jobs/installer/checks/vt_utils.py +89 -0
- machineconfig/jobs/installer/installer_data.json +271 -152
- machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
- machineconfig/jobs/installer/package_groups.py +11 -9
- machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +1 -2
- machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +1 -1
- machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +10 -8
- machineconfig/jobs/installer/{custom → python_scripts}/hx.py +30 -13
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +1 -1
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +6 -5
- machineconfig/jobs/installer/{custom_dev → python_scripts}/sysabc.py +26 -20
- machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +1 -1
- machineconfig/jobs/installer/{custom → python_scripts}/yazi.py +39 -19
- machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
- machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
- machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
- machineconfig/jobs/scripts_dynamic/a.py +428 -0
- machineconfig/logger.py +1 -1
- machineconfig/profile/create_helper.py +21 -10
- machineconfig/profile/create_links.py +77 -20
- machineconfig/profile/create_links_export.py +63 -58
- machineconfig/profile/create_shell_profile.py +14 -0
- machineconfig/profile/mapper_data.toml +45 -0
- machineconfig/profile/mapper_dotfiles.toml +249 -0
- machineconfig/scripts/python/agents.py +76 -171
- machineconfig/scripts/python/ai/initai.py +3 -1
- machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
- machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
- machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +29 -0
- machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
- machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
- machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
- machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
- machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
- machineconfig/scripts/python/ai/utils/vscode_tasks.py +6 -3
- machineconfig/scripts/python/cloud.py +58 -11
- machineconfig/scripts/python/croshell.py +4 -155
- machineconfig/scripts/python/devops.py +57 -38
- machineconfig/scripts/python/devops_navigator.py +17 -3
- machineconfig/scripts/python/fire_jobs.py +10 -193
- machineconfig/scripts/python/ftpx.py +5 -224
- machineconfig/scripts/python/graph/cli_graph.json +8743 -0
- machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
- machineconfig/scripts/python/{env_manager → helpers/helper_env}/env_manager_tui.py +1 -1
- machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.py +1 -1
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +1 -1
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_gemini.py +1 -1
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_qwen.py +1 -1
- machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_launch.py +10 -7
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
- machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.sh +3 -1
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +6 -6
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +10 -5
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +4 -4
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +7 -6
- machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +67 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_nw.py +69 -82
- machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +47 -22
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_file.py +44 -30
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_server.py +26 -43
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_terminal.py +12 -6
- machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +12 -6
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
- machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +64 -50
- machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
- machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
- machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +3 -3
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/file_wrangler.py +1 -0
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
- machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +3 -3
- machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
- machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_linux/fzfg +4 -3
- machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
- machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_windows/fzfg.ps1 +1 -1
- machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
- machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
- machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
- machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/address.py +52 -10
- machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
- machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
- machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_ssh.py +2 -2
- machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +118 -34
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +3 -2
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -13
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_2.py +63 -19
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
- machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
- machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +186 -0
- machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -2
- machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
- machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/download.py +1 -1
- machineconfig/scripts/python/{helpers_devops/cli_utils.py → helpers/helpers_utils/pdf.py} +2 -2
- machineconfig/scripts/python/{helpers_utils/path.py → helpers/helpers_utils/python.py} +65 -40
- machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
- machineconfig/scripts/python/mcfg_entry.py +133 -48
- machineconfig/scripts/python/msearch.py +16 -61
- machineconfig/scripts/python/sessions.py +68 -203
- machineconfig/scripts/python/terminal.py +27 -102
- machineconfig/scripts/python/utils.py +101 -22
- machineconfig/settings/atuin/config.toml +294 -0
- machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
- machineconfig/settings/linters/.ruff.toml +2 -1
- machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
- machineconfig/settings/shells/bash/init.sh +6 -3
- machineconfig/settings/shells/nushell/config.nu +23 -1
- machineconfig/settings/shells/nushell/env.nu +22 -48
- machineconfig/settings/shells/nushell/init.nu +64 -240
- machineconfig/settings/shells/pwsh/init.ps1 +69 -1
- machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +4 -1
- machineconfig/settings/shells/wt/settings.json +21 -21
- machineconfig/settings/shells/zsh/init.sh +25 -4
- machineconfig/settings/television/cable_unix/bash-history.toml +1 -1
- machineconfig/settings/television/cable_windows/pwsh-history.toml +1 -1
- machineconfig/settings/tv/config.toml +234 -0
- machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
- machineconfig/settings/wsl/.wslconfig +5 -30
- machineconfig/settings/wt/__init__.py +0 -0
- machineconfig/settings/yazi/yazi_linux.toml +18 -8
- machineconfig/settings/zellij/layouts/st.kdl +40 -9
- machineconfig/settings/zellij/layouts/st2.kdl +1 -1
- machineconfig/setup_linux/__init__.py +0 -1
- machineconfig/setup_linux/apps_desktop.sh +8 -27
- machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
- machineconfig/setup_linux/web_shortcuts/live_from_github.sh +3 -0
- machineconfig/setup_mac/__init__.py +0 -2
- machineconfig/setup_windows/__init__.py +2 -5
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +14 -13
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +4 -3
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +3 -3
- machineconfig/type_hinting/sql/__init__.py +1 -0
- machineconfig/type_hinting/sql/base.py +216 -0
- machineconfig/type_hinting/sql/core_schema.py +64 -0
- machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
- machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
- machineconfig/type_hinting/typedict/__init__.py +1 -0
- machineconfig/type_hinting/typedict/ast_utils.py +130 -0
- machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
- machineconfig/type_hinting/typedict/generators.py +231 -0
- machineconfig/type_hinting/typedict/polars_schema.py +24 -0
- machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
- machineconfig/utils/accessories.py +24 -0
- machineconfig/utils/code.py +78 -33
- machineconfig/utils/files/ascii_art.py +10 -14
- machineconfig/utils/files/headers.py +3 -5
- machineconfig/utils/files/read.py +8 -1
- machineconfig/utils/installer_utils/github_release_bulk.py +11 -91
- machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
- machineconfig/utils/installer_utils/install_from_url.py +1 -1
- machineconfig/utils/installer_utils/installer_class.py +12 -4
- machineconfig/utils/installer_utils/installer_cli.py +1 -15
- machineconfig/utils/installer_utils/installer_helper.py +2 -2
- machineconfig/utils/installer_utils/installer_locator_utils.py +13 -13
- machineconfig/utils/installer_utils/installer_runner.py +4 -4
- machineconfig/utils/io.py +25 -8
- machineconfig/utils/meta.py +6 -4
- machineconfig/utils/options.py +49 -19
- machineconfig/utils/options_utils/__init__.py +0 -0
- machineconfig/utils/options_utils/options_tv_linux.py +211 -0
- machineconfig/utils/options_utils/options_tv_windows.py +88 -0
- machineconfig/utils/options_utils/tv_options.py +37 -0
- machineconfig/utils/path_extended.py +8 -7
- machineconfig/utils/scheduler.py +8 -2
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/source_of_truth.py +6 -1
- machineconfig/utils/ssh.py +73 -23
- machineconfig/utils/ssh_utils/abc.py +1 -1
- machineconfig/utils/ssh_utils/copy_from_here.py +19 -14
- machineconfig/utils/ssh_utils/copy_to_here.py +2 -1
- machineconfig/utils/ssh_utils/utils.py +23 -7
- machineconfig/utils/ssh_utils/wsl.py +107 -170
- machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
- machineconfig/utils/upgrade_packages.py +4 -8
- {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/METADATA +30 -22
- machineconfig-8.51.dist-info/RECORD +543 -0
- machineconfig/jobs/installer/check_installations.py +0 -248
- machineconfig/profile/backup.toml +0 -49
- machineconfig/profile/mapper.toml +0 -263
- machineconfig/scripts/linux/other/switch_ip +0 -20
- machineconfig/scripts/python/helpers/run_py_script.py +0 -79
- machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +0 -26
- machineconfig/scripts/python/helpers_devops/cli_config.py +0 -105
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -89
- machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
- machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -215
- machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
- machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
- machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
- machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -620
- machineconfig/scripts/python/helpers_network/devops_add_identity.py +0 -82
- machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +0 -153
- machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +0 -391
- machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +0 -338
- machineconfig/scripts/python/helpers_network/wsl_windows_transfer.py +0 -67
- machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -77
- machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
- machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
- machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
- machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
- machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
- machineconfig/setup_windows/others/obs.ps1 +0 -4
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
- machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
- machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
- machineconfig/setup_windows/ssh/openssh-server_add_key.ps1 +0 -7
- machineconfig/setup_windows/ssh/openssh-server_copy-ssh-id.ps1 +0 -14
- machineconfig/utils/options_tv.py +0 -119
- machineconfig/utils/tst.py +0 -20
- machineconfig-7.98.dist-info/RECORD +0 -504
- /machineconfig/jobs/installer/{custom_dev → checks}/__init__.py +0 -0
- /machineconfig/{scripts/python/helpers_agents → jobs/installer/python_scripts}/__init__.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/cloudflare_warp_cli.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
- /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
- /machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +0 -0
- /machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
- /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
- /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_drive +0 -0
- /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_nfs +0 -0
- /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
- /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_smb +0 -0
- /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
- /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
- /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
- /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
- /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
- /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
- /machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
- /machineconfig/scripts/python/{helpers_agents/agentic_frameworks → graph}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_cloud → helpers}/__init__.py +0 -0
- /machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
- /machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_agents}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops → helpers/helpers_agents/agentic_frameworks}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_helper_types.py +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/prompt.txt +0 -0
- /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.ps1 +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes → helpers/helpers_cloud}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +0 -0
- /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_croshell}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_devops}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_devops/themes}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_fire_command}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/f.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_streamlit_helper.py +0 -0
- /machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_network/__init__.py} +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_nfs.py +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_nw_drive.py +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/onetimeshare.py +0 -0
- /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/wifi_conn.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_1.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
- /machineconfig/scripts/python/helpers/{ast_search.py → helpers_search/ast_search.py} +0 -0
- /machineconfig/scripts/python/helpers/{qr_code.py → helpers_search/qr_code.py} +0 -0
- /machineconfig/scripts/python/helpers/{repo_rag.py → helpers_search/repo_rag.py} +0 -0
- /machineconfig/scripts/python/helpers/{symantic_search.py → helpers_search/symantic_search.py} +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
- {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/WHEEL +0 -0
- {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/entry_points.txt +0 -0
- {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/top_level.txt +0 -0
|
@@ -103,7 +103,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
103
103
|
slf = self.expanduser().resolve()
|
|
104
104
|
if content:
|
|
105
105
|
assert self.is_dir(), NotADirectoryError(f"💥 When `content` flag is set to True, path must be a directory. It is not: `{repr(self)}`")
|
|
106
|
-
[x.move(folder=path.parent, content=False, overwrite=overwrite) for x in self.
|
|
106
|
+
[x.move(folder=path.parent, content=False, overwrite=overwrite) for x in self.glob("*")]
|
|
107
107
|
return path # contents live within this directory.
|
|
108
108
|
if overwrite:
|
|
109
109
|
tmp_path = slf.rename(path.parent.absolute() / randstr())
|
|
@@ -174,7 +174,8 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
174
174
|
appended_name = f"""{name}_{len(self.parent.search(f"*{self.name.split('.')[0]}*"))}"""
|
|
175
175
|
return self.append(name=appended_name, index=False, verbose=verbose, suffix=suffix, **kwargs)
|
|
176
176
|
full_name = name or ("_" + str(timestamp()))
|
|
177
|
-
|
|
177
|
+
whatever = ("bruh" + self)
|
|
178
|
+
full_suffix = suffix or "".join(whatever.suffixes)
|
|
178
179
|
subpath = self.name.split(".")[0] + full_name + full_suffix
|
|
179
180
|
dest = self.parent.joinpath(subpath)
|
|
180
181
|
res = PathExtended(dest)
|
|
@@ -294,7 +295,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
294
295
|
target = "BROKEN LINK " + str(self) # avoid infinite recursions for broken links.
|
|
295
296
|
return "🔗 Symlink '" + str(self) + "' ==> " + (str(target) if target == self else str(target))
|
|
296
297
|
elif self.is_absolute():
|
|
297
|
-
return self._type() + " '" + str(self.clickable()) + "'" + (" | " + datetime.fromtimestamp(self.stat().st_ctime).isoformat()[:-7].replace("T", " ") if self.exists() else "") + (f" | {self.
|
|
298
|
+
return self._type() + " '" + str(self.clickable()) + "'" + (" | " + datetime.fromtimestamp(self.stat().st_ctime).isoformat()[:-7].replace("T", " ") if self.exists() else "") + (f" | {round(self.stat().st_size / (1024**2), 1)} Mb" if self.is_file() else "")
|
|
298
299
|
elif "http" in str(self):
|
|
299
300
|
return "🕸️ URL " + str(self.as_url_str())
|
|
300
301
|
else:
|
|
@@ -476,7 +477,6 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
476
477
|
verbose: bool = True,
|
|
477
478
|
content: bool = False,
|
|
478
479
|
orig: bool = False,
|
|
479
|
-
pwd: Optional[str] = None,
|
|
480
480
|
mode: FILE_MODE = "w",
|
|
481
481
|
**kwargs: Any,
|
|
482
482
|
) -> "PathExtended":
|
|
@@ -493,7 +493,6 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
493
493
|
path_resolved = PathExtended(op_zip)
|
|
494
494
|
else:
|
|
495
495
|
import shutil
|
|
496
|
-
|
|
497
496
|
if content:
|
|
498
497
|
root_dir, base_dir = slf, "."
|
|
499
498
|
else:
|
|
@@ -501,7 +500,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
501
500
|
base_name = str(path_resolved)[:-4] if str(path_resolved).endswith(".zip") else str(path_resolved)
|
|
502
501
|
op_zip = shutil.make_archive(base_name=base_name, format="zip", root_dir=str(root_dir), base_dir=str(base_dir), verbose=False, **kwargs)
|
|
503
502
|
path_resolved = PathExtended(op_zip)
|
|
504
|
-
msg = f"ZIPPED {repr(slf)} ==>
|
|
503
|
+
msg = f"ZIPPED {repr(slf)} ==> {repr(path_resolved)}"
|
|
505
504
|
res_out = PathExtended(path_resolved)
|
|
506
505
|
ret = self if orig else res_out
|
|
507
506
|
delayed_msg = ""
|
|
@@ -538,7 +537,9 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
|
|
|
538
537
|
assert merge is False, "I have not implemented this yet"
|
|
539
538
|
assert path is None, "I have not implemented this yet"
|
|
540
539
|
if tmp:
|
|
541
|
-
|
|
540
|
+
tmp_root = PathExtended("~/tmp_results").expanduser()
|
|
541
|
+
tmp_root.mkdir(parents=True, exist_ok=True)
|
|
542
|
+
return self.unzip(folder=tmp_root.joinpath("tmp_unzips").joinpath(randstr()), content=True).joinpath(self.stem)
|
|
542
543
|
slf = zipfile__ = self.expanduser().resolve()
|
|
543
544
|
if any(ztype in str(slf.parent) for ztype in (".zip", ".7z")): # path include a zip archive in the middle.
|
|
544
545
|
tmp__ = [item for item in (".zip", ".7z", "") if item in str(slf)]
|
machineconfig/utils/scheduler.py
CHANGED
|
@@ -166,7 +166,10 @@ class CacheMemory[T]():
|
|
|
166
166
|
else:
|
|
167
167
|
age = datetime.now() - self.time_produced
|
|
168
168
|
if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)):
|
|
169
|
-
|
|
169
|
+
if not fresh:
|
|
170
|
+
self.logger.warning(f"""🔄 CACHE STALE 📦 {self.name} cache: Populating fresh cache from source func. """ + f"""⏱️ Age = {age} > Expiry {self.expire} """ )
|
|
171
|
+
else:
|
|
172
|
+
self.logger.warning(f"""⚠️ Fresh flag raised, age = {age} > {tolerance_seconds} seconds of tolerance. Updating {self.name} cache from source func.""")
|
|
170
173
|
t0 = time.time()
|
|
171
174
|
self.cache = self.source_func()
|
|
172
175
|
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
@@ -202,7 +205,10 @@ class Cache[T](): # This class helps to accelrate access to latest data coming
|
|
|
202
205
|
if self.path.exists(): # prefer to read from disk over source func as a default source of cache.
|
|
203
206
|
age = datetime.now() - datetime.fromtimestamp(self.path.stat().st_mtime)
|
|
204
207
|
if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)): # cache is old or if fresh flag is raised
|
|
205
|
-
|
|
208
|
+
if not fresh:
|
|
209
|
+
self.logger.warning(f"""🔄 CACHE STALE 📦 {self.name} cache: Populating fresh cache from source func. """ + f"""⏱️ Age = {age} > Expiry {self.expire} """ )
|
|
210
|
+
else:
|
|
211
|
+
self.logger.warning(f"""⚠️ Fresh flag raised, age = {age} > {tolerance_seconds} seconds of tolerance. Updating {self.name} cache from source func.""")
|
|
206
212
|
t0 = time.time()
|
|
207
213
|
self.cache = self.source_func() # fresh data.
|
|
208
214
|
self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
|
|
@@ -6,7 +6,7 @@ capturing all user inputs collected during interactive execution.
|
|
|
6
6
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from typing import TypedDict, Literal, NotRequired
|
|
9
|
-
from machineconfig.scripts.python.helpers_agents.fire_agents_help_launch import AGENTS
|
|
9
|
+
from machineconfig.scripts.python.helpers.helpers_agents.fire_agents_help_launch import AGENTS
|
|
10
10
|
|
|
11
11
|
SEARCH_STRATEGIES = Literal["file_path", "keyword_search", "filename_pattern"]
|
|
12
12
|
|
|
@@ -5,7 +5,12 @@ Utils
|
|
|
5
5
|
import machineconfig
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
|
|
8
|
-
EXCLUDE_DIRS = [".links", "
|
|
8
|
+
EXCLUDE_DIRS = [".links", "notebooks",
|
|
9
|
+
"GEMINI.md", "CLAUDE.md", "CRUSH.md", "AGENTS.md",
|
|
10
|
+
".cursor", ".clinerules", ".github/instructions", ".github/agents", ".github/prompts",
|
|
11
|
+
".ai",
|
|
12
|
+
".venv", ".git", ".idea", ".vscode", "node_modules", "__pycache__", ".mypy_cache"
|
|
13
|
+
]
|
|
9
14
|
LIBRARY_ROOT = Path(machineconfig.__file__).resolve().parent
|
|
10
15
|
|
|
11
16
|
CONFIG_ROOT = Path.home().joinpath(".config/machineconfig")
|
machineconfig/utils/ssh.py
CHANGED
|
@@ -2,8 +2,8 @@ from typing import Callable, Optional, Any, cast, Union, Literal
|
|
|
2
2
|
import os
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
import platform
|
|
5
|
-
from machineconfig.scripts.python.helpers_utils.
|
|
6
|
-
from machineconfig.utils.code import
|
|
5
|
+
from machineconfig.scripts.python.helpers.helpers_utils.python import MachineSpecs
|
|
6
|
+
from machineconfig.utils.code import get_uv_command
|
|
7
7
|
import rich.console
|
|
8
8
|
from machineconfig.utils.terminal import Response
|
|
9
9
|
from machineconfig.utils.accessories import pprint, randstr
|
|
@@ -14,7 +14,6 @@ from machineconfig.utils.ssh_utils.abc import DEFAULT_PICKLE_SUBDIR
|
|
|
14
14
|
class SSH:
|
|
15
15
|
@staticmethod
|
|
16
16
|
def from_config_file(host: str) -> "SSH":
|
|
17
|
-
"""Create SSH instance from SSH config file entry."""
|
|
18
17
|
return SSH(host=host, username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=False)
|
|
19
18
|
|
|
20
19
|
def __init__(
|
|
@@ -148,8 +147,10 @@ class SSH:
|
|
|
148
147
|
def view_bar(self, transferred: int, total: int) -> None:
|
|
149
148
|
if self.progress and self.task is not None:
|
|
150
149
|
self.progress.update(self.task, completed=transferred, total=total)
|
|
150
|
+
|
|
151
151
|
self.tqdm_wrap = RichProgressWrapper
|
|
152
|
-
from machineconfig.scripts.python.helpers_utils.
|
|
152
|
+
from machineconfig.scripts.python.helpers.helpers_utils.python import get_machine_specs
|
|
153
|
+
|
|
153
154
|
self.local_specs: MachineSpecs = get_machine_specs()
|
|
154
155
|
resp = self.run_shell_cmd_on_remote(
|
|
155
156
|
command="""~/.local/bin/utils get-machine-specs """,
|
|
@@ -160,6 +161,7 @@ class SSH:
|
|
|
160
161
|
)
|
|
161
162
|
json_str = resp.op
|
|
162
163
|
import ast
|
|
164
|
+
|
|
163
165
|
self.remote_specs: MachineSpecs = cast(MachineSpecs, ast.literal_eval(json_str))
|
|
164
166
|
self.terminal_responses: list[Response] = []
|
|
165
167
|
|
|
@@ -177,10 +179,22 @@ class SSH:
|
|
|
177
179
|
local_console = rich.console.Console(file=local_buffer, width=40)
|
|
178
180
|
remote_console = rich.console.Console(file=remote_buffer, width=40)
|
|
179
181
|
inspect(
|
|
180
|
-
type("LocalInfo", (object,), dict(self.local_specs))(),
|
|
182
|
+
type("LocalInfo", (object,), dict(self.local_specs))(),
|
|
183
|
+
value=False,
|
|
184
|
+
title="SSHing From",
|
|
185
|
+
docs=False,
|
|
186
|
+
dunder=False,
|
|
187
|
+
sort=False,
|
|
188
|
+
console=local_console,
|
|
181
189
|
)
|
|
182
190
|
inspect(
|
|
183
|
-
type("RemoteInfo", (object,), dict(self.remote_specs))(),
|
|
191
|
+
type("RemoteInfo", (object,), dict(self.remote_specs))(),
|
|
192
|
+
value=False,
|
|
193
|
+
title="SSHing To",
|
|
194
|
+
docs=False,
|
|
195
|
+
dunder=False,
|
|
196
|
+
sort=False,
|
|
197
|
+
console=remote_console,
|
|
184
198
|
)
|
|
185
199
|
local_lines = local_buffer.getvalue().split("\n")
|
|
186
200
|
remote_lines = remote_buffer.getvalue().split("\n")
|
|
@@ -215,19 +229,40 @@ class SSH:
|
|
|
215
229
|
self.copy_from_here(source_path="~/.ssh/id_rsa.pub", target_rel2home=None, compress_with_zip=False, recursive=False, overwrite_existing=False)
|
|
216
230
|
if self.remote_specs["system"] != "Windows":
|
|
217
231
|
raise RuntimeError("send_ssh_key is only supported for Windows remote machines")
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
232
|
+
python_code = '''
|
|
233
|
+
from pathlib import Path
|
|
234
|
+
import subprocess
|
|
235
|
+
sshd_dir = Path("C:/ProgramData/ssh")
|
|
236
|
+
admin_auth_keys = sshd_dir / "administrators_authorized_keys"
|
|
237
|
+
sshd_config = sshd_dir / "sshd_config"
|
|
238
|
+
pubkey_path = Path.home() / ".ssh" / "id_rsa.pub"
|
|
239
|
+
key_content = pubkey_path.read_text(encoding="utf-8").strip()
|
|
240
|
+
if admin_auth_keys.exists():
|
|
241
|
+
existing = admin_auth_keys.read_text(encoding="utf-8")
|
|
242
|
+
if not existing.endswith("\\n"):
|
|
243
|
+
existing += "\\n"
|
|
244
|
+
admin_auth_keys.write_text(existing + key_content + "\\n", encoding="utf-8")
|
|
245
|
+
else:
|
|
246
|
+
admin_auth_keys.write_text(key_content + "\\n", encoding="utf-8")
|
|
247
|
+
icacls_cmd = f'icacls "{admin_auth_keys}" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"'
|
|
248
|
+
subprocess.run(icacls_cmd, shell=True, check=True)
|
|
249
|
+
if sshd_config.exists():
|
|
250
|
+
config_text = sshd_config.read_text(encoding="utf-8")
|
|
251
|
+
config_text = config_text.replace("#PubkeyAuthentication", "PubkeyAuthentication")
|
|
252
|
+
sshd_config.write_text(config_text, encoding="utf-8")
|
|
253
|
+
subprocess.run("Restart-Service sshd -Force", shell=True, check=True)
|
|
254
|
+
print("SSH key added successfully")
|
|
255
|
+
'''
|
|
256
|
+
return self.run_py_remotely(python_code=python_code, uv_with=None, uv_project_dir=None, description="Adding SSH key to Windows remote", verbose_output=True, strict_stderr=False, strict_return_code=False)
|
|
224
257
|
|
|
225
258
|
def get_remote_repr(self, add_machine: bool = False) -> str:
|
|
226
259
|
return f"{self.username}@{self.hostname}:{self.port}" + (
|
|
227
260
|
f" [{self.remote_specs['system']}][{self.remote_specs['distro']}]" if add_machine else ""
|
|
228
261
|
)
|
|
262
|
+
|
|
229
263
|
def get_local_repr(self, add_machine: bool = False) -> str:
|
|
230
264
|
import getpass
|
|
265
|
+
|
|
231
266
|
return f"{getpass.getuser()}@{platform.node()}" + (f" [{platform.system()}][{self.local_specs['distro']}]" if add_machine else "")
|
|
232
267
|
|
|
233
268
|
def get_ssh_conn_str(self, command: str) -> str:
|
|
@@ -247,7 +282,9 @@ class SSH:
|
|
|
247
282
|
res.output.returncode = os.system(command)
|
|
248
283
|
return res
|
|
249
284
|
|
|
250
|
-
def run_shell_cmd_on_remote(
|
|
285
|
+
def run_shell_cmd_on_remote(
|
|
286
|
+
self, command: str, verbose_output: bool, description: str, strict_stderr: bool, strict_return_code: bool
|
|
287
|
+
) -> Response:
|
|
251
288
|
raw = self.ssh.exec_command(command)
|
|
252
289
|
res = Response(stdin=raw[0], stdout=raw[1], stderr=raw[2], cmd=command, desc=description) # type: ignore
|
|
253
290
|
if verbose_output:
|
|
@@ -274,12 +311,12 @@ class SSH:
|
|
|
274
311
|
with_clause += ""
|
|
275
312
|
match on:
|
|
276
313
|
case "local":
|
|
277
|
-
|
|
314
|
+
uv_cmd = get_uv_command(platform=self.local_specs["system"])
|
|
278
315
|
case "remote":
|
|
279
|
-
|
|
316
|
+
uv_cmd = get_uv_command(platform=self.remote_specs["system"])
|
|
280
317
|
case _:
|
|
281
318
|
raise ValueError(f"Invalid value for 'on': {on}. Must be 'local' or 'remote'")
|
|
282
|
-
uv_cmd = f"""{
|
|
319
|
+
uv_cmd = f"""{uv_cmd} run {with_clause} python {py_path.relative_to(Path.home())}"""
|
|
283
320
|
return uv_cmd
|
|
284
321
|
|
|
285
322
|
def run_py_remotely(
|
|
@@ -302,8 +339,7 @@ class SSH:
|
|
|
302
339
|
)
|
|
303
340
|
|
|
304
341
|
def run_lambda_function(self, func: Callable[..., Any], import_module: bool, uv_with: Optional[list[str]], uv_project_dir: Optional[str]):
|
|
305
|
-
command = lambda_to_python_script(func,
|
|
306
|
-
in_global=True, import_module=import_module)
|
|
342
|
+
command = lambda_to_python_script(func, in_global=True, import_module=import_module)
|
|
307
343
|
# turns ou that the code below for some reason runs but zellij doesn't start, looks like things are assigned to different user.
|
|
308
344
|
# return self.run_py(python_code=command, uv_with=uv_with, uv_project_dir=uv_project_dir,
|
|
309
345
|
# description=f"run_py_func {func.__name__} on {self.get_remote_repr(add_machine=False)}",
|
|
@@ -335,25 +371,39 @@ class SSH:
|
|
|
335
371
|
|
|
336
372
|
def create_parent_dir_and_check_if_exists(self, path_rel2home: str, overwrite_existing: bool) -> None:
|
|
337
373
|
from machineconfig.utils.ssh_utils.utils import create_dir_and_check_if_exists
|
|
374
|
+
|
|
338
375
|
return create_dir_and_check_if_exists(self, path_rel2home=path_rel2home, overwrite_existing=overwrite_existing)
|
|
339
376
|
|
|
340
377
|
def check_remote_is_dir(self, source_path: Union[str, Path]) -> bool:
|
|
341
378
|
from machineconfig.utils.ssh_utils.utils import check_remote_is_dir
|
|
379
|
+
|
|
342
380
|
return check_remote_is_dir(self, source_path=source_path)
|
|
343
381
|
|
|
344
382
|
def expand_remote_path(self, source_path: Union[str, Path]) -> str:
|
|
345
383
|
from machineconfig.utils.ssh_utils.utils import expand_remote_path
|
|
384
|
+
|
|
346
385
|
return expand_remote_path(self, source_path=source_path)
|
|
347
386
|
|
|
348
|
-
def copy_from_here(
|
|
387
|
+
def copy_from_here(
|
|
388
|
+
self, source_path: str, target_rel2home: Optional[str], compress_with_zip: bool, recursive: bool, overwrite_existing: bool
|
|
389
|
+
) -> None:
|
|
349
390
|
from machineconfig.utils.ssh_utils.copy_from_here import copy_from_here
|
|
350
|
-
return copy_from_here(self, source_path=source_path, target_rel2home=target_rel2home, compress_with_zip=compress_with_zip, recursive=recursive, overwrite_existing=overwrite_existing)
|
|
351
391
|
|
|
352
|
-
|
|
392
|
+
return copy_from_here(
|
|
393
|
+
self,
|
|
394
|
+
source_path=source_path,
|
|
395
|
+
target_rel2home=target_rel2home,
|
|
396
|
+
compress_with_zip=compress_with_zip,
|
|
397
|
+
recursive=recursive,
|
|
398
|
+
overwrite_existing=overwrite_existing,
|
|
399
|
+
)
|
|
400
|
+
|
|
401
|
+
def copy_to_here(
|
|
402
|
+
self, source: Union[str, Path], target: Optional[Union[str, Path]], compress_with_zip: bool, recursive: bool, internal_call: bool = False
|
|
403
|
+
) -> None:
|
|
353
404
|
from machineconfig.utils.ssh_utils.copy_to_here import copy_to_here
|
|
354
|
-
return copy_to_here(self, source=source, target=target, compress_with_zip=compress_with_zip, recursive=recursive, internal_call=internal_call)
|
|
355
405
|
|
|
356
|
-
|
|
406
|
+
return copy_to_here(self, source=source, target=target, compress_with_zip=compress_with_zip, recursive=recursive, internal_call=internal_call)
|
|
357
407
|
|
|
358
408
|
|
|
359
409
|
if __name__ == "__main__":
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
from typing import Optional
|
|
4
|
-
from pathlib import Path
|
|
3
|
+
from typing import Optional, TYPE_CHECKING
|
|
4
|
+
from pathlib import Path, PurePosixPath, PureWindowsPath
|
|
5
5
|
from machineconfig.utils.accessories import randstr
|
|
6
6
|
from machineconfig.utils.meta import lambda_to_python_script
|
|
7
7
|
from machineconfig.utils.ssh_utils.abc import DEFAULT_PICKLE_SUBDIR
|
|
8
|
-
from machineconfig.utils.code import
|
|
8
|
+
from machineconfig.utils.code import get_uv_command
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from machineconfig.utils.ssh import SSH
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _build_remote_path(self: "SSH", home_dir: str, rel_path: str) -> str:
|
|
15
|
+
if self.remote_specs["system"] == "Windows":
|
|
16
|
+
return str(PureWindowsPath(home_dir) / rel_path)
|
|
17
|
+
return str(PurePosixPath(home_dir) / PurePosixPath(rel_path.replace("\\", "/")))
|
|
9
18
|
|
|
10
19
|
|
|
11
20
|
def copy_from_here(
|
|
@@ -54,15 +63,14 @@ def copy_from_here(
|
|
|
54
63
|
target_rel2home = target_rel2home + ".zip"
|
|
55
64
|
if Path(target_rel2home).parent.as_posix() not in {"", "."}:
|
|
56
65
|
self.create_parent_dir_and_check_if_exists(path_rel2home=target_rel2home, overwrite_existing=overwrite_existing)
|
|
57
|
-
|
|
66
|
+
remote_target_full = _build_remote_path(self, self.remote_specs["home_dir"], target_rel2home)
|
|
67
|
+
print(f"""📤 [SFTP UPLOAD] Sending file: {repr(source_obj)} ==> Remote Path: {remote_target_full}""")
|
|
58
68
|
try:
|
|
59
69
|
with self.tqdm_wrap(ascii=True, unit="b", unit_scale=True) as pbar:
|
|
60
70
|
if self.sftp is None: # type: ignore[unreachable]
|
|
61
71
|
raise RuntimeError(f"SFTP connection lost for {self.hostname}")
|
|
62
|
-
print(f"Uploading {source_obj} to\n{
|
|
63
|
-
self.sftp.put(
|
|
64
|
-
localpath=str(source_obj), remotepath=str(Path(self.remote_specs["home_dir"]).joinpath(target_rel2home)), callback=pbar.view_bar
|
|
65
|
-
)
|
|
72
|
+
print(f"Uploading {source_obj} to\n{remote_target_full}")
|
|
73
|
+
self.sftp.put(localpath=str(source_obj), remotepath=remote_target_full, callback=pbar.view_bar)
|
|
66
74
|
except Exception:
|
|
67
75
|
if compress_with_zip and source_obj.exists() and str(source_obj).endswith("_archive.zip"):
|
|
68
76
|
source_obj.unlink()
|
|
@@ -83,12 +91,9 @@ def copy_from_here(
|
|
|
83
91
|
archive_handle.extractall(extraction_directory)
|
|
84
92
|
archive_path.unlink()
|
|
85
93
|
|
|
94
|
+
remote_zip_path = _build_remote_path(self, self.remote_specs["home_dir"], target_rel2home)
|
|
86
95
|
command = lambda_to_python_script(
|
|
87
|
-
lambda: unzip_archive(
|
|
88
|
-
zip_file_path=str(Path(self.remote_specs["home_dir"]).joinpath(target_rel2home)), overwrite_flag=overwrite_existing
|
|
89
|
-
),
|
|
90
|
-
in_global=True,
|
|
91
|
-
import_module=False,
|
|
96
|
+
lambda: unzip_archive(zip_file_path=remote_zip_path, overwrite_flag=overwrite_existing), in_global=True, import_module=False
|
|
92
97
|
)
|
|
93
98
|
tmp_py_file = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/create_target_dir_{randstr()}.py")
|
|
94
99
|
tmp_py_file.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -96,7 +101,7 @@ def copy_from_here(
|
|
|
96
101
|
remote_tmp_py = tmp_py_file.relative_to(Path.home()).as_posix()
|
|
97
102
|
self.copy_from_here(source_path=str(tmp_py_file), target_rel2home=None, compress_with_zip=False, recursive=False, overwrite_existing=True)
|
|
98
103
|
self.run_shell_cmd_on_remote(
|
|
99
|
-
command=f"""{
|
|
104
|
+
command=f"""{get_uv_command(platform=self.remote_specs['system'])} run python {remote_tmp_py}""",
|
|
100
105
|
verbose_output=False,
|
|
101
106
|
description=f"UNZIPPING {target_rel2home}",
|
|
102
107
|
strict_stderr=True,
|
|
@@ -8,7 +8,7 @@ from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION, DEFAULT_PIC
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
def copy_to_here(
|
|
11
|
-
self: SSH,
|
|
11
|
+
self: "SSH",
|
|
12
12
|
source: Union[str, Path],
|
|
13
13
|
target: Optional[Union[str, Path]],
|
|
14
14
|
compress_with_zip: bool = False,
|
|
@@ -300,3 +300,4 @@ def copy_to_here(
|
|
|
300
300
|
|
|
301
301
|
if __name__ == "__main__":
|
|
302
302
|
from machineconfig.utils.ssh import SSH
|
|
303
|
+
|
|
@@ -1,15 +1,30 @@
|
|
|
1
1
|
|
|
2
|
-
from pathlib import Path
|
|
2
|
+
from pathlib import Path, PurePosixPath, PureWindowsPath
|
|
3
3
|
from machineconfig.utils.accessories import randstr
|
|
4
4
|
from machineconfig.utils.meta import lambda_to_python_script
|
|
5
5
|
from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION, DEFAULT_PICKLE_SUBDIR
|
|
6
|
-
from machineconfig.utils.code import
|
|
7
|
-
from typing import Union
|
|
6
|
+
from machineconfig.utils.code import get_uv_command
|
|
7
|
+
from typing import Union, TYPE_CHECKING
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from machineconfig.utils.ssh import SSH
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _build_remote_path(self: "SSH", home_dir: str, rel_path: str) -> str:
|
|
14
|
+
if self.remote_specs["system"] == "Windows":
|
|
15
|
+
return str(PureWindowsPath(home_dir) / rel_path)
|
|
16
|
+
return str(PurePosixPath(home_dir) / PurePosixPath(rel_path.replace("\\", "/")))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _normalize_rel_path_for_remote(self: "SSH", rel_path: str) -> str:
|
|
20
|
+
if self.remote_specs["system"] == "Windows":
|
|
21
|
+
return str(PureWindowsPath(rel_path))
|
|
22
|
+
return rel_path.replace("\\", "/")
|
|
8
23
|
|
|
9
24
|
|
|
10
25
|
def create_dir_and_check_if_exists(self: "SSH", path_rel2home: str, overwrite_existing: bool) -> None:
|
|
11
26
|
"""Helper to create a directory on remote machine and return its path."""
|
|
12
|
-
|
|
27
|
+
path_rel2home_normalized = _normalize_rel_path_for_remote(self, path_rel2home)
|
|
13
28
|
def create_target_dir(target_rel2home: str, overwrite: bool):
|
|
14
29
|
from pathlib import Path
|
|
15
30
|
import shutil
|
|
@@ -26,7 +41,7 @@ def create_dir_and_check_if_exists(self: "SSH", path_rel2home: str, overwrite_ex
|
|
|
26
41
|
print(f"Creating directory for path: {target_path_abs}")
|
|
27
42
|
target_path_abs.parent.mkdir(parents=True, exist_ok=True)
|
|
28
43
|
command = lambda_to_python_script(
|
|
29
|
-
lambda: create_target_dir(target_rel2home=
|
|
44
|
+
lambda: create_target_dir(target_rel2home=path_rel2home_normalized, overwrite=overwrite_existing),
|
|
30
45
|
in_global=True, import_module=False
|
|
31
46
|
)
|
|
32
47
|
tmp_py_file = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/create_target_dir_{randstr()}.py")
|
|
@@ -34,9 +49,10 @@ def create_dir_and_check_if_exists(self: "SSH", path_rel2home: str, overwrite_ex
|
|
|
34
49
|
tmp_py_file.write_text(command, encoding="utf-8")
|
|
35
50
|
assert self.sftp is not None
|
|
36
51
|
tmp_remote_path = ".tmp_pyfile.py"
|
|
37
|
-
|
|
52
|
+
remote_tmp_full = _build_remote_path(self, self.remote_specs["home_dir"], tmp_remote_path)
|
|
53
|
+
self.sftp.put(localpath=str(tmp_py_file), remotepath=remote_tmp_full)
|
|
38
54
|
resp = self.run_shell_cmd_on_remote(
|
|
39
|
-
command=f"""{
|
|
55
|
+
command=f"""{get_uv_command(platform=self.remote_specs['system'])} run python {tmp_remote_path}""",
|
|
40
56
|
verbose_output=False,
|
|
41
57
|
description=f"Creating target dir {path_rel2home}",
|
|
42
58
|
strict_stderr=True,
|