71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
# ssh_manager/cli.py
|
|
|
|
import os
|
|
import asyncio
|
|
from .utils import print_info, print_error, print_warning, Colors, safe_input
|
|
from .config import SSH_DIR, CONF_DIR, SOCKET_DIR, MAIN_CONFIG, DEFAULT_CONFIG_CONTENT
|
|
from .add_host import add_host
|
|
from .edit_host import edit_host
|
|
from .list_hosts import list_hosts
|
|
from .regen_key import regenerate_key
|
|
from .remove_host import remove_host
|
|
|
|
def ensure_ssh_setup():
|
|
"""
|
|
Creates ~/.ssh, ~/.ssh/conf, and ~/.ssh/s if missing,
|
|
and writes a default ~/.ssh/config if it doesn't exist.
|
|
"""
|
|
if not os.path.isdir(SSH_DIR):
|
|
os.makedirs(SSH_DIR, mode=0o700, exist_ok=True)
|
|
print_info(f"Created directory: {SSH_DIR}")
|
|
|
|
if not os.path.isdir(CONF_DIR):
|
|
os.makedirs(CONF_DIR, mode=0o700, exist_ok=True)
|
|
print_info(f"Created directory: {CONF_DIR}")
|
|
|
|
if not os.path.isdir(SOCKET_DIR):
|
|
os.makedirs(SOCKET_DIR, mode=0o700, exist_ok=True)
|
|
print_info(f"Created directory: {SOCKET_DIR}")
|
|
|
|
if not os.path.isfile(MAIN_CONFIG):
|
|
with open(MAIN_CONFIG, "w") as f:
|
|
f.write(DEFAULT_CONFIG_CONTENT)
|
|
print_info(f"Created default SSH config at: {MAIN_CONFIG}")
|
|
|
|
def main():
|
|
ensure_ssh_setup()
|
|
|
|
# Display the server list on first load
|
|
asyncio.run(list_hosts(CONF_DIR))
|
|
|
|
while True:
|
|
print("\n" + f"{Colors.CYAN}{Colors.BOLD}SSH Config Manager Menu{Colors.RESET}")
|
|
print("1. List Hosts")
|
|
print("2. Add a Host")
|
|
print("3. Edit a Host")
|
|
print("4. Regenerate Key")
|
|
print("5. Remove Host")
|
|
print("6. Exit")
|
|
|
|
choice = safe_input("Select an option (1-6): ")
|
|
if choice is None:
|
|
continue # User pressed Ctrl+C => safe_input returns None => re-show menu
|
|
|
|
choice = choice.strip()
|
|
if choice == '1':
|
|
asyncio.run(list_hosts(CONF_DIR))
|
|
elif choice == '2':
|
|
add_host(CONF_DIR)
|
|
elif choice == '3':
|
|
asyncio.run(edit_host(CONF_DIR))
|
|
elif choice == '4':
|
|
asyncio.run(regenerate_key(CONF_DIR))
|
|
elif choice == '5':
|
|
asyncio.run(remove_host(CONF_DIR))
|
|
elif choice == '6':
|
|
print_info("Exiting...")
|
|
break
|
|
else:
|
|
print_error("Invalid choice. Please select 1 through 6.")
|
|
|
|
return 0
|