machineconfig 5.76__py3-none-any.whl → 5.78__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/jobs/installer/installer_data.json +6 -6
- machineconfig/scripts/python/devops.py +12 -8
- machineconfig/scripts/python/devops_helpers/cli_nw.py +15 -2
- machineconfig/scripts/python/devops_helpers/cli_self.py +23 -2
- machineconfig/scripts/python/devops_helpers/devops_add_ssh_key.py +3 -0
- machineconfig/scripts/python/nw/add_ssh_key.py +148 -0
- machineconfig/scripts/python/nw/devops_add_identity.py +82 -0
- machineconfig/settings/lf/linux/exe/previewer.sh +6 -1
- machineconfig/settings/lf/linux/lfrc +426 -19
- machineconfig/setup_linux/uv.sh +1 -1
- machineconfig/setup_windows/uv.ps1 +1 -1
- machineconfig/utils/installer_utils/installer_class.py +17 -3
- {machineconfig-5.76.dist-info → machineconfig-5.78.dist-info}/METADATA +6 -16
- {machineconfig-5.76.dist-info → machineconfig-5.78.dist-info}/RECORD +17 -15
- {machineconfig-5.76.dist-info → machineconfig-5.78.dist-info}/WHEEL +0 -0
- {machineconfig-5.76.dist-info → machineconfig-5.78.dist-info}/entry_points.txt +0 -0
- {machineconfig-5.76.dist-info → machineconfig-5.78.dist-info}/top_level.txt +0 -0
|
@@ -1469,14 +1469,14 @@
|
|
|
1469
1469
|
"doc": "🌐 cli to get info of ips",
|
|
1470
1470
|
"fileNamePattern": {
|
|
1471
1471
|
"amd64": {
|
|
1472
|
-
"linux": "
|
|
1473
|
-
"windows": "
|
|
1474
|
-
"macos": "
|
|
1472
|
+
"linux": "{version}_linux_amd64.tar.gz",
|
|
1473
|
+
"windows": "{version}_windows_amd64.zip",
|
|
1474
|
+
"macos": "{version}_darwin_amd64.tar.gz"
|
|
1475
1475
|
},
|
|
1476
1476
|
"arm64": {
|
|
1477
|
-
"linux": "
|
|
1478
|
-
"windows": "
|
|
1479
|
-
"macos": "
|
|
1477
|
+
"linux": "{version}_linux_arm64.tar.gz",
|
|
1478
|
+
"windows": "{version}_windows_arm64.zip",
|
|
1479
|
+
"macos": "{version}_darwin_arm64.tar.gz"
|
|
1480
1480
|
}
|
|
1481
1481
|
}
|
|
1482
1482
|
},
|
|
@@ -22,16 +22,20 @@ def get_app():
|
|
|
22
22
|
_ = install
|
|
23
23
|
app.command("install", no_args_is_help=True, help="🛠️ [i] Install essential packages")(install)
|
|
24
24
|
app.command("i", no_args_is_help=True, help="Install essential packages", hidden=True)(install)
|
|
25
|
-
|
|
26
|
-
app.add_typer(
|
|
27
|
-
app.add_typer(
|
|
28
|
-
|
|
25
|
+
app_repos = cli_repos.get_app()
|
|
26
|
+
app.add_typer(app_repos, name="repos")
|
|
27
|
+
app.add_typer(app_repos, name="r", hidden=True)
|
|
28
|
+
app_config = cli_config.get_app()
|
|
29
|
+
app.add_typer(app_config, name="config")
|
|
30
|
+
app.add_typer(app_config, name="c", hidden=True)
|
|
29
31
|
app.add_typer(cli_data.app_data, name="data")
|
|
30
32
|
app.add_typer(cli_data.app_data, name="d", hidden=True)
|
|
31
|
-
|
|
32
|
-
app.add_typer(
|
|
33
|
-
app.add_typer(
|
|
34
|
-
|
|
33
|
+
app_self = cli_self.get_app()
|
|
34
|
+
app.add_typer(app_self, name="self")
|
|
35
|
+
app.add_typer(app_self, name="s", hidden=True)
|
|
36
|
+
app_nw = cli_network.get_app()
|
|
37
|
+
app.add_typer(app_nw, name="network")
|
|
38
|
+
app.add_typer(app_nw, name="n", hidden=True)
|
|
35
39
|
return app
|
|
36
40
|
|
|
37
41
|
def main():
|
|
@@ -31,6 +31,17 @@ def add_ssh_identity():
|
|
|
31
31
|
import machineconfig.scripts.python.devops_helpers.devops_add_identity as helper
|
|
32
32
|
helper.main()
|
|
33
33
|
|
|
34
|
+
|
|
35
|
+
def show_address():
|
|
36
|
+
import socket
|
|
37
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
38
|
+
s.connect(('8.8.8.8',80))
|
|
39
|
+
local_ip_v4 = s.getsockname()[0]
|
|
40
|
+
s.close()
|
|
41
|
+
print(f"This computer is @ {local_ip_v4}")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
34
45
|
def get_app():
|
|
35
46
|
nw_apps = typer.Typer(help="🔐 [n] Network subcommands", no_args_is_help=True)
|
|
36
47
|
nw_apps.command(name="share-terminal", help="📡 [t] Share terminal via web browser")(cli_terminal.main)
|
|
@@ -39,8 +50,10 @@ def get_app():
|
|
|
39
50
|
nw_apps.command(name="s", help="Start local/global server to share files/folders via web browser", hidden=True, no_args_is_help=True)(cli_share_server.main)
|
|
40
51
|
nw_apps.command(name="install-ssh-server", help="📡 [i] Install SSH server")(install_ssh_server)
|
|
41
52
|
nw_apps.command(name="i", help="Install SSH server", hidden=True)(install_ssh_server)
|
|
42
|
-
nw_apps.command(name="add-ssh-key", help="🔑 [k] Add SSH public key to this machine")(add_ssh_key)
|
|
43
|
-
nw_apps.command(name="k", help="Add SSH public key to this machine", hidden=True)(add_ssh_key)
|
|
53
|
+
nw_apps.command(name="add-ssh-key", help="🔑 [k] Add SSH public key to this machine", no_args_is_help=True)(add_ssh_key)
|
|
54
|
+
nw_apps.command(name="k", help="Add SSH public key to this machine", hidden=True, no_args_is_help=True)(add_ssh_key)
|
|
44
55
|
nw_apps.command(name="add-ssh-identity", help="🗝️ [a] Add SSH identity (private key) to this machine")(add_ssh_identity)
|
|
45
56
|
nw_apps.command(name="a", help="Add SSH identity (private key) to this machine", hidden=True)(add_ssh_identity)
|
|
57
|
+
nw_apps.command(name="show-address", help="[A] Show this computer addresses on network")(show_address)
|
|
58
|
+
nw_apps.command(name="a", help="Show this computer addresses on network", hidden=True)(show_address)
|
|
46
59
|
return nw_apps
|
|
@@ -53,11 +53,30 @@ def run_python(ip: str = typer.Argument(..., help="Python command to run in the
|
|
|
53
53
|
import subprocess
|
|
54
54
|
import sys
|
|
55
55
|
subprocess.run([sys.executable, ip], cwd=machineconfig.__path__[0])
|
|
56
|
+
def readme():
|
|
57
|
+
from rich.console import Console
|
|
58
|
+
from rich.markdown import Markdown
|
|
59
|
+
import requests
|
|
60
|
+
|
|
61
|
+
# URL of the raw README.md file
|
|
62
|
+
url_readme = "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/README.md"
|
|
63
|
+
|
|
64
|
+
# Fetch the content
|
|
65
|
+
response = requests.get(url_readme)
|
|
66
|
+
response.raise_for_status() # Raise an error for bad responses
|
|
67
|
+
|
|
68
|
+
# Parse markdown
|
|
69
|
+
md = Markdown(response.text)
|
|
70
|
+
|
|
71
|
+
# Render in terminal
|
|
72
|
+
console = Console()
|
|
73
|
+
console.print(md)
|
|
74
|
+
|
|
56
75
|
|
|
57
76
|
def get_app():
|
|
58
77
|
cli_app = typer.Typer(help="🔄 [s] self operations subcommands", no_args_is_help=True)
|
|
59
|
-
cli_app.command("update", no_args_is_help=False, help="🔄 [u] UPDATE
|
|
60
|
-
cli_app.command("u", no_args_is_help=False,
|
|
78
|
+
cli_app.command("update", no_args_is_help=False, help="🔄 [u] UPDATE machineconfig")(update)
|
|
79
|
+
cli_app.command("u", no_args_is_help=False, hidden=True)(update)
|
|
61
80
|
cli_app.command("interactive", no_args_is_help=False, help="🤖 [i] INTERACTIVE configuration of machine.")(interactive)
|
|
62
81
|
cli_app.command("i", no_args_is_help=False, help="INTERACTIVE configuration of machine.", hidden=True)(interactive)
|
|
63
82
|
cli_app.command("status", no_args_is_help=False, help="📊 [s] STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.")(status)
|
|
@@ -68,4 +87,6 @@ def get_app():
|
|
|
68
87
|
cli_app.command("n", no_args_is_help=False, help="NAVIGATE command structure with TUI", hidden=True)(navigate)
|
|
69
88
|
cli_app.command("python", no_args_is_help=False, help="🐍 [c] python command/file in the machineconfig environment")(run_python)
|
|
70
89
|
cli_app.command("c", no_args_is_help=False, help="RUN python command/file in the machineconfig environment", hidden=True)(run_python)
|
|
90
|
+
cli_app.command("readme", no_args_is_help=False, help="📚 [r] render readme markdown in terminal.")(readme)
|
|
91
|
+
cli_app.command("r", no_args_is_help=False, hidden=True)(readme)
|
|
71
92
|
return cli_app
|
|
@@ -86,6 +86,7 @@ def main(pub_path: Optional[str] = typer.Argument(None, help="Path to the public
|
|
|
86
86
|
|
|
87
87
|
if pub_path:
|
|
88
88
|
key_path = PathExtended(pub_path).expanduser().absolute()
|
|
89
|
+
key_path.parent.mkdir(parents=True, exist_ok=True)
|
|
89
90
|
if not key_path.exists():
|
|
90
91
|
console.print(Panel(f"❌ ERROR: Provided key path does not exist\nPath: {key_path}", title="[bold red]Error[/bold red]"))
|
|
91
92
|
raise FileNotFoundError(f"Provided key path does not exist: {key_path}")
|
|
@@ -111,6 +112,7 @@ def main(pub_path: Optional[str] = typer.Argument(None, help="Path to the public
|
|
|
111
112
|
console.print(Panel("📋 Please provide a filename and paste the public key content", title="[bold blue]Input Required[/bold blue]", border_style="blue"))
|
|
112
113
|
key_filename = input("📝 File name (default: my_pasted_key.pub): ") or "my_pasted_key.pub"
|
|
113
114
|
key_path = PathExtended.home().joinpath(f".ssh/{key_filename}")
|
|
115
|
+
key_path.parent.mkdir(parents=True, exist_ok=True)
|
|
114
116
|
key_path.write_text(input("🔑 Paste the public key here: "), encoding="utf-8")
|
|
115
117
|
console.print(Panel(f"💾 Key saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
|
|
116
118
|
program = get_add_ssh_key_script(key_path)
|
|
@@ -127,6 +129,7 @@ def main(pub_path: Optional[str] = typer.Argument(None, help="Path to the public
|
|
|
127
129
|
return
|
|
128
130
|
console.print(Panel(f"✅ Found {len(keys)} public key(s) for user: {from_github}", title="[bold green]Success[/bold green]", border_style="green"))
|
|
129
131
|
key_path = PathExtended.home().joinpath(f".ssh/{from_github}_github_keys.pub")
|
|
132
|
+
key_path.parent.mkdir(parents=True, exist_ok=True)
|
|
130
133
|
key_path.write_text("\n".join([key["key"] for key in keys]), encoding="utf-8")
|
|
131
134
|
console.print(Panel(f"💾 Keys saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
|
|
132
135
|
program = get_add_ssh_key_script(key_path)
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""SSH"""
|
|
2
|
+
|
|
3
|
+
from platform import system
|
|
4
|
+
from machineconfig.utils.source_of_truth import LIBRARY_ROOT
|
|
5
|
+
from machineconfig.utils.path_extended import PathExtended
|
|
6
|
+
from rich.console import Console
|
|
7
|
+
from rich.panel import Panel
|
|
8
|
+
from rich import box # Import box
|
|
9
|
+
from typing import Optional
|
|
10
|
+
import typer
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
console = Console()
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def get_add_ssh_key_script(path_to_key: PathExtended):
|
|
17
|
+
console.print(Panel("🔑 SSH KEY CONFIGURATION", title="[bold blue]SSH Setup[/bold blue]"))
|
|
18
|
+
if system() == "Linux" or system() == "Darwin":
|
|
19
|
+
authorized_keys = PathExtended.home().joinpath(".ssh/authorized_keys")
|
|
20
|
+
console.print(Panel(f"🐧 Linux SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
|
|
21
|
+
elif system() == "Windows":
|
|
22
|
+
authorized_keys = PathExtended("C:/ProgramData/ssh/administrators_authorized_keys")
|
|
23
|
+
console.print(Panel(f"🪟 Windows SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
|
|
24
|
+
else:
|
|
25
|
+
console.print(Panel("❌ ERROR: Unsupported operating system\nOnly Linux and Windows are supported", title="[bold red]Error[/bold red]"))
|
|
26
|
+
raise NotImplementedError
|
|
27
|
+
|
|
28
|
+
if authorized_keys.exists():
|
|
29
|
+
split = "\n"
|
|
30
|
+
keys_text = authorized_keys.read_text(encoding="utf-8").split(split)
|
|
31
|
+
key_count = len([k for k in keys_text if k.strip()])
|
|
32
|
+
console.print(Panel(f"🔍 Current SSH authorization status\n✅ Found {key_count} authorized key(s)", title="[bold blue]Status[/bold blue]"))
|
|
33
|
+
if path_to_key.read_text(encoding="utf-8") in authorized_keys.read_text(encoding="utf-8"):
|
|
34
|
+
console.print(Panel(f"⚠️ Key already authorized\nKey: {path_to_key.name}\nStatus: Already present in authorized_keys file\nNo action required", title="[bold yellow]Warning[/bold yellow]"))
|
|
35
|
+
program = ""
|
|
36
|
+
else:
|
|
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":
|
|
39
|
+
program = f"cat {path_to_key} >> ~/.ssh/authorized_keys"
|
|
40
|
+
elif system() == "Windows":
|
|
41
|
+
program_path = LIBRARY_ROOT.joinpath("setup_windows/add-sshkey.ps1")
|
|
42
|
+
program = program_path.expanduser().read_text(encoding="utf-8")
|
|
43
|
+
place_holder = r'$sshfile = "$env:USERPROFILE\.ssh\pubkey.pub"'
|
|
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."
|
|
45
|
+
program = program.replace(place_holder, f'$sshfile = "{path_to_key}"')
|
|
46
|
+
console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Replaced placeholder with actual key path", title="[bold blue]Configuration[/bold blue]"))
|
|
47
|
+
else:
|
|
48
|
+
raise NotImplementedError
|
|
49
|
+
else:
|
|
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":
|
|
52
|
+
program = f"cat {path_to_key} > ~/.ssh/authorized_keys"
|
|
53
|
+
else:
|
|
54
|
+
program_path = LIBRARY_ROOT.joinpath("setup_windows/openssh-server_add-sshkey.ps1")
|
|
55
|
+
program = PathExtended(program_path).expanduser().read_text(encoding="utf-8").replace('$sshfile=""', f'$sshfile="{path_to_key}"')
|
|
56
|
+
console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Set key path in script", title="[bold blue]Configuration[/bold blue]"))
|
|
57
|
+
|
|
58
|
+
if system() == "Linux" or system() == "Darwin":
|
|
59
|
+
program += """
|
|
60
|
+
sudo chmod 700 ~/.ssh
|
|
61
|
+
sudo chmod 644 ~/.ssh/authorized_keys
|
|
62
|
+
sudo chmod 644 ~/.ssh/*.pub
|
|
63
|
+
sudo service ssh --full-restart
|
|
64
|
+
# from superuser.com/questions/215504/permissions-on-private-key-in-ssh-folder
|
|
65
|
+
"""
|
|
66
|
+
return program
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
"""
|
|
71
|
+
# Common pitfalls:
|
|
72
|
+
# 🚫 Wrong line endings (LF/CRLF) in config files
|
|
73
|
+
# 🌐 Network port conflicts (try 2222 -> 2223) between WSL and Windows
|
|
74
|
+
# sudo service ssh restart
|
|
75
|
+
# sudo service ssh status
|
|
76
|
+
# sudo nano /etc/ssh/sshd_config
|
|
77
|
+
"""
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def main(pub_path: Optional[str] = typer.Argument(None, help="Path to the public key file"),
|
|
81
|
+
pub_choose: bool = typer.Option(False, "--choose", "-c", help="Choose from available public keys in ~/.ssh"),
|
|
82
|
+
pub_val: bool = typer.Option(False, "--paste", "-p", help="Paste the public key content manually"),
|
|
83
|
+
from_github: Optional[str] = typer.Option(None, "--from-github", "-g", help="Fetch public keys from a GitHub username")
|
|
84
|
+
) -> None:
|
|
85
|
+
if pub_path:
|
|
86
|
+
key_path = PathExtended(pub_path).expanduser().absolute()
|
|
87
|
+
if not key_path.exists():
|
|
88
|
+
console.print(Panel(f"❌ ERROR: Provided key path does not exist\nPath: {key_path}", title="[bold red]Error[/bold red]"))
|
|
89
|
+
raise FileNotFoundError(f"Provided key path does not exist: {key_path}")
|
|
90
|
+
console.print(Panel(f"📄 Using provided public key file: {key_path}", title="[bold blue]Info[/bold blue]"))
|
|
91
|
+
program = get_add_ssh_key_script(key_path)
|
|
92
|
+
from machineconfig.utils.code import run_shell_script
|
|
93
|
+
run_shell_script(script=program)
|
|
94
|
+
console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
|
|
95
|
+
return
|
|
96
|
+
elif pub_choose:
|
|
97
|
+
console.print(Panel("🔐 SSH PUBLIC KEY AUTHORIZATION TOOL", box=box.DOUBLE_EDGE, title_align="left"))
|
|
98
|
+
console.print(Panel("🔍 Searching for public keys...", title="[bold blue]SSH Setup[/bold blue]", border_style="blue"))
|
|
99
|
+
pub_keys = PathExtended.home().joinpath(".ssh").search("*.pub")
|
|
100
|
+
if pub_keys:
|
|
101
|
+
console.print(Panel(f"✅ Found {len(pub_keys)} public key(s)", title="[bold green]Status[/bold green]", border_style="green"))
|
|
102
|
+
else:
|
|
103
|
+
console.print(Panel("⚠️ No public keys found", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
|
|
104
|
+
return
|
|
105
|
+
console.print(Panel(f"🔄 Processing all {len(pub_keys)} public keys...", title="[bold blue]Processing[/bold blue]", border_style="blue"))
|
|
106
|
+
program = "\n\n\n".join([get_add_ssh_key_script(key) for key in pub_keys])
|
|
107
|
+
|
|
108
|
+
elif pub_val:
|
|
109
|
+
console.print(Panel("📋 Please provide a filename and paste the public key content", title="[bold blue]Input Required[/bold blue]", border_style="blue"))
|
|
110
|
+
key_filename = input("📝 File name (default: my_pasted_key.pub): ") or "my_pasted_key.pub"
|
|
111
|
+
key_path = PathExtended.home().joinpath(f".ssh/{key_filename}")
|
|
112
|
+
key_path.write_text(input("🔑 Paste the public key here: "), encoding="utf-8")
|
|
113
|
+
console.print(Panel(f"💾 Key saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
|
|
114
|
+
program = get_add_ssh_key_script(key_path)
|
|
115
|
+
elif from_github:
|
|
116
|
+
console.print(Panel(f"🌐 Fetching public keys from GitHub user: {from_github}", title="[bold blue]GitHub Fetch[/bold blue]", border_style="blue"))
|
|
117
|
+
import requests
|
|
118
|
+
# $pubkey_url = 'https://github.com/thisismygitrepo.keys' # $pubkey_string = (Invoke-WebRequest $pubkey_url).Content
|
|
119
|
+
response = requests.get(f"https://api.github.com/users/{from_github}/keys")
|
|
120
|
+
if response.status_code != 200:
|
|
121
|
+
console.print(Panel(f"❌ ERROR: Failed to fetch keys from GitHub user {from_github}\nStatus Code: {response.status_code}", title="[bold red]Error[/bold red]", border_style="red"))
|
|
122
|
+
raise RuntimeError(f"Failed to fetch keys from GitHub user {from_github}: Status Code {response.status_code}")
|
|
123
|
+
keys = response.json()
|
|
124
|
+
if not keys:
|
|
125
|
+
console.print(Panel(f"⚠️ No public keys found for GitHub user: {from_github}", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
|
|
126
|
+
return
|
|
127
|
+
console.print(Panel(f"✅ Found {len(keys)} public key(s) for user: {from_github}", title="[bold green]Success[/bold green]", border_style="green"))
|
|
128
|
+
key_path = PathExtended.home().joinpath(f".ssh/{from_github}_github_keys.pub")
|
|
129
|
+
key_path.write_text("\n".join([key["key"] for key in keys]), encoding="utf-8")
|
|
130
|
+
console.print(Panel(f"💾 Keys saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
|
|
131
|
+
program = get_add_ssh_key_script(key_path)
|
|
132
|
+
else:
|
|
133
|
+
console.print(Panel("❌ ERROR: No method provided to add SSH key\nUse --help for options", title="[bold red]Error[/bold red]", border_style="red"))
|
|
134
|
+
raise ValueError("No method provided to add SSH key. Use --help for options.")
|
|
135
|
+
console.print(Panel("🚀 SSH KEY AUTHORIZATION READY\nRun the generated script to apply changes", box=box.DOUBLE_EDGE, title_align="left"))
|
|
136
|
+
from machineconfig.utils.code import run_shell_script
|
|
137
|
+
run_shell_script(script=program)
|
|
138
|
+
import socket
|
|
139
|
+
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
140
|
+
s.connect(('8.8.8.8',80))
|
|
141
|
+
local_ip_v4 = s.getsockname()[0]
|
|
142
|
+
s.close()
|
|
143
|
+
print(f"This computer is @ {local_ip_v4}")
|
|
144
|
+
console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
if __name__ == "__main__":
|
|
148
|
+
pass
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""ID"""
|
|
2
|
+
|
|
3
|
+
# from platform import system
|
|
4
|
+
from machineconfig.utils.path_extended import PathExtended
|
|
5
|
+
from machineconfig.utils.options import choose_from_options
|
|
6
|
+
from rich.panel import Panel
|
|
7
|
+
from rich.text import Text
|
|
8
|
+
|
|
9
|
+
BOX_WIDTH = 150 # width for box drawing
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def main() -> None:
|
|
13
|
+
title = "🔑 SSH IDENTITY MANAGEMENT"
|
|
14
|
+
print(Panel(Text(title, justify="center"), expand=False))
|
|
15
|
+
print(Panel("🔍 Searching for existing SSH keys...", expand=False))
|
|
16
|
+
private_keys = [x.with_name(x.stem) for x in PathExtended.home().joinpath(".ssh").search("*.pub")]
|
|
17
|
+
private_keys = [x for x in private_keys if x.exists()]
|
|
18
|
+
if private_keys:
|
|
19
|
+
print(Panel(f"✅ Found {len(private_keys)} SSH private key(s)", expand=False))
|
|
20
|
+
else:
|
|
21
|
+
print(Panel("⚠️ No SSH private keys found", expand=False))
|
|
22
|
+
|
|
23
|
+
choice = choose_from_options(msg="Path to private key to be used when ssh'ing: ", options=[str(x) for x in private_keys] + ["I have the path to the key file", "I want to paste the key itself"], multi=False)
|
|
24
|
+
|
|
25
|
+
if choice == "I have the path to the key file":
|
|
26
|
+
print(Panel("📄 Please enter the path to your private key file", expand=False))
|
|
27
|
+
path_to_key = PathExtended(input("📋 Input path here: ")).expanduser().absolute()
|
|
28
|
+
print(Panel(f"📂 Using key from custom path: {path_to_key}", expand=False))
|
|
29
|
+
|
|
30
|
+
elif choice == "I want to paste the key itself":
|
|
31
|
+
print(Panel("📋 Please provide a filename and paste the private key content", expand=False))
|
|
32
|
+
key_filename = input("📝 File name (default: my_pasted_key): ") or "my_pasted_key"
|
|
33
|
+
path_to_key = PathExtended.home().joinpath(f".ssh/{key_filename}")
|
|
34
|
+
path_to_key.parent.mkdir(parents=True, exist_ok=True)
|
|
35
|
+
path_to_key.write_text(input("🔑 Paste the private key here: "), encoding="utf-8")
|
|
36
|
+
print(Panel(f"💾 Key saved to: {path_to_key}", expand=False))
|
|
37
|
+
|
|
38
|
+
else:
|
|
39
|
+
path_to_key = PathExtended(choice)
|
|
40
|
+
print(Panel(f"🔑 Using selected key: {path_to_key.name}", expand=False))
|
|
41
|
+
|
|
42
|
+
txt = f"IdentityFile {path_to_key.collapseuser().as_posix()}" # adds this id for all connections, no host specified.
|
|
43
|
+
config_path = PathExtended.home().joinpath(".ssh/config")
|
|
44
|
+
|
|
45
|
+
print(Panel("📝 Updating SSH configuration...", expand=False))
|
|
46
|
+
|
|
47
|
+
# Inline the previous modify_text behavior (now deprecated):
|
|
48
|
+
# - If file doesn't exist, seed content with txt_search
|
|
49
|
+
# - Otherwise, replace a matching line or append if not found
|
|
50
|
+
if config_path.exists():
|
|
51
|
+
current = config_path.read_text(encoding="utf-8")
|
|
52
|
+
print(Panel("✏️ Updated existing SSH config file", expand=False))
|
|
53
|
+
else:
|
|
54
|
+
current = txt
|
|
55
|
+
print(Panel("📄 Created new SSH config file", expand=False))
|
|
56
|
+
lines = current.split("\n")
|
|
57
|
+
found = False
|
|
58
|
+
for i, line in enumerate(lines):
|
|
59
|
+
if txt in line:
|
|
60
|
+
lines[i] = txt
|
|
61
|
+
found = True
|
|
62
|
+
if not found:
|
|
63
|
+
lines.insert(0, txt)
|
|
64
|
+
new_content = "\n".join(lines)
|
|
65
|
+
config_path.write_text(new_content, encoding="utf-8")
|
|
66
|
+
|
|
67
|
+
panel_complete = Panel(Text("✅ SSH IDENTITY CONFIGURATION COMPLETE\nIdentity added to SSH config file\nConsider reloading the SSH config to apply changes", justify="center"), expand=False, border_style="green")
|
|
68
|
+
program = f"echo '{panel_complete}'"
|
|
69
|
+
|
|
70
|
+
success_message = f"🎉 CONFIGURATION SUCCESSFUL\nIdentity added: {path_to_key.name}\nConfig file: {config_path}"
|
|
71
|
+
print(Panel(Text(success_message, justify="center"), expand=False, border_style="green"))
|
|
72
|
+
|
|
73
|
+
import subprocess
|
|
74
|
+
|
|
75
|
+
# run program
|
|
76
|
+
subprocess.run(program, shell=True, check=True, text=True)
|
|
77
|
+
print(Panel("🔐 Identity added to SSH agent", expand=False, border_style="green"))
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
if __name__ == "__main__":
|
|
82
|
+
pass
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
# 🔍 File Preview Script for LF File Manager
|
|
3
3
|
# Uses:
|
|
4
4
|
# 🖼️ chafa, viu - Image preview
|
|
5
|
-
# 📝
|
|
5
|
+
# 📝 bat - Syntax-highlighted text/code preview
|
|
6
|
+
# 📄 pistol - General file preview
|
|
6
7
|
|
|
7
8
|
file=$1
|
|
8
9
|
width="$2"
|
|
@@ -30,6 +31,10 @@ case "$file" in
|
|
|
30
31
|
fi
|
|
31
32
|
exit 0
|
|
32
33
|
;;
|
|
34
|
+
# 📝 Text/Code Files - Use bat for syntax highlighting
|
|
35
|
+
*.py|*.json|*.js|*.ts|*.html|*.css|*.scss|*.less|*.xml|*.yml|*.yaml|*.toml|*.ini|*.cfg|*.conf|*.sh|*.bash|*.zsh|*.fish|*.ps1|*.rs|*.go|*.java|*.cpp|*.c|*.h|*.hpp|*.cs|*.php|*.rb|*.pl|*.pm|*.lua|*.vim|*.sql|*.md|*.txt|*.log|*.csv|*.tsv)
|
|
36
|
+
bat --color=always --style=plain --paging=never "$file"
|
|
37
|
+
;;
|
|
33
38
|
*)
|
|
34
39
|
# 📄 Default file preview
|
|
35
40
|
pistol "$file"
|
|
@@ -4,7 +4,428 @@ set icons true # show icons next to files
|
|
|
4
4
|
set period 1 # interval to check for directory updates
|
|
5
5
|
set hidden true # show hidden files by default
|
|
6
6
|
set incsearch true # jump to first match after each keystroke in search
|
|
7
|
-
|
|
7
|
+
# LF Configuration File - Updated for latest version
|
|
8
|
+
# Based on lf documentation: https://github.com/gokcehan/lf/blob/master/doc.md
|
|
9
|
+
|
|
10
|
+
# ============================ OPTIONS ============================================
|
|
11
|
+
|
|
12
|
+
# Navigation and display
|
|
13
|
+
set scrolloff 10 # space on top and bottom of screen
|
|
14
|
+
set relativenumber false # show relative line numbers (complements number)
|
|
15
|
+
set number true # show absolute line numbers
|
|
16
|
+
set wrapscroll false # scrolling wraps around the file list
|
|
17
|
+
set wrapscan true # searching wraps around the file list
|
|
18
|
+
|
|
19
|
+
# File display
|
|
20
|
+
set hidden true # show hidden files by default
|
|
21
|
+
set hiddenfiles ".*:*.aux:*.log:*.bbl:*.bcf:*.blg:*.run.xml" # additional hidden patterns
|
|
22
|
+
set dirfirst true # show directories first
|
|
23
|
+
set dironly false # show only directories
|
|
24
|
+
set info "size:time" # show file size and modification time
|
|
25
|
+
set dircounts false # don't show item counts in directories (performance)
|
|
26
|
+
set sizeunits binary # use binary units (1024) instead of decimal (1000)
|
|
27
|
+
|
|
28
|
+
# Icons and colors
|
|
29
|
+
set icons true # show icons next to files
|
|
30
|
+
set drawbox false # don't draw borders around panes
|
|
31
|
+
set roundbox false # rounded corners for borders (when drawbox enabled)
|
|
32
|
+
|
|
33
|
+
# Search and filtering
|
|
34
|
+
set ignorecase true # ignore case in sorting and search
|
|
35
|
+
set smartcase true # override ignorecase when pattern has uppercase
|
|
36
|
+
set ignoredia true # ignore diacritics in sorting and search
|
|
37
|
+
set smartdia false # override ignoredia when pattern has diacritics
|
|
38
|
+
set incsearch true # jump to first match after each keystroke in search
|
|
39
|
+
set incfilter false # don't apply filter after each keystroke
|
|
40
|
+
set filtermethod text # filter method: text, glob, or regex
|
|
41
|
+
set searchmethod text # search method: text, glob, or regex
|
|
42
|
+
set anchorfind true # find command starts matching from beginning
|
|
43
|
+
set findlen 1 # number of characters for find command
|
|
44
|
+
|
|
45
|
+
# File operations
|
|
46
|
+
set preserve "mode" # preserve file attributes when copying
|
|
47
|
+
set dupfilefmt "%f.~%n~" # format for duplicate files
|
|
48
|
+
set selmode all # selection mode: all or dir
|
|
49
|
+
|
|
50
|
+
# Preview
|
|
51
|
+
set preview true # preview files on the right pane
|
|
52
|
+
set previewer ~/.config/machineconfig/settings/lf/linux/exe/previewer.sh
|
|
53
|
+
set cleaner ~/.config/machineconfig/settings/lf/linux/exe/cleaner.sh
|
|
54
|
+
set dirpreviews false # don't preview directories by default
|
|
55
|
+
|
|
56
|
+
# Performance and monitoring
|
|
57
|
+
set period 0 # disable periodic directory updates (0 = disabled)
|
|
58
|
+
set watch false # don't watch filesystem for changes (can be slow)
|
|
59
|
+
|
|
60
|
+
# Mouse and interaction
|
|
61
|
+
set mouse false # disable mouse support
|
|
62
|
+
set showbinds true # show key bindings
|
|
63
|
+
|
|
64
|
+
# UI layout
|
|
65
|
+
set ratios "1:2:3" # ratio of pane widths
|
|
66
|
+
|
|
67
|
+
# Truncation
|
|
68
|
+
set truncatechar "~" # character to show when filename is truncated
|
|
69
|
+
set truncatepct 100 # percentage of space for filename before extension
|
|
70
|
+
|
|
71
|
+
# History and persistence
|
|
72
|
+
set history true # save command history
|
|
73
|
+
|
|
74
|
+
# Special files and behavior
|
|
75
|
+
set ifs "\n" # internal field separator for shell commands
|
|
76
|
+
set shell sh # shell to use
|
|
77
|
+
set shellflag -c # shell flag
|
|
78
|
+
set shellopts "" # shell options
|
|
79
|
+
set waitmsg "Press any key to continue"
|
|
80
|
+
|
|
81
|
+
# Formatting (colors and styles)
|
|
82
|
+
set promptfmt "\033[32;1m%u@%h\033[0m:\033[34;1m%d\033[0m\033[1m%f\033[0m"
|
|
83
|
+
set cursoractivefmt "\033[7m"
|
|
84
|
+
set cursorparentfmt "\033[7m"
|
|
85
|
+
set cursorpreviewfmt "\033[4m"
|
|
86
|
+
set numberfmt "\033[33m"
|
|
87
|
+
set copyfmt "\033[7;33m"
|
|
88
|
+
set cutfmt "\033[7;31m"
|
|
89
|
+
set selectfmt "\033[7;35m"
|
|
90
|
+
set visualfmt "\033[7;36m"
|
|
91
|
+
set errorfmt "\033[7;31;47m"
|
|
92
|
+
set borderfmt "\033[0m"
|
|
93
|
+
set menufmt "\033[0m"
|
|
94
|
+
set menuheaderfmt "\033[1m"
|
|
95
|
+
set menuselectfmt "\033[7m"
|
|
96
|
+
|
|
97
|
+
# Ruler and status
|
|
98
|
+
set rulerfmt " %a| %p| \033[7;31m %m \033[0m| \033[7;33m %c \033[0m| \033[7;35m %s \033[0m| \033[7;36m %v \033[0m| \033[7;34m %f \033[0m| %i/%t"
|
|
99
|
+
set statfmt "\033[36m%p\033[0m| %c| %u| %g| %S| %t| -> %l"
|
|
100
|
+
|
|
101
|
+
# Sorting
|
|
102
|
+
set sortby natural # sort by: natural, name, ext, size, time, atime, btime, ctime
|
|
103
|
+
set reverse false # don't reverse sort order
|
|
104
|
+
|
|
105
|
+
# Tabstops and display
|
|
106
|
+
set tabstop 8 # number of spaces for tab character
|
|
107
|
+
|
|
108
|
+
# User options (can be accessed in scripts)
|
|
109
|
+
# set user_option value
|
|
110
|
+
|
|
111
|
+
# ============================ KEY BINDINGS ============================================
|
|
112
|
+
|
|
113
|
+
# Clear default mappings that might conflict
|
|
114
|
+
clearmaps
|
|
115
|
+
|
|
116
|
+
# Navigation (vim-like)
|
|
117
|
+
map <up> up
|
|
118
|
+
map <down> down
|
|
119
|
+
map <left> updir
|
|
120
|
+
map <right> open
|
|
121
|
+
map k up
|
|
122
|
+
map j down
|
|
123
|
+
map h updir
|
|
124
|
+
map l open
|
|
125
|
+
map gg top
|
|
126
|
+
map G bottom
|
|
127
|
+
map H high
|
|
128
|
+
map M middle
|
|
129
|
+
map L low
|
|
130
|
+
|
|
131
|
+
# Scrolling
|
|
132
|
+
map <c-u> half-up
|
|
133
|
+
map <c-d> half-down
|
|
134
|
+
map <c-b> page-up
|
|
135
|
+
map <c-f> page-down
|
|
136
|
+
map <c-y> scroll-up
|
|
137
|
+
map <c-e> scroll-down
|
|
138
|
+
|
|
139
|
+
# Jumping
|
|
140
|
+
map ] jump-next
|
|
141
|
+
map [ jump-prev
|
|
142
|
+
|
|
143
|
+
# File operations
|
|
144
|
+
map y copy
|
|
145
|
+
map d cut
|
|
146
|
+
map p paste
|
|
147
|
+
map c clear
|
|
148
|
+
map x delete
|
|
149
|
+
map r rename
|
|
150
|
+
|
|
151
|
+
# Selection and marking
|
|
152
|
+
map v invert
|
|
153
|
+
map u unselect
|
|
154
|
+
map t tag-toggle
|
|
155
|
+
map <space> :toggle; down
|
|
156
|
+
|
|
157
|
+
# Search and find
|
|
158
|
+
map / search
|
|
159
|
+
map ? search-back
|
|
160
|
+
map n search-next
|
|
161
|
+
map N search-prev
|
|
162
|
+
map f find
|
|
163
|
+
map F find-back
|
|
164
|
+
map ; find-next
|
|
165
|
+
map , find-prev
|
|
166
|
+
|
|
167
|
+
# Filter
|
|
168
|
+
map f filter
|
|
169
|
+
|
|
170
|
+
# Marks
|
|
171
|
+
map m mark-save
|
|
172
|
+
map ' mark-load
|
|
173
|
+
map " mark-remove
|
|
174
|
+
|
|
175
|
+
# Commands
|
|
176
|
+
map : read
|
|
177
|
+
map $ shell
|
|
178
|
+
map % shell-pipe
|
|
179
|
+
map ! shell-wait
|
|
180
|
+
map & shell-async
|
|
181
|
+
|
|
182
|
+
# Special
|
|
183
|
+
map . set hidden!
|
|
184
|
+
map zh set hidden!
|
|
185
|
+
map zr set reverse!
|
|
186
|
+
map zn set info
|
|
187
|
+
map zs set info size
|
|
188
|
+
map zt set info time
|
|
189
|
+
map za set info size:time
|
|
190
|
+
|
|
191
|
+
# Sorting shortcuts
|
|
192
|
+
map sn :set sortby natural; set info
|
|
193
|
+
map ss :set sortby size; set info size
|
|
194
|
+
map st :set sortby time; set info time
|
|
195
|
+
map sa :set sortby atime; set info atime
|
|
196
|
+
map sb :set sortby btime; set info btime
|
|
197
|
+
map sc :set sortby ctime; set info ctime
|
|
198
|
+
map se :set sortby ext; set info
|
|
199
|
+
|
|
200
|
+
# UI
|
|
201
|
+
map <c-l> redraw
|
|
202
|
+
map <c-r> reload
|
|
203
|
+
|
|
204
|
+
# Quit
|
|
205
|
+
map q quit
|
|
206
|
+
map ZZ quit
|
|
207
|
+
map ZQ quit!
|
|
208
|
+
|
|
209
|
+
# Help
|
|
210
|
+
map <f-1> help
|
|
211
|
+
|
|
212
|
+
# ============================ CUSTOM COMMANDS =====================================
|
|
213
|
+
|
|
214
|
+
# Open files with appropriate applications
|
|
215
|
+
cmd open &{{
|
|
216
|
+
case $(file --mime-type -Lb "$f") in
|
|
217
|
+
text/*) $EDITOR "$f" ;;
|
|
218
|
+
image/*) imv "$f" ;;
|
|
219
|
+
video/*) mpv "$f" ;;
|
|
220
|
+
audio/*) mpv "$f" ;;
|
|
221
|
+
application/pdf) zathura "$f" ;;
|
|
222
|
+
*) xdg-open "$f" ;;
|
|
223
|
+
esac
|
|
224
|
+
}}
|
|
225
|
+
|
|
226
|
+
# Enhanced paste with progress
|
|
227
|
+
cmd paste &{{
|
|
228
|
+
# Use lf's built-in paste but with custom handling if needed
|
|
229
|
+
# This is a fallback - lf handles paste internally by default
|
|
230
|
+
lf -remote "send $id paste"
|
|
231
|
+
}}
|
|
232
|
+
|
|
233
|
+
# Enhanced delete with trash
|
|
234
|
+
cmd delete &{{
|
|
235
|
+
printf "Delete %d files? [y/N] " $(echo "$fx" | wc -l)
|
|
236
|
+
read -r ans
|
|
237
|
+
[ "$ans" = "y" ] || [ "$ans" = "Y" ] || exit 1
|
|
238
|
+
|
|
239
|
+
# Move to trash instead of permanent deletion
|
|
240
|
+
mkdir -p ~/.trash
|
|
241
|
+
mv "$fx" ~/.trash/
|
|
242
|
+
}}
|
|
243
|
+
|
|
244
|
+
# Bulk rename with vidir
|
|
245
|
+
cmd rename %vidir
|
|
246
|
+
|
|
247
|
+
# Create directories
|
|
248
|
+
cmd mkdir &{{
|
|
249
|
+
printf "Directory name: "
|
|
250
|
+
read -r dirname
|
|
251
|
+
mkdir -p "$dirname"
|
|
252
|
+
}}
|
|
253
|
+
|
|
254
|
+
# Create files
|
|
255
|
+
cmd mkfile &{{
|
|
256
|
+
printf "File name: "
|
|
257
|
+
read -r filename
|
|
258
|
+
$EDITOR "$filename"
|
|
259
|
+
}}
|
|
260
|
+
|
|
261
|
+
# Change permissions
|
|
262
|
+
cmd chmod %{{
|
|
263
|
+
printf "Mode bits: "
|
|
264
|
+
read -r mode
|
|
265
|
+
chmod "$mode" "$fx"
|
|
266
|
+
lf -remote "send $id reload"
|
|
267
|
+
}}
|
|
268
|
+
|
|
269
|
+
# Directory size calculation
|
|
270
|
+
cmd calcdirsize &{{
|
|
271
|
+
for dir in "$fx"; do
|
|
272
|
+
if [ -d "$dir" ]; then
|
|
273
|
+
size=$(du -sh "$dir" | cut -f1)
|
|
274
|
+
lf -remote "send $id addcustominfo \"$dir\" \"$size\""
|
|
275
|
+
fi
|
|
276
|
+
done
|
|
277
|
+
}}
|
|
278
|
+
|
|
279
|
+
# Git status indicators
|
|
280
|
+
cmd git-status &{{
|
|
281
|
+
if git rev-parse --git-dir >/dev/null 2>&1; then
|
|
282
|
+
for file in "$@"; do
|
|
283
|
+
if [ -e "$file" ]; then
|
|
284
|
+
status=$(git status --porcelain "$file" 2>/dev/null | head -n1 | cut -c1-2)
|
|
285
|
+
[ -n "$status" ] && lf -remote "send $id addcustominfo \"$file\" \"$status\""
|
|
286
|
+
fi
|
|
287
|
+
done
|
|
288
|
+
fi
|
|
289
|
+
}}
|
|
290
|
+
|
|
291
|
+
# Fuzzy jump with fzf
|
|
292
|
+
cmd fzf-jump &{{
|
|
293
|
+
dest=$(find . -type d | fzf --height 40% --reverse --header="Jump to directory")
|
|
294
|
+
[ -n "$dest" ] && lf -remote "send $id cd \"$dest\""
|
|
295
|
+
}}
|
|
296
|
+
|
|
297
|
+
# Fuzzy search with ripgrep and fzf
|
|
298
|
+
cmd fzf-search &{{
|
|
299
|
+
RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case"
|
|
300
|
+
result=$(
|
|
301
|
+
FZF_DEFAULT_COMMAND="$RG_PREFIX ''" \
|
|
302
|
+
fzf --bind "change:reload:$RG_PREFIX {q} || true" \
|
|
303
|
+
--ansi --layout=reverse --header 'Search in files' \
|
|
304
|
+
--disabled
|
|
305
|
+
)
|
|
306
|
+
[ -n "$result" ] && file=$(echo "$result" | cut -d: -f1) && lf -remote "send $id select \"$file\""
|
|
307
|
+
}}
|
|
308
|
+
|
|
309
|
+
# Zoxide integration
|
|
310
|
+
cmd zi &{{
|
|
311
|
+
result="$(zoxide query -i)"
|
|
312
|
+
[ -n "$result" ] && lf -remote "send $id cd \"$result\""
|
|
313
|
+
}}
|
|
314
|
+
|
|
315
|
+
# Tere integration (if available)
|
|
316
|
+
cmd tere &{{
|
|
317
|
+
result="$(tere)"
|
|
318
|
+
[ -n "$result" ] && lf -remote "send $id cd \"$result\""
|
|
319
|
+
}}
|
|
320
|
+
|
|
321
|
+
# Bulk operations
|
|
322
|
+
cmd bulk-rename %{{
|
|
323
|
+
vidir "$@"
|
|
324
|
+
}}
|
|
325
|
+
|
|
326
|
+
cmd bulk-chmod %{{
|
|
327
|
+
printf "New permissions: "
|
|
328
|
+
read -r perms
|
|
329
|
+
chmod -R "$perms" "$@"
|
|
330
|
+
lf -remote "send $id reload"
|
|
331
|
+
}}
|
|
332
|
+
|
|
333
|
+
# Archive operations
|
|
334
|
+
cmd extract &{{
|
|
335
|
+
for file in "$@"; do
|
|
336
|
+
case "$file" in
|
|
337
|
+
*.tar.bz2|*.tbz2) tar xjf "$file" ;;
|
|
338
|
+
*.tar.gz|*.tgz) tar xzf "$file" ;;
|
|
339
|
+
*.tar.xz|*.txz) tar xJf "$file" ;;
|
|
340
|
+
*.tar.zst) tar --zstd -xf "$file" ;;
|
|
341
|
+
*.tar) tar xf "$file" ;;
|
|
342
|
+
*.bz2) bunzip2 "$file" ;;
|
|
343
|
+
*.gz) gunzip "$file" ;;
|
|
344
|
+
*.xz) unxz "$file" ;;
|
|
345
|
+
*.zip) unzip "$file" ;;
|
|
346
|
+
*.7z) 7z x "$file" ;;
|
|
347
|
+
*.rar) unrar x "$file" ;;
|
|
348
|
+
*) echo "Unsupported archive: $file" ;;
|
|
349
|
+
esac
|
|
350
|
+
done
|
|
351
|
+
lf -remote "send $id reload"
|
|
352
|
+
}}
|
|
353
|
+
|
|
354
|
+
cmd compress &{{
|
|
355
|
+
printf "Archive name (without extension): "
|
|
356
|
+
read -r name
|
|
357
|
+
printf "Format (tar.gz/zip/7z): "
|
|
358
|
+
read -r format
|
|
359
|
+
|
|
360
|
+
case "$format" in
|
|
361
|
+
tar.gz) tar czf "$name.tar.gz" "$@" ;;
|
|
362
|
+
zip) zip -r "$name.zip" "$@" ;;
|
|
363
|
+
7z) 7z a "$name.7z" "$@" ;;
|
|
364
|
+
*) echo "Unsupported format" ;;
|
|
365
|
+
esac
|
|
366
|
+
lf -remote "send $id reload"
|
|
367
|
+
}}
|
|
368
|
+
|
|
369
|
+
# ============================ SPECIAL COMMANDS ===================================
|
|
370
|
+
|
|
371
|
+
# Directory change hooks
|
|
372
|
+
cmd on-cd &{{
|
|
373
|
+
# Update terminal title
|
|
374
|
+
lf -remote "send $id tty-write \"\033]0;lf: $PWD\007\""
|
|
375
|
+
}}
|
|
376
|
+
|
|
377
|
+
cmd on-load &git-status
|
|
378
|
+
|
|
379
|
+
# ============================ LEGACY/COMPATIBILITY ==============================
|
|
380
|
+
|
|
381
|
+
# Old mappings (kept for compatibility but prefer new ones above)
|
|
382
|
+
# map Q !~/.config/machineconfig/settings/lf/linux/exe/previewer.sh "$f"
|
|
383
|
+
# map I !cat $f | gum pager
|
|
384
|
+
# map R $~/scripts/croshell -r $f
|
|
385
|
+
# map O $~/scripts/croshell -rj $f
|
|
386
|
+
|
|
387
|
+
# Old jump mappings
|
|
388
|
+
# map jc cd ~/code
|
|
389
|
+
# map jd cd ~/data
|
|
390
|
+
# map jD cd ~/Downloads
|
|
391
|
+
# map jx cd ~/dotfiles
|
|
392
|
+
# map jh cd ~
|
|
393
|
+
# map jj $~/scripts/croshell -j --read $f
|
|
394
|
+
|
|
395
|
+
# Old operation mappings
|
|
396
|
+
# map od cut
|
|
397
|
+
# map op paste
|
|
398
|
+
# map oy copy
|
|
399
|
+
# map oc $echo $f | xclip
|
|
400
|
+
# map or rename
|
|
401
|
+
# map of reload
|
|
402
|
+
# map os mark-save
|
|
403
|
+
# map ol mark-load
|
|
404
|
+
# map oR mark-remove
|
|
405
|
+
# map oD $ouch d $f
|
|
406
|
+
# map oC $ouch c $f "$f.zip"
|
|
407
|
+
# map oL $ln -s $f ~/tmp_results/tmp_links/$(basename "$f")
|
|
408
|
+
|
|
409
|
+
# Old make mappings
|
|
410
|
+
# map md mkdir
|
|
411
|
+
# map mf mkfile
|
|
412
|
+
# map mF sudomkfile
|
|
413
|
+
# map mp chmod
|
|
414
|
+
|
|
415
|
+
# Old junk mappings
|
|
416
|
+
# map <c-f> :fzf_jump
|
|
417
|
+
# map gs :fzf_search
|
|
418
|
+
# map J broot_jump
|
|
419
|
+
# map F fzf_jump
|
|
420
|
+
|
|
421
|
+
# Old command definitions (replaced with modern equivalents above)
|
|
422
|
+
# cmd fzf_jump ${{ ... }}
|
|
423
|
+
# cmd fzf_search ${{ ... }}
|
|
424
|
+
# cmd broot_jump ${{ ... }}
|
|
425
|
+
# cmd mkdir ${{ ... }}
|
|
426
|
+
# cmd mkfile ${{ ... }}
|
|
427
|
+
# cmd sudomkfile ${{ ... }}
|
|
428
|
+
# cmd chmod ${{ ... }}
|
|
8
429
|
set info "size" # list directory information on the right
|
|
9
430
|
set sortby "natural" # don't sort files in any special way
|
|
10
431
|
# set drawbox true # draw a border around all panes
|
|
@@ -14,8 +435,8 @@ set number true # show line numbers
|
|
|
14
435
|
|
|
15
436
|
set preview true # preview file on the right pane
|
|
16
437
|
# set previewer chafa --format sixel --work 9 --optimize 9 --stretch --zoom --size 140x80
|
|
17
|
-
set previewer
|
|
18
|
-
set cleaner
|
|
438
|
+
set previewer ~/.config/machineconfig/settings/lf/linux/exe/previewer.sh
|
|
439
|
+
set cleaner ~/.config/machineconfig/settings/lf/linux/exe/cleaner.sh
|
|
19
440
|
# set previewer pistol
|
|
20
441
|
|
|
21
442
|
# set sixels true
|
|
@@ -48,16 +469,10 @@ set ratios '1:2:3' # ratio of pane widths
|
|
|
48
469
|
|
|
49
470
|
|
|
50
471
|
# test image viewer
|
|
51
|
-
map Q
|
|
472
|
+
map Q !~/.config/machineconfig/settings/lf/linux/exe/previewer.sh "$f"
|
|
52
473
|
|
|
53
474
|
# key bindings
|
|
54
|
-
map vmap v # default is invert
|
|
55
475
|
map V invert
|
|
56
|
-
map p
|
|
57
|
-
map x
|
|
58
|
-
map c
|
|
59
|
-
map v
|
|
60
|
-
# map D
|
|
61
476
|
map D $diskonaut
|
|
62
477
|
map K $kondo $f
|
|
63
478
|
|
|
@@ -80,7 +495,6 @@ map <enter> open
|
|
|
80
495
|
|
|
81
496
|
|
|
82
497
|
# w shells
|
|
83
|
-
map w
|
|
84
498
|
map ww bash
|
|
85
499
|
# map wp $powershell
|
|
86
500
|
map wr $~/scripts/croshell
|
|
@@ -95,7 +509,6 @@ map O $~/scripts/croshell -rj $f
|
|
|
95
509
|
map c clear
|
|
96
510
|
map <delete> delete
|
|
97
511
|
|
|
98
|
-
map o
|
|
99
512
|
map od cut
|
|
100
513
|
map op paste
|
|
101
514
|
map oy copy
|
|
@@ -107,10 +520,9 @@ map ol mark-load
|
|
|
107
520
|
map oR mark-remove
|
|
108
521
|
map oD $ouch d $f
|
|
109
522
|
map oC $ouch c $f "$f.zip"
|
|
110
|
-
map oL $ln -s $f
|
|
523
|
+
map oL $ln -s $f ~/tmp_results/tmp_links/$(basename "$f")
|
|
111
524
|
|
|
112
525
|
# j jump
|
|
113
|
-
map j
|
|
114
526
|
map jc cd ~/code
|
|
115
527
|
map jd cd ~/data
|
|
116
528
|
map jD cd ~/Downloads
|
|
@@ -132,7 +544,6 @@ cmd ter ${{
|
|
|
132
544
|
map T ter #!tere
|
|
133
545
|
|
|
134
546
|
# m make
|
|
135
|
-
map m
|
|
136
547
|
map md mkdir
|
|
137
548
|
map mf mkfile
|
|
138
549
|
map mF sudomkfile
|
|
@@ -160,10 +571,6 @@ cmd fzf_jump ${{
|
|
|
160
571
|
}}
|
|
161
572
|
|
|
162
573
|
|
|
163
|
-
cmd fzf2g $(~/scripts/fzf2g.sh $args[1])
|
|
164
|
-
# map F $nano fzf2g $args[1]
|
|
165
|
-
|
|
166
|
-
|
|
167
574
|
cmd fzf_search ${{
|
|
168
575
|
res="$( \
|
|
169
576
|
RG_PREFIX="rg --column --line-number --no-heading --color=always \
|
machineconfig/setup_linux/uv.sh
CHANGED
|
@@ -276,9 +276,23 @@ class Installer:
|
|
|
276
276
|
an_dl = asset.get("browser_download_url", "NA")
|
|
277
277
|
available_filenames.append(an_dl.split("/")[-1])
|
|
278
278
|
if filename not in available_filenames:
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
279
|
+
candidates = [
|
|
280
|
+
filename,
|
|
281
|
+
filename_pattern.format(version=actual_version),
|
|
282
|
+
filename_pattern.format(version=actual_version.replace("v", "")),
|
|
283
|
+
]
|
|
284
|
+
|
|
285
|
+
# Include hyphen/underscore variants
|
|
286
|
+
variants = []
|
|
287
|
+
for f in candidates:
|
|
288
|
+
variants += [f, f.replace("-", "_"), f.replace("_", "-")]
|
|
289
|
+
|
|
290
|
+
for f in variants:
|
|
291
|
+
if f in available_filenames:
|
|
292
|
+
filename = f
|
|
293
|
+
break
|
|
294
|
+
else:
|
|
295
|
+
print(f"❌ Filename not found in assets. Tried: {variants}\nAvailable: {available_filenames}")
|
|
282
296
|
return None, None
|
|
283
297
|
browser_download_url = f"{repo_url}/releases/download/{actual_version}/{filename}"
|
|
284
298
|
return browser_download_url, actual_version
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: machineconfig
|
|
3
|
-
Version: 5.
|
|
3
|
+
Version: 5.78
|
|
4
4
|
Summary: Dotfiles management package
|
|
5
5
|
Author-email: Alex Al-Saffar <programmer@usa.com>
|
|
6
6
|
License: Apache 2.0
|
|
@@ -56,29 +56,19 @@ Requires-Dist: python-magic>=0.4.27; extra == "plot"
|
|
|
56
56
|
# Welcome to machineconfig
|
|
57
57
|
|
|
58
58
|
Machineconfig is a package for managing configuration files (aka dotfiles). The idea is to collect those critical, time-consuming-files-to-setup in one directory and reference them via symbolic links from their original locations. Thus, when a new machine is to be setup, all that is required is to clone the repo in that machine and create the symbolic links.
|
|
59
|
-
Dotfiles
|
|
60
|
-
* `~/.gitconfig`
|
|
61
|
-
* `~/.ssh`
|
|
62
|
-
* `~/.aws`
|
|
63
|
-
* `~/.bash_profile`
|
|
64
|
-
* `~/.bashrc`
|
|
65
|
-
* `~/.config`
|
|
66
|
-
* `$profile` in Windows Powershell
|
|
67
|
-
* etc
|
|
59
|
+
Dotfiles are divided into private and public. Examples of private ones are, `~/.gitconfig`, `~/.ssh`, etc. Whereas public config files are ones like `lfrc`. The private dotfiles are placed @ `~/dotfiles`. The files therein are encrypted before backedup.
|
|
68
60
|
|
|
69
|
-
|
|
70
|
-
Additionally, files that contain data, sensitive information that should not be pushed to a repository are contained in a directory `~/dotfiles`. The files therein are encrypted before backedup.
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
# Windows:
|
|
61
|
+
# Install On Windows:
|
|
74
62
|
|
|
75
63
|
```powershell
|
|
64
|
+
|
|
76
65
|
iex (iwr bit.ly/cfgwindows).Content
|
|
77
66
|
```
|
|
78
67
|
|
|
79
|
-
# Linux and MacOS
|
|
68
|
+
# Install On Linux and MacOS
|
|
80
69
|
|
|
81
70
|
```bash
|
|
71
|
+
|
|
82
72
|
. <(curl -sL bit.ly/cfglinux)
|
|
83
73
|
```
|
|
84
74
|
|
|
@@ -46,7 +46,7 @@ machineconfig/cluster/templates/cli_trogon.py,sha256=PFWGy8SFYIhT9r3ZV4oIEYfImsQ
|
|
|
46
46
|
machineconfig/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
47
|
machineconfig/jobs/installer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
48
48
|
machineconfig/jobs/installer/check_installations.py,sha256=uFuxhgI8rIMtClcGmuc9gpG6iJ7X0__peGUQfGkreT8,10778
|
|
49
|
-
machineconfig/jobs/installer/installer_data.json,sha256=
|
|
49
|
+
machineconfig/jobs/installer/installer_data.json,sha256=qkQi-ZkGqjPJspa30CpbHzHLEnjEO81bUDK0yFyoIFc,74978
|
|
50
50
|
machineconfig/jobs/installer/package_groups.py,sha256=i4z83F_rk7BVsrwFhz5Vn4SLF0IHxyQBFSxpAaZBl8M,5270
|
|
51
51
|
machineconfig/jobs/installer/custom/gh.py,sha256=gn7TUSrsLx7uqFqj1Z-iYglS0EYBSgtJ9jWHxaJIfXM,4119
|
|
52
52
|
machineconfig/jobs/installer/custom/hx.py,sha256=YQClQXqWtGvon8BLFGf1Fp20JPkHgZeEZ6ebmCJQQfI,5838
|
|
@@ -123,7 +123,7 @@ machineconfig/scripts/python/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
|
123
123
|
machineconfig/scripts/python/agents.py,sha256=DIfM7mqi8BhB7PWk-UiBNOYjUzQHdeA1hoS8v3FHKPQ,10446
|
|
124
124
|
machineconfig/scripts/python/cloud.py,sha256=ubLmf06FSdi1NawpQDgUDAtYb9cZSQqHbSUHzAwRIas,1199
|
|
125
125
|
machineconfig/scripts/python/croshell.py,sha256=zVlHH60HVlqZweYyt2VW_Zt2_a9tR8fK5W-9pZ6egMs,7083
|
|
126
|
-
machineconfig/scripts/python/devops.py,sha256=
|
|
126
|
+
machineconfig/scripts/python/devops.py,sha256=9VgoOQLLOpCgJDu6j4PbydKCsjvmNoPriuVL35WT3HE,2102
|
|
127
127
|
machineconfig/scripts/python/devops_navigator.py,sha256=4O9_-ACeP748NcMjWQXZF7mBQpMPxqCGhLvPG3DMi4Q,236
|
|
128
128
|
machineconfig/scripts/python/entry.py,sha256=Az7dK1eXHGW5l46Yg10Cd88VChCdhvLAzO3e1A3r56A,2176
|
|
129
129
|
machineconfig/scripts/python/fire_jobs.py,sha256=O5DrckUGLxGblOcLf_iXU31pmCSpTg-c0hQZxQKD1os,13591
|
|
@@ -177,13 +177,13 @@ machineconfig/scripts/python/devops_helpers/__init__.py,sha256=47DEQpj8HBSa-_TIm
|
|
|
177
177
|
machineconfig/scripts/python/devops_helpers/cli_config.py,sha256=wnQyhN-LbuIpVKvZhOxv8_UR7cwFTlKpZMqL3Ydi3Zo,5332
|
|
178
178
|
machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py,sha256=rjTys4FNf9_feP9flWM7Zvq17dxWmetSiGaHPxp25nk,2737
|
|
179
179
|
machineconfig/scripts/python/devops_helpers/cli_data.py,sha256=kvJ7g2CccjjXIhCwdu_Vlif8JHC0qUoLjuGcTSqT-IU,514
|
|
180
|
-
machineconfig/scripts/python/devops_helpers/cli_nw.py,sha256=
|
|
180
|
+
machineconfig/scripts/python/devops_helpers/cli_nw.py,sha256=pMypnNF7Ffp__Ic9D0R386juwhbbQ21TAdYyZRwmCy0,3442
|
|
181
181
|
machineconfig/scripts/python/devops_helpers/cli_repos.py,sha256=HJH5ZBob_Uzhc3fDgG9riOeW6YEJt88xTjQYcEUPmUY,12015
|
|
182
|
-
machineconfig/scripts/python/devops_helpers/cli_self.py,sha256=
|
|
182
|
+
machineconfig/scripts/python/devops_helpers/cli_self.py,sha256=9ie3qtEKcUSDwi7rkwBbWCXZoYsk6wpYXEVIC4wlBIg,4531
|
|
183
183
|
machineconfig/scripts/python/devops_helpers/cli_share_server.py,sha256=285OzxttCx7YsrpOkaapMKP1eVGHmG5TkkaSQnY7i3c,3976
|
|
184
184
|
machineconfig/scripts/python/devops_helpers/cli_terminal.py,sha256=k_PzXaiGyE0vXr0Ii1XcJz2A7UvyPJrR31TRWt4RKRI,6019
|
|
185
185
|
machineconfig/scripts/python/devops_helpers/devops_add_identity.py,sha256=wvjNgqsLmqD2SxbNCW_usqfp0LI-TDvcJJKGOWt2oFw,3775
|
|
186
|
-
machineconfig/scripts/python/devops_helpers/devops_add_ssh_key.py,sha256=
|
|
186
|
+
machineconfig/scripts/python/devops_helpers/devops_add_ssh_key.py,sha256=4Vn93ecTy62rIc8uLM90YsR3l0-0AiiqumMlI9Axk9A,9296
|
|
187
187
|
machineconfig/scripts/python/devops_helpers/devops_backup_retrieve.py,sha256=nK47Rc7gQuDCnkk6_sW1y82gBnDJ9TdHU8XwMPFBK9c,5591
|
|
188
188
|
machineconfig/scripts/python/devops_helpers/devops_status.py,sha256=PJVPhfhXq8der6Xd-_fjZfnizfM-RGfJApkRGhGBmNo,20525
|
|
189
189
|
machineconfig/scripts/python/devops_helpers/devops_update_repos.py,sha256=qYS3vT-VECxXI4MXgmRMHAqbVX19aj0U_zobhyM_nGI,10130
|
|
@@ -225,6 +225,8 @@ machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py,sha256=fVKbiAov7qG
|
|
|
225
225
|
machineconfig/scripts/python/helpers_repos/grource.py,sha256=IywQ1NDPcLXM5Tr9xhmq4tHfYspLRs3pF20LP2TlgIQ,14595
|
|
226
226
|
machineconfig/scripts/python/helpers_repos/secure_repo.py,sha256=g0o3SHBwicro1K51IY1Wg0_rkBJQ3esHPcsfNHu4Q8A,1005
|
|
227
227
|
machineconfig/scripts/python/nw/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
228
|
+
machineconfig/scripts/python/nw/add_ssh_key.py,sha256=dYOK9vCB6I9YSeCLO7Hid1IaFjiEs9n_gugDSddtGU8,9298
|
|
229
|
+
machineconfig/scripts/python/nw/devops_add_identity.py,sha256=aPjcHbTLhxYwWYcandyAHdwuO15ZBu3fB82u6bI0tMQ,3773
|
|
228
230
|
machineconfig/scripts/python/nw/mount_drive,sha256=zemKofv7hOmRN_V3qK0q580GkfWw3VdikyVVQyiu8j8,3514
|
|
229
231
|
machineconfig/scripts/python/nw/mount_nfs,sha256=DdJqswbKLu8zqlVR3X6Js30D4myJFPVzHHNkWTJqDUQ,1855
|
|
230
232
|
machineconfig/scripts/python/nw/mount_nfs.py,sha256=lOMDY4RS7tx8gsCazVR5tNNwFbaRyO2PJlnwBCDQgCM,3573
|
|
@@ -269,7 +271,7 @@ machineconfig/settings/keyboard/espanso/match/base.yml,sha256=A0QcNSzbdqSUNh42Wq
|
|
|
269
271
|
machineconfig/settings/keyboard/kanata/kanata.kbd,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
270
272
|
machineconfig/settings/lf/linux/colors,sha256=uSW9O3CkiVomxK8-JN8hQRcM71yADuOSjichbfBFTpg,4148
|
|
271
273
|
machineconfig/settings/lf/linux/icons,sha256=liVoi5nOaxFyujil2z7Pcu8l5dG7_uurJ9IJD36jVhI,7147
|
|
272
|
-
machineconfig/settings/lf/linux/lfrc,sha256=
|
|
274
|
+
machineconfig/settings/lf/linux/lfrc,sha256=tLsoQtPm73qQy9jwjAcRFuZNQHNmR1dTXHVsa5iqby8,16270
|
|
273
275
|
machineconfig/settings/lf/linux/autocall/delete.sh,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
274
276
|
machineconfig/settings/lf/linux/autocall/on-cd.sh,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
275
277
|
machineconfig/settings/lf/linux/autocall/on-quit.sh,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -281,7 +283,7 @@ machineconfig/settings/lf/linux/exe/cleaner.sh,sha256=NKK30rUcrHXnwy8srylyaWL-XJ
|
|
|
281
283
|
machineconfig/settings/lf/linux/exe/fzf_nano.sh,sha256=b6YTQ5zXrdV4tiedJHqWJLVud6LNWDtUXig0U7o9zLc,619
|
|
282
284
|
machineconfig/settings/lf/linux/exe/leftpane_previewer.sh,sha256=KXMq81hIvU9uzOuanluVcxVgJmEOYy-5sUbzcuc9b6U,200
|
|
283
285
|
machineconfig/settings/lf/linux/exe/lfcd.sh,sha256=dh_9JZHGHeNjGd8BE1NYNK4fO3Exwa9bAehywGYhSNs,770
|
|
284
|
-
machineconfig/settings/lf/linux/exe/previewer.sh,sha256=
|
|
286
|
+
machineconfig/settings/lf/linux/exe/previewer.sh,sha256=g2gzBL_fa72FvJHUknzmZT5D8JHyFuwB0sdMWhWZjZE,1210
|
|
285
287
|
machineconfig/settings/lf/linux/exe/previewer_archive.sh,sha256=MGAlXrso-RSrvBbkFnmBHSGoPB54ZHtY_s5Qd1-fNZM,3536
|
|
286
288
|
machineconfig/settings/lf/windows/cd_tere.ps1,sha256=kiW7LiE0Pe2Pjq_4CO2N36wHx_0N-9fXXUDUvHWCOuc,203
|
|
287
289
|
machineconfig/settings/lf/windows/cd_zoxide.ps1,sha256=gQKJPa_YDmp5BiCKeYYHkZB_p7py8EXIhXtZi6vnN8o,159
|
|
@@ -360,7 +362,7 @@ machineconfig/setup_linux/__init__.py,sha256=7VLvb9uj9XJYtlYu9lgavQuxjX3tVCE9i8W
|
|
|
360
362
|
machineconfig/setup_linux/apps.sh,sha256=XOEzhuwYNat83ybamUdnVhDaGf2wlQiT5wVNvz2aJYM,3262
|
|
361
363
|
machineconfig/setup_linux/apps_desktop.sh,sha256=L2b_pcw3GiQdoAaoMO7J4bVvUoG5Pnuy9kDhV8JqprU,3325
|
|
362
364
|
machineconfig/setup_linux/apps_gui.sh,sha256=lFPYq7H2bRogPwW6QoEuSr9GnTjHS-jRM_eYg2rjOmM,2301
|
|
363
|
-
machineconfig/setup_linux/uv.sh,sha256=
|
|
365
|
+
machineconfig/setup_linux/uv.sh,sha256=cyegPmMMB7B3OnVx9KxZiU1JQU3Z_oqboUgwzmW2W40,487
|
|
364
366
|
machineconfig/setup_linux/nix/cli_installation.sh,sha256=gVvszYZJgKPRJx2SEaE31BXDP0Fmeta4--gpr-zJZlY,4010
|
|
365
367
|
machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh,sha256=F5dbg0n9RHsKGPn8fIdZMn3p0RrHEkb8rWBGsdVGbus,1207
|
|
366
368
|
machineconfig/setup_linux/ssh/openssh_all.sh,sha256=3dg6HEUFbHQOzLfSAtzK_D_GB8rGCCp_aBnxNdnidVc,824
|
|
@@ -369,7 +371,7 @@ machineconfig/setup_linux/web_shortcuts/android.sh,sha256=gzep6bBhK7FCBvGcXK0fdJ
|
|
|
369
371
|
machineconfig/setup_linux/web_shortcuts/interactive.sh,sha256=IJKYO2cxpg0UD9lvCHjIAg3u8d9S5zalU3DecSrxhSg,880
|
|
370
372
|
machineconfig/setup_windows/__init__.py,sha256=NnSVZkIBoxoMgkj-_KAqGonH3YziBIWXOKDEcmNAGTY,386
|
|
371
373
|
machineconfig/setup_windows/apps.ps1,sha256=G5GqZ9G0aiQr_A-HaahtRdzpaTTdW6n3DRKMZWDTSPc,11214
|
|
372
|
-
machineconfig/setup_windows/uv.ps1,sha256=
|
|
374
|
+
machineconfig/setup_windows/uv.ps1,sha256=ukk1Abh-q-RfpoEqI2XTE2dcQJmHk0VFF6WqkK3TW8Q,350
|
|
373
375
|
machineconfig/setup_windows/others/docker.ps1,sha256=M8NfsSxH8YlmY92J4rSe1xWOwTW8IFrdgb8cI8Riu2E,311
|
|
374
376
|
machineconfig/setup_windows/others/obs.ps1,sha256=2andchcXpxS3rqZjGaMpY5VShxTAKWvw6eCrayjuaLo,30
|
|
375
377
|
machineconfig/setup_windows/others/power_options.ps1,sha256=c7Hn94jBD5GWF29CxMhmNpuM0hgXTQgVJmIRR_7sdcY,182
|
|
@@ -412,14 +414,14 @@ machineconfig/utils/installer_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQ
|
|
|
412
414
|
machineconfig/utils/installer_utils/github_release_bulk.py,sha256=WJf_qZlF02SmIc6C7o1h4Gy4gAaJAfeAS8O9s2Itj-k,6535
|
|
413
415
|
machineconfig/utils/installer_utils/installer.py,sha256=bWFSIW05hDo6p1BsNqK-yCQL5ZNU_eZxCQW1QLLc-SA,9759
|
|
414
416
|
machineconfig/utils/installer_utils/installer_abc.py,sha256=ZoMtINHD9cHEu4R5SYUWgHLTAqo4F2a33pBrEOGX4zs,11693
|
|
415
|
-
machineconfig/utils/installer_utils/installer_class.py,sha256=
|
|
417
|
+
machineconfig/utils/installer_utils/installer_class.py,sha256=apLMLmpZfHbj4I5ttgwg0ZIp66B5vx2nPtuhEobGdWM,17186
|
|
416
418
|
machineconfig/utils/schemas/fire_agents/fire_agents_input.py,sha256=Xbi59rU35AzR7HZZ8ZQ8aUu_FjSgijNqc8Sme0rCk2Y,2050
|
|
417
419
|
machineconfig/utils/schemas/installer/installer_types.py,sha256=QClRY61QaduBPJoSpdmTIdgS9LS-RvE-QZ-D260tD3o,1214
|
|
418
420
|
machineconfig/utils/schemas/layouts/layout_types.py,sha256=TcqlZdGVoH8htG5fHn1KWXhRdPueAcoyApppZsPAPto,2020
|
|
419
421
|
machineconfig/utils/schemas/repos/repos_types.py,sha256=ECVr-3IVIo8yjmYmVXX2mnDDN1SLSwvQIhx4KDDQHBQ,405
|
|
420
422
|
machineconfig/utils/ssh_utils/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
421
|
-
machineconfig-5.
|
|
422
|
-
machineconfig-5.
|
|
423
|
-
machineconfig-5.
|
|
424
|
-
machineconfig-5.
|
|
425
|
-
machineconfig-5.
|
|
423
|
+
machineconfig-5.78.dist-info/METADATA,sha256=i9g-av8M1QLZxEzuHg-_KcwvgukX_qg_ioP95H3oniY,3013
|
|
424
|
+
machineconfig-5.78.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
425
|
+
machineconfig-5.78.dist-info/entry_points.txt,sha256=M0jwN_brZdXWhmNVeXLvdKxfkv8WhhXFZYcuKBA9qnk,418
|
|
426
|
+
machineconfig-5.78.dist-info/top_level.txt,sha256=porRtB8qms8fOIUJgK-tO83_FeH6Bpe12oUVC670teA,14
|
|
427
|
+
machineconfig-5.78.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|