Skip to content
Snippets Groups Projects
Commit 02f9083b authored by Erik Reid's avatar Erik Reid
Browse files

saving this utility, since it's useful

parent 1f9d9e92
No related branches found
No related tags found
No related merge requests found
from getpass import getpass
import os
import logging
import threading
import click
from paramiko import SSHClient
from scp import SCPClient
DEFAULT_HOSTNAMES = [
'test-inventory-provider01.geant.org',
'test-inventory-provider02.geant.org'
]
def _install_proc(hostname, username, password, sdist):
logging.info(f'installing on {hostname}')
scp_destination = f'/tmp/{os.path.basename(sdist)}'
ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect(hostname=hostname, username=username, password=password)
scp = SCPClient(ssh.get_transport())
scp.put(sdist, scp_destination)
channel = ssh.invoke_shell()
stdin = channel.makefile('wb')
stdout = channel.makefile('rb')
pip = '/home/inventory/venv/bin/pip'
commands = [
f'sudo su - -c \'{pip} uninstall -y inventory\'',
f'sudo su - -c \'{pip} install {scp_destination}\'',
f'rm {scp_destination}',
'exit'
]
stdin.write('\n'.join(commands) + '\n')
print('\n'.join(commands))
print(stdout.read())
stdout.close()
stdin.close()
processes = [
'inventory-provider.service',
'inventory-worker.service',
'inventory-monitor.service'
]
restart_cmd = 'sudo su - -c \'systemctl restart ' \
+ ' '.join(processes) + '\''
stdin, stdout, _ = ssh.exec_command(restart_cmd)
output = stdout.read()
status = stdout.channel.recv_exit_status()
logging.debug(f'status: {status}, output: {output}')
ssh.close()
logging.info(f'finished installing on {hostname}')
@click.command()
@click.option(
"--hostname",
multiple=True,
default=DEFAULT_HOSTNAMES,
type=click.STRING,
help="hostname [%r]"
% str(DEFAULT_HOSTNAMES))
@click.option(
"--user",
default=None,
type=click.STRING,
help="ssh username")
@click.option(
"--sdist",
required=True,
type=click.Path(exists=True, dir_okay=False),
help="sdist filename")
def cli(hostname, user, sdist):
password = getpass(prompt='Password: ', stream=None)
def _make_thread(h):
t = threading.Thread(
target=_install_proc,
args=[h, user, password, sdist])
t.start()
return t
threads = [_make_thread(h) for h in hostname]
for t in threads:
t.join()
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO)
cli()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment