import docker from game_tables import GameTable from key_tables import KeyTable import os import socket import inspect from flask import current_app def build_container_routing_labels(prefix: str, strip_prefix=True): router_key = "traefik.http.routers.{prefix}.rule".format(prefix=prefix) middleware_key = ( "traefik.http.middlewares.{prefix}-stripprefix.stripprefix.prefixes".format( prefix=prefix ) ) middleware_router_key = "traefik.http.routers.{prefix}.middlewares".format( prefix=prefix ) labels = {} labels[router_key] = "Host(`localhost`) && PathPrefix(`/{prefix}`)".format( prefix=prefix ) if strip_prefix: labels[middleware_key] = "/{prefix}".format(prefix=prefix) labels[middleware_router_key] = "{prefix}-stripprefix".format(prefix=prefix) return labels def delete_container(docker_id) -> bool: if not docker_id: return False try: client = docker.from_env() container = client.containers.get(docker_id) container.remove() return True except docker.errors.NotFound, docker.errors.APIError: return False def stop_container(docker_id) -> bool: try: client = docker.from_env() container = client.containers.get(docker_id) container.kill() return True except docker.errors.NotFound, docker.errors.APIError: return False def start_foundry_container(table: GameTable, key: KeyTable): client = docker.from_env() container = None networkName = client.containers.get(socket.gethostname()).attrs["HostConfig"]["NetworkMode"] if table.docker_id != None and table.docker_id != 0: try: container = client.containers.get(table.docker_id) except docker.errors.NotFound, docker.errors.NullResource: container = None if container: container.start() else: image = "felddy/foundryvtt:{version}".format(version=table.version) labels = build_container_routing_labels(table.game_table_link, False) volumes = { "{data_bind}/{prefix}".format( data_bind=os.environ.get("FOUNDRY_DATA_BIND"), prefix=table.game_table_link, ): {"bind": "/data", "mode": "rw"}, "{data_bind}/container_cache".format( data_bind=os.environ.get("FOUNDRY_DATA_BIND") ): {"bind": "/data/container_cache", "mode": "rw"}, } environment = [ "FOUNDRY_ROUTE_PREFIX={prefix}".format(prefix=table.game_table_link), "FOUNDRY_TELEMETRY=FALSE", "FOUNDRY_LICENSE_KEY={key_value}".format(key_value=key.key), ] ports = {"30000": str(30000 + table.game_table_id)} container = client.containers.run( image=image, labels=labels, volumes=volumes, environment=environment, ports=ports, detach=True, network=networkName ) return container.id