Knowledge Base

Preserving for the future: Shell scripts, AoC, and more

fdroid-sync.sh (Source)

#/bin/sh
# vim: set ts=3 sw=3 sts=3:
# File: /etc/installed/fdroid/fdroid-sync.sh
# Location: server3
# Author: bgstack15
# SPDX-License-Identifier: GPL-3.0-only
# Startdate: 2024-05-29-4 07:36
# Title: F-Droid Sync wrapper
# Purpose: Single command to mirror down only the F-droid packages I use
# History:
# Usage:
# Reference:
# Improve:
#    take a list of hardcoded filenames and prepend them with "P" in the rsync file, to avoid deletion.
# Documentation:
# Dependencies:
#    user fdroid, ~/venv1, custom pip packages installed
#    cd ~/git ; git clone https://gitlab.com/fdroid/fdroiddata
#    plecho from bgscripts
CONF_FILE="${CONF_FILE:-/etc/sysconfig/fdroid-sync}"
test -f "${CONF_FILE}" && . "${CONF_FILE}"
WORK_DIR="${WORK_DIR:-/etc/installed/fdroid}"
GET_FILE="${GET_FILE:-${WORK_DIR}/get}"
MIRROR_DIR="${MIRROR_DIR:-/mnt/mirror/fdroid/repo}"
GIT_DIR="${GIT_DIR:-/home/fdroid/git/fdroiddata}"
INSTALLED_FILES_DIR="${INSTALLED_FILES_DIR:-/mnt/public/Support/Systems/server3/fdroid}"
prepare_input_file() {
   echo "# BEGIN preparing list of packages I want."
   # installed.txt was the exact output shared from my fdroid instance(s)
   # I do not understand how this appears to limit to just our desired apps, within the icons/ path while also grabbing still the app files. But I think it does, so we will leave it at that.
   {
      #awk -F',' '$1!~/packageName/{print $1}' < "${WORK_DIR}/installed.txt" | awk '{print "+ **/"$0"**";}'
         #awk -F',' '$1!~/packageName/{print "+ **/"$1"*"; print "+ **/"$1"/en*/***"; print "+ icons*/"$1"***";}' | sort
      printf '%s\n' '- org.fdroid.fdroid.privileged*' ;
      printf '%s\n' '- com.termux.api*' ;
      printf '%s\n' '- com.termux.boot*' ;
      printf '%s\n' '- com.termux.gui*' ;
      printf '%s\n' '- com.termux.nix*' ;
      printf '%s\n' '- com.termux.styling*' ;
      printf '%s\n' '- com.termux.tasker*' ;
      printf '%s\n' '- com.termux.widget*' ;
      printf '%s\n' '- com.termux.window*' ;
      # Find all the metadata/*.protect files and use that filename as a deletion-protection filter for rsync
      # Does this, in effect: printf '%s\n' 'P org.qtproject.bibletimemini*' ;
      find "${MIRROR_DIR%%/}/../metadata/"*.protect | \
         xargs basename --multiple | sed -r -e 's/\.protect$/*/;' -e 's/^/P /;'
      cat "${INSTALLED_FILES_DIR%%/}"/installed*.txt | grep -vE 'com.google.android.marvin.talkback|org.fdroid.fdroid.privileged|\<packageName\>' | \
         awk -F',' '$1!~/packageName/{print "+ **/"$1"*"; print "+ **/"$1"/en*/***"; }' | sort
      printf '%s\n' '+ icons*/'
      printf '%s\n' '- *' ;
      #printf '%s\n' '+ **/index*'
      #awk -F',' '$1!~/packageName/{print $1}' < installed.txt | awk '{print "+ **"$0"*";print "+ icons*/"$0"*";}' ; printf '%s\n' '- *' ;
   } > "${GET_FILE}"
}
sync_files() {
   echo "# BEGIN syncing files"
   if test -n "${APPLY}" ;
   then
      dashn=""
   else
      dashn="-n "
   fi
   if test "${USER}" != "fdroid" ;
   then
      sudo -u fdroid -E /usr/bin/rsync --filter "merge ${GET_FILE}" ${dashn}-v -r -d -aHS --delete --delete-delay plug-mirror.rcac.purdue.edu::fdroid/repo/ "${MIRROR_DIR}"
   else
      /usr/bin/rsync --filter "merge ${GET_FILE}" ${dashn}-v -r -aHS --delete --delete-delay plug-mirror.rcac.purdue.edu::fdroid/repo/ "${MIRROR_DIR}"
   fi
}
fix_metadata() {
   echo "# BEGIN fixing metadata"
   _oldpwd="${PWD}"
   cd "${GIT_DIR}"
   git checkout master ; git pull
   cat "${INSTALLED_FILES_DIR%%/}"/installed*.txt | grep -vE 'com.google.android.marvin.talkback|org.fdroid.fdroid.privileged|\<packageName\>' | \
   awk -F',' '{print $1}' | while read app ;
   do
      appyml="${app}.yml"
      destfile="$( find "${MIRROR_DIR%%/}/../metadata/" -mindepth 1 -maxdepth 1 -name "${appyml}" -exec readlink -f {} \; )"
      test -z "${destfile}" && {
         destfile="${MIRROR_DIR%%/}/../metadata/${appyml}"
         echo "Making new file ${destfile}"
         touch "${destfile}"
      }
      descfile="${destfile%%.yml}.desc"
      srcfile="$( find "${GIT_DIR}/metadata" -name "${appyml}" -exec readlink -f {} \; )"
      echo "Need to munge ${srcfile} to ${destfile}"
      test -f "${descfile}" || { curl --silent -L "https://f-droid.org/en/packages/${app}/" | awk -F'"' '/meta name.*description/{print $4}' > "${descfile}" ; }
      if test -f "${srcfile}" ;
      then
         cp -pf "${srcfile}" "${destfile}"
         # too simple, and just one line. this should be rewritten in python bs4
         echo "Summary: '$( cat "${descfile}" )'" >> "${destfile}"
      fi
      sed -i -r -e "/ArchivePolicy:/d" -e "/AutoName:/s/^AutoName:/Name:/g;" "${destfile}"
   done
   cd "${_oldpwd}"
}
fdroid_update() {
   (
      source ~/venv1/bin/activate
      cd "${MIRROR_DIR}/.."
      fdroid update -c --use-date-from-apk
   )
}
generate_web() {
   /etc/installed/fdroid/fdroid_generate_web.py
}
main() {
   cd "${WORK_DIR}"
   test -z "${SKIP_INPUT}" && prepare_input_file
   test -z "${SKIP_METADATA}" && fix_metadata
   test -z "${SKIP_SYNC}" && sync_files
   test -z "${SKIP_UPDATE}" && fdroid_update
   test -z "${SKIP_WEB}" && generate_web
}
case "${0}" in
   "-bash")
      # dot-sourced
      :
      ;;
   *)
      main | plecho "fdroid_sync"
      ;;
esac