bbc-ovh/setup_tunnel.py

86 lines
2.4 KiB
Python
Raw Normal View History

2022-12-01 13:00:16 +01:00
#!/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
2022-12-01 13:00:16 +01:00
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
2022-12-01 13:00:16 +01:00
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
2022-12-01 13:00:16 +01:00
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}')
2022-12-01 13:00:16 +01:00
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']))
2022-12-01 13:00:16 +01:00
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')
2022-12-01 13:00:16 +01:00
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]
2022-12-01 13:00:16 +01:00
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:
2022-12-01 13:00:16 +01:00
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