From d05a462c4d9b7b1d604a4d6273c6ed5f58cb4f8d Mon Sep 17 00:00:00 2001 From: phantom Date: Wed, 26 Nov 2025 23:43:34 -0600 Subject: [PATCH] Initial commit --- .gitignore | 2 ++ Dockerfile | 3 +++ crontab | 0 docker-compose.yml | 0 main.py | 50 +++++++++++++++++++++++++++++++++++++ package.py | 26 +++++++++++++++++++ pkg/bitcoinknots/Dockerfile | 0 pkg/electrs/Dockerfile | 1 + requirements.txt | 6 +++++ 9 files changed, 88 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 crontab create mode 100644 docker-compose.yml create mode 100644 main.py create mode 100644 package.py create mode 100644 pkg/bitcoinknots/Dockerfile create mode 100644 pkg/electrs/Dockerfile create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f67589e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.venv/ +*.ini \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f783247 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,3 @@ +FROM python:3-trixie as base + +WORKDIR /app \ No newline at end of file diff --git a/crontab b/crontab new file mode 100644 index 0000000..e69de29 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e69de29 diff --git a/main.py b/main.py new file mode 100644 index 0000000..73f8f3e --- /dev/null +++ b/main.py @@ -0,0 +1,50 @@ +import configparser + +import requests + +from package import pkg + +# Local Variables + +## Application State +_state = "test" + +if _state == "prod": + datafile = "/etc/autopkg/data.ini" +elif _state == "test": + datafile = "data.ini" + +## Apps to be packaged +apps = { + "bitcoinknots": "https://api.github.com/repos/bitcoinknots/bitcoin/releases/latest", + "electrs": "https://api.github.com/repos/romanz/electrs/releases/latest" +} + +# Setup data file +data = configparser.ConfigParser() + +data.read(datafile) + +## Setup file if not present +if "Versions" not in data: + data["Versions"] = {} + +if __name__ == "__main__": + # Handle apps (get versions) + for app, url in apps.items(): + response = requests.get(url) + + # Parse through JSON data + if response.status_code == 200: + json = response.json() + version = json["id"] + + data["Versions"][app] = str(version) + + # Package new versions if available + if version != data["Versions"][app]: + pkg(app, version) + + # Write changes + with open("data.ini", "w") as datafile: + data.write(datafile) diff --git a/package.py b/package.py new file mode 100644 index 0000000..347b8a6 --- /dev/null +++ b/package.py @@ -0,0 +1,26 @@ +import docker + +from docker import DockerClient + +# Container Management + +## Build Image +def build(client: DockerClient, app: str): + with open(f"{app}/Dockerfile") as dockerfile: + image, _ = client.images.build(fileobj=dockerfile, tag="") + return image + +## Run Image +def run(client: DockerClient, image, app: str): + container = client.containers.run(image, detach=True, name=app) + +# Main Packaging Function +def pkg(app, version): + client = docker.from_env() + + try: + image = build(client, app) + + container = run(client, image, app) + except Exception as e: + print("Error") diff --git a/pkg/bitcoinknots/Dockerfile b/pkg/bitcoinknots/Dockerfile new file mode 100644 index 0000000..e69de29 diff --git a/pkg/electrs/Dockerfile b/pkg/electrs/Dockerfile new file mode 100644 index 0000000..5909d64 --- /dev/null +++ b/pkg/electrs/Dockerfile @@ -0,0 +1 @@ +FROM debian:bookworm as base \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..dd8aaec --- /dev/null +++ b/requirements.txt @@ -0,0 +1,6 @@ +certifi==2025.11.12 +charset-normalizer==3.4.4 +docker==7.1.0 +idna==3.11 +requests==2.32.5 +urllib3==2.5.0