diff --git a/.gitignore b/.gitignore index e8e70dc..aca28bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ +# Environment .vscode/ +*venv/ # Python stuff __pycache__/ -*venv/ +*.egg-info/ + +# Build artifacts dist/ diff --git a/dockge_cli/__init__.py b/dockge_cli/__init__.py index e69de29..16fe7d9 100644 --- a/dockge_cli/__init__.py +++ b/dockge_cli/__init__.py @@ -0,0 +1,4 @@ +import importlib.metadata +__version__ = importlib.metadata.version(__package__ or "dockge_cli") + +from .dockge_cli import cli diff --git a/dockge_cli/cli.py b/dockge_cli/cli.py deleted file mode 100644 index 1b64752..0000000 --- a/dockge_cli/cli.py +++ /dev/null @@ -1 +0,0 @@ -import argparse diff --git a/dockge_cli/__main__.py b/dockge_cli/components/auth.py similarity index 100% rename from dockge_cli/__main__.py rename to dockge_cli/components/auth.py diff --git a/dockge_cli/components/authentication.py b/dockge_cli/components/authentication.py deleted file mode 100644 index e69de29..0000000 diff --git a/dockge_cli/components/communication.py b/dockge_cli/components/communication.py deleted file mode 100644 index e69de29..0000000 diff --git a/dockge_cli/components/exec.py b/dockge_cli/components/exec.py new file mode 100644 index 0000000..d08f61e --- /dev/null +++ b/dockge_cli/components/exec.py @@ -0,0 +1,31 @@ +from getpass import getpass +from urllib.parse import urlparse +from . import storage + + +def exec_command(command, extra_args): + match command: + case "login": + storage.set("username", input("Username: "), encoded=True) + storage.set("password", getpass("Password: "), encoded=True) + return + case "logout": + storage.remove("username") + storage.remove("password") + return + case "host": + if len(extra_args) > 0: + res = urlparse(extra_args[0]) + if all([res.scheme, res.netloc]): + storage.set("host", extra_args[0]) + else: + raise Exception(f"Malformed URL {extra_args[0]}") + return + print(storage.get("host")) + case "exit": + storage.clear() + return + case _: + print("Not implemented") + return + diff --git a/dockge_cli/components/parser.py b/dockge_cli/components/parser.py new file mode 100644 index 0000000..1f66b6c --- /dev/null +++ b/dockge_cli/components/parser.py @@ -0,0 +1,28 @@ +import argparse +import sys + +from .. import __version__ + +commands = [ + "host", + "login", + "logout", + "list", + "restart", + "update", + "exit" +] + +class Arguments(argparse.Namespace): + command: str + +parser = argparse.ArgumentParser( + prog="dockge_cli", + description="CLI interface for interacting with Dockge",) + +parser.add_argument("command", choices=commands, action="store", type=str, default=None) +parser.add_argument("--version", action="version", version=f"dockge_cli {__version__}") + +args = Arguments() + +args, extra_args = parser.parse_known_args(sys.argv[1:], namespace=args) diff --git a/dockge_cli/components/storage.py b/dockge_cli/components/storage.py index bff2e30..b4bf003 100644 --- a/dockge_cli/components/storage.py +++ b/dockge_cli/components/storage.py @@ -1,3 +1,4 @@ +import os import pathlib import base64 import yaml @@ -7,20 +8,37 @@ _file = _storagepath / "storage.yaml" _storagepath.mkdir(exist_ok=True, parents=True) -def set(key: str, value: str): - with open(_file, "w+") as file: +def fileexists(): + if not _file.exists(): + with open(_file, 'a'): + os.utime(_file, None) + +def set(key: str, value: str, encoded=False): + fileexists() + with open(_file, "r+") as file: content: dict[str, str] = yaml.load(file, Loader=yaml.SafeLoader) or {} - content.update({ key: base64.b64encode(value.encode()) }) + content.update({ key: base64.b64encode(value.encode()) if encoded else value }) + with open(_file, "w+") as file: yaml.dump(content, file, Dumper=yaml.SafeDumper) -def get(key: str): +def remove(key: str): + fileexists() + with open(_file, "r") as file: + content: dict[str, str] = yaml.load(file, Loader=yaml.SafeLoader) or {} + content.pop(key, None) + with open(_file, "w+") as file: + yaml.dump(content, file, Dumper=yaml.SafeDumper) + +def get(key: str, encoded=False): value: str = None if not _file.exists(): return None with open(_file, "r") as file: content: dict[str, str] = yaml.load(file, Loader=yaml.SafeLoader) value = content.get(key, None) - return base64.b64decode(value).decode() if value is not None else None + if value is None: + return None + return base64.b64decode(value).decode() if encoded else value def clear(): _file.unlink() diff --git a/dockge_cli/dockge_cli.py b/dockge_cli/dockge_cli.py new file mode 100644 index 0000000..eea8d6c --- /dev/null +++ b/dockge_cli/dockge_cli.py @@ -0,0 +1,5 @@ +from .components.parser import args, extra_args +from .components.exec import exec_command + +def cli(): + exec_command(args.command, extra_args) \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 585b74b..d7276ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,9 @@ classifiers = [ "Programming Language :: Python :: 3.12", ] +[project.scripts] +dockge-cli = "dockge_cli:cli" + [tool.setuptools.packages.find] where = ["."] include = ["dockge_cli*"]