diff --git a/setup_tunnel.py b/setup_tunnel.py index ff6349e..b5e695d 100644 --- a/setup_tunnel.py +++ b/setup_tunnel.py @@ -1,20 +1,23 @@ +#!/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 -from novaclient.v2.client import 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 keystoneauth1 import session -from keystoneauth1.identity import v3 -from os import environ as env -from os.path import exists, expanduser -from os import system -from time import sleep -import platform from pick import pick -from typing import List -from ipaddress import ip_address -import socket -def try_connect(ip): +SERVER_NAME='gbv' + +def try_connect(ip: str) -> bool: sock = None try: sock = socket.create_connection((ip, 22), 1) @@ -23,38 +26,39 @@ def try_connect(ip): sock.close() return True -def open_conn(ip, port=23406): + +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}') -auth = 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']) -sess = session.Session(auth) +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: Client = novaclient.client.Client("2.1", session=sess, region_name=env['OS_REGION_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") -# List keypairs 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()) -# Select flavor flavor = nova.flavors.find(name='s1-2') - -# Select image - image = nova.glance.find_image('Debian 10') net = nova.neutron.find_network('Ext-Net') -nova.servers.create('gbv', image, flavor, nics=[{'net-id':net.id}], key_name=keyname) -sv: Server = nova.servers.find(name='gbv') + + +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: @@ -62,7 +66,7 @@ for x in sv.interface_list(): ip = list(filter(lambda x: ip_address(x).version == 4, ips))[0] -while not try_connect(ip): +while sv.status != 'ACTIVE' and not try_connect(ip): print('Waiting for server to come online...') pass @@ -70,7 +74,8 @@ 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?') + 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':