machineconfig 3.99__py3-none-any.whl → 7.66__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/__init__.py +0 -28
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- machineconfig/cluster/remote/script_execution.py +1 -2
- machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
- machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
- machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
- machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
- machineconfig/cluster/sessions_managers/wt_local.py +128 -330
- machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
- machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
- machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
- machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
- machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -172
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
- machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
- machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
- machineconfig/jobs/{python → installer}/check_installations.py +2 -16
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/gh.py +69 -53
- machineconfig/jobs/installer/custom/hx.py +77 -20
- machineconfig/jobs/installer/custom_dev/alacritty.py +45 -30
- machineconfig/jobs/installer/custom_dev/brave.py +43 -35
- machineconfig/jobs/installer/custom_dev/bypass_paywall.py +31 -20
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +33 -21
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/espanso.py +64 -41
- machineconfig/jobs/installer/custom_dev/goes.py +41 -36
- machineconfig/jobs/installer/custom_dev/lvim.py +49 -33
- machineconfig/jobs/installer/custom_dev/nerdfont.py +71 -47
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +32 -26
- machineconfig/jobs/installer/custom_dev/redis.py +51 -33
- machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +55 -39
- machineconfig/jobs/installer/custom_dev/winget.py +1 -0
- machineconfig/jobs/installer/installer_data.json +3406 -0
- machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
- machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
- machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
- machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
- machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
- machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
- machineconfig/jobs/installer/package_groups.py +255 -0
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +74 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +136 -0
- machineconfig/profile/mapper.toml +258 -0
- machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +47 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +198 -0
- machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
- machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
- machineconfig/scripts/python/ai/generate_files.py +307 -42
- machineconfig/scripts/python/ai/initai.py +3 -28
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
- machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +27 -4
- machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +117 -181
- machineconfig/scripts/python/define.py +31 -0
- machineconfig/scripts/python/devops.py +44 -124
- machineconfig/scripts/python/devops_navigator.py +10 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -0
- machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
- machineconfig/scripts/python/explore.py +49 -0
- machineconfig/scripts/python/fire_jobs.py +106 -244
- machineconfig/scripts/python/ftpx.py +125 -68
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
- machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
- machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +11 -19
- machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +17 -7
- machineconfig/scripts/python/helpers_devops/cli_config.py +95 -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 +134 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
- machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
- machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
- machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
- machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
- machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
- machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
- machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -87
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
- machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
- machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
- machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
- machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
- machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
- machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
- machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
- machineconfig/scripts/python/helpers_repos/action.py +209 -0
- machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
- machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
- machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
- machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
- machineconfig/scripts/python/helpers_repos/grource.py +340 -0
- machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
- machineconfig/scripts/python/helpers_repos/sync.py +66 -0
- machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
- machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
- machineconfig/scripts/python/helpers_utils/download.py +152 -0
- machineconfig/scripts/python/helpers_utils/path.py +108 -0
- machineconfig/scripts/python/interactive.py +79 -160
- machineconfig/scripts/python/machineconfig.py +63 -0
- machineconfig/scripts/python/msearch.py +21 -0
- machineconfig/scripts/python/nw/__init__.py +0 -0
- machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
- machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
- machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
- machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
- machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
- machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
- machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +6 -5
- machineconfig/scripts/python/sessions.py +167 -0
- machineconfig/scripts/python/terminal.py +127 -0
- machineconfig/scripts/python/utils.py +66 -0
- machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
- machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
- machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
- machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
- machineconfig/settings/broot/br.sh +0 -4
- machineconfig/settings/broot/conf.toml +1 -1
- machineconfig/settings/helix/config.toml +16 -0
- machineconfig/settings/helix/languages.toml +13 -4
- machineconfig/settings/helix/yazi-picker.sh +12 -0
- machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
- machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
- machineconfig/settings/lf/linux/lfrc +10 -12
- machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
- machineconfig/settings/lf/windows/lfrc +18 -38
- machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
- machineconfig/settings/linters/.ruff.toml +1 -1
- machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
- machineconfig/settings/marimo/marimo.toml +80 -0
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/pistol/pistol.conf +1 -1
- machineconfig/settings/shells/bash/init.sh +55 -31
- machineconfig/settings/shells/nushell/config.nu +1 -34
- machineconfig/settings/shells/nushell/init.nu +127 -0
- machineconfig/settings/shells/pwsh/init.ps1 +60 -43
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
- machineconfig/settings/shells/wt/settings.json +32 -17
- machineconfig/settings/shells/zsh/init.sh +89 -0
- machineconfig/settings/svim/linux/init.toml +0 -4
- machineconfig/settings/svim/windows/init.toml +0 -3
- machineconfig/settings/yazi/init.lua +57 -0
- machineconfig/settings/yazi/keymap_linux.toml +79 -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/yazi.toml +13 -0
- machineconfig/setup_linux/__init__.py +10 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
- machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
- machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
- machineconfig/setup_linux/uv.sh +15 -0
- machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
- machineconfig/setup_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 +8 -0
- machineconfig/setup_windows/others/power_options.ps1 +7 -0
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
- machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
- machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
- machineconfig/setup_windows/uv.ps1 +10 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -9
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
- machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +140 -93
- 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 +118 -0
- machineconfig/utils/files/dbms.py +257 -0
- machineconfig/utils/files/headers.py +68 -0
- machineconfig/utils/files/ouch/__init__.py +0 -0
- machineconfig/utils/files/ouch/decompress.py +45 -0
- machineconfig/utils/files/read.py +95 -0
- machineconfig/utils/installer_utils/github_release_bulk.py +2 -12
- machineconfig/utils/installer_utils/installer_class.py +68 -126
- machineconfig/utils/installer_utils/installer_cli.py +181 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +38 -85
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +69 -69
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +309 -100
- machineconfig/utils/meta.py +255 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +10 -25
- machineconfig/utils/path_extended.py +94 -104
- machineconfig/utils/path_helper.py +75 -22
- machineconfig/utils/procs.py +50 -74
- machineconfig/utils/scheduler.py +94 -97
- machineconfig/utils/scheduling.py +0 -3
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
- machineconfig/utils/schemas/installer/installer_types.py +0 -1
- machineconfig/utils/schemas/layouts/layout_types.py +2 -1
- machineconfig/utils/source_of_truth.py +3 -6
- machineconfig/utils/ssh.py +742 -254
- machineconfig/utils/ssh_utils/utils.py +0 -0
- machineconfig/utils/terminal.py +3 -140
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +109 -28
- machineconfig/utils/ve.py +13 -5
- machineconfig-7.66.dist-info/METADATA +124 -0
- machineconfig-7.66.dist-info/RECORD +451 -0
- machineconfig-7.66.dist-info/entry_points.txt +15 -0
- machineconfig/cluster/templates/utils.py +0 -51
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
- machineconfig/jobs/installer/packages_custom_dev.json +0 -226
- machineconfig/jobs/installer/packages_custom_essential.json +0 -39
- machineconfig/jobs/installer/packages_github_dev.json +0 -1110
- machineconfig/jobs/installer/packages_github_essential.json +0 -804
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -37
- machineconfig/jobs/python/create_bootable_media.py +0 -16
- machineconfig/jobs/python/python_cargo_build_share.py +0 -59
- machineconfig/jobs/python/python_ve_symlink.py +0 -29
- machineconfig/jobs/python/tasks.py +0 -3
- machineconfig/jobs/python/vscode/api.py +0 -49
- machineconfig/jobs/python/vscode/sync_code.py +0 -58
- machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
- machineconfig/jobs/windows/start_terminal.ps1 +0 -6
- machineconfig/jobs/windows/startup_file.cmd +0 -2
- machineconfig/profile/create.py +0 -170
- machineconfig/profile/shell.py +0 -176
- machineconfig/scripts/cloud/init.sh +0 -119
- machineconfig/scripts/linux/choose_wezterm_theme +0 -3
- machineconfig/scripts/linux/cloud_copy +0 -2
- machineconfig/scripts/linux/cloud_mount +0 -2
- machineconfig/scripts/linux/cloud_repo_sync +0 -2
- machineconfig/scripts/linux/cloud_sync +0 -2
- machineconfig/scripts/linux/croshell +0 -3
- machineconfig/scripts/linux/devops +0 -2
- machineconfig/scripts/linux/fire +0 -2
- machineconfig/scripts/linux/fire_agents +0 -2
- machineconfig/scripts/linux/ftpx +0 -2
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/gh_models +0 -2
- machineconfig/scripts/linux/initai +0 -2
- machineconfig/scripts/linux/kill_process +0 -2
- machineconfig/scripts/linux/programs +0 -21
- machineconfig/scripts/linux/repos +0 -2
- machineconfig/scripts/linux/scheduler +0 -2
- machineconfig/scripts/linux/share_smb +0 -1
- machineconfig/scripts/linux/start_slidev +0 -2
- machineconfig/scripts/linux/start_terminals +0 -3
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/wifi_conn +0 -2
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
- machineconfig/scripts/python/cloud_repo_sync.py +0 -186
- machineconfig/scripts/python/devops_devapps_install.py +0 -159
- machineconfig/scripts/python/devops_update_repos.py +0 -180
- machineconfig/scripts/python/dotfile.py +0 -52
- machineconfig/scripts/python/fire_agents.py +0 -175
- machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
- machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
- machineconfig/scripts/python/fire_jobs_args_helper.py +0 -75
- machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -74
- machineconfig/scripts/python/get_zellij_cmd.py +0 -15
- machineconfig/scripts/python/gh_models.py +0 -104
- machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
- machineconfig/scripts/python/repos.py +0 -80
- machineconfig/scripts/python/repos_helper_action.py +0 -335
- machineconfig/scripts/python/share_terminal.py +0 -104
- machineconfig/scripts/python/snapshot.py +0 -25
- machineconfig/scripts/python/start_terminals.py +0 -121
- machineconfig/scripts/python/t4.py +0 -17
- machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
- machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
- machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
- machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
- machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
- machineconfig/scripts/windows/croshell.ps1 +0 -1
- machineconfig/scripts/windows/devops.ps1 +0 -1
- machineconfig/scripts/windows/dotfile.ps1 +0 -1
- machineconfig/scripts/windows/fire.ps1 +0 -1
- machineconfig/scripts/windows/ftpx.ps1 +0 -1
- machineconfig/scripts/windows/gpt.ps1 +0 -1
- machineconfig/scripts/windows/grep.ps1 +0 -2
- machineconfig/scripts/windows/initai.ps1 +0 -1
- machineconfig/scripts/windows/kill_process.ps1 +0 -1
- machineconfig/scripts/windows/nano.ps1 +0 -3
- machineconfig/scripts/windows/pomodoro.ps1 +0 -1
- machineconfig/scripts/windows/reload_path.ps1 +0 -3
- machineconfig/scripts/windows/repos.ps1 +0 -1
- machineconfig/scripts/windows/scheduler.ps1 +0 -1
- machineconfig/scripts/windows/snapshot.ps1 +0 -1
- machineconfig/scripts/windows/start_slidev.ps1 +0 -1
- machineconfig/scripts/windows/start_terminals.ps1 +0 -1
- machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
- machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
- machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
- machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
- machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
- machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
- machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
- machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
- machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
- machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
- machineconfig/utils/ai/generate_file_checklist.py +0 -68
- machineconfig-3.99.dist-info/METADATA +0 -167
- machineconfig-3.99.dist-info/RECORD +0 -409
- machineconfig-3.99.dist-info/entry_points.txt +0 -18
- machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
- machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
- machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
- machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
- machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
- machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
- machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
- machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
- machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
- /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
- /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
- /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
- /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
- /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
- /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
- /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
- /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
- /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
- /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
- {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
- {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""Repos CLI powered by Typer.
|
|
2
|
+
|
|
3
|
+
# TODO use gh api user --jq '.login' to get the username and use it to clone the repos.
|
|
4
|
+
in the event that username@github.com is not mentioned in the remote url.
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Annotated, Optional
|
|
10
|
+
import typer
|
|
11
|
+
from machineconfig.scripts.python.helpers_repos.cloud_repo_sync import main as secure_repo_main
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
DirectoryArgument = Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")]
|
|
15
|
+
RecursiveOption = Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")]
|
|
16
|
+
UVsyncOption = Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")]
|
|
17
|
+
CloudOption = Annotated[Optional[str], typer.Option("--cloud", "-c", help="☁️ Upload to or download from this cloud remote.")]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def push(directory: DirectoryArgument = None, recursive: RecursiveOption = False, auto_uv_sync: UVsyncOption = False) -> None:
|
|
21
|
+
"""🚀 Push changes across repositories."""
|
|
22
|
+
from machineconfig.scripts.python.helpers_repos.entrypoint import git_operations
|
|
23
|
+
git_operations(directory, pull=False, commit=False, push=True, recursive=recursive, auto_uv_sync=auto_uv_sync)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def pull(directory: DirectoryArgument = None, recursive: RecursiveOption = False, auto_uv_sync: UVsyncOption = False) -> None:
|
|
27
|
+
"""⬇️ Pull changes across repositories."""
|
|
28
|
+
from machineconfig.scripts.python.helpers_repos.entrypoint import git_operations
|
|
29
|
+
|
|
30
|
+
git_operations(directory, pull=True, commit=False, push=False, recursive=recursive, auto_uv_sync=auto_uv_sync)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def commit(directory: DirectoryArgument = None, recursive: RecursiveOption = False, auto_uv_sync: UVsyncOption = False) -> None:
|
|
34
|
+
"""💾 Commit changes across repositories."""
|
|
35
|
+
from machineconfig.scripts.python.helpers_repos.entrypoint import git_operations
|
|
36
|
+
git_operations(directory, pull=False, commit=True, push=False, recursive=recursive, auto_uv_sync=auto_uv_sync)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def sync(directory: DirectoryArgument = None, recursive: RecursiveOption = False, auto_uv_sync: UVsyncOption = False) -> None:
|
|
40
|
+
"""🔄 Pull, commit, and push changes across repositories."""
|
|
41
|
+
from machineconfig.scripts.python.helpers_repos.entrypoint import git_operations
|
|
42
|
+
git_operations(directory, pull=True, commit=True, push=True, recursive=recursive, auto_uv_sync=auto_uv_sync)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def capture(directory: DirectoryArgument = None, cloud: CloudOption = None) -> None:
|
|
46
|
+
"""📝 Record repositories into a repos.json specification."""
|
|
47
|
+
from machineconfig.scripts.python.helpers_repos.entrypoint import resolve_directory
|
|
48
|
+
repos_root = resolve_directory(directory)
|
|
49
|
+
from machineconfig.scripts.python.helpers_repos.record import main_record as record_repos
|
|
50
|
+
save_path = record_repos(repos_root=repos_root)
|
|
51
|
+
from machineconfig.utils.path_extended import PathExtended
|
|
52
|
+
if cloud is not None:
|
|
53
|
+
PathExtended(save_path).to_cloud(rel2home=True, cloud=cloud)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def clone(directory: DirectoryArgument = None, cloud: CloudOption = None) -> None:
|
|
57
|
+
"""📥 Clone repositories described by a repos.json specification."""
|
|
58
|
+
from machineconfig.scripts.python.helpers_repos.entrypoint import clone_from_specs
|
|
59
|
+
clone_from_specs(directory, cloud, checkout_branch_flag=False, checkout_commit_flag=False)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def checkout_command(directory: DirectoryArgument = None, cloud: CloudOption = None) -> None:
|
|
63
|
+
"""🔀 Check out specific commits listed in the specification."""
|
|
64
|
+
from machineconfig.scripts.python.helpers_repos.entrypoint import clone_from_specs
|
|
65
|
+
clone_from_specs(directory, cloud, checkout_branch_flag=False, checkout_commit_flag=True)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def checkout_to_branch_command(directory: DirectoryArgument = None, cloud: CloudOption = None) -> None:
|
|
69
|
+
"""🔀 Check out to the main branch defined in the specification."""
|
|
70
|
+
from machineconfig.scripts.python.helpers_repos.entrypoint import clone_from_specs
|
|
71
|
+
clone_from_specs(directory, cloud, checkout_branch_flag=True, checkout_commit_flag=False)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def analyze(directory: DirectoryArgument = None) -> None:
|
|
75
|
+
"""📊 Analyze repository development over time."""
|
|
76
|
+
repo_path = directory if directory is not None else "."
|
|
77
|
+
from machineconfig.scripts.python.helpers_repos.count_lines_frontend import analyze_repo_development
|
|
78
|
+
analyze_repo_development(repo_path=repo_path)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def viz(
|
|
82
|
+
repo: Annotated[str, typer.Option(..., "--repo", "-r", help="Path to git repository to visualize")] = ".",
|
|
83
|
+
output_file: Annotated[Optional[Path], typer.Option(..., "--output", "-o", help="Output video file (e.g., output.mp4). If specified, gource will render to video.")] = None,
|
|
84
|
+
resolution: Annotated[str, typer.Option(..., "--resolution", "-res", help="Video resolution (e.g., 1920x1080, 1280x720)")] = "1920x1080",
|
|
85
|
+
seconds_per_day: Annotated[float, typer.Option(..., "--seconds-per-day", "-spd", help="Speed of simulation (lower = faster)")] = 0.1,
|
|
86
|
+
auto_skip_seconds: Annotated[float, typer.Option(..., "--auto-skip-seconds", "-as", help="Skip to next entry if nothing happens for X seconds")] = 1.0,
|
|
87
|
+
title: Annotated[Optional[str], typer.Option(..., "--title", "-t", help="Title for the visualization")] = None,
|
|
88
|
+
hide_items: Annotated[list[str], typer.Option(..., "--hide", "-h", help="Items to hide: bloom, date, dirnames, files, filenames, mouse, progress, root, tree, users, usernames")] = [],
|
|
89
|
+
key_items: Annotated[bool, typer.Option(..., "--key", "-k", help="Show file extension key")] = False,
|
|
90
|
+
fullscreen: Annotated[bool, typer.Option(..., "--fullscreen", "-f", help="Run in fullscreen mode")] = False,
|
|
91
|
+
viewport: Annotated[Optional[str], typer.Option(..., "--viewport", "-v", help="Camera viewport (e.g., '1000x1000')")] = None,
|
|
92
|
+
start_date: Annotated[Optional[str], typer.Option(..., "--start-date", help="Start date (YYYY-MM-DD)")] = None,
|
|
93
|
+
stop_date: Annotated[Optional[str], typer.Option(..., "--stop-date", help="Stop date (YYYY-MM-DD)")] = None,
|
|
94
|
+
user_image_dir: Annotated[Optional[Path], typer.Option(..., "--user-image-dir", help="Directory with user avatar images")] = None,
|
|
95
|
+
max_files: Annotated[int, typer.Option(..., "--max-files", help="Maximum number of files to show (0 = no limit)")] = 0,
|
|
96
|
+
max_file_lag: Annotated[float, typer.Option(..., "--max-file-lag", help="Max time files remain on screen after last change")] = 5.0,
|
|
97
|
+
file_idle_time: Annotated[int, typer.Option(..., "--file-idle-time", help="Time in seconds files remain idle before being removed")] = 0,
|
|
98
|
+
framerate: Annotated[int, typer.Option(..., "--framerate", help="Frames per second for video output")] = 60,
|
|
99
|
+
background_color: Annotated[str, typer.Option(..., "--background-color", help="Background color in hex (e.g., 000000 for black)")] = "000000",
|
|
100
|
+
font_size: Annotated[int, typer.Option(..., "--font-size", help="Font size")] = 22,
|
|
101
|
+
camera_mode: Annotated[str, typer.Option(..., "--camera-mode", help="Camera mode: overview or track")] = "overview",
|
|
102
|
+
) -> None:
|
|
103
|
+
"""🎬 Visualize repository activity using Gource."""
|
|
104
|
+
from machineconfig.scripts.python.helpers_repos.grource import visualize
|
|
105
|
+
visualize(repo=repo, output_file=output_file, resolution=resolution, seconds_per_day=seconds_per_day,
|
|
106
|
+
auto_skip_seconds=auto_skip_seconds, title=title, hide_items=hide_items, key_items=key_items,
|
|
107
|
+
fullscreen=fullscreen, viewport=viewport, start_date=start_date, stop_date=stop_date,
|
|
108
|
+
user_image_dir=user_image_dir, max_files=max_files, max_file_lag=max_file_lag,
|
|
109
|
+
file_idle_time=file_idle_time, framerate=framerate, background_color=background_color,
|
|
110
|
+
font_size=font_size, camera_mode=camera_mode)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def cleanup(repo: DirectoryArgument = None, recursive: RecursiveOption = False) -> None:
|
|
114
|
+
"""🧹 Clean repository directories from cache files."""
|
|
115
|
+
if repo is None:
|
|
116
|
+
repo = Path.cwd().as_posix()
|
|
117
|
+
|
|
118
|
+
arg_path = Path(repo).expanduser().absolute()
|
|
119
|
+
from git import Repo, InvalidGitRepositoryError
|
|
120
|
+
if not recursive:
|
|
121
|
+
# Check if the directory is a git repo
|
|
122
|
+
try:
|
|
123
|
+
Repo(str(arg_path), search_parent_directories=False)
|
|
124
|
+
except InvalidGitRepositoryError:
|
|
125
|
+
typer.echo(f"❌ {arg_path} is not a git repository. Use -r flag for recursive cleanup.")
|
|
126
|
+
return
|
|
127
|
+
# Run cleanup on this repo
|
|
128
|
+
repos_to_clean = [arg_path]
|
|
129
|
+
else:
|
|
130
|
+
# Find all git repos recursively under the directory
|
|
131
|
+
git_dirs = list(arg_path.rglob('.git'))
|
|
132
|
+
repos_to_clean = [git_dir.parent for git_dir in git_dirs if git_dir.is_dir()]
|
|
133
|
+
if not repos_to_clean:
|
|
134
|
+
typer.echo(f"❌ No git repositories found under {arg_path}")
|
|
135
|
+
return
|
|
136
|
+
|
|
137
|
+
for repo_path in repos_to_clean:
|
|
138
|
+
typer.echo(f"🧹 Cleaning {repo_path}")
|
|
139
|
+
script = fr"""
|
|
140
|
+
cd "{repo_path}"
|
|
141
|
+
uv run --with cleanpy cleanpy .
|
|
142
|
+
# mcinit .
|
|
143
|
+
# find "." -type f \( -name "*.py" -o -name "*.md" -o -name "*.json" \) -not -path "*/\.*" -not -path "*/__pycache__/*" -print0 | xargs -0 sed -i 's/[[:space:]]*$//'
|
|
144
|
+
"""
|
|
145
|
+
from machineconfig.utils.code import run_shell_script
|
|
146
|
+
run_shell_script(script)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def get_app():
|
|
150
|
+
repos_apps = typer.Typer(help="📁 [r] Manage development repositories", no_args_is_help=True, add_help_option=False, add_completion=False)
|
|
151
|
+
mirror_app = typer.Typer(help="🔄 [m] Manage repository specifications and syncing", no_args_is_help=True, add_help_option=False, add_completion=False)
|
|
152
|
+
repos_apps.add_typer(mirror_app, name="mirror", help="🔄 [m] mirror repositories using saved specs")
|
|
153
|
+
repos_apps.add_typer(mirror_app, name="m", help="mirror repositories using saved specs", hidden=True)
|
|
154
|
+
|
|
155
|
+
repos_apps.command(name="push", help="🚀 [p] Push changes across repositories")(push)
|
|
156
|
+
repos_apps.command(name="p", help="Push changes across repositories", hidden=True)(push)
|
|
157
|
+
repos_apps.command(name="pull", help="⬇️ [P] Pull changes across repositories")(pull)
|
|
158
|
+
repos_apps.command(name="P", help="Pull changes across repositories", hidden=True)(pull)
|
|
159
|
+
repos_apps.command(name="commit", help="💾 [c] Commit changes across repositories")(commit)
|
|
160
|
+
repos_apps.command(name="c", help="Commit changes across repositories", hidden=True)(commit)
|
|
161
|
+
repos_apps.command(name="sync", help="🔄 [y] Pull, commit, and push changes across repositories")(sync)
|
|
162
|
+
repos_apps.command(name="s", help="Pull, commit, and push changes across repositories", hidden=True)(sync)
|
|
163
|
+
repos_apps.command(name="analyze", help="📊 [a] Analyze repository development over time")(analyze)
|
|
164
|
+
repos_apps.command(name="a", help="Analyze repository development over time", hidden=True)(analyze)
|
|
165
|
+
repos_apps.command(name="secure", help="🔐 [s] Securely sync git repository to/from cloud with encryption")(secure_repo_main)
|
|
166
|
+
repos_apps.command(name="s", help="Securely sync git repository to/from cloud with encryption", hidden=True)(secure_repo_main)
|
|
167
|
+
repos_apps.command(name="viz", help="🎬 [v] Visualize repository activity using Gource")(viz)
|
|
168
|
+
repos_apps.command(name="v", help="Visualize repository activity using Gource", hidden=True)(viz)
|
|
169
|
+
repos_apps.command(name="cleanup", help="🧹 [n] Clean repository directories from cache files")(cleanup)
|
|
170
|
+
repos_apps.command(name="n", help="Clean repository directories from cache files", hidden=True)(cleanup)
|
|
171
|
+
|
|
172
|
+
mirror_app.command(name="capture", help="📝 [cap] Record repositories into a repos.json specification")(capture)
|
|
173
|
+
mirror_app.command(name="cap", help="Record repositories into a repos.json specification", hidden=True)(capture)
|
|
174
|
+
mirror_app.command(name="clone", help="📥 [clo] Clone repositories described by a repos.json specification")(clone)
|
|
175
|
+
mirror_app.command(name="clo", help="Clone repositories described by a repos.json specification", hidden=True)(clone)
|
|
176
|
+
mirror_app.command(name="checkout-to-commit", help="🔀 [ctc] Check out specific commits listed in the specification")(checkout_command)
|
|
177
|
+
mirror_app.command(name="ctc", help="Check out specific commits listed in the specification", hidden=True)(checkout_command)
|
|
178
|
+
mirror_app.command(name="checkout-to-branch", help="🔀 [ctb] Check out to the main branch defined in the specification")(checkout_to_branch_command)
|
|
179
|
+
mirror_app.command(name="ctb", help="Check out to the main branch defined in the specification", hidden=True)(checkout_to_branch_command)
|
|
180
|
+
|
|
181
|
+
return repos_apps
|
|
182
|
+
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
|
|
2
|
+
import typer
|
|
3
|
+
from typing import Optional, Annotated
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def copy_both_assets():
|
|
7
|
+
import machineconfig.profile.create_helper as create_helper
|
|
8
|
+
create_helper.copy_assets_to_machine(which="scripts")
|
|
9
|
+
create_helper.copy_assets_to_machine(which="settings")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def update(copy_assets: Annotated[bool, typer.Option("--assets-copy/--no-assets-copy", "-a/-na", help="Copy (overwrite) assets to the machine after the update")] = True,
|
|
13
|
+
link_public_configs: Annotated[bool, typer.Option("--link-public-configs/--no-link-public-configs", "-b/-nb", help="Link public configs after update (overwrites your configs!)")] = False,
|
|
14
|
+
):
|
|
15
|
+
"""🔄 UPDATE uv and machineconfig"""
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
if Path.home().joinpath("code", "machineconfig").exists():
|
|
18
|
+
shell_script = """
|
|
19
|
+
uv self update
|
|
20
|
+
cd ~/code/machineconfig
|
|
21
|
+
git pull
|
|
22
|
+
uv tool install --upgrade --editable $HOME/code/machineconfig
|
|
23
|
+
"""
|
|
24
|
+
else:
|
|
25
|
+
shell_script = """
|
|
26
|
+
uv self update
|
|
27
|
+
uv tool install --upgrade machineconfig
|
|
28
|
+
"""
|
|
29
|
+
import platform
|
|
30
|
+
if platform.system() == "Windows":
|
|
31
|
+
from machineconfig.utils.code import exit_then_run_shell_script, get_uv_command_executing_python_script
|
|
32
|
+
from machineconfig.utils.meta import lambda_to_python_script
|
|
33
|
+
python_script = lambda_to_python_script(lambda: copy_both_assets(),
|
|
34
|
+
in_global=True, import_module=False)
|
|
35
|
+
uv_command, _py_file = get_uv_command_executing_python_script(python_script=python_script, uv_with=["machineconfig"], uv_project_dir=None)
|
|
36
|
+
exit_then_run_shell_script(shell_script + "\n" + uv_command, strict=True)
|
|
37
|
+
else:
|
|
38
|
+
from machineconfig.utils.code import run_shell_script
|
|
39
|
+
run_shell_script(shell_script)
|
|
40
|
+
if copy_assets:
|
|
41
|
+
copy_both_assets()
|
|
42
|
+
if link_public_configs:
|
|
43
|
+
import machineconfig.profile.create_links_export as create_links_export
|
|
44
|
+
create_links_export.main_public_from_parser(method="copy", on_conflict="overwrite-default-path", which="all", interactive=False)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def install(no_copy_assets: Annotated[bool, typer.Option("--no-assets-copy", "-na", help="Copy (overwrite) assets to the machine after the update")] = False):
|
|
48
|
+
"""📋 CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates."""
|
|
49
|
+
from machineconfig.utils.code import run_shell_script
|
|
50
|
+
from pathlib import Path
|
|
51
|
+
if Path.home().joinpath("code/machineconfig").exists():
|
|
52
|
+
run_shell_script(f"""$HOME/.local/bin/uv tool install --upgrade --editable "{str(Path.home().joinpath("code/machineconfig"))}" """)
|
|
53
|
+
else:
|
|
54
|
+
import platform
|
|
55
|
+
if platform.system() == "Windows":
|
|
56
|
+
run_shell_script(r"""& "$HOME\.local\bin\uv.exe" tool install --upgrade "machineconfig>=7.66" """)
|
|
57
|
+
else:
|
|
58
|
+
run_shell_script("""$HOME/.local/bin/uv tool install --upgrade "machineconfig>=7.66" """)
|
|
59
|
+
from machineconfig.profile.create_shell_profile import create_default_shell_profile
|
|
60
|
+
if not no_copy_assets:
|
|
61
|
+
create_default_shell_profile() # involves copying assets too
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def interactive():
|
|
66
|
+
"""🤖 INTERACTIVE configuration of machine."""
|
|
67
|
+
from machineconfig.scripts.python.interactive import main
|
|
68
|
+
main()
|
|
69
|
+
|
|
70
|
+
def status():
|
|
71
|
+
"""📊 STATUS of machine, shell profile, apps, symlinks, dotfiles, etc."""
|
|
72
|
+
import machineconfig.scripts.python.helpers_devops.devops_status as helper
|
|
73
|
+
helper.main()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def navigate():
|
|
77
|
+
"""📚 NAVIGATE command structure with TUI"""
|
|
78
|
+
import machineconfig.scripts.python as navigator
|
|
79
|
+
from pathlib import Path
|
|
80
|
+
path = Path(navigator.__file__).resolve().parent.joinpath("devops_navigator.py")
|
|
81
|
+
from machineconfig.utils.code import run_shell_script
|
|
82
|
+
if Path.home().joinpath("code/machineconfig").exists(): executable = f"""--project "{str(Path.home().joinpath("code/machineconfig"))}" --with textual"""
|
|
83
|
+
else: executable = """--with "machineconfig>=7.66,textual" """
|
|
84
|
+
run_shell_script(f"""uv run {executable} {path}""")
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def run_python(ip: Annotated[str, typer.Argument(..., help="Python command to run in the machineconfig environment")],
|
|
88
|
+
command: Annotated[Optional[bool], typer.Option(..., "--command", "-c", help="Run as command")] = False):
|
|
89
|
+
"""🐍 RUN python command/file in the machineconfig environment"""
|
|
90
|
+
if command:
|
|
91
|
+
exec(ip)
|
|
92
|
+
return
|
|
93
|
+
import machineconfig
|
|
94
|
+
import subprocess
|
|
95
|
+
import sys
|
|
96
|
+
subprocess.run([sys.executable, ip], cwd=machineconfig.__path__[0])
|
|
97
|
+
def readme():
|
|
98
|
+
from rich.console import Console
|
|
99
|
+
from rich.markdown import Markdown
|
|
100
|
+
import requests
|
|
101
|
+
|
|
102
|
+
# URL of the raw README.md file
|
|
103
|
+
url_readme = "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/README.md"
|
|
104
|
+
|
|
105
|
+
# Fetch the content
|
|
106
|
+
response = requests.get(url_readme)
|
|
107
|
+
response.raise_for_status() # Raise an error for bad responses
|
|
108
|
+
|
|
109
|
+
# Parse markdown
|
|
110
|
+
md = Markdown(response.text)
|
|
111
|
+
|
|
112
|
+
# Render in terminal
|
|
113
|
+
console = Console()
|
|
114
|
+
console.print(md)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def get_app():
|
|
118
|
+
cli_app = typer.Typer(help="🔄 [s] self operations subcommands", no_args_is_help=True, add_help_option=False, add_completion=False)
|
|
119
|
+
cli_app.command("update", no_args_is_help=False, help="🔄 [u] UPDATE machineconfig")(update)
|
|
120
|
+
cli_app.command("u", no_args_is_help=False, hidden=True)(update)
|
|
121
|
+
cli_app.command("interactive", no_args_is_help=False, help="🤖 [i] INTERACTIVE configuration of machine.")(interactive)
|
|
122
|
+
cli_app.command("i", no_args_is_help=False, help="INTERACTIVE configuration of machine.", hidden=True)(interactive)
|
|
123
|
+
cli_app.command("status", no_args_is_help=False, help="📊 [s] STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.")(status)
|
|
124
|
+
cli_app.command("s", no_args_is_help=False, help="STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.", hidden=True)(status)
|
|
125
|
+
cli_app.command("install", no_args_is_help=False, help="📋 [I] CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.")(install)
|
|
126
|
+
cli_app.command("I", no_args_is_help=False, help="CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.", hidden=True)(install)
|
|
127
|
+
cli_app.command("navigate", no_args_is_help=False, help="📚 [n] NAVIGATE command structure with TUI")(navigate)
|
|
128
|
+
cli_app.command("n", no_args_is_help=False, help="NAVIGATE command structure with TUI", hidden=True)(navigate)
|
|
129
|
+
cli_app.command("python", no_args_is_help=False, help="🐍 [c] python command/file in the machineconfig environment", context_settings={"show_help_on_error": True})(run_python)
|
|
130
|
+
cli_app.command("c", no_args_is_help=False, help="RUN python command/file in the machineconfig environment", hidden=True)(run_python)
|
|
131
|
+
cli_app.command("readme", no_args_is_help=False, help="📚 [r] render readme markdown in terminal.")(readme)
|
|
132
|
+
cli_app.command("r", no_args_is_help=False, hidden=True)(readme)
|
|
133
|
+
return cli_app
|
|
134
|
+
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import typer
|
|
2
|
+
# import platform
|
|
3
|
+
# import sys
|
|
4
|
+
from typing import Annotated
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def share_file_receive(code_args: Annotated[list[str], typer.Argument(help="Receive code or relay command. Examples: '7121-donor-olympic-bicycle' or '--relay 10.17.62.206:443 7121-donor-olympic-bicycle'")],
|
|
8
|
+
) -> None:
|
|
9
|
+
"""Receive a file using croc with relay server.
|
|
10
|
+
Usage examples:
|
|
11
|
+
devops network receive 7121-donor-olympic-bicycle
|
|
12
|
+
devops network receive -- --relay 10.17.62.206:443 7121-donor-olympic-bicycle
|
|
13
|
+
devops network receive -- croc --relay 10.17.62.206:443 7121-donor-olympic-bicycle
|
|
14
|
+
"""
|
|
15
|
+
from machineconfig.utils.installer_utils.installer_cli import install_if_missing
|
|
16
|
+
install_if_missing(which="croc")
|
|
17
|
+
import platform
|
|
18
|
+
import sys
|
|
19
|
+
|
|
20
|
+
is_windows = platform.system() == "Windows"
|
|
21
|
+
|
|
22
|
+
# If no args passed via typer, try to get them from sys.argv directly
|
|
23
|
+
# This handles the case where -- was used and arguments weren't parsed by typer
|
|
24
|
+
if not code_args or (len(code_args) == 1 and code_args[0] in ['--relay', 'croc']):
|
|
25
|
+
# Find the index of 'rx' or 'receive' in sys.argv and get everything after it
|
|
26
|
+
try:
|
|
27
|
+
for i, arg in enumerate(sys.argv):
|
|
28
|
+
if arg in ['rx', 'receive', 'r'] and i + 1 < len(sys.argv):
|
|
29
|
+
code_args = sys.argv[i + 1:]
|
|
30
|
+
break
|
|
31
|
+
except Exception:
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
# Join all arguments
|
|
35
|
+
input_str = " ".join(code_args)
|
|
36
|
+
tokens = input_str.split()
|
|
37
|
+
|
|
38
|
+
# Parse input to extract relay server and secret code
|
|
39
|
+
relay_server: str | None = None
|
|
40
|
+
secret_code: str | None = None
|
|
41
|
+
|
|
42
|
+
# Remove 'croc' and 'export' from tokens if present
|
|
43
|
+
tokens = [t for t in tokens if t not in ['croc', 'export']]
|
|
44
|
+
|
|
45
|
+
# Look for --relay flag and capture next token
|
|
46
|
+
relay_idx = -1
|
|
47
|
+
for i, token in enumerate(tokens):
|
|
48
|
+
if token == '--relay' and i + 1 < len(tokens):
|
|
49
|
+
relay_server = tokens[i + 1]
|
|
50
|
+
relay_idx = i
|
|
51
|
+
break
|
|
52
|
+
|
|
53
|
+
# Look for CROC_SECRET= prefix in any token
|
|
54
|
+
for token in tokens:
|
|
55
|
+
if token.startswith('CROC_SECRET='):
|
|
56
|
+
secret_code = token.split('=', 1)[1].strip('"').strip("'")
|
|
57
|
+
break
|
|
58
|
+
|
|
59
|
+
# If no secret code found yet, look for tokens with dashes (typical pattern: number-word-word-word)
|
|
60
|
+
# Skip relay server and relay flag
|
|
61
|
+
if not secret_code:
|
|
62
|
+
for i, token in enumerate(tokens):
|
|
63
|
+
if '-' in token and not token.startswith('-') and token != relay_server:
|
|
64
|
+
if relay_idx >= 0 and (i == relay_idx or i == relay_idx + 1):
|
|
65
|
+
continue # Skip relay server parts
|
|
66
|
+
secret_code = token
|
|
67
|
+
break
|
|
68
|
+
|
|
69
|
+
if not secret_code and not relay_server:
|
|
70
|
+
typer.echo(f"❌ Error: Could not parse croc receive code from input: {input_str}", err=True)
|
|
71
|
+
typer.echo("Usage:", err=True)
|
|
72
|
+
typer.echo(" devops network receive 7121-donor-olympic-bicycle", err=True)
|
|
73
|
+
typer.echo(" devops network receive -- --relay 10.17.62.206:443 7121-donor-olympic-bicycle", err=True)
|
|
74
|
+
raise typer.Exit(code=1)
|
|
75
|
+
|
|
76
|
+
# Build the appropriate script for current OS
|
|
77
|
+
if is_windows:
|
|
78
|
+
# Windows PowerShell format: croc --relay server:port secret-code --yes
|
|
79
|
+
relay_arg = f"--relay {relay_server}" if relay_server else ""
|
|
80
|
+
code_arg = f"{secret_code}" if secret_code else ""
|
|
81
|
+
script = f"""croc {relay_arg} {code_arg} --yes""".strip()
|
|
82
|
+
else:
|
|
83
|
+
# Linux/macOS Bash format: CROC_SECRET="secret-code" croc --relay server:port --yes
|
|
84
|
+
relay_arg = f"--relay {relay_server}" if relay_server else ""
|
|
85
|
+
if secret_code:
|
|
86
|
+
script = f"""export CROC_SECRET="{secret_code}"
|
|
87
|
+
croc {relay_arg} --yes""".strip()
|
|
88
|
+
else:
|
|
89
|
+
script = f"""croc {relay_arg} --yes""".strip()
|
|
90
|
+
|
|
91
|
+
from machineconfig.utils.code import exit_then_run_shell_script, print_code
|
|
92
|
+
print_code(code=script, desc="🚀 Receiving file with croc", lexer="bash" if platform.system() != "Windows" else "powershell")
|
|
93
|
+
exit_then_run_shell_script(script=script, strict=False)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def share_file_send(path: Annotated[str, typer.Argument(help="Path to the file or directory to send")],
|
|
97
|
+
zip_folder: Annotated[bool, typer.Option("--zip", help="Zip folder before sending")] = False,
|
|
98
|
+
code: Annotated[str | None, typer.Option("--code", "-c", help="Codephrase used to connect to relay")] = None,
|
|
99
|
+
text: Annotated[str | None, typer.Option("--text", "-t", help="Send some text")] = None,
|
|
100
|
+
qrcode: Annotated[bool, typer.Option("--qrcode", "--qr", help="Show receive code as a qrcode")] = False,
|
|
101
|
+
) -> None:
|
|
102
|
+
"""Send a file using croc with relay server."""
|
|
103
|
+
from machineconfig.utils.installer_utils.installer_cli import install_if_missing
|
|
104
|
+
install_if_missing(which="croc")
|
|
105
|
+
# Get relay server IP from environment or use default
|
|
106
|
+
import socket
|
|
107
|
+
import platform
|
|
108
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
109
|
+
s.connect(('8.8.8.8',80))
|
|
110
|
+
local_ip_v4 = s.getsockname()[0]
|
|
111
|
+
s.close()
|
|
112
|
+
relay_port = "443"
|
|
113
|
+
is_windows = platform.system() == "Windows"
|
|
114
|
+
|
|
115
|
+
# Build command parts
|
|
116
|
+
relay_arg = f"--relay {local_ip_v4}:{relay_port} --ip {local_ip_v4}:{relay_port}"
|
|
117
|
+
zip_arg = "--zip" if zip_folder else ""
|
|
118
|
+
text_arg = f"--text '{text}'" if text else ""
|
|
119
|
+
qrcode_arg = "--qrcode" if qrcode else ""
|
|
120
|
+
path_arg = f"{path}" if not text else ""
|
|
121
|
+
|
|
122
|
+
if is_windows:
|
|
123
|
+
# Windows PowerShell format
|
|
124
|
+
code_arg = f"--code {code}" if code else ""
|
|
125
|
+
script = f"""croc {relay_arg} send {zip_arg} {code_arg} {qrcode_arg} {text_arg} {path_arg}"""
|
|
126
|
+
else:
|
|
127
|
+
# Linux/macOS Bash format
|
|
128
|
+
if code:
|
|
129
|
+
script = f"""export CROC_SECRET="{code}"
|
|
130
|
+
croc {relay_arg} send {zip_arg} {qrcode_arg} {text_arg} {path_arg}"""
|
|
131
|
+
else:
|
|
132
|
+
script = f"""croc {relay_arg} send {zip_arg} {qrcode_arg} {text_arg} {path_arg}"""
|
|
133
|
+
|
|
134
|
+
typer.echo(f"🚀 Sending file: {path}. Use: devops network receive")
|
|
135
|
+
from machineconfig.utils.code import exit_then_run_shell_script, print_code
|
|
136
|
+
print_code(code=script, desc="🚀 sending file with croc", lexer="bash" if platform.system() != "Windows" else "powershell")
|
|
137
|
+
exit_then_run_shell_script(script=script, strict=False)
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
from typing import Optional, Annotated
|
|
3
|
+
from machineconfig.scripts.python.helpers_devops.cli_share_file import share_file_receive, share_file_send
|
|
4
|
+
import typer
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def display_share_url(local_ip_v4: str, port: int, protocol: str = "http") -> None:
|
|
8
|
+
"""Display a flashy, unmissable share URL announcement."""
|
|
9
|
+
from rich.console import Console
|
|
10
|
+
from rich.panel import Panel
|
|
11
|
+
from rich.text import Text
|
|
12
|
+
from rich.align import Align
|
|
13
|
+
console = Console()
|
|
14
|
+
# Create the main message with styling
|
|
15
|
+
url_text = Text(f"{protocol}://{local_ip_v4}:{port}", style="bold bright_cyan underline")
|
|
16
|
+
message = Text.assemble(
|
|
17
|
+
("🚀 ", "bright_red"),
|
|
18
|
+
("Share server is now accessible at: ", "bright_white bold"),
|
|
19
|
+
url_text,
|
|
20
|
+
(" 🚀", "bright_red")
|
|
21
|
+
)
|
|
22
|
+
# Create a fancy panel with borders and styling
|
|
23
|
+
panel = Panel(
|
|
24
|
+
Align.center(message),
|
|
25
|
+
title="[bold bright_green]🌐 SHARE SERVER READY 🌐[/bold bright_green]",
|
|
26
|
+
subtitle="[italic bright_yellow]⚡ Click the link above to access your shared files! ⚡[/italic bright_yellow]",
|
|
27
|
+
border_style="bright_magenta",
|
|
28
|
+
padding=(1, 2),
|
|
29
|
+
expand=False
|
|
30
|
+
)
|
|
31
|
+
# Print with extra spacing and attention-grabbing elements
|
|
32
|
+
console.print(panel)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def web_file_explorer(
|
|
36
|
+
path: Annotated[str, typer.Argument(help="Path to the file or directory to share")],
|
|
37
|
+
port: Annotated[Optional[int], typer.Option("--port", "-p", help="Port to run the share server on (default: 8080)")] = None,
|
|
38
|
+
username: Annotated[Optional[str], typer.Option("--username", "-u", help="Username for share access (default: current user)")] = None,
|
|
39
|
+
password: Annotated[Optional[str], typer.Option("--password", "-w", help="Password for share access (default: from ~/dotfiles/creds/passwords/quick_password)")] = None,
|
|
40
|
+
over_internet: Annotated[bool, typer.Option("--over-internet", "-i", help="Expose the share server over the internet using ngrok")] = False,
|
|
41
|
+
backend: Annotated[str, typer.Option("--backend", "-b", help="Backend to use: filebrowser (default), miniserve, or easy-sharing")] = "filebrowser"
|
|
42
|
+
) -> None:
|
|
43
|
+
from machineconfig.utils.installer_utils.installer_cli import install_if_missing
|
|
44
|
+
|
|
45
|
+
if backend not in ["filebrowser", "miniserve", "easy-sharing"]:
|
|
46
|
+
typer.echo(f"❌ ERROR: Invalid backend '{backend}'. Must be one of: filebrowser, miniserve, easy-sharing", err=True)
|
|
47
|
+
raise typer.Exit(code=1)
|
|
48
|
+
|
|
49
|
+
install_if_missing(which=backend)
|
|
50
|
+
if over_internet:
|
|
51
|
+
install_if_missing(which="ngrok")
|
|
52
|
+
|
|
53
|
+
if username is None:
|
|
54
|
+
import getpass
|
|
55
|
+
username = getpass.getuser()
|
|
56
|
+
|
|
57
|
+
if password is None:
|
|
58
|
+
pwd_path = Path.home().joinpath("dotfiles/creds/passwords/quick_password")
|
|
59
|
+
if pwd_path.exists():
|
|
60
|
+
password = pwd_path.read_text(encoding="utf-8").strip()
|
|
61
|
+
else:
|
|
62
|
+
typer.echo(f"⚠️ WARNING: Password not provided and default password file does not exist.\nPath: {pwd_path}\nUsing default password: 'quick_password' (insecure!)", err=True)
|
|
63
|
+
raise typer.Exit(code=1)
|
|
64
|
+
|
|
65
|
+
if port is None:
|
|
66
|
+
port = 8080
|
|
67
|
+
|
|
68
|
+
import socket
|
|
69
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
70
|
+
s.connect(('8.8.8.8', 80))
|
|
71
|
+
local_ip_v4 = s.getsockname()[0]
|
|
72
|
+
s.close()
|
|
73
|
+
|
|
74
|
+
protocol = "http"
|
|
75
|
+
display_share_url(local_ip_v4, port, protocol)
|
|
76
|
+
|
|
77
|
+
path_obj = Path(path).resolve()
|
|
78
|
+
if not path_obj.exists():
|
|
79
|
+
typer.echo(f"❌ ERROR: Path does not exist: {path}", err=True)
|
|
80
|
+
raise typer.Exit(code=1)
|
|
81
|
+
|
|
82
|
+
if backend == "filebrowser":
|
|
83
|
+
db_path = Path.home().joinpath(".config/filebrowser/filebrowser.db")
|
|
84
|
+
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
85
|
+
command = f"""
|
|
86
|
+
filebrowser users add {username} "{password}" --database {db_path}
|
|
87
|
+
filebrowser --address 0.0.0.0 --port {port} --root "{path_obj}" --database {db_path}
|
|
88
|
+
"""
|
|
89
|
+
elif backend == "miniserve":
|
|
90
|
+
command = f"""miniserve --port {port} --interfaces 0.0.0.0 --auth {username}:{password} --upload-files --mkdir --enable-tar --enable-tar-gz --enable-zip --qrcode "{path_obj}" """
|
|
91
|
+
elif backend == "easy-sharing":
|
|
92
|
+
command = f"""easy-sharing --port {port} --username {username} --password "{password}" "{path_obj}" """
|
|
93
|
+
else:
|
|
94
|
+
typer.echo(f"❌ ERROR: Unknown backend '{backend}'", err=True)
|
|
95
|
+
raise typer.Exit(code=1)
|
|
96
|
+
|
|
97
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
98
|
+
exit_then_run_shell_script(script=command, strict=False)
|
|
99
|
+
# import subprocess
|
|
100
|
+
# import time
|
|
101
|
+
# server_process: subprocess.Popen[bytes]
|
|
102
|
+
# server_process = subprocess.Popen(command, shell=True)
|
|
103
|
+
# processes = [server_process]
|
|
104
|
+
# if over_internet:
|
|
105
|
+
# ngrok_process = subprocess.Popen(f"ngrok http {port}", shell=True)
|
|
106
|
+
# processes.append(ngrok_process)
|
|
107
|
+
# time.sleep(3)
|
|
108
|
+
# try:
|
|
109
|
+
# import requests
|
|
110
|
+
# response = requests.get("http://localhost:4040/api/tunnels")
|
|
111
|
+
# data = response.json()
|
|
112
|
+
# public_url = data['tunnels'][0]['public_url']
|
|
113
|
+
# print(f"🌐 Ngrok tunnel ready: {public_url}")
|
|
114
|
+
# except Exception as e:
|
|
115
|
+
# print(f"Could not retrieve ngrok URL: {e}")
|
|
116
|
+
|
|
117
|
+
# try:
|
|
118
|
+
# while True:
|
|
119
|
+
# print(f"Share server ({backend}) is running. Press Ctrl+C to stop.")
|
|
120
|
+
# time.sleep(2)
|
|
121
|
+
# except KeyboardInterrupt:
|
|
122
|
+
# print("\nTerminating processes...")
|
|
123
|
+
# for p in processes:
|
|
124
|
+
# p.terminate()
|
|
125
|
+
# p.wait()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def get_share_file_app():
|
|
129
|
+
app = typer.Typer(name="share-file", help="Send or receive files using croc with relay server.")
|
|
130
|
+
app.command(name="send", no_args_is_help=True, hidden=False, help="[s] send files from here.")(share_file_send)
|
|
131
|
+
app.command(name="s", no_args_is_help=True, hidden=True, help="[s] send files from here.")(share_file_send)
|
|
132
|
+
app.command(name="receive", no_args_is_help=True, hidden=False, help="[r] receive files to here.")(share_file_receive)
|
|
133
|
+
app.command(name="r", no_args_is_help=True, hidden=True, help="[r] receive files to here.")(share_file_receive)
|
|
134
|
+
return app
|
|
135
|
+
|
|
136
|
+
def main_with_parser():
|
|
137
|
+
typer.run(web_file_explorer)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
if __name__ == "__main__":
|
|
141
|
+
pass
|