machineconfig 6.23__py3-none-any.whl → 8.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of machineconfig might be problematic. Click here for more details.
- machineconfig/cluster/remote/cloud_manager.py +1 -1
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- 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 +16 -221
- machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
- 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_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +3 -3
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +5 -3
- machineconfig/cluster/sessions_managers/zellij_remote.py +2 -2
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +2 -2
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -7
- machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_with_panes.py +1 -1
- machineconfig/jobs/installer/check_installations.py +0 -1
- machineconfig/jobs/installer/installer_data.json +1408 -201
- machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
- machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
- machineconfig/jobs/installer/package_groups.py +63 -92
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/jobs/installer/python_scripts/boxes.py +61 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
- machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +4 -1
- machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
- machineconfig/jobs/installer/{custom → python_scripts}/hx.py +75 -18
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +27 -22
- machineconfig/jobs/installer/python_scripts/sysabc.py +139 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
- machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
- machineconfig/jobs/installer/python_scripts/yazi.py +121 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
- 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 +25 -0
- machineconfig/logger.py +0 -1
- machineconfig/profile/create_helper.py +56 -18
- machineconfig/profile/create_links.py +2 -1
- machineconfig/profile/create_links_export.py +64 -18
- machineconfig/profile/create_shell_profile.py +90 -132
- machineconfig/profile/mapper.toml +18 -8
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/wrap_mcfg +46 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +82 -60
- machineconfig/scripts/python/ai/initai.py +1 -19
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +1 -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 +4 -0
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/generic.py +1 -1
- machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
- machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
- machineconfig/scripts/python/cloud.py +14 -9
- machineconfig/scripts/python/croshell.py +135 -117
- machineconfig/scripts/python/devops.py +48 -25
- machineconfig/scripts/python/devops_navigator.py +1 -5
- machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +18 -9
- machineconfig/scripts/python/fire_jobs.py +127 -118
- machineconfig/scripts/python/ftpx.py +44 -17
- 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/symantic_search.py +25 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
- 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_fire → helpers_agents}/fire_agents_help_launch.py +37 -15
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/copilot/config.yml +1 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/crush/crush.json +10 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/gemini/settings.json +12 -0
- machineconfig/scripts/python/helpers_agents/privacy/privacy.py +109 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +34 -0
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_copy.py +28 -21
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_mount.py +19 -17
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_sync.py +12 -11
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/start_slidev.py +6 -7
- 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 +221 -0
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/cli_repos.py +60 -36
- 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/{devops_helpers/cli_terminal.py → helpers_devops/cli_share_terminal.py} +15 -17
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_backup_retrieve.py +7 -10
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_status.py +7 -19
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_update_repos.py +1 -1
- machineconfig/scripts/python/helpers_devops/run_script.py +168 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_wezterm_theme.py +1 -1
- machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -20
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +2 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
- 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/{helper_navigator → helpers_navigator}/command_builder.py +1 -1
- machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_detail.py +1 -1
- machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_tree.py +160 -23
- machineconfig/scripts/python/{helper_navigator → helpers_navigator}/main_app.py +5 -5
- machineconfig/scripts/python/helpers_network/address.py +176 -0
- machineconfig/scripts/python/helpers_network/address_switch.py +78 -0
- machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
- machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
- machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py} +35 -1
- machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py} +26 -7
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
- machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
- machineconfig/scripts/python/helpers_repos/action.py +209 -0
- machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
- machineconfig/scripts/python/{repos_helpers → helpers_repos}/clone.py +0 -1
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +80 -37
- machineconfig/scripts/python/{repos_helpers → helpers_repos}/entrypoint.py +5 -5
- machineconfig/scripts/python/helpers_repos/grource.py +2 -2
- machineconfig/scripts/python/{repos_helpers → helpers_repos}/record.py +3 -2
- machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/{repos_helpers/count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
- machineconfig/scripts/python/{repos_helpers → helpers_repos}/sync.py +5 -5
- machineconfig/scripts/python/{sessions_helpers → helpers_sessions}/sessions_multiprocess.py +19 -13
- machineconfig/scripts/python/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers_utils/pdf.py +96 -0
- machineconfig/scripts/python/helpers_utils/python.py +187 -0
- machineconfig/scripts/python/interactive.py +26 -35
- machineconfig/scripts/python/{entry.py → mcfg_entry.py} +24 -10
- machineconfig/scripts/python/msearch.py +72 -0
- machineconfig/scripts/python/sessions.py +101 -38
- machineconfig/scripts/python/terminal.py +136 -0
- machineconfig/scripts/python/utils.py +62 -0
- machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
- 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 +3 -2
- machineconfig/settings/lf/linux/lfrc +10 -11
- machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
- machineconfig/settings/lf/windows/lfrc +15 -17
- machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
- machineconfig/settings/linters/.ruff.toml +1 -1
- machineconfig/settings/marimo/marimo.toml +80 -0
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/shells/bash/init.sh +57 -10
- 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 +59 -23
- 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/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/settings/zellij/layouts/st.kdl +39 -8
- machineconfig/setup_linux/__init__.py +2 -2
- machineconfig/setup_linux/apps_desktop.sh +8 -27
- machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -11
- 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 +3 -5
- machineconfig/setup_windows/ssh/openssh-server.ps1 +1 -1
- machineconfig/setup_windows/uv.ps1 +8 -1
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -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/code.py +143 -167
- 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/headers.py +6 -11
- machineconfig/utils/files/read.py +3 -9
- 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 +44 -101
- 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} +39 -87
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +17 -63
- machineconfig/utils/io.py +77 -4
- machineconfig/utils/links.py +56 -38
- machineconfig/utils/meta.py +235 -145
- machineconfig/utils/options.py +46 -18
- machineconfig/utils/options_tv.py +119 -0
- machineconfig/utils/path_extended.py +46 -97
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +10 -23
- machineconfig/utils/scheduler.py +84 -115
- 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/ssh.py +214 -476
- 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 +303 -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/upgrade_packages.py +114 -28
- machineconfig/utils/ve.py +12 -4
- machineconfig-8.12.dist-info/METADATA +132 -0
- machineconfig-8.12.dist-info/RECORD +504 -0
- {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/entry_points.txt +5 -1
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
- 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/windows/archive/archive_pygraphviz.ps1 +0 -12
- machineconfig/jobs/windows/archive/openssh-server_add_key.ps1 +0 -7
- machineconfig/jobs/windows/archive/openssh-server_copy-ssh-id.ps1 +0 -14
- 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/other/share_smb +0 -1
- machineconfig/scripts/linux/other/switch_ip +0 -20
- machineconfig/scripts/linux/skrg +0 -4
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
- machineconfig/scripts/python/devops_helpers/cli_config.py +0 -81
- machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py +0 -84
- machineconfig/scripts/python/devops_helpers/cli_data.py +0 -18
- machineconfig/scripts/python/devops_helpers/cli_nw.py +0 -73
- machineconfig/scripts/python/devops_helpers/cli_self.py +0 -117
- machineconfig/scripts/python/devops_helpers/cli_share_server.py +0 -104
- machineconfig/scripts/python/helper_navigator/__init__.py +0 -20
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
- machineconfig/scripts/python/helpers_fire/fire_agents_helper_types.py +0 -30
- machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
- machineconfig/scripts/python/helpers_fire/template.sh +0 -15
- machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
- machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
- machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
- machineconfig/scripts/python/repos_helpers/action.py +0 -378
- machineconfig/scripts/python/repos_helpers/count_lines_frontend.py +0 -17
- machineconfig/scripts/windows/fzfb.ps1 +0 -3
- machineconfig/scripts/windows/fzfg.ps1 +0 -2
- machineconfig/scripts/windows/fzfrga.bat +0 -20
- machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
- 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/shells/pwsh/profile.ps1 +0 -0
- machineconfig/settings/yazi/keymap.toml +0 -0
- machineconfig/settings/yazi/yazi.toml +0 -4
- machineconfig/setup_linux/apps.sh +0 -66
- machineconfig/setup_linux/nix/cli_installation.sh +0 -137
- machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
- machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
- machineconfig/setup_windows/apps.ps1 +0 -62
- machineconfig/setup_windows/others/obs.ps1 +0 -4
- machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
- machineconfig/setup_windows/wt_and_pwsh/__init__.py +0 -0
- machineconfig/utils/installer_utils/installer.py +0 -225
- machineconfig-6.23.dist-info/METADATA +0 -84
- machineconfig-6.23.dist-info/RECORD +0 -428
- machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
- machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper.py +0 -0
- machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_restart.py +0 -0
- machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_manager_helper.py +0 -0
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +0 -0
- machineconfig/jobs/installer/{custom_dev → 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}/cursor.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/{setup_linux/web_shortcuts → jobs/scripts/bash_scripts}/android.sh +0 -0
- machineconfig/jobs/{linux/msc → scripts/bash_scripts}/lid.sh +0 -0
- machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/mint_keyboard_shortcuts.sh +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
- machineconfig/{scripts/python/nw → 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 → 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/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
- machineconfig/scripts/python/{cloud_helpers → helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{croshell_helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
- machineconfig/scripts/python/{devops_helpers → helpers_cloud}/__init__.py +0 -0
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers5.py +0 -0
- /machineconfig/scripts/python/{devops_helpers/themes → helpers_croshell}/__init__.py +0 -0
- /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/pomodoro.py +0 -0
- /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/scheduler.py +0 -0
- /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer.py +0 -0
- /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer_template.py +0 -0
- /machineconfig/scripts/python/{helpers_fire → helpers_devops}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_devops/themes}/__init__.py +0 -0
- /machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
- /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/data_models.py +0 -0
- /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/search_bar.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers_network}/__init__.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
- /machineconfig/scripts/python/{repos_helpers → helpers_repos}/update.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_sessions}/__init__.py +0 -0
- /machineconfig/{scripts/python/sessions_helpers → settings/wt}/__init__.py +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
- {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/WHEEL +0 -0
- {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/top_level.txt +0 -0
|
@@ -3,7 +3,7 @@ Command tree widget for displaying command hierarchy.
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from textual.widgets import Tree
|
|
6
|
-
from machineconfig.scripts.python.
|
|
6
|
+
from machineconfig.scripts.python.helpers_navigator.data_models import CommandInfo
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class CommandTree(Tree[CommandInfo]):
|
|
@@ -188,15 +188,31 @@ class CommandTree(Tree[CommandInfo]):
|
|
|
188
188
|
description="Configure your shell profile",
|
|
189
189
|
command="devops config shell",
|
|
190
190
|
parent="config",
|
|
191
|
-
help_text="devops config shell <
|
|
191
|
+
help_text="devops config shell --which <default|nushell>"
|
|
192
192
|
))
|
|
193
193
|
|
|
194
|
-
config_node.add("🔗
|
|
195
|
-
name="
|
|
196
|
-
description="
|
|
197
|
-
command="devops config
|
|
194
|
+
config_node.add("🔗 starship-theme - Select starship theme", data=CommandInfo(
|
|
195
|
+
name="starship-theme",
|
|
196
|
+
description="Select starship prompt theme",
|
|
197
|
+
command="devops config starship-theme",
|
|
198
198
|
parent="config",
|
|
199
|
-
help_text="devops config
|
|
199
|
+
help_text="devops config starship-theme"
|
|
200
|
+
))
|
|
201
|
+
|
|
202
|
+
config_node.add("🔗 pwsh-theme - Configure PowerShell theme", data=CommandInfo(
|
|
203
|
+
name="pwsh-theme",
|
|
204
|
+
description="Select powershell prompt theme",
|
|
205
|
+
command="devops config pwsh-theme",
|
|
206
|
+
parent="config",
|
|
207
|
+
help_text="devops config pwsh-theme"
|
|
208
|
+
))
|
|
209
|
+
|
|
210
|
+
config_node.add("🔗 copy-assets - Copy asset files", data=CommandInfo(
|
|
211
|
+
name="copy-assets",
|
|
212
|
+
description="Copy asset files from library to machine",
|
|
213
|
+
command="devops config copy-assets",
|
|
214
|
+
parent="config",
|
|
215
|
+
help_text="devops config copy-assets <scripts|settings|both>"
|
|
200
216
|
))
|
|
201
217
|
|
|
202
218
|
# data subcommands
|
|
@@ -241,28 +257,52 @@ class CommandTree(Tree[CommandInfo]):
|
|
|
241
257
|
help_text="devops network share-terminal"
|
|
242
258
|
))
|
|
243
259
|
|
|
244
|
-
network_node.add("
|
|
245
|
-
name="
|
|
260
|
+
network_node.add("🌐 share-server - Start local/global server", data=CommandInfo(
|
|
261
|
+
name="share-server",
|
|
262
|
+
description="Start local/global server to share files/folders via web browser",
|
|
263
|
+
command="devops network share-server",
|
|
264
|
+
parent="network",
|
|
265
|
+
help_text="devops network share-server"
|
|
266
|
+
))
|
|
267
|
+
|
|
268
|
+
network_node.add("📡 install-ssh-server - Install SSH server", data=CommandInfo(
|
|
269
|
+
name="install-ssh-server",
|
|
246
270
|
description="Install SSH server",
|
|
247
|
-
command="devops network
|
|
271
|
+
command="devops network install-ssh-server",
|
|
248
272
|
parent="network",
|
|
249
|
-
help_text="devops network
|
|
273
|
+
help_text="devops network install-ssh-server"
|
|
250
274
|
))
|
|
251
275
|
|
|
252
|
-
network_node.add("
|
|
253
|
-
name="
|
|
276
|
+
network_node.add("🔑 add-ssh-key - Add SSH public key", data=CommandInfo(
|
|
277
|
+
name="add-ssh-key",
|
|
254
278
|
description="Add SSH public key to this machine",
|
|
255
|
-
command="devops network
|
|
279
|
+
command="devops network add-ssh-key",
|
|
256
280
|
parent="network",
|
|
257
|
-
help_text="devops network
|
|
281
|
+
help_text="devops network add-ssh-key --path <file> --choose --value --github <username>"
|
|
258
282
|
))
|
|
259
283
|
|
|
260
|
-
network_node.add("
|
|
261
|
-
name="
|
|
284
|
+
network_node.add("🗝️ add-ssh-identity - Add SSH identity", data=CommandInfo(
|
|
285
|
+
name="add-ssh-identity",
|
|
262
286
|
description="Add SSH identity (private key) to this machine",
|
|
263
|
-
command="devops network
|
|
287
|
+
command="devops network add-ssh-identity",
|
|
288
|
+
parent="network",
|
|
289
|
+
help_text="devops network add-ssh-identity"
|
|
290
|
+
))
|
|
291
|
+
|
|
292
|
+
network_node.add("📌 show-address - Show computer addresses", data=CommandInfo(
|
|
293
|
+
name="show-address",
|
|
294
|
+
description="Show this computer addresses on network",
|
|
295
|
+
command="devops network show-address",
|
|
296
|
+
parent="network",
|
|
297
|
+
help_text="devops network show-address"
|
|
298
|
+
))
|
|
299
|
+
|
|
300
|
+
network_node.add("🐛 debug-ssh - Debug SSH connection", data=CommandInfo(
|
|
301
|
+
name="debug-ssh",
|
|
302
|
+
description="Debug SSH connection",
|
|
303
|
+
command="devops network debug-ssh",
|
|
264
304
|
parent="network",
|
|
265
|
-
help_text="devops network
|
|
305
|
+
help_text="devops network debug-ssh"
|
|
266
306
|
))
|
|
267
307
|
|
|
268
308
|
# self subcommands
|
|
@@ -314,6 +354,22 @@ class CommandTree(Tree[CommandInfo]):
|
|
|
314
354
|
help_text="devops self navigate"
|
|
315
355
|
))
|
|
316
356
|
|
|
357
|
+
self_node.add("📚 readme - Render README markdown", data=CommandInfo(
|
|
358
|
+
name="readme",
|
|
359
|
+
description="Render readme markdown in terminal",
|
|
360
|
+
command="devops self readme",
|
|
361
|
+
parent="self",
|
|
362
|
+
help_text="devops self readme"
|
|
363
|
+
))
|
|
364
|
+
|
|
365
|
+
self_node.add("🐍 python - Run Python command/file", data=CommandInfo(
|
|
366
|
+
name="python",
|
|
367
|
+
description="Run python command/file in the machineconfig environment",
|
|
368
|
+
command="devops self python",
|
|
369
|
+
parent="self",
|
|
370
|
+
help_text="devops self python <path> --command"
|
|
371
|
+
))
|
|
372
|
+
|
|
317
373
|
# fire command - now a typer sub-app
|
|
318
374
|
fire_node = self.root.add("🔥 fire - Fire jobs execution", data=CommandInfo(
|
|
319
375
|
name="fire",
|
|
@@ -463,9 +519,9 @@ class CommandTree(Tree[CommandInfo]):
|
|
|
463
519
|
))
|
|
464
520
|
|
|
465
521
|
# croshell command
|
|
466
|
-
self.root.add("
|
|
522
|
+
self.root.add("🔄 croshell - Cross-shell command execution", data=CommandInfo(
|
|
467
523
|
name="croshell",
|
|
468
|
-
description="
|
|
524
|
+
description="Cross-shell command execution",
|
|
469
525
|
command="croshell",
|
|
470
526
|
is_group=False,
|
|
471
527
|
module_path="machineconfig.scripts.python.croshell",
|
|
@@ -473,11 +529,92 @@ class CommandTree(Tree[CommandInfo]):
|
|
|
473
529
|
))
|
|
474
530
|
|
|
475
531
|
# ftpx command
|
|
476
|
-
self.root.add("📡 ftpx - File transfer", data=CommandInfo(
|
|
532
|
+
self.root.add("📡 ftpx - File transfer utility", data=CommandInfo(
|
|
477
533
|
name="ftpx",
|
|
478
|
-
description="File transfer
|
|
534
|
+
description="File transfer utility through SSH",
|
|
479
535
|
command="ftpx",
|
|
480
536
|
is_group=False,
|
|
481
537
|
module_path="machineconfig.scripts.python.ftpx",
|
|
482
538
|
help_text="ftpx <source> <target> --recursive --zipFirst --cloud"
|
|
539
|
+
))
|
|
540
|
+
|
|
541
|
+
# utils command
|
|
542
|
+
utils_node = self.root.add("🛠️ utils - Utility commands", data=CommandInfo(
|
|
543
|
+
name="utils",
|
|
544
|
+
description="Utility commands",
|
|
545
|
+
command="utils",
|
|
546
|
+
is_group=True,
|
|
547
|
+
module_path="machineconfig.scripts.python.utils"
|
|
548
|
+
))
|
|
549
|
+
|
|
550
|
+
utils_node.add("💀 kill-process - Kill processes", data=CommandInfo(
|
|
551
|
+
name="kill-process",
|
|
552
|
+
description="Choose a process to kill interactively",
|
|
553
|
+
command="utils kill-process",
|
|
554
|
+
parent="utils",
|
|
555
|
+
help_text="utils kill-process --interactive"
|
|
556
|
+
))
|
|
557
|
+
|
|
558
|
+
utils_node.add("📚 path - Navigate PATH variable", data=CommandInfo(
|
|
559
|
+
name="path",
|
|
560
|
+
description="Navigate PATH variable with TUI",
|
|
561
|
+
command="utils path",
|
|
562
|
+
parent="utils",
|
|
563
|
+
help_text="utils path"
|
|
564
|
+
))
|
|
565
|
+
|
|
566
|
+
utils_node.add("⬆️ upgrade-packages - Upgrade dependencies", data=CommandInfo(
|
|
567
|
+
name="upgrade-packages",
|
|
568
|
+
description="Upgrade project dependencies",
|
|
569
|
+
command="utils upgrade-packages",
|
|
570
|
+
parent="utils",
|
|
571
|
+
help_text="utils upgrade-packages"
|
|
572
|
+
))
|
|
573
|
+
|
|
574
|
+
utils_node.add("⬇️ download - Download file", data=CommandInfo(
|
|
575
|
+
name="download",
|
|
576
|
+
description="Download a file from a URL and optionally decompress it",
|
|
577
|
+
command="utils download",
|
|
578
|
+
parent="utils",
|
|
579
|
+
help_text="utils download <url> --destination <path> --decompress"
|
|
580
|
+
))
|
|
581
|
+
|
|
582
|
+
utils_node.add("🖥️ get-machine-specs - Get machine specifications", data=CommandInfo(
|
|
583
|
+
name="get-machine-specs",
|
|
584
|
+
description="Get machine specifications",
|
|
585
|
+
command="utils get-machine-specs",
|
|
586
|
+
parent="utils",
|
|
587
|
+
help_text="utils get-machine-specs"
|
|
588
|
+
))
|
|
589
|
+
|
|
590
|
+
utils_node.add("🚀 init-project - Initialize project", data=CommandInfo(
|
|
591
|
+
name="init-project",
|
|
592
|
+
description="Initialize a project with a uv virtual environment and install dev packages",
|
|
593
|
+
command="utils init-project",
|
|
594
|
+
parent="utils",
|
|
595
|
+
help_text="utils init-project"
|
|
596
|
+
))
|
|
597
|
+
|
|
598
|
+
utils_node.add("✏️ edit - Open file in editor", data=CommandInfo(
|
|
599
|
+
name="edit",
|
|
600
|
+
description="Open a file in the default editor",
|
|
601
|
+
command="utils edit",
|
|
602
|
+
parent="utils",
|
|
603
|
+
help_text="utils edit <file>"
|
|
604
|
+
))
|
|
605
|
+
|
|
606
|
+
utils_node.add("📄 pdf-merge - Merge PDF files", data=CommandInfo(
|
|
607
|
+
name="pdf-merge",
|
|
608
|
+
description="Merge two PDF files into one",
|
|
609
|
+
command="utils pdf-merge",
|
|
610
|
+
parent="utils",
|
|
611
|
+
help_text="utils pdf-merge <file1> <file2> --output <file>"
|
|
612
|
+
))
|
|
613
|
+
|
|
614
|
+
utils_node.add("� pdf-compress - Compress PDF file", data=CommandInfo(
|
|
615
|
+
name="pdf-compress",
|
|
616
|
+
description="Compress a PDF file",
|
|
617
|
+
command="utils pdf-compress",
|
|
618
|
+
parent="utils",
|
|
619
|
+
help_text="utils pdf-compress <file> --output <file>"
|
|
483
620
|
))
|
|
@@ -6,11 +6,11 @@ import subprocess
|
|
|
6
6
|
from textual.app import App, ComposeResult
|
|
7
7
|
from textual.widgets import Header, Footer, Input, Tree
|
|
8
8
|
from textual.binding import Binding
|
|
9
|
-
from machineconfig.scripts.python.
|
|
10
|
-
from machineconfig.scripts.python.
|
|
11
|
-
from machineconfig.scripts.python.
|
|
12
|
-
from machineconfig.scripts.python.
|
|
13
|
-
from machineconfig.scripts.python.
|
|
9
|
+
from machineconfig.scripts.python.helpers_navigator.command_builder import CommandBuilderScreen
|
|
10
|
+
from machineconfig.scripts.python.helpers_navigator.command_tree import CommandTree
|
|
11
|
+
from machineconfig.scripts.python.helpers_navigator.command_detail import CommandDetail
|
|
12
|
+
from machineconfig.scripts.python.helpers_navigator.search_bar import SearchBar
|
|
13
|
+
from machineconfig.scripts.python.helpers_navigator.data_models import CommandInfo
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class CommandNavigatorApp(App[None]):
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
|
|
2
|
+
from typing import Optional, TypedDict, cast
|
|
3
|
+
|
|
4
|
+
class CountryFlag(TypedDict, total=False):
|
|
5
|
+
emoji: str
|
|
6
|
+
unicode: str
|
|
7
|
+
|
|
8
|
+
class CountryCurrency(TypedDict, total=False):
|
|
9
|
+
code: str
|
|
10
|
+
symbol: str
|
|
11
|
+
|
|
12
|
+
class Continent(TypedDict, total=False):
|
|
13
|
+
code: str
|
|
14
|
+
name: str
|
|
15
|
+
|
|
16
|
+
class PublicIpInfo(TypedDict, total=True):
|
|
17
|
+
ip: str
|
|
18
|
+
hostname: str
|
|
19
|
+
city: str
|
|
20
|
+
region: str
|
|
21
|
+
country: str
|
|
22
|
+
country_name: str
|
|
23
|
+
country_flag: CountryFlag
|
|
24
|
+
country_flag_url: str
|
|
25
|
+
country_currency: CountryCurrency
|
|
26
|
+
continent: Continent
|
|
27
|
+
loc: str
|
|
28
|
+
org: str
|
|
29
|
+
postal: str
|
|
30
|
+
timezone: str
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def get_public_ip_address() -> PublicIpInfo:
|
|
34
|
+
from machineconfig.utils.installer_utils.installer_cli import install_if_missing
|
|
35
|
+
import subprocess
|
|
36
|
+
install_if_missing("ipinfo")
|
|
37
|
+
result = subprocess.run(
|
|
38
|
+
["ipinfo", "myip", "--json"],
|
|
39
|
+
check=True,
|
|
40
|
+
capture_output=True,
|
|
41
|
+
text=True,
|
|
42
|
+
encoding="utf-8",
|
|
43
|
+
)
|
|
44
|
+
import json
|
|
45
|
+
loaded_json: PublicIpInfo = json.loads(result.stdout)
|
|
46
|
+
return loaded_json
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_all_ipv4_addresses() -> list[tuple[str, str]]:
|
|
50
|
+
import psutil
|
|
51
|
+
import socket
|
|
52
|
+
result: list[tuple[str, str]] = []
|
|
53
|
+
for iface, addrs in psutil.net_if_addrs().items():
|
|
54
|
+
for addr in addrs:
|
|
55
|
+
if addr.family == socket.AF_INET:
|
|
56
|
+
ip = addr.address
|
|
57
|
+
result.append((iface, ip))
|
|
58
|
+
return result
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def select_lan_ipv4(prefer_vpn: bool) -> Optional[str]:
|
|
62
|
+
"""
|
|
63
|
+
Choose the best 'real LAN' IPv4:
|
|
64
|
+
- Excludes loopback/link-local and (by default) VPN/tunnel/container ifaces
|
|
65
|
+
- Prefers physical-looking ifaces (eth/en*/wlan/wl*)
|
|
66
|
+
- Prefers RFC1918 LANs: 192.168/16 > 10/8 > 172.16/12
|
|
67
|
+
- Requires interface is UP
|
|
68
|
+
Set prefer_vpn=True to allow tunnel/VPN ifaces to compete.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
import ipaddress
|
|
72
|
+
import re
|
|
73
|
+
from collections.abc import Sequence
|
|
74
|
+
import psutil
|
|
75
|
+
|
|
76
|
+
# Down-rank or exclude: tunnels/VPNs/bridges/containers (add your own if needed)
|
|
77
|
+
VIRTUAL_IFACE_PAT = re.compile(
|
|
78
|
+
r"^(?:lo|loopback|docker\d*|br-.*|veth.*|virbr.*|bridge.*|"
|
|
79
|
+
r"vboxnet.*|vmnet.*|zt.*|ham.*|tailscale.*|wg\d*|utun\d*|llw\d*|awdl\d*|"
|
|
80
|
+
r"tun\d*|tap\d*|cloudflarewarp.*|warp.*)$",
|
|
81
|
+
re.IGNORECASE,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
# Light preference for names that look like real NICs
|
|
85
|
+
PHYSICAL_IFACE_PAT = re.compile(
|
|
86
|
+
r"^(?:eth\d*|en\d*|enp.*|ens.*|eno.*|wlan\d*|wl.*|.*wifi.*|.*ethernet.*)$",
|
|
87
|
+
re.IGNORECASE,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
# Known noisy CIDRs to avoid
|
|
91
|
+
NOISY_NETS: list[ipaddress.IPv4Network] = [
|
|
92
|
+
ipaddress.IPv4Network("100.64.0.0/10"), # CGNAT (Tailscale/others)
|
|
93
|
+
ipaddress.IPv4Network("172.17.0.0/16"), # docker0 default
|
|
94
|
+
ipaddress.IPv4Network("172.18.0.0/16"),
|
|
95
|
+
ipaddress.IPv4Network("172.19.0.0/16"),
|
|
96
|
+
ipaddress.IPv4Network("192.168.49.0/24"), # minikube default
|
|
97
|
+
ipaddress.IPv4Network("10.0.2.0/24"), # VirtualBox NAT
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
def _in_any(ip: ipaddress.IPv4Address, nets: Sequence[ipaddress.IPv4Network]) -> bool:
|
|
101
|
+
return any(ip in n for n in nets)
|
|
102
|
+
|
|
103
|
+
stats = psutil.net_if_stats()
|
|
104
|
+
best = None
|
|
105
|
+
best_score = -10**9
|
|
106
|
+
import socket
|
|
107
|
+
for iface, addrs in psutil.net_if_addrs().items():
|
|
108
|
+
st = stats.get(iface)
|
|
109
|
+
if not st or not st.isup:
|
|
110
|
+
continue
|
|
111
|
+
|
|
112
|
+
for a in addrs:
|
|
113
|
+
if a.family != socket.AF_INET or not a.address:
|
|
114
|
+
continue
|
|
115
|
+
|
|
116
|
+
ip_str = a.address
|
|
117
|
+
try:
|
|
118
|
+
ip = cast(ipaddress.IPv4Address, ipaddress.ip_address(ip_str))
|
|
119
|
+
except ValueError:
|
|
120
|
+
continue
|
|
121
|
+
|
|
122
|
+
# Exclude unusable classes
|
|
123
|
+
if ip.is_loopback or ip.is_link_local: # 127.0.0.0/8, 169.254.0.0/16
|
|
124
|
+
continue
|
|
125
|
+
|
|
126
|
+
# Hard filter: if it looks virtual and we don't prefer VPNs, skip it
|
|
127
|
+
if not prefer_vpn and VIRTUAL_IFACE_PAT.match(iface):
|
|
128
|
+
continue
|
|
129
|
+
|
|
130
|
+
# Hard filter: known noisy subnets (docker, cgnat, etc.)
|
|
131
|
+
if _in_any(ip, NOISY_NETS) and not prefer_vpn:
|
|
132
|
+
continue
|
|
133
|
+
|
|
134
|
+
# Base score
|
|
135
|
+
score = 0
|
|
136
|
+
|
|
137
|
+
# Prefer physical-looking names
|
|
138
|
+
if PHYSICAL_IFACE_PAT.match(iface):
|
|
139
|
+
score += 200
|
|
140
|
+
|
|
141
|
+
# Broadcast present usually means L2 LAN (not point-to-point)
|
|
142
|
+
# (psutil puts it on the same entry as .broadcast)
|
|
143
|
+
if getattr(a, "broadcast", None):
|
|
144
|
+
score += 100
|
|
145
|
+
|
|
146
|
+
# Prefer private RFC1918; rank families
|
|
147
|
+
if ip.is_private:
|
|
148
|
+
# Order: 192.168.x.x > 10.x.x.x > 172.16-31.x.x
|
|
149
|
+
ip_net = ipaddress.IPv4Network((ip, 32), strict=False)
|
|
150
|
+
if ipaddress.IPv4Network("192.168.0.0/16").supernet_of(ip_net):
|
|
151
|
+
score += 90
|
|
152
|
+
elif ipaddress.IPv4Network("10.0.0.0/8").supernet_of(ip_net):
|
|
153
|
+
score += 70
|
|
154
|
+
elif ipaddress.IPv4Network("172.16.0.0/12").supernet_of(ip_net):
|
|
155
|
+
score += 50
|
|
156
|
+
else:
|
|
157
|
+
# Public on a NIC is unusual for a home/office LAN
|
|
158
|
+
score -= 50
|
|
159
|
+
|
|
160
|
+
# Slight nudge by interface speed if known (>0 means psutil knows it)
|
|
161
|
+
# (Many tunnels report 0)
|
|
162
|
+
if getattr(st, "speed", 0) > 0:
|
|
163
|
+
score += 20
|
|
164
|
+
|
|
165
|
+
# Deterministic tie-breaker: prefer shorter iface name (eth0 over eth10)
|
|
166
|
+
score -= len(iface) * 0.01
|
|
167
|
+
|
|
168
|
+
if score > best_score:
|
|
169
|
+
best_score = score
|
|
170
|
+
best = ip_str
|
|
171
|
+
|
|
172
|
+
return best
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
if __name__ == "__main__":
|
|
176
|
+
print(select_lan_ipv4(False) or "No LAN IPv4 found")
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
import time
|
|
3
|
+
|
|
4
|
+
from machineconfig.scripts.python.helpers_network.address import get_public_ip_address
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def switch_public_ip_address(max_trials: int = 10, wait_seconds: float = 4.0) -> None:
|
|
8
|
+
print("🔁 Switching IP ... ")
|
|
9
|
+
from machineconfig.utils.installer_utils.installer_cli import install_if_missing
|
|
10
|
+
install_if_missing("warp-cli")
|
|
11
|
+
|
|
12
|
+
current_ip: str | None = None
|
|
13
|
+
try:
|
|
14
|
+
current_data = get_public_ip_address()
|
|
15
|
+
current_ip = current_data.get("ip")
|
|
16
|
+
except Exception as e:
|
|
17
|
+
print(f"⚠️ Could not get current IP: {e}")
|
|
18
|
+
|
|
19
|
+
print(f"Current IP: {current_ip}")
|
|
20
|
+
|
|
21
|
+
for attempt in range(1, max_trials + 1):
|
|
22
|
+
print(f"\n--- Attempt {attempt}/{max_trials} ---")
|
|
23
|
+
|
|
24
|
+
print("🔻 Deactivating current connection ... ")
|
|
25
|
+
# We use check=False because if it's already deleted it might return non-zero
|
|
26
|
+
subprocess.run(["warp-cli", "registration", "delete"], check=False)
|
|
27
|
+
|
|
28
|
+
print(f"😴 Sleeping for {wait_seconds} seconds ... ")
|
|
29
|
+
time.sleep(wait_seconds)
|
|
30
|
+
|
|
31
|
+
print("🔼 Registering new connection ... ")
|
|
32
|
+
res_reg = subprocess.run(["warp-cli", "registration", "new"], check=False)
|
|
33
|
+
if res_reg.returncode != 0:
|
|
34
|
+
print("⚠️ Registration failed, retrying loop...")
|
|
35
|
+
continue
|
|
36
|
+
|
|
37
|
+
print("🔗 Connecting ... ")
|
|
38
|
+
subprocess.run(["warp-cli", "connect"], check=False)
|
|
39
|
+
|
|
40
|
+
print(f"😴 Sleeping for {wait_seconds} seconds ... ")
|
|
41
|
+
time.sleep(wait_seconds)
|
|
42
|
+
|
|
43
|
+
print("🔍 Checking status of warp ... ")
|
|
44
|
+
subprocess.run(["warp-cli", "status"], check=False)
|
|
45
|
+
|
|
46
|
+
print("🔍 Checking new IP ... ")
|
|
47
|
+
new_ip: str | None = None
|
|
48
|
+
# Retry getting IP a few times before giving up on this connection attempt
|
|
49
|
+
for ip_check_attempt in range(5):
|
|
50
|
+
try:
|
|
51
|
+
new_data = get_public_ip_address()
|
|
52
|
+
new_ip = new_data["ip"]
|
|
53
|
+
if new_ip:
|
|
54
|
+
break
|
|
55
|
+
except Exception as e:
|
|
56
|
+
print(f"⚠️ Error checking new IP (attempt {ip_check_attempt+1}/5): {e}")
|
|
57
|
+
time.sleep(wait_seconds)
|
|
58
|
+
|
|
59
|
+
if new_ip:
|
|
60
|
+
print(f"New IP: {new_ip}")
|
|
61
|
+
|
|
62
|
+
if current_ip and new_ip != current_ip:
|
|
63
|
+
print("✅ Done ... IP Changed.")
|
|
64
|
+
return
|
|
65
|
+
elif current_ip is None:
|
|
66
|
+
print("✅ Done ... IP obtained (was unknown).")
|
|
67
|
+
return
|
|
68
|
+
else:
|
|
69
|
+
print("❌ IP did not change.")
|
|
70
|
+
else:
|
|
71
|
+
print("⚠️ Could not retrieve new IP after multiple attempts.")
|
|
72
|
+
|
|
73
|
+
print("❌ Failed to switch IP after max trials.")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if __name__ == "__main__":
|
|
77
|
+
switch_public_ip_address()
|
|
78
|
+
|
|
@@ -20,8 +20,8 @@ def main():
|
|
|
20
20
|
tmp = choose_ssh_host(multi=False)
|
|
21
21
|
assert isinstance(tmp, str)
|
|
22
22
|
ssh = SSH(host=tmp, username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=False)
|
|
23
|
-
default = f"{ssh.hostname}:{ssh.
|
|
24
|
-
share_info = choose_from_options(msg="📂 Choose a share path:", options=[f"{ssh.hostname}:{item.split(' ')[0]}" for item in ssh.
|
|
23
|
+
default = f"{ssh.hostname}:{ssh.run_shell_cmd_on_remote(command='echo $HOME', verbose_output=False, description='Get home directory', strict_stderr=False, strict_return_code=True).op}/data/share_nfs"
|
|
24
|
+
share_info = choose_from_options(msg="📂 Choose a share path:", options=[f"{ssh.hostname}:{item.split(' ')[0]}" for item in ssh.run_shell_cmd_on_remote(command="cat /etc/exports", verbose_output=False, description='Get NFS exports', strict_stderr=False, strict_return_code=False).op.split("\n") if not item.startswith("#")] + [default], default=default, multi=False)
|
|
25
25
|
assert isinstance(share_info, str), f"❌ share_info must be a string. Got {type(share_info)}"
|
|
26
26
|
|
|
27
27
|
remote_server = share_info.split(":")[0]
|
|
@@ -19,7 +19,7 @@ def main():
|
|
|
19
19
|
tmp = choose_ssh_host(multi=False)
|
|
20
20
|
assert isinstance(tmp, str)
|
|
21
21
|
ssh = SSH(host=tmp, username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=False)
|
|
22
|
-
share_info = f"{ssh.username}@{ssh.hostname}:{ssh.
|
|
22
|
+
share_info = f"{ssh.username}@{ssh.hostname}:{ssh.run_shell_cmd_on_remote(command='echo $HOME', verbose_output=False, description='Get home directory', strict_stderr=False, strict_return_code=True).op}/data/share_ssh"
|
|
23
23
|
else:
|
|
24
24
|
ssh = SSH(host=share_info.split(":")[0], username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=False)
|
|
25
25
|
|
machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py}
RENAMED
|
@@ -1,4 +1,38 @@
|
|
|
1
|
-
"""ID
|
|
1
|
+
"""ID
|
|
2
|
+
|
|
3
|
+
On windows:
|
|
4
|
+
|
|
5
|
+
# on the side of the local machine, you need to sort out the following:
|
|
6
|
+
# if the $sshfile doesn't have a standard name, you will need to explicitly specify the identity while SSHing (e.g. ssh u@s -i ~/.ssh/my_id)
|
|
7
|
+
# However, this must be done every time. For permanent solutions, use .ssh/config
|
|
8
|
+
$sshfile = "$env:USERPROFILE/.ssh/id_rsa"
|
|
9
|
+
Set-Service ssh-agent -StartupType Manual # allow the service to be started manually
|
|
10
|
+
ssh-agent # start the service
|
|
11
|
+
ssh-add.exe $sshfile # add the key to the agent
|
|
12
|
+
|
|
13
|
+
# add key:
|
|
14
|
+
$sshfile=""
|
|
15
|
+
$ErrorActionPreference = "Stop"
|
|
16
|
+
$sshd_dir = "$env:ProgramData/ssh"
|
|
17
|
+
cp "$sshd_dir/administrators_authorized_keys" "$sshd_dir/administrators_authorized_keys.orig"
|
|
18
|
+
Get-Content $sshfile >> "$sshd_dir/administrators_authorized_keys"
|
|
19
|
+
Restart-Service sshd -Force
|
|
20
|
+
|
|
21
|
+
# copy ssh key:
|
|
22
|
+
# This is the Windows equivalent of copy-ssh-id on Linux.
|
|
23
|
+
# Just like the original function, it is a convenient way of doing two things in one go:
|
|
24
|
+
# 1- copy a certain public key to the remote machine.
|
|
25
|
+
# scp ~/.ssh/id_rsa.pub $remote_user@$remote_host:~/.ssh/authorized_keys
|
|
26
|
+
# 2- Store the value on the remote in a file called .ssh/authorized_keys
|
|
27
|
+
# ssh $remote_user@$remote_host "echo $public_key >> ~/.ssh/authorized_keys"
|
|
28
|
+
# Idea from: https://www.chrisjhart.com/Windows-10-ssh-copy-id/
|
|
29
|
+
|
|
30
|
+
$key_value = cat ($env:USERPROFILE + "/.ssh/id_rsa.pub")
|
|
31
|
+
ssh $args[0] "powershell.exe -Command type $key_value >> .ssh/authorized_keys"
|
|
32
|
+
$my_keys='https://github.com/thisismygitrepo.keys'
|
|
33
|
+
(Invoke-WebRequest $my_keys).Content >> .ssh/authorized_keys
|
|
34
|
+
|
|
35
|
+
"""
|
|
2
36
|
|
|
3
37
|
# from platform import system
|
|
4
38
|
from machineconfig.utils.path_extended import PathExtended
|
machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py}
RENAMED
|
@@ -13,9 +13,9 @@ import typer
|
|
|
13
13
|
console = Console()
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
def get_add_ssh_key_script(path_to_key: PathExtended):
|
|
16
|
+
def get_add_ssh_key_script(path_to_key: PathExtended) -> str:
|
|
17
17
|
console.print(Panel("🔑 SSH KEY CONFIGURATION", title="[bold blue]SSH Setup[/bold blue]"))
|
|
18
|
-
if system() == "Linux":
|
|
18
|
+
if system() == "Linux" or system() == "Darwin":
|
|
19
19
|
authorized_keys = PathExtended.home().joinpath(".ssh/authorized_keys")
|
|
20
20
|
console.print(Panel(f"🐧 Linux SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
|
|
21
21
|
elif system() == "Windows":
|
|
@@ -35,10 +35,10 @@ def get_add_ssh_key_script(path_to_key: PathExtended):
|
|
|
35
35
|
program = ""
|
|
36
36
|
else:
|
|
37
37
|
console.print(Panel(f"➕ Adding new SSH key to authorized keys\n🔑 Key file: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
|
|
38
|
-
if system() == "Linux":
|
|
38
|
+
if system() == "Linux" or system() == "Darwin":
|
|
39
39
|
program = f"cat {path_to_key} >> ~/.ssh/authorized_keys"
|
|
40
40
|
elif system() == "Windows":
|
|
41
|
-
program_path = LIBRARY_ROOT.joinpath("setup_windows/add-sshkey.ps1")
|
|
41
|
+
program_path = LIBRARY_ROOT.joinpath("setup_windows/ssh/add-sshkey.ps1")
|
|
42
42
|
program = program_path.expanduser().read_text(encoding="utf-8")
|
|
43
43
|
place_holder = r'$sshfile = "$env:USERPROFILE\.ssh\pubkey.pub"'
|
|
44
44
|
assert place_holder in program, f"This section performs string manipulation on the script {program_path} to add the key to the authorized_keys file. The script has changed and the string {place_holder} is not found."
|
|
@@ -48,14 +48,14 @@ def get_add_ssh_key_script(path_to_key: PathExtended):
|
|
|
48
48
|
raise NotImplementedError
|
|
49
49
|
else:
|
|
50
50
|
console.print(Panel(f"📝 Creating new authorized_keys file\n🔑 Using key: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
|
|
51
|
-
if system() == "Linux":
|
|
51
|
+
if system() == "Linux" or system() == "Darwin":
|
|
52
52
|
program = f"cat {path_to_key} > ~/.ssh/authorized_keys"
|
|
53
53
|
else:
|
|
54
|
-
program_path = LIBRARY_ROOT.joinpath("setup_windows/openssh-server_add-sshkey.ps1")
|
|
54
|
+
program_path = LIBRARY_ROOT.joinpath("setup_windows/ssh/openssh-server_add-sshkey.ps1")
|
|
55
55
|
program = PathExtended(program_path).expanduser().read_text(encoding="utf-8").replace('$sshfile=""', f'$sshfile="{path_to_key}"')
|
|
56
56
|
console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Set key path in script", title="[bold blue]Configuration[/bold blue]"))
|
|
57
57
|
|
|
58
|
-
if system() == "Linux":
|
|
58
|
+
if system() == "Linux" or system() == "Darwin":
|
|
59
59
|
program += """
|
|
60
60
|
sudo chmod 700 ~/.ssh
|
|
61
61
|
sudo chmod 644 ~/.ssh/authorized_keys
|
|
@@ -66,6 +66,16 @@ sudo service ssh --full-restart
|
|
|
66
66
|
return program
|
|
67
67
|
|
|
68
68
|
|
|
69
|
+
"""
|
|
70
|
+
Common pitfalls:
|
|
71
|
+
🚫 Wrong line endings (LF/CRLF) in config files
|
|
72
|
+
🌐 Network port conflicts (try 2222 -> 2223) between WSL and Windows
|
|
73
|
+
sudo service ssh restart
|
|
74
|
+
sudo service ssh status
|
|
75
|
+
sudo nano /etc/ssh/sshd_config
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
|
|
69
79
|
def main(pub_path: Annotated[Optional[str], typer.Argument(..., help="Path to the public key file")] = None,
|
|
70
80
|
pub_choose: Annotated[bool, typer.Option(..., "--choose", "-c", help="Choose from available public keys in ~/.ssh")] = False,
|
|
71
81
|
pub_val: Annotated[bool, typer.Option(..., "--paste", "-p", help="Paste the public key content manually")] = False,
|
|
@@ -127,6 +137,15 @@ def main(pub_path: Annotated[Optional[str], typer.Argument(..., help="Path to th
|
|
|
127
137
|
console.print(Panel("🚀 SSH KEY AUTHORIZATION READY\nRun the generated script to apply changes", box=box.DOUBLE_EDGE, title_align="left"))
|
|
128
138
|
from machineconfig.utils.code import run_shell_script
|
|
129
139
|
run_shell_script(script=program)
|
|
140
|
+
|
|
141
|
+
import machineconfig.scripts.python.helpers_network.address as helper
|
|
142
|
+
res = helper.select_lan_ipv4(prefer_vpn=False)
|
|
143
|
+
if res is None:
|
|
144
|
+
console.print(Panel("❌ ERROR: Could not determine local LAN IPv4 address", title="[bold red]Error[/bold red]", border_style="red"))
|
|
145
|
+
raise typer.Exit(code=1)
|
|
146
|
+
local_ip_v4 = res
|
|
147
|
+
|
|
148
|
+
console.print(Panel(f"🌐 This computer is accessible at: {local_ip_v4}", title="[bold green]Network Info[/bold green]", border_style="green"))
|
|
130
149
|
console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
|
|
131
150
|
|
|
132
151
|
|