From aebc5adaf33ebdb3c9a8a740f79e55c47d0d40a5 Mon Sep 17 00:00:00 2001 From: Kumi Date: Thu, 18 Jul 2024 18:58:17 +0200 Subject: [PATCH] feat: add script to manage Hetzner servers Introduce a new script to manage Hetzner servers which includes capabilities to list, update, and delete servers. The script integrates with the local Wireguard VPN configuration tool, running an update script and subsequently removing old servers. This automates the process, ensuring efficient server management and updated local configurations. --- manage_hetzner_servers.py | 68 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 manage_hetzner_servers.py diff --git a/manage_hetzner_servers.py b/manage_hetzner_servers.py new file mode 100644 index 0000000..060f842 --- /dev/null +++ b/manage_hetzner_servers.py @@ -0,0 +1,68 @@ +import subprocess +import configparser +from hcloud import Client +import argparse +import pathlib + +UPDATE_SCRIPT_PATH = pathlib.Path(__file__).parent / "update_local_config.py" +CONFIG_PATH = pathlib.Path(__file__).parent / "config.ini" + +def get_hetzner_client(): + config = configparser.ConfigParser() + config.read(CONFIG_PATH) + api_token = config["hetzner"]["api_token"] + return Client(token=api_token) + +def list_hetzner_servers(client): + return client.servers.get_all() + +def delete_hetzner_server(client, server): + server.delete() + +def run_update_script(provider, location, server_type, interface, config_path): + command = [ + "python", UPDATE_SCRIPT_PATH, + "--provider", provider, + "--location", location, + "--server_type", server_type, + "--interface", interface + ] + + if config_path: + command.extend(["--config_path", config_path]) + + result = subprocess.run(command, capture_output=True, text=True) + if result.returncode != 0: + raise Exception(f"Error executing update script: {result.stderr}") + print(result.stdout) + +def main(): + parser = argparse.ArgumentParser(description="Manage Hetzner servers and update local Wireguard VPN.") + parser.add_argument("--provider", type=str, required=True, help="Cloud provider (e.g., hetzner)") + parser.add_argument("--location", type=str, required=True, help="Server location") + parser.add_argument("--server_type", type=str, required=True, help="Server type") + parser.add_argument("--interface", type=str, required=True, help="Wireguard interface (e.g., wg0)") + parser.add_argument("--config_path", type=str, help="Path to the Wireguard configuration file") + + args = parser.parse_args() + + provider = args.provider + location = args.location + server_type = args.server_type + interface = args.interface + config_path = args.config_path + + # Step 1: Get Hetzner client and list existing servers + client = get_hetzner_client() + existing_servers = list_hetzner_servers(client) + + # Step 2: Run the update_local_config.py script + run_update_script(provider, location, server_type, interface, config_path) + + # Step 3: Delete old servers that existed before running the update script + for server in existing_servers: + delete_hetzner_server(client, server) + print(f"Deleted server: {server.name}") + +if __name__ == "__main__": + main() \ No newline at end of file