|
#!/bin/bash |
|
set -eu -o pipefail |
|
|
|
# deb.sury.org Missing Packages Checker |
|
# |
|
# This script systematically checks for missing PHP packages in the Sury repository |
|
# for a specific Debian distribution (default: trixie). |
|
# |
|
# It downloads package metadata and checks availability across all PHP versions |
|
# and architectures, then generates a consolidated report of missing packages. |
|
# |
|
# Usage: ./sury_missing_packages_checker.sh [DEBIAN_CODENAME] |
|
# Example: ./sury_missing_packages_checker.sh bookworm |
|
# |
|
# Author: Generated with Claude Code (https://claude.ai/code) |
|
# License: MIT |
|
|
|
# Configuration |
|
DEBIAN_CODENAME="${1:-trixie}" # Default to trixie, allow override via command line |
|
PHP_VERSIONS=("5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0" "8.1" "8.2" "8.3" "8.4") |
|
ARCHITECTURES=("amd64" "arm64") |
|
|
|
# Extensions to test (comprehensive list from DDEV requirements) |
|
EXTENSIONS=("apcu" "apcu-bc" "bcmath" "bz2" "cli" "common" "curl" "fpm" "gd" "imagick" "intl" "json" "ldap" "mbstring" "mcrypt" "memcached" "mysql" "opcache" "pgsql" "readline" "redis" "soap" "sqlite3" "uploadprogress" "xdebug" "xhprof" "xml" "xmlrpc" "zip") |
|
|
|
# Output files |
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S) |
|
MISSING_PACKAGES="sury_missing_packages_${DEBIAN_CODENAME}_${TIMESTAMP}.txt" |
|
|
|
echo "deb.sury.org Missing Packages Checker" |
|
echo "=====================================" |
|
echo "Debian codename: $DEBIAN_CODENAME" |
|
echo "Testing $(( ${#PHP_VERSIONS[@]} * ${#EXTENSIONS[@]} * ${#ARCHITECTURES[@]} )) package combinations..." |
|
echo "Missing packages will be saved to: $MISSING_PACKAGES" |
|
echo "" |
|
|
|
# Download package lists for both architectures |
|
echo "Downloading package lists..." |
|
for arch in "${ARCHITECTURES[@]}"; do |
|
echo " Downloading ${arch} package list for ${DEBIAN_CODENAME}..." |
|
if ! curl -s "https://packages.sury.org/php/dists/${DEBIAN_CODENAME}/main/binary-${arch}/Packages.gz" | gunzip > "/tmp/packages_${arch}.txt" 2>/dev/null; then |
|
echo " ERROR: Failed to download or decompress package list for ${arch}" |
|
echo " Please check if ${DEBIAN_CODENAME} is a valid distribution name" |
|
exit 1 |
|
fi |
|
|
|
# Verify the file was created and has content |
|
if [[ ! -s "/tmp/packages_${arch}.txt" ]]; then |
|
echo " ERROR: Package list for ${arch} is empty" |
|
exit 1 |
|
fi |
|
|
|
echo " Downloaded $(wc -l < "/tmp/packages_${arch}.txt") lines for ${arch}" |
|
done |
|
|
|
# Function to test package availability in downloaded package lists |
|
test_web_package_availability() { |
|
local php_version=$1 |
|
local extension=$2 |
|
local arch=$3 |
|
local package_name="php${php_version}-${extension}" |
|
|
|
if grep -q "^Package: $package_name$" "/tmp/packages_${arch}.txt" 2>/dev/null; then |
|
echo "AVAILABLE" |
|
else |
|
echo "MISSING" |
|
fi |
|
} |
|
|
|
# Initialize output files |
|
echo "# Missing PHP packages on Debian $DEBIAN_CODENAME from deb.sury.org ($(date))" > "$MISSING_PACKAGES" |
|
echo "# Generated by sury_missing_packages_checker.sh" >> "$MISSING_PACKAGES" |
|
echo "# Repository: https://packages.sury.org/php/" >> "$MISSING_PACKAGES" |
|
echo "" >> "$MISSING_PACKAGES" |
|
|
|
# Test all combinations |
|
total_tests=$((${#PHP_VERSIONS[@]} * ${#EXTENSIONS[@]} * ${#ARCHITECTURES[@]})) |
|
current_test=0 |
|
|
|
for php_version in "${PHP_VERSIONS[@]}"; do |
|
for extension in "${EXTENSIONS[@]}"; do |
|
for arch in "${ARCHITECTURES[@]}"; do |
|
current_test=$((current_test + 1)) |
|
package_name="php${php_version}-${extension}" |
|
|
|
echo -n "Testing $package_name ($arch) ... [$current_test/$total_tests] " |
|
|
|
result=$(test_web_package_availability "$php_version" "$extension" "$arch") |
|
|
|
case "$result" in |
|
"AVAILABLE") |
|
echo "✓ AVAILABLE" |
|
;; |
|
"MISSING") |
|
echo "✗ MISSING" |
|
echo "$package_name ($arch)" >> "$MISSING_PACKAGES" |
|
;; |
|
esac |
|
done |
|
done |
|
done |
|
|
|
# Generate consolidated missing packages report |
|
echo "" |
|
echo "Generating consolidated report..." |
|
|
|
# Create a temporary associative array structure using files |
|
rm -f /tmp/missing_by_extension_* |
|
|
|
# Parse missing packages and group by extension |
|
while IFS= read -r line; do |
|
if [[ $line =~ ^php([0-9.]+)-([a-zA-Z0-9_-]+)\ \(([a-zA-Z0-9]+)\)$ ]]; then |
|
php_ver="${BASH_REMATCH[1]}" |
|
extension="${BASH_REMATCH[2]}" |
|
arch="${BASH_REMATCH[3]}" |
|
echo "$php_ver:$arch" >> "/tmp/missing_by_extension_$extension" |
|
fi |
|
done < "$MISSING_PACKAGES" |
|
|
|
# Generate consolidated report |
|
CONSOLIDATED_MISSING="sury_consolidated_missing_${DEBIAN_CODENAME}_${TIMESTAMP}.txt" |
|
echo "# Consolidated Missing PHP Packages Report - Debian $DEBIAN_CODENAME ($(date))" > "$CONSOLIDATED_MISSING" |
|
echo "# Generated by sury_missing_packages_checker.sh" >> "$CONSOLIDATED_MISSING" |
|
echo "# Repository: https://packages.sury.org/php/" >> "$CONSOLIDATED_MISSING" |
|
echo "# Format: Extension -> PHP versions missing (architectures)" >> "$CONSOLIDATED_MISSING" |
|
echo "" >> "$CONSOLIDATED_MISSING" |
|
|
|
missing_extensions=0 |
|
total_missing_count=0 |
|
|
|
for ext_file in /tmp/missing_by_extension_*; do |
|
if [[ -f "$ext_file" ]]; then |
|
extension=$(basename "$ext_file" | sed 's/missing_by_extension_//') |
|
missing_extensions=$((missing_extensions + 1)) |
|
|
|
echo "Extension: $extension" >> "$CONSOLIDATED_MISSING" |
|
|
|
# Group by PHP version using a simpler approach |
|
while IFS=: read -r php_ver arch; do |
|
total_missing_count=$((total_missing_count + 1)) |
|
done < "$ext_file" |
|
|
|
# Output grouped by PHP version |
|
for php_ver in $(cut -d: -f1 "$ext_file" | sort -V -u); do |
|
arches=$(grep "^$php_ver:" "$ext_file" | cut -d: -f2 | tr '\n' ',' | sed 's/,$//' | sed 's/,/, /g') |
|
echo " php$php_ver: $arches" >> "$CONSOLIDATED_MISSING" |
|
done |
|
|
|
echo "" >> "$CONSOLIDATED_MISSING" |
|
fi |
|
done |
|
|
|
echo "Web-based testing completed!" |
|
echo "Missing extensions: $missing_extensions" |
|
echo "Total missing packages: $total_missing_count" |
|
echo "" |
|
echo "Results saved to:" |
|
echo " Detailed missing: $MISSING_PACKAGES" |
|
echo " Consolidated missing: $CONSOLIDATED_MISSING" |
|
|
|
# Show the consolidated report |
|
echo "" |
|
echo "=== CONSOLIDATED MISSING PACKAGES REPORT ===" |
|
grep -v "^#" "$CONSOLIDATED_MISSING" |
|
|
|
# Cleanup |
|
rm -f /tmp/packages_*.txt /tmp/missing_by_extension_* |
|
|
|
echo "" |
|
echo "==========================================" |
|
echo "Report generated successfully!" |
|
echo "" |
|
echo "Files created:" |
|
echo " - Detailed missing packages: $MISSING_PACKAGES" |
|
echo " - Consolidated summary: $CONSOLIDATED_MISSING" |
|
echo "" |
|
echo "NOTE: This script only verifies package metadata presence in the repository." |
|
echo "For installation verification, test actual package installation in a container." |
|
echo "" |
|
echo "To report issues, create an issue at: https://github.com/oerdnj/deb.sury.org/issues" |