#!/bin/bash /etc/rc.common # Copyright (C) 2023-2024 muink . "${IPKG_INSTROOT}/lib/functions.sh" . "${IPKG_INSTROOT}/usr/share/libubox/jshn.sh" START=99 USE_PROCD=1 EXTRA_COMMANDS="getinfo checkln symln setcron cleanup" EXTRA_HELP=\ " getinfo Get releases/targets/archs list checkln Check home path symln [home_url] Make symlink to mount porint setcron [cron] Add cron expression to crontabs cleanup [autorm] Clean up invalid versions" CONFIG_NAME='packagesync' SCONFIG='config' RELEASE='release' MNTPKGS='/mnt/packagesync' CRONTABS='/etc/crontabs/root' SYNCEXE='/usr/libexec/packagesync/sync' PIDFILE='/var/run/packagesync.pid' DEF_HOMEURL="packagesync" DEF_HOMEPATH="/www/$DEF_HOMEURL" RELEASES_LIST="/var/packagesync/releaseslist" TARGETS_LIST="/var/packagesync/targetslist" PKGARCHS_LIST="/var/packagesync/pkgarchslist" RESULTPATH='/var/packagesync/results' # url path DOWNLOAD_URL="https://downloads.openwrt.org" URLHREF_RELEASES='releases' URLHREF_SNAPSHOTS='snapshots' URLHREF_PACKAGES_PREFIX='packages-' # packages-22.03 URLHREF_VERS_PACKAGES='packages' URLHREF_VERS_TARGETS='targets' config_load $CONFIG_NAME # define global var: GLOBAL_* define_global() { [ "$2" == "0" ] || { >&2 echo "$(basename $0): section $1 validation failed"; return 1; } local error=0 local v ucivv="download_url rsync_url home_url bwlimit proxy_enabled proxy_protocol proxy_server" for v in $ucivv; do [ -z "$(config_get $1 $v)" ] && grep -qEv "^(download_url|rsync_url|proxy_protocol|proxy_server)$" <<< "$v" && { >&2 echo "$(basename $0): section $1 option $v cannot be empty" let error++ } config_get GLOBAL_$v $1 $v done [ "$error" -gt 0 ] && return 1 || return 0 } validate_section_config() { uci_load_validate "$CONFIG_NAME" "$SCONFIG" "$1" "$2" \ 'download_url:string' \ 'rsync_url:string' \ 'home_url:string' \ 'bwlimit:uinteger:8000' \ 'auto_exec:bool:1' \ 'cron_expression:string' \ 'proxy_enabled:bool:0' \ 'proxy_protocol:string:socks5' \ 'proxy_server:string' } validate_section_release() { uci_load_validate $CONFIG_NAME $RELEASE "$1" "$2" \ 'enabled:bool:0' \ 'name:uciname' \ 'version:string' \ 'target:string' \ 'pkgarch:string' \ 'model:string' \ 'extra:bool:0' } gen_order() { [ "$2" == "0" ] || { >&2 echo "section $1 validation failed"; return 1; } [ "$enabled" == "0" ] && return 0 json_init json_load "$orders" json_select orders json_add_object json_add_string name "$name" json_add_string version "$version" json_add_string target "$target" json_add_string arch "$pkgarch" json_add_string model "$model" json_add_boolean extra "$extra" json_close_object orders="$(json_dump)" } sync_instance() { [ -z "$1" ] && return 1 procd_open_instance 'sync' procd_set_param command "$SYNCEXE" -o "$1" procd_append_param command -l "$bwlimit" -d "$homepath" ${ALL_PROXY:+-x $ALL_PROXY} \ ${GLOBAL_rsync_url:+--rsyncurl "$GLOBAL_rsync_url"} #procd_set_param respawn #procd_set_param stdout 1 procd_set_param stderr 1 procd_set_param user root procd_set_param pidfile "$PIDFILE" procd_close_instance } start_service() { # locked file check [ -n "$(cat "$PIDFILE" 2>/dev/null)" -a -n "$(ps|grep -E "^\s*$(cat "$PIDFILE" 2>/dev/null)")" ] && return 1 # mount point check [ -n "$(df -hT|grep "$MNTPKGS")" ] || return 1 validate_section_config "$SCONFIG" define_global || return $? local homepath bwlimit [ -n "$GLOBAL_home_url" ] && homepath="/www/$GLOBAL_home_url" || homepath="$DEF_HOMEPATH" [ -d "$homepath" ] || { >&2 echo -e "$CONFIG_NAME: The Home Path '$homepath' is invalid. please check the 'home_url'"; return 1; } bwlimit="$GLOBAL_bwlimit" [ "$GLOBAL_proxy_enabled" = "1" ] && { export ALL_PROXY=$GLOBAL_proxy_protocol://$GLOBAL_proxy_server } local orders='{ "orders": [] }' config_foreach validate_section_release $RELEASE gen_order sync_instance "$(jsonfilter -q -s "$orders" -e @.orders)" #$SYNCEXE -l|--bwlimit "$bwlimit" -d|--homedir "$homepath" -n|--name "x64_21_02_5" -s|--version "21.02.5" -t|--target "x86/64" -k|--arch "x86_64"; #$SYNCEXE -l|--bwlimit "$bwlimit" -d|--homedir "$homepath" -n|--name "x64_22_03_2" -s|--version "22.03.2" -t|--target "x86/64" -k|--arch "x86_64"; #$SYNCEXE -l|--bwlimit "$bwlimit" -d|--homedir "$homepath" -n|--name "ath79_21_02_5" -s|--version "21.02.5" -t|--target "ath79/nand" -k|--arch "mips_24kc"; #$SYNCEXE -l|--bwlimit "$bwlimit" -d|--homedir "$homepath" -n|--name "ath79_22_03_2" -s|--version "22.03.2" -t|--target "ath79/nand" -k|--arch "mips_24kc"; # #$SYNCEXE -l|--bwlimit "$bwlimit" -o|--orders '[ {"homedir": "$homepath", "name": "x64_21_02_5", "version": "21.02.5", "target": "x86/64", "arch": "x86_64"}, \ # {"homedir": "$homepath", "name": "x64_22_03_2", "version": "22.03.2", "target": "x86/64", "arch": "x86_64"}, \ # {"homedir": "$homepath", "name": "ath79_21_02_5", "version": "21.02.5", "target": "ath79/nand", "arch": "mips_24kc"}, \ # {"homedir": "$homepath", "name": "ath79_22_03_2", "version": "22.03.2", "target": "ath79/nand", "arch": "mips_24kc"} ]' # #$SYNCEXE -l|--bwlimit "$bwlimit" -d|--homedir "$homepath" -o|--orders '[ {"name": "x64_21_02_5", "version": "21.02.5", "target": "x86/64", "arch": "x86_64"}, \ # {"name": "x64_22_03_2", "version": "22.03.2", "target": "x86/64", "arch": "x86_64"}, \ # {"name": "ath79_21_02_5", "version": "21.02.5", "target": "ath79/nand", "arch": "mips_24kc"}, \ # {"name": "ath79_22_03_2", "version": "22.03.2", "target": "ath79/nand", "arch": "mips_24kc"} ]' return 0 } getinfo() { validate_section_config "$SCONFIG" define_global local rawhtml stables releases targets pkgarchs download_url="${GLOBAL_download_url:-$DOWNLOAD_URL}" # Versions rawhtml="$(curl --connect-timeout 10 --retry 3 -sSL "$download_url/")" stables="$( \ echo "$rawhtml" | sed -n '/Stable Release/,/Development Snapshots/p' \ | sed -n '/