machineconfig 7.98__py3-none-any.whl → 8.61__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 +28 -43
- 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_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 +229 -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 +130 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config_mount.py +77 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +71 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +285 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +84 -33
- 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/helpers_devops/cli_share_temp.py +69 -0
- 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/mount_helpers/commands.py +25 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/device_entry.py +17 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/devices.py +17 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/linux.py +103 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/macos.py +100 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/selection.py +47 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/utils.py +28 -0
- machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/windows.py +91 -0
- 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_fire_command/fire_jobs_streamlit_helper.py +0 -0
- 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 +2 -7
- 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/helpers_network/__init__.py +0 -0
- 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/helpers_network/ssh/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_identity.py +73 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_key_windows.py +23 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_ssh_key.py +169 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_cloud_init.py +33 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux.py +338 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux_utils.py +35 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows.py +245 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows_utils.py +34 -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 +120 -37
- 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/attach_impl.py +87 -0
- machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +114 -0
- machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -2
- machineconfig/scripts/python/helpers/helpers_sessions/utils.py +69 -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 +126 -48
- machineconfig/scripts/python/msearch.py +16 -61
- machineconfig/scripts/python/sessions.py +137 -191
- machineconfig/scripts/python/utils.py +104 -24
- 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 -10
- 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 +71 -5
- machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +4 -0
- machineconfig/settings/shells/wt/settings.json +31 -37
- machineconfig/settings/shells/zsh/init.sh +25 -5
- 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/__init__.py +0 -0
- machineconfig/settings/zellij/config.kdl +0 -295
- machineconfig/settings/zellij/layouts/__init__.py +0 -0
- machineconfig/settings/zellij/layouts/st.kdl +39 -9
- machineconfig/settings/zellij/layouts/st2.kdl +6 -2
- 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 +7 -17
- machineconfig/utils/installer_utils/installer_helper.py +52 -36
- machineconfig/utils/installer_utils/installer_locator_utils.py +15 -25
- 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/procs.py +35 -27
- machineconfig/utils/scheduler.py +8 -2
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +10 -0
- machineconfig/utils/source_of_truth.py +7 -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.61.dist-info}/METADATA +30 -23
- machineconfig-8.61.dist-info/RECORD +539 -0
- {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/entry_points.txt +0 -1
- machineconfig/jobs/installer/check_installations.py +0 -248
- machineconfig/profile/backup.toml +0 -49
- machineconfig/profile/mapper.toml +0 -263
- machineconfig/scripts/linux/other/share_cloud.sh +0 -64
- machineconfig/scripts/linux/other/share_nfs +0 -49
- machineconfig/scripts/linux/other/start_docker +0 -23
- 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_nw.py +0 -214
- 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/mount_drive +0 -128
- machineconfig/scripts/python/helpers_network/mount_nfs +0 -49
- machineconfig/scripts/python/helpers_network/mount_nfs.py +0 -85
- machineconfig/scripts/python/helpers_network/mount_nw_drive +0 -61
- machineconfig/scripts/python/helpers_network/mount_nw_drive.py +0 -48
- machineconfig/scripts/python/helpers_network/mount_smb +0 -3
- machineconfig/scripts/python/helpers_network/mount_ssh.py +0 -64
- 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/python/terminal.py +0 -133
- machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +0 -92
- machineconfig/scripts/windows/mounts/mount_nfs.ps1 +0 -42
- machineconfig/scripts/windows/mounts/mount_nw.ps1 +0 -9
- machineconfig/scripts/windows/mounts/mount_smb.ps1 +0 -2
- machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
- machineconfig/scripts/windows/mounts/share_cloud.cmd +0 -34
- machineconfig/scripts/windows/mounts/share_smb.ps1 +0 -16
- machineconfig/settings/zellij/config.orig.kdl +0 -295
- machineconfig/setup_linux/others/android.sh +0 -2
- 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/docker.ps1 +0 -7
- machineconfig/setup_windows/others/obs.ps1 +0 -4
- machineconfig/setup_windows/others/power_options.ps1 +0 -7
- 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 → cluster/sessions_managers/wt_utils/examples}/__init__.py +0 -0
- /machineconfig/{scripts/python/helpers_agents → jobs/installer/checks}/__init__.py +0 -0
- /machineconfig/{scripts/python/helpers_agents/agentic_frameworks → 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/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +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_cloud → graph}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → 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_devops → helpers/helpers_agents}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes → 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_fire_command → 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_network → 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_sessions → helpers/helpers_devops}/__init__.py +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/mount_helpers}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_devops/themes/__init__.py} +0 -0
- /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
- /machineconfig/scripts/python/{helpers_fire_command/f.py → 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/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.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_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.61.dist-info}/WHEEL +0 -0
- {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
@dataclass(frozen=True)
|
|
5
|
+
class DeviceEntry:
|
|
6
|
+
platform_name: str
|
|
7
|
+
key: str
|
|
8
|
+
device_path: str
|
|
9
|
+
device_type: str | None
|
|
10
|
+
label: str | None
|
|
11
|
+
mount_point: str | None
|
|
12
|
+
fs_type: str | None
|
|
13
|
+
size: str | None
|
|
14
|
+
extra: str | None
|
|
15
|
+
disk_number: int | None
|
|
16
|
+
partition_number: int | None
|
|
17
|
+
drive_letter: str | None
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import platform
|
|
2
|
+
|
|
3
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
|
|
4
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.linux import list_linux_devices
|
|
5
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.macos import list_macos_devices
|
|
6
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.windows import list_windows_devices
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def list_devices() -> list[DeviceEntry]:
|
|
10
|
+
platform_name = platform.system()
|
|
11
|
+
if platform_name == "Linux":
|
|
12
|
+
return list_linux_devices()
|
|
13
|
+
if platform_name == "Darwin":
|
|
14
|
+
return list_macos_devices()
|
|
15
|
+
if platform_name == "Windows":
|
|
16
|
+
return list_windows_devices()
|
|
17
|
+
return []
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.commands import ensure_ok, run_command, run_command_sudo
|
|
6
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
|
|
7
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.selection import pick_device
|
|
8
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.utils import as_str
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _flatten_lsblk_devices(devices: list[dict[str, object]]) -> list[dict[str, object]]:
|
|
12
|
+
result: list[dict[str, object]] = []
|
|
13
|
+
stack = list(devices)
|
|
14
|
+
while stack:
|
|
15
|
+
item = stack.pop(0)
|
|
16
|
+
result.append(item)
|
|
17
|
+
children = item.get("children")
|
|
18
|
+
if isinstance(children, list):
|
|
19
|
+
for child in children:
|
|
20
|
+
if isinstance(child, dict):
|
|
21
|
+
stack.append(child)
|
|
22
|
+
return result
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def list_linux_devices() -> list[DeviceEntry]:
|
|
26
|
+
result = run_command(["lsblk", "-J", "-o", "NAME,SIZE,TYPE,FSTYPE,LABEL,MOUNTPOINT,UUID,MODEL"])
|
|
27
|
+
text = ensure_ok(result, "lsblk")
|
|
28
|
+
data = json.loads(text)
|
|
29
|
+
raw_devices = data.get("blockdevices")
|
|
30
|
+
entries: list[DeviceEntry] = []
|
|
31
|
+
if isinstance(raw_devices, list):
|
|
32
|
+
for item in _flatten_lsblk_devices(raw_devices):
|
|
33
|
+
name_value = item.get("name")
|
|
34
|
+
if not isinstance(name_value, str):
|
|
35
|
+
continue
|
|
36
|
+
device_type = item.get("type")
|
|
37
|
+
if not isinstance(device_type, str):
|
|
38
|
+
continue
|
|
39
|
+
if device_type not in {"disk", "part"}:
|
|
40
|
+
continue
|
|
41
|
+
device_path = f"/dev/{name_value}"
|
|
42
|
+
label = as_str(item.get("label"))
|
|
43
|
+
mount_point = as_str(item.get("mountpoint"))
|
|
44
|
+
fs_type = as_str(item.get("fstype"))
|
|
45
|
+
size = as_str(item.get("size"))
|
|
46
|
+
model = as_str(item.get("model"))
|
|
47
|
+
entries.append(
|
|
48
|
+
DeviceEntry(
|
|
49
|
+
platform_name="Linux",
|
|
50
|
+
key=name_value,
|
|
51
|
+
device_path=device_path,
|
|
52
|
+
device_type=device_type,
|
|
53
|
+
label=label,
|
|
54
|
+
mount_point=mount_point,
|
|
55
|
+
fs_type=fs_type,
|
|
56
|
+
size=size,
|
|
57
|
+
extra=model,
|
|
58
|
+
disk_number=None,
|
|
59
|
+
partition_number=None,
|
|
60
|
+
drive_letter=None,
|
|
61
|
+
)
|
|
62
|
+
)
|
|
63
|
+
return entries
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def mount_linux(entry: DeviceEntry, mount_point: str) -> None:
|
|
67
|
+
mount_path = Path(mount_point)
|
|
68
|
+
try:
|
|
69
|
+
mount_path.mkdir(parents=True, exist_ok=True)
|
|
70
|
+
except PermissionError:
|
|
71
|
+
mkdir_result = run_command_sudo(["mkdir", "-p", str(mount_path)])
|
|
72
|
+
ensure_ok(mkdir_result, "mkdir")
|
|
73
|
+
if os.geteuid() == 0:
|
|
74
|
+
result = run_command(["mount", entry.device_path, str(mount_path)])
|
|
75
|
+
else:
|
|
76
|
+
result = run_command_sudo(["mount", entry.device_path, str(mount_path)])
|
|
77
|
+
ensure_ok(result, "mount")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _is_partition_of_disk(partition: DeviceEntry, disk: DeviceEntry) -> bool:
|
|
81
|
+
if partition.device_type != "part" or disk.device_type != "disk":
|
|
82
|
+
return False
|
|
83
|
+
if partition.key == disk.key:
|
|
84
|
+
return False
|
|
85
|
+
if not partition.key.startswith(disk.key):
|
|
86
|
+
return False
|
|
87
|
+
return True
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def select_linux_partition(entries: list[DeviceEntry], entry: DeviceEntry) -> DeviceEntry:
|
|
91
|
+
if entry.device_type != "disk":
|
|
92
|
+
return entry
|
|
93
|
+
candidates = [device for device in entries if _is_partition_of_disk(device, entry)]
|
|
94
|
+
with_fs = [device for device in candidates if device.fs_type is not None and device.fs_type != ""]
|
|
95
|
+
if len(with_fs) == 1:
|
|
96
|
+
return with_fs[0]
|
|
97
|
+
if len(with_fs) > 1:
|
|
98
|
+
return pick_device(with_fs, header="Select partition to mount")
|
|
99
|
+
if len(candidates) == 1:
|
|
100
|
+
return candidates[0]
|
|
101
|
+
if len(candidates) > 1:
|
|
102
|
+
return pick_device(candidates, header="Select partition to mount")
|
|
103
|
+
raise RuntimeError("No mountable partitions found for selected disk")
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import plistlib
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.commands import ensure_ok, run_command
|
|
5
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
|
|
6
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.utils import as_str, format_size_bytes
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _diskutil_info(identifier: str) -> dict[str, object]:
|
|
10
|
+
result = run_command(["diskutil", "info", "-plist", identifier])
|
|
11
|
+
text = ensure_ok(result, "diskutil info")
|
|
12
|
+
return plistlib.loads(text.encode("utf-8"))
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def list_macos_devices() -> list[DeviceEntry]:
|
|
16
|
+
result = run_command(["diskutil", "list", "-plist"])
|
|
17
|
+
text = ensure_ok(result, "diskutil list")
|
|
18
|
+
data = plistlib.loads(text.encode("utf-8"))
|
|
19
|
+
entries: list[DeviceEntry] = []
|
|
20
|
+
all_disks = data.get("AllDisksAndPartitions")
|
|
21
|
+
if isinstance(all_disks, list):
|
|
22
|
+
for disk in all_disks:
|
|
23
|
+
if not isinstance(disk, dict):
|
|
24
|
+
continue
|
|
25
|
+
partitions = disk.get("Partitions")
|
|
26
|
+
if isinstance(partitions, list) and partitions:
|
|
27
|
+
for partition in partitions:
|
|
28
|
+
if not isinstance(partition, dict):
|
|
29
|
+
continue
|
|
30
|
+
identifier = partition.get("DeviceIdentifier")
|
|
31
|
+
if not isinstance(identifier, str):
|
|
32
|
+
continue
|
|
33
|
+
info = _diskutil_info(identifier)
|
|
34
|
+
mount_point = as_str(info.get("MountPoint"))
|
|
35
|
+
label = as_str(info.get("VolumeName"))
|
|
36
|
+
fs_type = as_str(info.get("FilesystemType"))
|
|
37
|
+
if fs_type is None:
|
|
38
|
+
fs_type = as_str(info.get("FileSystemType"))
|
|
39
|
+
size_value = info.get("TotalSize")
|
|
40
|
+
size = format_size_bytes(size_value) if isinstance(size_value, int) else None
|
|
41
|
+
media_name = as_str(info.get("MediaName"))
|
|
42
|
+
device_path = f"/dev/{identifier}"
|
|
43
|
+
entries.append(
|
|
44
|
+
DeviceEntry(
|
|
45
|
+
platform_name="Darwin",
|
|
46
|
+
key=identifier,
|
|
47
|
+
device_path=device_path,
|
|
48
|
+
device_type="part",
|
|
49
|
+
label=label,
|
|
50
|
+
mount_point=mount_point,
|
|
51
|
+
fs_type=fs_type,
|
|
52
|
+
size=size,
|
|
53
|
+
extra=media_name,
|
|
54
|
+
disk_number=None,
|
|
55
|
+
partition_number=None,
|
|
56
|
+
drive_letter=None,
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
else:
|
|
60
|
+
identifier = disk.get("DeviceIdentifier")
|
|
61
|
+
if not isinstance(identifier, str):
|
|
62
|
+
continue
|
|
63
|
+
info = _diskutil_info(identifier)
|
|
64
|
+
mount_point = as_str(info.get("MountPoint"))
|
|
65
|
+
label = as_str(info.get("VolumeName"))
|
|
66
|
+
fs_type = as_str(info.get("FilesystemType"))
|
|
67
|
+
if fs_type is None:
|
|
68
|
+
fs_type = as_str(info.get("FileSystemType"))
|
|
69
|
+
size_value = info.get("TotalSize")
|
|
70
|
+
size = format_size_bytes(size_value) if isinstance(size_value, int) else None
|
|
71
|
+
media_name = as_str(info.get("MediaName"))
|
|
72
|
+
device_path = f"/dev/{identifier}"
|
|
73
|
+
entries.append(
|
|
74
|
+
DeviceEntry(
|
|
75
|
+
platform_name="Darwin",
|
|
76
|
+
key=identifier,
|
|
77
|
+
device_path=device_path,
|
|
78
|
+
device_type="disk",
|
|
79
|
+
label=label,
|
|
80
|
+
mount_point=mount_point,
|
|
81
|
+
fs_type=fs_type,
|
|
82
|
+
size=size,
|
|
83
|
+
extra=media_name,
|
|
84
|
+
disk_number=None,
|
|
85
|
+
partition_number=None,
|
|
86
|
+
drive_letter=None,
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
return entries
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def mount_macos(entry: DeviceEntry, mount_point: str) -> None:
|
|
93
|
+
if mount_point == "-":
|
|
94
|
+
result = run_command(["diskutil", "mount", entry.key])
|
|
95
|
+
ensure_ok(result, "diskutil mount")
|
|
96
|
+
return
|
|
97
|
+
mount_path = Path(mount_point)
|
|
98
|
+
mount_path.mkdir(parents=True, exist_ok=True)
|
|
99
|
+
result = run_command(["diskutil", "mount", "-mountPoint", str(mount_path), entry.key])
|
|
100
|
+
ensure_ok(result, "diskutil mount")
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
|
|
2
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.utils import format_device
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def pick_device(entries: list[DeviceEntry], header: str) -> DeviceEntry:
|
|
6
|
+
from machineconfig.utils.options import choose_from_options
|
|
7
|
+
|
|
8
|
+
options: list[str] = []
|
|
9
|
+
map_option: dict[str, DeviceEntry] = {}
|
|
10
|
+
for idx, entry in enumerate(entries):
|
|
11
|
+
option = f"{idx:02d} {format_device(entry)}"
|
|
12
|
+
options.append(option)
|
|
13
|
+
map_option[option] = entry
|
|
14
|
+
choice = choose_from_options(options=options, msg="Select a device", multi=False, header=header, tv=True)
|
|
15
|
+
selected = map_option.get(choice)
|
|
16
|
+
if selected is None:
|
|
17
|
+
raise RuntimeError("Selection not found")
|
|
18
|
+
return selected
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def resolve_device(entries: list[DeviceEntry], query: str) -> DeviceEntry:
|
|
22
|
+
query_value = query.strip()
|
|
23
|
+
if query_value in {"?", ""}:
|
|
24
|
+
return pick_device(entries, header="Available devices")
|
|
25
|
+
exact_matches = [
|
|
26
|
+
entry
|
|
27
|
+
for entry in entries
|
|
28
|
+
if entry.device_path.lower() == query_value.lower()
|
|
29
|
+
or entry.key.lower() == query_value.lower()
|
|
30
|
+
or (entry.label is not None and entry.label.lower() == query_value.lower())
|
|
31
|
+
]
|
|
32
|
+
if len(exact_matches) == 1:
|
|
33
|
+
return exact_matches[0]
|
|
34
|
+
if len(exact_matches) > 1:
|
|
35
|
+
return pick_device(exact_matches, header="Multiple matches")
|
|
36
|
+
partial_matches = [
|
|
37
|
+
entry
|
|
38
|
+
for entry in entries
|
|
39
|
+
if query_value.lower() in entry.device_path.lower()
|
|
40
|
+
or query_value.lower() in entry.key.lower()
|
|
41
|
+
or (entry.label is not None and query_value.lower() in entry.label.lower())
|
|
42
|
+
]
|
|
43
|
+
if len(partial_matches) == 1:
|
|
44
|
+
return partial_matches[0]
|
|
45
|
+
if len(partial_matches) > 1:
|
|
46
|
+
return pick_device(partial_matches, header="Multiple matches")
|
|
47
|
+
return pick_device(entries, header="Available devices")
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def as_str(value: object) -> str | None:
|
|
5
|
+
if isinstance(value, str) and value != "":
|
|
6
|
+
return value
|
|
7
|
+
return None
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def format_size_bytes(size_bytes: int) -> str:
|
|
11
|
+
units = ["B", "KB", "MB", "GB", "TB", "PB"]
|
|
12
|
+
value = float(size_bytes)
|
|
13
|
+
unit_index = 0
|
|
14
|
+
while value >= 1024 and unit_index < len(units) - 1:
|
|
15
|
+
value = value / 1024
|
|
16
|
+
unit_index += 1
|
|
17
|
+
if unit_index == 0:
|
|
18
|
+
return f"{int(value)} {units[unit_index]}"
|
|
19
|
+
return f"{value:.1f} {units[unit_index]}"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def format_device(entry: DeviceEntry) -> str:
|
|
23
|
+
label = entry.label if entry.label is not None and entry.label != "" else "-"
|
|
24
|
+
fs_type = entry.fs_type if entry.fs_type is not None and entry.fs_type != "" else "-"
|
|
25
|
+
size = entry.size if entry.size is not None and entry.size != "" else "-"
|
|
26
|
+
mount_point = entry.mount_point if entry.mount_point is not None and entry.mount_point != "" else "-"
|
|
27
|
+
extra = entry.extra if entry.extra is not None and entry.extra != "" else "-"
|
|
28
|
+
return f"{entry.key} | {entry.device_path} | {fs_type} | {size} | {mount_point} | {label} | {extra}"
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.commands import ensure_ok, run_powershell
|
|
5
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
|
|
6
|
+
from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.utils import as_str, format_size_bytes
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _normalize_ps_json(raw_text: str) -> list[dict[str, object]]:
|
|
10
|
+
if raw_text.strip() == "":
|
|
11
|
+
return []
|
|
12
|
+
data = json.loads(raw_text)
|
|
13
|
+
if isinstance(data, list):
|
|
14
|
+
return [x for x in data if isinstance(x, dict)]
|
|
15
|
+
if isinstance(data, dict):
|
|
16
|
+
return [data]
|
|
17
|
+
return []
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def list_windows_devices() -> list[DeviceEntry]:
|
|
21
|
+
partitions_result = run_powershell(
|
|
22
|
+
"Get-Partition | Select-Object DiskNumber,PartitionNumber,DriveLetter,Size,Type,Guid | ConvertTo-Json"
|
|
23
|
+
)
|
|
24
|
+
volumes_result = run_powershell(
|
|
25
|
+
"Get-Volume | Select-Object DriveLetter,FileSystemLabel,FileSystem,Size,SizeRemaining,DriveType,Path | ConvertTo-Json"
|
|
26
|
+
)
|
|
27
|
+
partitions_text = ensure_ok(partitions_result, "Get-Partition")
|
|
28
|
+
volumes_text = ensure_ok(volumes_result, "Get-Volume")
|
|
29
|
+
partitions = _normalize_ps_json(partitions_text)
|
|
30
|
+
volumes = _normalize_ps_json(volumes_text)
|
|
31
|
+
volume_map: dict[str, dict[str, object]] = {}
|
|
32
|
+
for volume in volumes:
|
|
33
|
+
drive_letter = as_str(volume.get("DriveLetter"))
|
|
34
|
+
if isinstance(drive_letter, str):
|
|
35
|
+
volume_map[drive_letter.upper()] = volume
|
|
36
|
+
entries: list[DeviceEntry] = []
|
|
37
|
+
for partition in partitions:
|
|
38
|
+
disk_number = partition.get("DiskNumber")
|
|
39
|
+
partition_number = partition.get("PartitionNumber")
|
|
40
|
+
drive_letter = as_str(partition.get("DriveLetter"))
|
|
41
|
+
volume = volume_map.get(drive_letter.upper()) if isinstance(drive_letter, str) else None
|
|
42
|
+
label = None
|
|
43
|
+
fs_type = None
|
|
44
|
+
mount_point = None
|
|
45
|
+
extra = as_str(partition.get("Type"))
|
|
46
|
+
if isinstance(volume, dict):
|
|
47
|
+
label = as_str(volume.get("FileSystemLabel"))
|
|
48
|
+
fs_type = as_str(volume.get("FileSystem"))
|
|
49
|
+
mount_point = as_str(volume.get("Path"))
|
|
50
|
+
if mount_point is None and isinstance(drive_letter, str) and drive_letter != "":
|
|
51
|
+
mount_point = f"{drive_letter}:\\"
|
|
52
|
+
size_value = partition.get("Size")
|
|
53
|
+
size = format_size_bytes(size_value) if isinstance(size_value, int) else None
|
|
54
|
+
key = f"Disk {disk_number} Part {partition_number}"
|
|
55
|
+
device_path = as_str(partition.get("Guid")) or key
|
|
56
|
+
entries.append(
|
|
57
|
+
DeviceEntry(
|
|
58
|
+
platform_name="Windows",
|
|
59
|
+
key=key,
|
|
60
|
+
device_path=device_path,
|
|
61
|
+
device_type="part",
|
|
62
|
+
label=label,
|
|
63
|
+
mount_point=mount_point,
|
|
64
|
+
fs_type=fs_type,
|
|
65
|
+
size=size,
|
|
66
|
+
extra=extra,
|
|
67
|
+
disk_number=disk_number if isinstance(disk_number, int) else None,
|
|
68
|
+
partition_number=partition_number if isinstance(partition_number, int) else None,
|
|
69
|
+
drive_letter=drive_letter.upper() if isinstance(drive_letter, str) and drive_letter != "" else None,
|
|
70
|
+
)
|
|
71
|
+
)
|
|
72
|
+
return entries
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _normalize_drive_letter(value: str) -> str:
|
|
76
|
+
match = re.search(r"([A-Za-z])", value)
|
|
77
|
+
if match is None:
|
|
78
|
+
raise RuntimeError("Invalid drive letter")
|
|
79
|
+
return match.group(1).upper()
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def mount_windows(entry: DeviceEntry, mount_point: str) -> None:
|
|
83
|
+
if entry.disk_number is None or entry.partition_number is None:
|
|
84
|
+
raise RuntimeError("Partition details not available")
|
|
85
|
+
letter = _normalize_drive_letter(mount_point)
|
|
86
|
+
command = (
|
|
87
|
+
f"Get-Partition -DiskNumber {entry.disk_number} -PartitionNumber {entry.partition_number} | "
|
|
88
|
+
f"Set-Partition -NewDriveLetter {letter}"
|
|
89
|
+
)
|
|
90
|
+
result = run_powershell(command)
|
|
91
|
+
ensure_ok(result, "Set-Partition")
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
"""run python/shell scripts from pre-defined directorys, or, run command/file in the machineconfig environment
|
|
4
|
+
|
|
5
|
+
Recursively Searched Predefined Directories:
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
* 'private' : $HOME/dotfiles/scripts
|
|
9
|
+
|
|
10
|
+
* 'public' : $HOME/.config/machineconfig/scripts
|
|
11
|
+
|
|
12
|
+
* 'library' : $MACHINECONFIG_LIBRARY_ROOT/jobs/scripts
|
|
13
|
+
|
|
14
|
+
* 'dynamic' : fetched from GitHub repository on the fly (relies on latest commit, rather than the version currently installed)
|
|
15
|
+
|
|
16
|
+
* 'custom' : custom directories from comma separated entry 'scripts' under 'general' section @ ~/dotfiles/machineconfig/defaults.ini
|
|
17
|
+
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
import typer
|
|
22
|
+
from typing import Annotated, Optional, Literal
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def run_py_script(ctx: typer.Context,
|
|
26
|
+
name: Annotated[str, typer.Argument(help="Name of script to run, e.g., 'a' for a.py, or command to execute")] = "",
|
|
27
|
+
where: Annotated[Literal["all", "a", "private", "p", "public", "b", "library", "l", "dynamic", "d", "custom", "c"], typer.Option("--where", "-w", help="Where to look for the script")] = "all",
|
|
28
|
+
interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactive selection of scripts to run")] = False,
|
|
29
|
+
command: Annotated[Optional[bool], typer.Option(..., "--command", "-c", help="Run as command")] = False,
|
|
30
|
+
list_scripts: Annotated[bool, typer.Option(..., "--list", "-l", help="List available scripts in all locations")] = False,
|
|
31
|
+
) -> None:
|
|
32
|
+
if command:
|
|
33
|
+
exec(name)
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
from pathlib import Path
|
|
37
|
+
if list_scripts:
|
|
38
|
+
from machineconfig.scripts.python.helpers.helpers_search.script_help import list_available_scripts
|
|
39
|
+
list_available_scripts(where=where)
|
|
40
|
+
return
|
|
41
|
+
|
|
42
|
+
if not interactive and not name:
|
|
43
|
+
typer.echo("❌ ERROR: You must provide a script name or use --interactive option to select a script.")
|
|
44
|
+
raise typer.Exit(code=1)
|
|
45
|
+
target_file: Optional[Path] = None
|
|
46
|
+
|
|
47
|
+
if where in ["dynamic", "d"]:
|
|
48
|
+
# src/machineconfig/jobs/scripts/python_scripts/a.py
|
|
49
|
+
if "." in name: resolved_names: list[str] = [name]
|
|
50
|
+
else: resolved_names = [f"{name}{a_suffix}" for a_suffix in [".py", ".sh", "", ".ps1", ".bat", ".cmd"]]
|
|
51
|
+
urls = [f"""https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/jobs/scripts_dynamic/{a_resolved_name}""" for a_resolved_name in resolved_names]
|
|
52
|
+
for a_url in urls:
|
|
53
|
+
try:
|
|
54
|
+
print(f"Fetching temporary script from {a_url} ...")
|
|
55
|
+
import requests
|
|
56
|
+
response = requests.get(a_url)
|
|
57
|
+
if response.status_code != 200:
|
|
58
|
+
print(f"❌ ERROR: Could not fetch script '{name}.py' from repository. Status Code: {response.status_code}")
|
|
59
|
+
raise RuntimeError(f"Could not fetch script '{name}.py' from repository.")
|
|
60
|
+
script_content = response.text
|
|
61
|
+
target_file = Path.home().joinpath("tmp_results", "tmp_scripts", "python", f"{name}.py")
|
|
62
|
+
target_file.parent.mkdir(parents=True, exist_ok=True)
|
|
63
|
+
target_file.write_text(script_content, encoding="utf-8")
|
|
64
|
+
except Exception as _e:
|
|
65
|
+
pass
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
if target_file is None and Path(name).is_file():
|
|
69
|
+
if name.endswith(".py"):
|
|
70
|
+
import machineconfig
|
|
71
|
+
import subprocess
|
|
72
|
+
import sys
|
|
73
|
+
subprocess.run([sys.executable, name], cwd=machineconfig.__path__[0])
|
|
74
|
+
return
|
|
75
|
+
else:
|
|
76
|
+
if Path(name).suffix in [".sh", ".ps1", ".bat", ".cmd", ""]:
|
|
77
|
+
target_file = Path(name)
|
|
78
|
+
else:
|
|
79
|
+
print(f"❌ Error: File '{name}' is not a recognized script type. Supported types are {'.py', '.sh', '.ps1', '.bat', '.cmd', ''}.")
|
|
80
|
+
raise typer.Exit(code=1)
|
|
81
|
+
|
|
82
|
+
from machineconfig.utils.source_of_truth import CONFIG_ROOT, LIBRARY_ROOT, DEFAULTS_PATH
|
|
83
|
+
private_root = Path.home().joinpath("dotfiles/scripts") # local directory
|
|
84
|
+
public_root = CONFIG_ROOT.joinpath("scripts") # local machineconfig directory
|
|
85
|
+
library_root = LIBRARY_ROOT.joinpath("jobs", "scripts")
|
|
86
|
+
|
|
87
|
+
def get_custom_roots() -> list[Path]:
|
|
88
|
+
custom_roots: list[Path] = []
|
|
89
|
+
if DEFAULTS_PATH.is_file():
|
|
90
|
+
from configparser import ConfigParser
|
|
91
|
+
config = ConfigParser()
|
|
92
|
+
config.read(DEFAULTS_PATH)
|
|
93
|
+
if config.has_section("general") and config.has_option("general", "scripts"):
|
|
94
|
+
custom_dirs = config.get("general", "scripts").split(",")
|
|
95
|
+
for custom_dir in custom_dirs:
|
|
96
|
+
custom_path = Path(custom_dir.strip()).expanduser().resolve()
|
|
97
|
+
if custom_path.is_dir():
|
|
98
|
+
custom_roots.append(custom_path)
|
|
99
|
+
return custom_roots
|
|
100
|
+
|
|
101
|
+
roots: list[Path] = []
|
|
102
|
+
match where:
|
|
103
|
+
case "all" | "a":
|
|
104
|
+
roots = [private_root, public_root, library_root] + get_custom_roots()
|
|
105
|
+
case "private" | "p":
|
|
106
|
+
roots = [private_root]
|
|
107
|
+
case "public" | "b":
|
|
108
|
+
roots = [public_root]
|
|
109
|
+
case "library" | "l":
|
|
110
|
+
roots = [library_root]
|
|
111
|
+
case "dynamic" | "d":
|
|
112
|
+
roots = []
|
|
113
|
+
case "custom" | "c":
|
|
114
|
+
roots = get_custom_roots()
|
|
115
|
+
|
|
116
|
+
suffixes: list[str]
|
|
117
|
+
if "." in name:
|
|
118
|
+
suffixes = [""]
|
|
119
|
+
else:
|
|
120
|
+
import platform
|
|
121
|
+
if platform.system() == "Windows":
|
|
122
|
+
suffixes = [".py", ".bat", ".cmd", ".ps1"]
|
|
123
|
+
elif platform.system() == "Darwin" or platform.system() == "Linux":
|
|
124
|
+
suffixes = [""] # files without suffix could be shell scripts, and that already cover files with .sh suffix without duplications
|
|
125
|
+
else:
|
|
126
|
+
suffixes = [".py"]
|
|
127
|
+
|
|
128
|
+
# Finding target file
|
|
129
|
+
potential_matches: list[Path] = []
|
|
130
|
+
if target_file is None:
|
|
131
|
+
for a_root in roots:
|
|
132
|
+
for a_suffix in suffixes:
|
|
133
|
+
if a_root.joinpath(f"{name}{a_suffix}").is_file():
|
|
134
|
+
target_file = a_root.joinpath(f"{name}{a_suffix}")
|
|
135
|
+
break # perfect match
|
|
136
|
+
potential_matches += [a_file for a_file in a_root.rglob(f"*{name}*{a_suffix}") if a_file.is_file()]
|
|
137
|
+
|
|
138
|
+
if target_file is None:
|
|
139
|
+
if len(potential_matches) == 1:
|
|
140
|
+
target_file = potential_matches[0]
|
|
141
|
+
elif len(potential_matches) == 0:
|
|
142
|
+
typer.echo(ctx.get_help())
|
|
143
|
+
typer.echo()
|
|
144
|
+
typer.echo(typer.style(f"❌ ERROR: Could not find script '{name}'.", fg=typer.colors.RED, bold=True))
|
|
145
|
+
typer.echo("Searched in:")
|
|
146
|
+
for r in roots:
|
|
147
|
+
typer.echo(f" - {r}")
|
|
148
|
+
raise typer.Exit(code=1)
|
|
149
|
+
else:
|
|
150
|
+
typer.echo(typer.style(f"Warning: Could not find script '{name}'. Checked {len(potential_matches)} candidate files, trying interactively:", fg=typer.colors.YELLOW))
|
|
151
|
+
from machineconfig.utils.options import choose_from_options
|
|
152
|
+
options = [str(p) for p in potential_matches]
|
|
153
|
+
chosen_file_part = choose_from_options(options, multi=False, msg="Select the script to run:", tv=True, preview="bat")
|
|
154
|
+
target_file = Path(chosen_file_part)
|
|
155
|
+
|
|
156
|
+
typer.echo(typer.style(f"✅ Found script at: {target_file}", fg=typer.colors.GREEN))
|
|
157
|
+
if target_file.suffix == ".py":
|
|
158
|
+
from machineconfig.utils.code import get_uv_command_executing_python_file, exit_then_run_shell_script
|
|
159
|
+
shell_script = get_uv_command_executing_python_file(python_file=str(target_file), uv_project_dir=None, uv_with=None, prepend_print=False)
|
|
160
|
+
exit_then_run_shell_script(script=shell_script)
|
|
161
|
+
else:
|
|
162
|
+
from machineconfig.utils.code import exit_then_run_shell_file
|
|
163
|
+
exit_then_run_shell_file(script_path=str(target_file), strict=True)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def copy_script_to_local(ctx: typer.Context,
|
|
167
|
+
name: Annotated[str, typer.Argument(help="Name of the temporary python script to copy, e.g., 'a' for a.py")],
|
|
168
|
+
alias: Annotated[Optional[str], typer.Option("--alias", "-a", help="Whether to create call it a different name locally")] = None
|
|
169
|
+
) -> None:
|
|
170
|
+
"""
|
|
171
|
+
Copy a temporary python script stored in machineconfig/scripts/python/helpers/tmp_py_scripts to the local machine.
|
|
172
|
+
"""
|
|
173
|
+
url = f"""https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/scripts/python/helpers/tmp_py_scripts/{name}.py"""
|
|
174
|
+
import requests
|
|
175
|
+
response = requests.get(url)
|
|
176
|
+
if response.status_code != 200:
|
|
177
|
+
typer.echo(ctx.get_help())
|
|
178
|
+
typer.echo()
|
|
179
|
+
typer.echo(typer.style(f"❌ ERROR: Could not fetch script '{name}.py' from repository. Status Code: {response.status_code}", fg=typer.colors.RED, bold=True))
|
|
180
|
+
raise typer.Exit(code=1)
|
|
181
|
+
script_content = response.text
|
|
182
|
+
from machineconfig.utils.source_of_truth import CONFIG_ROOT
|
|
183
|
+
local_path = CONFIG_ROOT.joinpath(f"scripts_python/{alias or name}.py")
|
|
184
|
+
with open(local_path, "w") as f:
|
|
185
|
+
f.write(script_content)
|
|
186
|
+
typer.echo(typer.style(f"✅ Script '{name}.py' has been copied to '{local_path}'.", fg=typer.colors.GREEN))
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def get_app():
|
|
190
|
+
app = typer.Typer(
|
|
191
|
+
name="run-tmp-script",
|
|
192
|
+
help="Helper to run temporary python scripts stored in machineconfig/scripts/python/helpers/tmp_py_scripts",
|
|
193
|
+
no_args_is_help=True,
|
|
194
|
+
)
|
|
195
|
+
from machineconfig.jobs.scripts_dynamic import a
|
|
196
|
+
app.command()(a.main)
|
|
197
|
+
return app
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
$presets = @{
|
|
2
|
+
"nerd-font-symbols" = "Changes the symbols for each module to use Nerd Font symbols."
|
|
3
|
+
"no-nerd-font" = "Changes the symbols so that no Nerd Font symbols are used."
|
|
4
|
+
"bracketed-segments" = "Changes the format to show segments in brackets."
|
|
5
|
+
"plain-text-symbols" = "Changes the symbols for each module into plain text."
|
|
6
|
+
"no-runtime-versions" = "Hides the version of language runtimes."
|
|
7
|
+
"no-empty-icons" = "Does not show icons if the toolset is not found."
|
|
8
|
+
"pure-preset" = "Emulates the look and behavior of Pure."
|
|
9
|
+
"pastel-powerline" = "Inspired by M365Princess."
|
|
10
|
+
"tokyo-night" = "Inspired by tokyo-night-vscode-theme."
|
|
11
|
+
"gruvbox-rainbow" = "Inspired by Pastel Powerline and Tokyo Night."
|
|
12
|
+
"jetpack" = "Pseudo minimalist preset inspired by geometry and spaceship."
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
$input_list = $presets.Keys | ForEach-Object { "$_`t$($presets[$_])" }
|
|
16
|
+
|
|
17
|
+
$preview_config = "$env:TEMP/starship_preview.toml"
|
|
18
|
+
|
|
19
|
+
# Preview command for PowerShell
|
|
20
|
+
# We need to split the line and get the first part.
|
|
21
|
+
# tv replaces {} with the line.
|
|
22
|
+
# We use powershell -c for the preview command to be safe and consistent.
|
|
23
|
+
|
|
24
|
+
$preview_cmd = "powershell -c `"`$preset = '{}'.Split('`t')[0]; starship preset `$preset > $preview_config; `$env:STARSHIP_CONFIG='$preview_config'; `$env:STARSHIP_SHELL='powershell'; starship prompt`""
|
|
25
|
+
|
|
26
|
+
if (Get-Command "tv" -ErrorAction SilentlyContinue) {
|
|
27
|
+
$selected_line = $input_list | tv --preview-command $preview_cmd --preview-size 50
|
|
28
|
+
} elseif (Get-Command "fzf" -ErrorAction SilentlyContinue) {
|
|
29
|
+
# fzf fallback
|
|
30
|
+
$selected_line = $input_list | fzf --ansi --delimiter "`t" --with-nth 1,2 --preview "powershell -c `"`$preset = {1}; starship preset `$preset > $preview_config; `$env:STARSHIP_CONFIG='$preview_config'; `$env:STARSHIP_SHELL='powershell'; starship prompt`"" --preview-window bottom:50%
|
|
31
|
+
} else {
|
|
32
|
+
Write-Host "Error: 'tv' or 'fzf' not found."
|
|
33
|
+
exit 1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if ($selected_line) {
|
|
37
|
+
$selected_preset = $selected_line.Split("`t")[0]
|
|
38
|
+
Write-Host "Applying $selected_preset..."
|
|
39
|
+
starship preset $selected_preset -o "$HOME/.config/starship.toml"
|
|
40
|
+
Write-Host "Done!"
|
|
41
|
+
}
|