66 lines
1.7 KiB
Python
66 lines
1.7 KiB
Python
# ssh_manager/config.py
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from typing import Final
|
|
import subprocess
|
|
|
|
# Use Path for more efficient path handling
|
|
HOME: Final[Path] = Path.home()
|
|
SSH_DIR: Final[Path] = HOME / ".ssh"
|
|
CONF_DIR: Final[Path] = SSH_DIR / "conf"
|
|
SOCKET_DIR: Final[Path] = SSH_DIR / "s"
|
|
MAIN_CONFIG: Final[Path] = SSH_DIR / "config"
|
|
|
|
# Validate paths on import
|
|
for path in (SSH_DIR, CONF_DIR, SOCKET_DIR):
|
|
if not path.exists():
|
|
path.mkdir(mode=0o700, parents=True, exist_ok=True)
|
|
|
|
# Default SSH config content if ~/.ssh/config is missing
|
|
DEFAULT_CONFIG_CONTENT: Final[str] = """###
|
|
#Local ssh
|
|
###
|
|
|
|
Include conf/*/config
|
|
|
|
###
|
|
#Catch all ssh config
|
|
###
|
|
|
|
Host *
|
|
UserKnownHostsFile /dev/null
|
|
StrictHostKeyChecking no
|
|
ServerAliveInterval 60
|
|
ConnectTimeout 60
|
|
AddKeysToAgent yes
|
|
EscapeChar `
|
|
ControlMaster auto
|
|
ControlPersist 72000
|
|
ControlPath ~/.ssh/s/%C
|
|
"""
|
|
|
|
# Export string versions for backward compatibility
|
|
SSH_DIR_STR: Final[str] = str(SSH_DIR)
|
|
CONF_DIR_STR: Final[str] = str(CONF_DIR)
|
|
SOCKET_DIR_STR: Final[str] = str(SOCKET_DIR)
|
|
MAIN_CONFIG_STR: Final[str] = str(MAIN_CONFIG)
|
|
|
|
def validate_key_path(key_path: Path) -> bool:
|
|
if not key_path.exists():
|
|
return False
|
|
if not key_path.is_dir():
|
|
return False
|
|
if not os.access(key_path, os.W_OK):
|
|
return False
|
|
return True
|
|
|
|
def update_config_with_key(key_path: Path) -> bool:
|
|
if not validate_key_path(key_path):
|
|
return False # Early return if path validation fails
|
|
|
|
try:
|
|
subprocess.check_call([...])
|
|
except subprocess.CalledProcessError as e:
|
|
print_error(f"Error generating new SSH key: {e}")
|
|
return False
|