21 Commits

Author SHA1 Message Date
b4a80f5ba1 1.34.11 release 2025-11-07 23:24:58 -05:00
6dcf224b8e Remove unused var 2025-11-07 22:55:49 -05:00
5fb8e0e75f Workaround weird buildah FD 2025-11-07 22:20:56 -05:00
20e09ea15c Still print buildah rm debug 2025-11-07 22:13:16 -05:00
2ac055e827 Make buildah rm quiet 2025-11-07 22:11:30 -05:00
0ee91075fb Download deb to /tmp in container 2025-11-07 21:59:31 -05:00
3c7ef14aac Mounting container in buildah unshare 2025-11-07 21:52:16 -05:00
71ce48626f Make package manager operations noisier by default 2025-11-07 21:22:32 -05:00
f564980ec6 Temp debug 2025-11-07 20:36:34 -05:00
e040a94504 Temp debug 2025-11-07 20:34:42 -05:00
e913d57e17 Remove rootful buildah for cmd execution 2025-11-07 20:28:11 -05:00
61d9e2f98c Remove rootful buildah for deb download 2025-11-07 20:24:22 -05:00
148e821fa9 Remove rootful buildah for buildah checking 2025-11-07 20:20:01 -05:00
622e5d9295 Remove rootful buildah 2025-11-07 20:18:40 -05:00
71defe9672 Pass vars to working container instead of heredoc 2025-11-07 20:11:46 -05:00
60cfe6a19c Fix quoted repo names in containerized pm 2025-11-07 20:09:03 -05:00
c6eed2a89a Allow future full versions for --mcversion 2025-11-07 18:22:48 -05:00
f2c8865216 Print helper for future beta versions instead of scraping 2025-11-07 18:17:38 -05:00
fc1956dc04 Skip containerized version lookup for beta versions 2025-11-07 18:01:22 -05:00
533106cbd7 Allow future major beta versions 2025-11-07 17:54:51 -05:00
89499ddac8 Allow empty --install flag, default to repo method 2025-10-22 20:45:26 -04:00

View File

@@ -21,7 +21,7 @@
# shellcheck disable=SC2329 # shellcheck disable=SC2329
shopt -s extglob shopt -s extglob
declare -g SCRIPT_VERSION="1.34.10" declare -g SCRIPT_VERSION="1.34.11"
declare -g MC_VERSION_HARDCODE="34.0.71" # do find all replace declare -g MC_VERSION_HARDCODE="34.0.71" # do find all replace
declare -g MC_REPO_HARDCODE="bookworm" # should match the MC_VERSION_HARDCODE declare -g MC_REPO_HARDCODE="bookworm" # should match the MC_VERSION_HARDCODE
declare -g BOARD_ID="89.0" # MC34 board ID for automatic version detection declare -g BOARD_ID="89.0" # MC34 board ID for automatic version detection
@@ -139,7 +139,7 @@ parse_input() {
--install|-i) shift; --install|-i) shift;
case $1 in case $1 in
local|rpm|deb) BUILD_SWITCH=1 LOCAL_INSTALL_SWITCH=1 ;; local|rpm|deb) BUILD_SWITCH=1 LOCAL_INSTALL_SWITCH=1 ;;
repo|remote) REPO_INSTALL_SWITCH=1 ;; repo|remote|""|-*) REPO_INSTALL_SWITCH=1 ;;
container) CONTAINER_INSTALL_SWITCH=1 ;; container) CONTAINER_INSTALL_SWITCH=1 ;;
snap) SNAP_INSTALL_SWITCH=1 ;; snap) SNAP_INSTALL_SWITCH=1 ;;
appimage) APPIMAGE_INSTALL_SWITCH=1 ;; appimage) APPIMAGE_INSTALL_SWITCH=1 ;;
@@ -173,8 +173,14 @@ parse_input() {
23) MC_VERSION_USER="${MC_VERSION_USER:-23.0.104}" MC_REPO_HARDCODE="jessie" BOARD_ID="54.0" ;; 23) MC_VERSION_USER="${MC_VERSION_USER:-23.0.104}" MC_REPO_HARDCODE="jessie" BOARD_ID="54.0" ;;
22) MC_VERSION_USER="${MC_VERSION_USER:-22.0.102}" MC_REPO_HARDCODE="jessie" BOARD_ID="51.0" ;; 22) MC_VERSION_USER="${MC_VERSION_USER:-22.0.102}" MC_REPO_HARDCODE="jessie" BOARD_ID="51.0" ;;
21) MC_VERSION_USER="${MC_VERSION_USER:-21.0.90}" MC_REPO_HARDCODE="jessie" BOARD_ID="44.0" ;; 21) MC_VERSION_USER="${MC_VERSION_USER:-21.0.90}" MC_REPO_HARDCODE="jessie" BOARD_ID="44.0" ;;
20) MC_VERSION_USER="${MC_VERSION_USER:-20.0.131}" MC_REPO_HARDCODE="jessie" BOARD_ID="35.0";; 20) MC_VERSION_USER="${MC_VERSION_USER:-20.0.131}" MC_REPO_HARDCODE="jessie" BOARD_ID="35.0" ;;
*) err "Bad --mcversion"; print_help; exit 1 ;; *)
# Warn for future major beta versions
if [[ $MC_MVERSION_USER -gt ${MC_VERSION_HARDCODE%%.*} ]] && [[ -z $MC_VERSION_USER ]]; then
echo "For future major versions, supply full version (and --betapass if necessary)."
err "Bad --mcversion"; print_help; exit 1
fi
;;
esac esac
else else
err "Bad --mcversion"; print_help; exit 1 err "Bad --mcversion"; print_help; exit 1
@@ -290,21 +296,21 @@ init() {
raspbian) ID="debian" ;; raspbian) ID="debian" ;;
*mandriva*) ID="mandriva" *mandriva*) ID="mandriva"
if ((REPO_INSTALL_SWITCH)); then if ((REPO_INSTALL_SWITCH)); then
debug "Automatically using --install=local for Mandriva" debug "Automatically using --install=local for Mandriva."
REPO_INSTALL_SWITCH=0 REPO_INSTALL_SWITCH=0
BUILD_SWITCH=1 BUILD_SWITCH=1
LOCAL_INSTALL_SWITCH=1 LOCAL_INSTALL_SWITCH=1
fi ;; fi ;;
manjaro|arch|cachyos) ID="arch" manjaro|arch|cachyos) ID="arch"
if ((REPO_INSTALL_SWITCH)); then if ((REPO_INSTALL_SWITCH)); then
debug "Automatically using --install=local for Arch" debug "Automatically using --install=local for Arch."
REPO_INSTALL_SWITCH=0 REPO_INSTALL_SWITCH=0
BUILD_SWITCH=1 BUILD_SWITCH=1
LOCAL_INSTALL_SWITCH=1 LOCAL_INSTALL_SWITCH=1
fi ;; fi ;;
*suse*) ID="suse" *suse*) ID="suse"
if ((REPO_INSTALL_SWITCH)); then if ((REPO_INSTALL_SWITCH)); then
debug "Automatically using --install=local for SUSE" debug "Automatically using --install=local for SUSE."
REPO_INSTALL_SWITCH=0 REPO_INSTALL_SWITCH=0
BUILD_SWITCH=1 BUILD_SWITCH=1
LOCAL_INSTALL_SWITCH=1 LOCAL_INSTALL_SWITCH=1
@@ -341,31 +347,31 @@ init() {
fedora|centos|mandriva) fedora|centos|mandriva)
local rpm_mgr local rpm_mgr
rpm_mgr=$(command -v dnf &>/dev/null && echo "dnf" || echo "yum") rpm_mgr=$(command -v dnf &>/dev/null && echo "dnf" || echo "yum")
PKG_INSTALL=(sudo "$rpm_mgr" install -y) PKG_INSTALL=(sudo "$rpm_mgr" install --assumeyes)
PKG_REMOVE=(sudo "$rpm_mgr" remove -y) PKG_REMOVE=(sudo "$rpm_mgr" remove --assumeyes)
PKG_UPDATE=(sudo "$rpm_mgr" makecache) PKG_UPDATE=(sudo "$rpm_mgr" makecache --assumeyes)
PKG_QUERY=(rpm -q) PKG_QUERY=(rpm -q)
PKG_INSTALL_LOCAL() { install_mc_rpm; } PKG_INSTALL_LOCAL() { install_mc_rpm; }
;; ;;
debian|ubuntu) debian|ubuntu)
PKG_INSTALL=(sudo apt-get -f install --install-recommends -y -q0) PKG_INSTALL=(sudo apt-get install --fix-broken --install-recommends --assume-yes)
PKG_REMOVE=(sudo apt-get remove --auto-remove -y -q0) PKG_REMOVE=(sudo apt-get remove --auto-remove --assume-yes)
PKG_UPDATE=(sudo apt-get update -y -q0) PKG_UPDATE=(sudo apt-get update --assume-yes)
PKG_QUERY=(dpkg -s) PKG_QUERY=(dpkg -s)
PKG_INSTALL_LOCAL() { install_mc_deb "$@"; } PKG_INSTALL_LOCAL() { install_mc_deb "$@"; }
;; ;;
suse) suse)
PKG_INSTALL=(sudo zypper --gpg-auto-import-keys --non-interactive --quiet install --force --force-resolution --replacefiles --no-confirm) PKG_INSTALL=(sudo zypper --gpg-auto-import-keys --non-interactive install --force --force-resolution --replacefiles --no-confirm)
PKG_REMOVE=(sudo zypper --non-interactive --quiet remove --clean-deps) PKG_REMOVE=(sudo zypper --non-interactive remove --clean-deps)
PKG_UPDATE=(sudo zypper --non-interactive --quiet refresh jriver) PKG_UPDATE=(sudo zypper --non-interactive refresh jriver)
PKG_QUERY=(rpm -q) PKG_QUERY=(rpm --query)
PKG_INSTALL_LOCAL() { install_mc_rpm; } PKG_INSTALL_LOCAL() { install_mc_rpm; }
;; ;;
arch) arch)
PKG_INSTALL=(sudo pacman -Sy --noconfirm) PKG_INSTALL=(sudo pacman --sync --refresh --noconfirm)
PKG_REMOVE=(sudo pacman -Rs --noconfirm) PKG_REMOVE=(sudo pacman --remove --recursive --noconfirm)
PKG_UPDATE=(sudo pacman -Syy) PKG_UPDATE=(sudo pacman --sync --refresh --refresh)
PKG_QUERY=(sudo pacman -Qs) PKG_QUERY=(sudo pacman --query --search)
PKG_INSTALL_LOCAL() { install_mc_arch; } PKG_INSTALL_LOCAL() { install_mc_arch; }
;; ;;
unknown) unknown)
@@ -434,8 +440,8 @@ set_mc_version() {
# Determine latest version # Determine latest version
# Containerized package manager # Containerized package manager
if create_mc_apt_container && if create_mc_apt_container &&
MC_VERSION=$(sudo buildah run "$CNT" -- apt-cache policy "mediacenter${MC_MVERSION_USER:-${MC_VERSION_HARDCODE%%.*}}" | awk '/Candidate:/ {sub(/-.*/, "", $2); print $2}' | sort -V | tail -n1) && MC_VERSION=$(buildah run "$CNT" -- apt-cache policy "mediacenter${MC_MVERSION_USER:-${MC_VERSION_HARDCODE%%.*}}" | awk '/Candidate:/ {sub(/-.*/, "", $2); print $2}' | sort -V | tail -n1) &&
execute sudo buildah rm "$CNT" && buildah rm "$CNT" &>/dev/null &&
[[ $MC_VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then [[ $MC_VERSION =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
MC_VERSION_SOURCE="containerized package manager" MC_VERSION_SOURCE="containerized package manager"
# Fallback to webscrape # Fallback to webscrape
@@ -531,6 +537,8 @@ install_package() {
((no_gpg_check)) && install_flags+=(--allow-unsigned-rpm) ;; ((no_gpg_check)) && install_flags+=(--allow-unsigned-rpm) ;;
esac esac
((silent)) && install_flags+=(--quiet)
# Install packages # Install packages
if [[ ${#pkg_array[@]} -gt 0 ]]; then if [[ ${#pkg_array[@]} -gt 0 ]]; then
if ! execute "${pkg_install[@]}" "${install_flags[@]}" "${pkg_array[@]}"; then if ! execute "${pkg_install[@]}" "${install_flags[@]}" "${pkg_array[@]}"; then
@@ -734,7 +742,7 @@ install_mc_repo() {
acquire_deb() { acquire_deb() {
debug "${FUNCNAME[0]}()" debug "${FUNCNAME[0]}()"
declare -g MC_DEB MC_SOURCE declare -g MC_DEB MC_SOURCE
local fname mnt local fname
[[ -d $OUTPUT_DIR/SOURCES ]] || execute mkdir -p "$OUTPUT_DIR/SOURCES" [[ -d $OUTPUT_DIR/SOURCES ]] || execute mkdir -p "$OUTPUT_DIR/SOURCES"
@@ -749,10 +757,10 @@ acquire_deb() {
MC_DEB="$OUTPUT_DIR/SOURCES/$fname" MC_DEB="$OUTPUT_DIR/SOURCES/$fname"
MC_SOURCE="https://files.jriver-cdn.com/mediacenter/channels/v$MC_MVERSION/latest/$fname" MC_SOURCE="https://files.jriver-cdn.com/mediacenter/channels/v$MC_MVERSION/latest/$fname"
# If deb file already exists, skip download # If deb file already exists and is >30MB, skip download
if [[ -f $MC_DEB ]]; then if [[ -f $MC_DEB ]]; then
if [[ $(stat -c%s "$MC_DEB") -lt 10000000 ]]; then if [[ $(stat -c%s "$MC_DEB") -lt 30000000 ]]; then
echo "Removing existing DEB under 10MB: $MC_DEB" echo "Removing existing DEB under 30MB: $MC_DEB"
execute rm -f "$MC_DEB" execute rm -f "$MC_DEB"
else else
echo "Using existing DEB: $MC_DEB" echo "Using existing DEB: $MC_DEB"
@@ -761,12 +769,18 @@ acquire_deb() {
fi fi
# Download the deb file using the containerized package manager # Download the deb file using the containerized package manager
if ! { create_mc_apt_container "apt-get download --allow-unauthenticated mediacenter$MC_MVERSION &>/dev/null" && # shellcheck disable=SC2016
mnt="$(sudo buildah mount "$CNT")" && if ! {
execute sudo find "$mnt" -maxdepth 1 -type f -name "*.deb" -exec cp {} "$MC_DEB" \; && # Download to /tmp to silence _apt permission warnings
[[ -f $MC_DEB ]] && create_mc_apt_container "cd /tmp && apt-get download --allow-unauthenticated mediacenter$MC_MVERSION -qq" &&
execute sudo buildah umount "$CNT" && env CNT="$CNT" MC_DEB="$MC_DEB" buildah unshare -- bash -eu -o pipefail -c '
execute sudo buildah rm "$CNT"; }; then mnt="$(buildah mount "$CNT")"
deb="$(find "$mnt/tmp" -maxdepth 1 -type f -name "*.deb" | head -n1)"
[[ -n "$deb" ]] && cp -f "$deb" "$MC_DEB"
buildah umount "$CNT"' &&
[[ -f $MC_DEB ]] &&
buildah rm "$CNT" &>/dev/null;
}; then
debug "Failed to download DEB using containerized package manager" debug "Failed to download DEB using containerized package manager"
echo "Using legacy download method" echo "Using legacy download method"
# Define the repository search order # Define the repository search order
@@ -934,8 +948,7 @@ translate_packages() {
recommends_arr=('mesa-libgl' 'nvidia-libgl' 'nvidia-utils' 'vulkan-intel' recommends_arr=('mesa-libgl' 'nvidia-libgl' 'nvidia-utils' 'vulkan-intel'
'vulkan-radeon' 'vorbis-tools' 'musepack-tools') 'vulkan-radeon' 'vorbis-tools' 'musepack-tools')
;; ;;
*) *) echo "Skipping package translations for $ID" ;;
echo "Skipping package translations for $ID"
esac esac
} }
@@ -1037,6 +1050,8 @@ build_rpm() {
-bb -bb
"$spec_file" "$spec_file"
) )
# Run rpmbuild and verify output RPM exists
execute "${rpmbuild_cmd[@]}" && [[ -f $MC_RPM ]] execute "${rpmbuild_cmd[@]}" && [[ -f $MC_RPM ]]
} }
@@ -1982,14 +1997,14 @@ download() {
local url="$1" local url="$1"
local output="${2:-}" local output="${2:-}"
local -a cmd local -a cmd
if command -v curl &>/dev/null || install_package --silent curl; then if command -v curl &>/dev/null || install_package curl; then
cmd=(curl --silent --fail --location) cmd=(curl --silent --fail --location)
if [[ -n "$output" ]]; then if [[ -n "$output" ]]; then
cmd+=(--output "$output") cmd+=(--output "$output")
else else
cmd+=(--remote-name) cmd+=(--remote-name)
fi fi
elif command -v wget &>/dev/null || install_package --silent wget; then elif command -v wget &>/dev/null || install_package wget; then
cmd=(wget --quiet) cmd=(wget --quiet)
[[ -n "$output" ]] && cmd+=("--output-document=$output") [[ -n "$output" ]] && cmd+=("--output-document=$output")
else else
@@ -2003,23 +2018,24 @@ create_mc_apt_container() {
debug "${FUNCNAME[0]}()" "$@" debug "${FUNCNAME[0]}()" "$@"
declare -g CNT declare -g CNT
local -a cmds=("$@") local -a cmds=("$@")
{ command -v buildah &>/dev/null || install_package buildah &>/dev/null; } && # shellcheck disable=SC2016
CNT=$(sudo buildah from --quiet alpine:edge) && { command -v buildah &>/dev/null || install_package buildah; } &&
sudo buildah run "$CNT" -- sh -c ' CNT=$(buildah from --quiet alpine:edge) &&
apk add --no-cache apt curl gnupg &>/dev/null buildah run --env MC_REPO="$MC_REPO" --env MC_ARCH="$MC_ARCH" "$CNT" -- sh -c '
curl -fsSL https://dist.jriver.com/mediacenter@jriver.com.gpg.key | gpg --dearmor -o /usr/share/keyrings/jriver-com-archive-keyring.gpg &>/dev/null apk add --quiet --no-progress --no-cache apt curl gnupg
curl -fsSL https://dist.jriver.com/mediacenter@jriver.com.gpg.key | gpg --quiet --dearmor -o /usr/share/keyrings/jriver-com-archive-keyring.gpg
cat <<-EOF > /etc/apt/sources.list.d/jriver.sources cat <<-EOF > /etc/apt/sources.list.d/jriver.sources
Types: deb Types: deb
URIs: https://dist.jriver.com/latest/mediacenter/ URIs: https://dist.jriver.com/latest/mediacenter/
Signed-By: /usr/share/keyrings/jriver-com-archive-keyring.gpg Signed-By: /usr/share/keyrings/jriver-com-archive-keyring.gpg
Suites: '"$MC_REPO"' Suites: $MC_REPO
Components: main Components: main
Architectures: '"$MC_ARCH"' Architectures: $MC_ARCH
EOF EOF
apt-get update &>/dev/null' && apt-get update -qq' &&
# If user passes command strings run them in the container # If user passes command strings run them in the container
for cmd in "${cmds[@]}"; do for cmd in "${cmds[@]}"; do
sudo buildah run "$CNT" -- sh -c "$cmd" || { err "$cmd failed"; return 1; } buildah run "$CNT" -- sh -c "$cmd" || { err "$cmd failed"; return 1; }
done done
} }
add_temp_repo() { add_temp_repo() {