iwonder-patch-1 #2

Merged
iwonder merged 2 commits from iwonder-patch-1 into master 2022-11-30 22:45:45 +01:00
2 changed files with 83 additions and 0 deletions

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
keystoneauth1
python-novaclient
pick

80
setup_tunnel.py Normal file
View File

@ -0,0 +1,80 @@
import novaclient.client
from novaclient.v2.client import Client
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):
sock = None
try:
sock = socket.create_connection((ip, 22), 1)
except socket.timeout:
return False
sock.close()
return True
def open_conn(ip, port=23406):
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)
nova: 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')
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 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