From 92d7093a439f149d7a807c745565d18069f64c08 Mon Sep 17 00:00:00 2001 From: sim Date: Mon, 13 Jan 2025 10:28:13 +0100 Subject: [PATCH] Add init command --- apkrepotool/__init__.py | 85 ++++++++++++++++++++++++++++++++---- apkrepotool/assets/icon.png | Bin 0 -> 11047 bytes setup.py | 2 +- 3 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 apkrepotool/assets/icon.png diff --git a/apkrepotool/__init__.py b/apkrepotool/__init__.py index 87aba50..0dc9714 100755 --- a/apkrepotool/__init__.py +++ b/apkrepotool/__init__.py @@ -19,10 +19,12 @@ import hashlib import json import os +import pkg_resources import shutil import subprocess import sys import time +import uuid import zipfile from dataclasses import field @@ -313,6 +315,51 @@ def parse_recipe_yaml(recipe_file: Path, latest_version_code: int) -> App: translation_url=data.get("Translation"), website_url=data.get("WebSite")) +def default_config() -> Config: + return Config( + repo_url="https://example.tld/repo/", + repo_name="Example", + repo_description="My example repo", + repo_keyalias="apkrepo", + keystore="apkrepo.jks", + keystorepass_cmd="cat passwd", + keypass_cmd="cat passwd" + ) + +def write_config(config: Config, config_file: Path): + with config_file.open("w", encoding="utf-8") as fh: + yaml = YAML(typ="safe") + yaml.default_flow_style = False + cfg_dump = {k: v for k, v in vars(config).items() if v is not None} + yaml.dump(cfg_dump, fh) + +def gen_keystore(keystore_path: Path, passwd_path: Path, key_alias: str): + passwd = uuid.uuid4().hex + with passwd_path.open("w", encoding="utf-8") as fh: + fh.write(passwd) + # When generating a new key, store pass and key pass need to be the same for PKCS12 + run_command( + "keytool", + "-genkey", + "-v", + "-keystore", + keystore_path.name, + "-alias", + key_alias, + "-storepass", + passwd, + "-dname", + "cn=RepoTool, ou=Unknown, o=Unknown, c=Unknown", + "-keyalg", + "RSA", + "-keysize", + "4096", + "-sigalg", + "SHA512withRSA", + "-validity", + "10000" + ) + # FIXME def parse_config_yaml(config_file: Path) -> Config: r""" @@ -1228,10 +1275,30 @@ def run_command(*args: str, env: Optional[Dict[str, str]] = None, keepenv: bool return out, err -# FIXME -# def do_init() -> None: -# """Create a new repo.""" -# raise NotImplementedError("FIXME") +def do_init() -> None: + """Create a new repo.""" + Path("repo/icons").mkdir(parents=True, exist_ok=True) + image_target = Path("repo/icons/icon.png") + if not image_target.exists(): + image_path = pkg_resources.resource_filename( + __name__, 'assets/icon.png' + ) + shutil.copy(image_path, image_target) + config = default_config() + config_path = Path("config.yml") + keystore_path = Path(config.keystore) + passwd_path = Path("passwd") + if config_path.exists(): + print(f"{config_path.name} already exists") + exit(1) + if keystore_path.exists(): + print(f"{keystore_path.name} already exists") + exit(1) + if passwd_path.exists(): + print(f"{passwd_path.name} already exists") + exit(1) + gen_keystore(keystore_path, passwd_path, config.repo_keyalias) + write_config(config, config_path) def do_link() -> None: @@ -1336,11 +1403,11 @@ def main() -> None: def cli() -> None: pass - # @cli.command(help=""" - # create a new repo - # """) - # def init(*args: Any, **kwargs: Any) -> None: - # do_init(*args, **kwargs) + @cli.command(help=""" + create a new repo + """) + def init(*args: Any, **kwargs: Any) -> None: + do_init(*args, **kwargs) @cli.command(help=""" print repo link diff --git a/apkrepotool/assets/icon.png b/apkrepotool/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..40ba262c92be43e587e29b155e9ad4acc41a8c81 GIT binary patch literal 11047 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.0", "repro-apk>=0.2.7", "ruamel.yaml"], + install_requires=["click>=6.0", "repro-apk>=0.2.7", "ruamel.yaml", "setuptools"], )