import subprocess import configparser from hcloud import Client import argparse import pathlib import sys UPDATE_SCRIPT_PATH = pathlib.Path(__file__).parent / "update_local_config.py" CONFIG_PATH = "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 = [ sys.executable, 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("--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 = "hetzner" 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()