machineconfig 6.23__py3-none-any.whl → 8.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of machineconfig might be problematic. Click here for more details.

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