„setup_tunnel.py“ hinzufügen

This commit is contained in:
iwonder 2022-11-30 22:41:54 +01:00
parent 62eadd676f
commit 197529f93e

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