from django.contrib import admin from .models import Game, Server from .utils import launch_docker_container, stop_docker_container, remove_docker_container import podman @admin.register(Game) class GameAdmin(admin.ModelAdmin): list_display = ('name', 'genre') search_fields = ('name', 'genre') ordering = ('name',) @admin.action(description='Launch Docker Container') def launch_container(modeladmin, request, queryset): client = podman.PodmanClient(base_url="unix:///run/user/1000/podman/podman.sock") for server in queryset: container_name = f"{server.game.name}_{server.ip_address}_{server.port}" try: # Ensure the command is passed as a list of strings command = server.get_docker_run_command().split() if server.docker_run_command else [] container = client.containers.run( server.docker_image, detach=True, name=container_name, command=command, ports={f"{server.port}/tcp": server.port}, remove=True, # Automatically remove on stop ) server.sync_status() modeladmin.message_user(request, f"Container launched: {container.id}") except Exception as e: modeladmin.message_user(request, f"Failed to launch {server}: {e}", level="error") @admin.action(description='Stop Docker Container') def stop_container(modeladmin, request, queryset): for server in queryset: container_name = f"{server.game.name}_{server.ip_address}_{server.port}" result = stop_docker_container(container_name) server.sync_status() modeladmin.message_user(request, f"Stop container result for {server}: {result}") @admin.action(description='Remove Docker Container') def remove_container(modeladmin, request, queryset): for server in queryset: container_name = f"{server.game.name}_{server.ip_address}_{server.port}" result = remove_docker_container(container_name) server.sync_status() modeladmin.message_user(request, f"Remove container result for {server}: {result}") @admin.register(Server) class ServerAdmin(admin.ModelAdmin): list_display = ('game', 'name', 'ip_address', 'port', 'status', 'docker_image', 'docker_run_command', 'command_args') search_fields = ('game__name', 'ip_address', 'port') def save_model(self, request, obj, form, change): super().save_model(request, obj, form, change) def get_queryset(self, request): """Sync status of all servers before rendering the admin list view.""" queryset = super().get_queryset(request) for server in queryset: server.sync_status() return queryset list_filter = ('status', 'game') search_fields = ('ip_address', 'game__name', 'docker_image') ordering = ('game', 'ip_address') actions = [launch_container, stop_container, remove_container]