SE_BMMF/code/botserver.py
2022-02-22 13:46:01 +01:00

121 lines
3.3 KiB
Python

import docker
import os
import getpass
import logging
_image = "dokoliho/botserver"
_uid = os.getuid()
_username = getpass.getuser()
_containername = "botserver_" + _username
_port = 62187 + _uid
_logger = logging.getLogger(__name__)
_from_env=False
_verbose=False
def _client():
if _from_env:
client = docker.from_env()
else:
client = docker.DockerClient(base_url='tcp://172.17.0.1:2375')
return client
def _get_running_container():
client = _client()
try:
return client.containers.get(_containername)
except:
msg = f"Container {_containername} not found."
if _verbose: print(msg)
_logger.info(msg)
return None
def connect_remote_daemon(flag):
global _from_env
_from_env = not flag
def stop_container():
container = _get_running_container()
if container is not None:
container.stop()
container.remove()
msg = f"Container {_containername} stopped."
if _verbose: print(msg)
_logger.info(msg)
def start_container(verbose=False):
global _verbose
_verbose = verbose
stop_container()
client = _client()
try:
client.containers.run(_image,
command=["sleep", "inf"],
detach=True,
name=_containername,
ports={63187: _port})
msg = f"Container {_containername} started with port {_port}"
if _verbose: print(msg)
_logger.info(msg)
return _port
except Exception as e:
if _verbose: print(str(e))
_logger.warning(str(e))
return None
def exec_in_container(command):
container = _get_running_container()
if container == None:
msg = f"Container {_containername} not running."
_logger.warning(msg)
raise Exception(msg)
try:
msg = f"Executing {command}"
if _verbose: print(msg)
_logger.info(msg)
result = container.exec_run(command, stream=True)
except Exception as e:
print(str(e))
_logger.warning(str(e))
return
for line in result.output:
print(line.decode("utf-8"))
msg = f"Execution of {command} finished."
if _verbose: print(msg)
_logger.info(msg)
def exec_synced_in_container(command):
container = _get_running_container()
if container == None:
msg = f"Container {_containername} not running."
_logger.warning(msg)
raise Exception(msg)
try:
msg = f"Executing (sync) {command}"
if _verbose: print(msg)
_logger.info(msg)
exit_code, output = container.exec_run(command)
except Exception as e:
print(str(e))
return
print(output.decode("utf-8") )
msg = f"Execution of {command} finished."
if _verbose: print(msg)
_logger.info(msg)
def print_logs():
container = _get_running_container()
if container == None:
msg = f"Container {_containername} not running."
_logger.warning(msg)
raise Exception(msg)
print(container.logs().decode("utf-8"))
if __name__ == "__main__":
connect_remote_daemon(False)
start_container(verbose=True)
# exec_in_container("echo 'hello world'")
exec_in_container("/bots/server/bots training")
stop_container()