From b4c9f173bd95833472b68a3df547057ce06f0877 Mon Sep 17 00:00:00 2001 From: ange Date: Mon, 5 Feb 2024 16:03:13 +0100 Subject: [PATCH] feat(fdroid): automatic apk download --- fdroid/.env | 1 + fdroid/Dockerfile | 4 +++- fdroid/apks.txt | 6 ++++++ fdroid/compose.yaml | 2 ++ fdroid/entrypoint.sh | 10 ++++----- fdroid/scripts/get_apks.sh | 31 +++++++++++++++++++++++++++ fdroid/scripts/get_github_dl_links.sh | 19 ++++++++++++++++ fdroid/scripts/get_gitlab_dl_links.sh | 20 +++++++++++++++++ 8 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 fdroid/apks.txt create mode 100755 fdroid/scripts/get_apks.sh create mode 100755 fdroid/scripts/get_github_dl_links.sh create mode 100755 fdroid/scripts/get_gitlab_dl_links.sh diff --git a/fdroid/.env b/fdroid/.env index b00ab64..e4c4478 100644 --- a/fdroid/.env +++ b/fdroid/.env @@ -2,6 +2,7 @@ BASE_URL=fdroid. EMAIL= REPO_NAME=fdroid +CRON_APP_UPDATE='0 0 * * 1' PUID=1000 PGID=1000 diff --git a/fdroid/Dockerfile b/fdroid/Dockerfile index 4320ec2..c332ab4 100644 --- a/fdroid/Dockerfile +++ b/fdroid/Dockerfile @@ -1,7 +1,9 @@ FROM docker.io/nginx:latest RUN apt-get update \ && apt-get install -y --no-install-recommends \ + cron \ fdroidserver \ && rm -rf /var/lib/apt/lists/* -COPY entrypoint.sh /docker-entrypoint.d/99-init-fdroid.sh +COPY entrypoint.sh /docker-entrypoint.d/99-entrypoint.sh +COPY scripts/ /usr/local/bin/ COPY default.conf /etc/nginx/conf.d/ diff --git a/fdroid/apks.txt b/fdroid/apks.txt new file mode 100644 index 0000000..6f57f80 --- /dev/null +++ b/fdroid/apks.txt @@ -0,0 +1,6 @@ +# 1 URL by line +# Supported URLS patterns: +# - .*github.com/OWNER/REPO.* +# - .*gitlab.com/OWNER/REPO.* +# Exemple: +# https://gitlab.com/fdroid/fdroidclient diff --git a/fdroid/compose.yaml b/fdroid/compose.yaml index 96ec2bd..26dbf2b 100644 --- a/fdroid/compose.yaml +++ b/fdroid/compose.yaml @@ -18,10 +18,12 @@ services: environment: - BASE_URL - REPO_NAME + - CRON_APP_UPDATE - PUID - PGID volumes: - ./repo/:/repo/ + - ./apks.txt:/:ro networks: - nginx diff --git a/fdroid/entrypoint.sh b/fdroid/entrypoint.sh index 411d1ad..e373122 100755 --- a/fdroid/entrypoint.sh +++ b/fdroid/entrypoint.sh @@ -7,10 +7,10 @@ -e "/repo_url/s .* repo_url:\ https://$BASE_URL/repo " \ -e "/repo_name/s .* repo_name:\ \"$REPO_NAME\" " \ config.yml - - fdroid update -c ) -if [ -n "$PUID" ]; then - chown -R "$PUID:$PGID" /repo/ -fi +get_apks.sh + +echo "$CRON_APP_UPDATE root get_apks.sh" > /etc/cron.d/get_new_apks + +/etc/init.d/cron start diff --git a/fdroid/scripts/get_apks.sh b/fdroid/scripts/get_apks.sh new file mode 100755 index 0000000..1a35e94 --- /dev/null +++ b/fdroid/scripts/get_apks.sh @@ -0,0 +1,31 @@ +#!/bin/bash -e + +SCRIPT_PATH="$(dirname "$0")" + +function get_links() { + FILE="$1" + + awk 'NF && $1!~/^#/' "$FILE" | while read -r URL; do + case "$URL" in + *github.com*) + "$SCRIPT_PATH/get_github_dl_links.sh" "$URL" + ;; + *gitlab.com*) + "$SCRIPT_PATH/get_gitlab_dl_links.sh" "$URL" + ;; + *) + ;; + esac + done +} + +LINKS="$(get_links apks.txt)" + +(cd /repo/ + xargs -n1 -P8 curl -LO <<< "$LINKS" + fdroid update -c +) + +if [ -n "$PUID" ]; then + chown -R "$PUID:$PGID" /repo/ +fi diff --git a/fdroid/scripts/get_github_dl_links.sh b/fdroid/scripts/get_github_dl_links.sh new file mode 100755 index 0000000..99874e6 --- /dev/null +++ b/fdroid/scripts/get_github_dl_links.sh @@ -0,0 +1,19 @@ +#!/bin/bash -e + +API='https://api.github.com' +CONTENT_TYPE='"application/vnd.android.package-archive"' + +function get_urls() { + local repo="$1" + + curl -sSL "$API/repos/$repo/releases/latest" | \ + jq -r ".assets.[] | select(.content_type == $CONTENT_TYPE) | .browser_download_url" +} + +function get_repo_name_from_url() { + grep -Po '(?<=github.com/)[[:alnum:]]+/[[:alnum:]]+' <<< "$1" +} + +for repo in "$@"; do + get_urls "$(get_repo_name_from_url "$repo")" +done diff --git a/fdroid/scripts/get_gitlab_dl_links.sh b/fdroid/scripts/get_gitlab_dl_links.sh new file mode 100755 index 0000000..62513c9 --- /dev/null +++ b/fdroid/scripts/get_gitlab_dl_links.sh @@ -0,0 +1,20 @@ +#!/bin/bash -e + +API='https://gitlab.com/api/v4' + +function get_urls() { + local repo="$1" + + curl -L "$API/projects/$repo/releases" | \ + jq -r '.[0].assets.links.[] | select(.name | test(".apk$")) | .url' +} + +function get_repo_name_from_url() { + printf '%s' \ + "$(grep -Po '(?<=gitlab.com/)[[:alnum:]]+/[[:alnum:]]+' <<< "$1")" | \ + jq -sRr '@uri' +} + +for repo in "$@"; do + get_urls "$(get_repo_name_from_url "$repo")" +done