Add packages sideload feature
This commit is contained in:
parent
135ffc5def
commit
0e07a33968
5 changed files with 137 additions and 12 deletions
94
ssh.py
94
ssh.py
|
@ -1,25 +1,101 @@
|
|||
import logging
|
||||
import os
|
||||
import pathlib
|
||||
import subprocess
|
||||
import click
|
||||
from wrapper import check_programs_wrap
|
||||
from config import config
|
||||
from constants import SSH_COMMON_OPTIONS, SSH_DEFAULT_HOST, SSH_DEFAULT_PORT
|
||||
from wrapper import enforce_wrap
|
||||
|
||||
|
||||
@click.command(name='ssh')
|
||||
def cmd_ssh():
|
||||
check_programs_wrap('ssh')
|
||||
enforce_wrap()
|
||||
run_ssh_command()
|
||||
|
||||
|
||||
def run_ssh_command(cmd: list[str] = [], host: str = '172.16.42.1', user: str = 'kupfer', port: int = 22):
|
||||
def run_ssh_command(cmd: list[str] = [], user: str = None, host: str = SSH_DEFAULT_HOST, port: int = SSH_DEFAULT_PORT):
|
||||
if not user:
|
||||
user = config.get_profile()['username']
|
||||
keys = find_ssh_keys()
|
||||
key_args = []
|
||||
if len(keys) > 0:
|
||||
key_args = ['-i', keys[0]]
|
||||
return subprocess.run([
|
||||
'ssh',
|
||||
'-o',
|
||||
'GlobalKnownHostsFile=/dev/null',
|
||||
'-o',
|
||||
'UserKnownHostsFile=/dev/null',
|
||||
'-o',
|
||||
'StrictHostKeyChecking=no',
|
||||
] + key_args + SSH_COMMON_OPTIONS + [
|
||||
'-p',
|
||||
str(port),
|
||||
f'{user}@{host}',
|
||||
'--',
|
||||
] + cmd)
|
||||
|
||||
|
||||
def scp_put_files(src: list[str], dst: str, user: str = None, host: str = SSH_DEFAULT_HOST, port: int = SSH_DEFAULT_PORT):
|
||||
if not user:
|
||||
user = config.get_profile()['username']
|
||||
keys = find_ssh_keys()
|
||||
key_args = []
|
||||
if len(keys) > 0:
|
||||
key_args = ['-i', keys[0]]
|
||||
return subprocess.run([
|
||||
'scp',
|
||||
] + key_args + SSH_COMMON_OPTIONS + [
|
||||
'-P',
|
||||
str(port),
|
||||
] + src + [
|
||||
f'{user}@{host}:{dst}',
|
||||
])
|
||||
|
||||
|
||||
def find_ssh_keys():
|
||||
dir = os.path.join(pathlib.Path.home(), '.ssh')
|
||||
if not os.path.exists(dir):
|
||||
return []
|
||||
keys = []
|
||||
for file in os.listdir(dir):
|
||||
if file.startswith('id_') and not file.endswith('.pub'):
|
||||
keys.append(os.path.join(dir, file))
|
||||
return keys
|
||||
|
||||
|
||||
def copy_ssh_keys(root_dir: str, user: str):
|
||||
authorized_keys_file = os.path.join(
|
||||
root_dir,
|
||||
'home',
|
||||
user,
|
||||
'.ssh',
|
||||
'authorized_keys',
|
||||
)
|
||||
if os.path.exists(authorized_keys_file):
|
||||
os.unlink(authorized_keys_file)
|
||||
|
||||
keys = find_ssh_keys()
|
||||
if len(keys) == 0:
|
||||
logging.info("Could not find any ssh key to copy")
|
||||
create = click.confirm("Do you want me to generate an ssh key for you?", True)
|
||||
if not create:
|
||||
return
|
||||
result = subprocess.run([
|
||||
'ssh-keygen',
|
||||
'-f',
|
||||
os.path.join(pathlib.Path.home(), '.ssh', 'id_ed25519_kupfer'),
|
||||
'-t',
|
||||
'ed25519',
|
||||
'-C',
|
||||
'kupfer',
|
||||
'-N',
|
||||
'',
|
||||
])
|
||||
if result.returncode != 0:
|
||||
logging.fatal("Failed to generate ssh key")
|
||||
keys = find_ssh_keys()
|
||||
|
||||
ssh_dir = os.path.join(root_dir, 'home', user, '.ssh')
|
||||
if not os.path.exists(ssh_dir):
|
||||
os.makedirs(ssh_dir, exist_ok=True)
|
||||
|
||||
with open(authorized_keys_file, 'a') as authorized_keys:
|
||||
for key in keys:
|
||||
with open(f'{key}.pub', 'r') as file:
|
||||
authorized_keys.write(file.read())
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue