From 1008e00ca5757deb7464d04d9a7c81957beb0398 Mon Sep 17 00:00:00 2001 From: Aaron Riedel Date: Sun, 21 Aug 2022 13:45:45 +0200 Subject: [PATCH] start working on python replacement of the bash tool --- .gitignore | 1 + requirements.txt | 2 + shcloud.py | 110 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 requirements.txt create mode 100755 shcloud.py diff --git a/.gitignore b/.gitignore index 5966c57..c0c24a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ **/.env +**/.token diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f21842d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +tabulate==0.8.10 +hcloud==1.18.0 \ No newline at end of file diff --git a/shcloud.py b/shcloud.py new file mode 100755 index 0000000..a0e7613 --- /dev/null +++ b/shcloud.py @@ -0,0 +1,110 @@ +#!/bin/python3 +import sys +from os import environ, system, path +from tabulate import tabulate +from hcloud import Client +from hcloud.images.domain import Image +from hcloud.server_types.domain import ServerType +from hcloud.ssh_keys.domain import SSHKey +from hcloud.datacenters.domain import Datacenter +from hcloud.primary_ips.domain import PrimaryIP +from hcloud.volumes.domain import Volume +from hcloud.servers.domain import ServerCreatePublicNetwork +from hcloud.locations.domain import Location + +server_name = "lgsm-1" +#server_type = "cx11" +server_type_id = None +server_key = 6513932 +server_image = 45557056 +server_ipv4 = 11737045 +server_ipv6 = 11737053 +volume_id = 22257210 #11742041 + +# please put the token in a file named .token in the same dir as the python script +token_file = open("%s/.token"%path.dirname(__file__), "r") +token = token_file.read().replace("\n","") +token_file.close() +client = Client(token=token) + +# get volume +volume = Volume(volume_id) + +# get server types +models = client.server_types.get_all() + +# functions +def delete_server(s): + print ("detach volume") + response = client.volumes.detach(volume) + response.wait_until_finished() + print("deleting server...") + response = s.delete() + response.wait_until_finished() + +def check_servertype(server_type): + # return id or None + for m in models: + if m.name == server_type and m.deprecated == False: + return(m.id) + return(None) + +def select_servertype(): + # return id or None + models_list = [] + for m in models: + models_list.append([str(m.id), str(m.name), str(m.description), str(m.cores), str(m.memory), str(m.disk), str(m.storage_type), str(m.cpu_type), str(m.deprecated)]) + print(tabulate(models_list, headers=["ID","Name","Description", "Cores", "Memory", "Disk", "Storage Type", "CPU Type", "Deprecated"], tablefmt="rounded_grid")) + return(input("Selection: ")) + +if len(sys.argv) < 2: + print("shcloud python script") + print("") + print("usage:") + print("shcloud.py create ") + print("shcloud.py delete") + exit(0) + +if sys.argv[1] == "delete": + delete_server(client.servers.get_by_name(server_name)) + exit(0) + +if sys.argv[1] == "create": + # check if server model was selected + if len(sys.argv) > 2: + # get server models + server_type_id = check_servertype(sys.argv[2]) + # if not found force the user to select one + while server_type_id == None: + print("Server type not found. Please select one:") + server_type_id = check_servertype(select_servertype()) + else: + while server_type_id == None: + print("Server type not found. Please select one:") + server_type_id = check_servertype(select_servertype()) + # check if server already exists + servers = client.servers.get_all() + for s in servers: + if s.name == server_name: + print("server already there") + answer = input("delete? y/N: ") + if answer.lower() == "y": + delete_server(s) + exit(0) # for now, until I have a way to wait + else: + print("Server should not be deleted. Aboring...") + exit(0) + + # create new server + print("create new server") + response = client.servers.create( + name=server_name, + server_type=ServerType(id=server_type_id), + image=Image(id=server_image), + ssh_keys=[SSHKey(id=server_key)], + location=Location(name="fsn1"), + volumes=[Volume(id=volume_id)], + public_net=ServerCreatePublicNetwork(ipv4=PrimaryIP(id=server_ipv4),ipv6=PrimaryIP(id=server_ipv6),enable_ipv4 = True, enable_ipv6 = True) + ) + response.action.wait_until_finished() + print("done") \ No newline at end of file