"""Console script for timelink.
Also provides basic mhk manager functionality.
Run with python -m timelink.cli
"""
import platform
import uvicorn
import typer
import docker
from timelink.mhk.utilities import get_mhk_info, is_mhk_installed
server: uvicorn.Server = None # uvicorn server instance
# We use Typer https://typer.tiangolo.com
app = typer.Typer(help="Timelink and MHK manager")
mhk_app = typer.Typer()
app.add_typer(mhk_app, name="mhk", help="MHK legacy manager")
# Start server
# see alternative methods
# https://github.com/miguelgrinberg/python-socketio/issues/332#issuecomment-712928157
# https://stackoverflow.com/questions/68603658/how-to-terminate-a-uvicorn-fastapi-application-cleanly-with-workers-2-when
[docs]
@app.command("start")
def start():
"""Starts timelink with uvicorn"""
typer.echo("Starting Timelink")
config = uvicorn.Config("timelink.app.main:app", port=8008, reload=True)
global server
server = uvicorn.Server(config)
server.run()
return 0
[docs]
@mhk_app.command(name="version")
def mhk_version():
"""shows MHK manager version
Demonstrates how to access MHK installation files and
usage of Docker API
"""
if is_mhk_installed():
mhk_info = get_mhk_info()
try:
client = docker.from_env(version="auto")
dv = client.version()
mhkv = f""" Manager version: {mhk_info.mhk_version}
Docker version: {dv["Version"]}
Host OS: {platform.system()} {platform.release()}
User home: {mhk_info.user_home}
mhk-home: {mhk_info.mhk_home}
mhk-home init: {mhk_info.mhk_home_init}
mhk-home update: {mhk_info.mhk_home_update}
mhk use-tag: {mhk_info.mhk_app_env.get("TAG", "*none*")}
mhk local host: {mhk_info.mhk_host}
MHK URL: http://127.0.0.1:8080/mhk
Kleio URL: http://127.0.0.1:8088
Portainer URL: http://127.0.0.1:9000"""
typer.echo(mhkv)
except Exception as e:
typer.echo(f"Could not access docker: {e}")
else:
type.echo("Could not find a MHK instalation")
return 0
[docs]
@mhk_app.command(name="status")
def mhk_status():
"""shows docker status information"""
client = docker.from_env()
dinfo = client.info()
typer.echo(
f"""
Containers :{dinfo['Containers']}
Running :{dinfo['ContainersRunning']}
Paused :{dinfo['ContainersPaused']}
Stopped :{dinfo['ContainersStopped']}
"""
)
return 0
[docs]
@app.callback()
def main():
"""
This is the timelink/MHK manager on the command line
"""
typer.echo("This is the timelink/MHK manager")
if __name__ == "__main__":
app() # pragma: no cover