shcloud/shcloud.py

118 lines
4.1 KiB
Python
Raw Normal View History

#!/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"
2022-08-22 06:21:37 +02:00
server_game = "sfserver"
#server_type = "cx11"
server_type_id = None
server_key = 6513932
server_image = 45557056
server_ipv4 = 11737045
server_ipv6 = 11737053
2022-08-22 06:21:37 +02:00
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):
2022-08-22 06:21:37 +02:00
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 <server_model>")
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)],
2022-08-22 06:21:37 +02:00
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")