bbc-ovh/setup_tunnel.py
2022-12-01 13:00:16 +01:00

86 lines
2.4 KiB
Python

#!/usr/bin/env python3
import platform
import socket
from ipaddress import ip_address
from os import environ as env
from os import system
from os.path import exists, expanduser
from typing import List
import novaclient.client
import novaclient.v2.client
from keystoneauth1.identity import v3
from keystoneauth1.session import Session
from novaclient.v2.keypairs import Keypair
from novaclient.v2.servers import Server
from pick import pick
SERVER_NAME='gbv'
def try_connect(ip: str) -> bool:
sock = None
try:
sock = socket.create_connection((ip, 22), 1)
except socket.timeout:
return False
sock.close()
return True
def open_conn(ip: str, port: int = 23406):
print('Opening tunnel...')
system(f'ssh -D {port} -i ~/.ssh/id_ovh -o StrictHostKeyChecking=no -o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=/dev/null -N debian@{ip}')
sess = Session(v3.Password(
auth_url=env['OS_AUTH_URL'],
username=env['OS_USERNAME'],
password=env['OS_PASSWORD'],
project_id=env['OS_TENANT_ID'],
user_domain_name=env['OS_USER_DOMAIN_NAME']))
nova: novaclient.v2.client.Client = novaclient.client.Client(
"2.1", session=sess, region_name=env['OS_REGION_NAME'])
if not exists(expanduser('~/.ssh/id_ovh')):
system("ssh-keygen -f ~/.ssh/id_ovh")
keypairs: List[Keypair] = nova.keypairs.list()
keyname = 'ovh_' + platform.uname()[1].split('.', 1)[0]
if keyname not in (k.name for k in keypairs):
with open(expanduser('~/.ssh/id_ovh')) as f:
nova.keypairs.create(keyname, f.read())
flavor = nova.flavors.find(name='s1-2')
image = nova.glance.find_image('Debian 10')
net = nova.neutron.find_network('Ext-Net')
nova.servers.create(SERVER_NAME, image, flavor,
nics=[{'net-id': net.id}], key_name=keyname)
sv: Server = nova.servers.find(name=SERVER_NAME)
ips = []
for x in sv.interface_list():
for i in x.fixed_ips:
ips.append(i['ip_address'])
ip = list(filter(lambda x: ip_address(x).version == 4, ips))[0]
while sv.status != 'ACTIVE' and not try_connect(ip):
print('Waiting for server to come online...')
pass
open_conn(ip)
exit = False
while not exit:
choice = pick(['Reconnect', 'Destroy server and exit', 'Keep server online and exit'],
'The connection has ended. How do you want to proceed?')
if choice == 'Reconnect':
open_conn(ip)
elif choice == 'Destroy server and exit':
sv.delete()
exit = True
else:
exit = True