#!/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_game = "sfserver" #server_type = "cx11" server_type_id = None server_key = 6513932 server_image = 45557056 server_ipv4 = 11737045 server_ipv6 = 11737053 volume_id = 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("stop game") system("ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null shcloud.eu 'su -c \"cd /gameserver/%s && /gameserver/%s/%s stop\" gameserver'"%(server_game, server_game, server_game)) print("shut down server") response = s.shutdown() response.wait_until_finished() 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)], labels={"game" : server_game}, user_data="#!/bin/bash\ncurl -sL ar21.de/shinit.php?GAME=%s\\&VOLUME=%s | bash"%(server_game, 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")