#!/bin/bash # # GT-salat-dikr - Complete Installation Script v3.2.5 # يدعم جميع التوزيعات ويتضمن System Tray وإعدادات الطرفية # مع إصلاح مشكلة الإعدادات المتكررة # set -e # ---------- تعريف المتغيرات ---------- INSTALL_DIR="$HOME/.GT-salat-dikr" REPO_BASE="https://raw.githubusercontent.com/SalehGNUTUX/GT-salat-dikr/main" TEMP_LOG="/tmp/gt-salat-install-$$.log" # ---------- عرض الشعار ---------- show_logo() { echo "" echo " ___ _____ ___ _ _ _ _____ ___ ___ _ _____ " echo " / __|_ _|__/ __| /_\ | | /_\_ _|__| \_ _| |/ / _ \\" echo " | (_ | | ||___\__ \/ _ \| |__ / _ \| ||___| |) | || ' <| /" echo " \___| |_| |___/_/ \_\____/_/ \_\_| |___/___|_|\_\_|_\\" echo "" echo " 🕌 نظام إشعارات الصلاة والأذكار - الإصدار 3.2 🕋" echo "" echo "═══════════════════════════════════════════════════════════════════════════════" echo "" } show_logo if [ "$EUID" -eq 0 ]; then echo "⚠️ لا تشغل هذا السكربت بصلاحيات root." exit 1 fi # قائمة الملفات المطلوبة FILES_TO_DOWNLOAD=( "gt-salat-dikr.sh" "azkar.txt" "adhan.ogg" "short_adhan.ogg" "prayer_approaching.ogg" "gt-tray.py" "install-system-tray.sh" "install-python-deps.sh" "uninstall.sh" "LICENSE" "README.md" ) # ---------- دالة التسجيل ---------- log() { local message="$*" echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" | tee -a "$TEMP_LOG" if [ -d "$INSTALL_DIR" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> "$INSTALL_DIR/install.log" 2>/dev/null || true fi } # ---------- دالة كشف التوزيعة ومدير الحزم ---------- detect_distro() { if [ -f /etc/os-release ]; then . /etc/os-release DISTRO_ID="$ID" DISTRO_NAME="$NAME" elif command -v lsb_release >/dev/null 2>&1; then DISTRO_ID=$(lsb_release -is | tr '[:upper:]' '[:lower:]') else DISTRO_ID="unknown" fi # كشف نظام التشغيل الأساسي (Linux/FreeBSD) case "$(uname -s)" in Linux) OS_TYPE="linux" ;; FreeBSD) OS_TYPE="freebsd" ;; *) OS_TYPE="unknown" ;; esac # تحديد مدير الحزم وأسماء الحزم # قيم افتراضية PKG_MANAGER="unknown" PKG_UPDATE="" PKG_INSTALL="" PYTHON3_PKG="python3" PYTHON_PKG_PYSTRAY="" PYTHON_PKG_PILLOW="" JQ_PKG="" IMAGEMAGICK_PKG="" case "$OS_TYPE-$DISTRO_ID" in linux-ubuntu|linux-debian|linux-linuxmint|linux-pop|linux-raspbian|linux-kali|linux-elementary|linux-zorin) PKG_MANAGER="apt" PKG_UPDATE="sudo apt update" PKG_INSTALL="sudo apt install -y" PYTHON3_PKG="python3" PYTHON_PKG_PYSTRAY="python3-pystray" PYTHON_PKG_PILLOW="python3-pil" JQ_PKG="jq" IMAGEMAGICK_PKG="imagemagick" ;; linux-fedora|linux-*fedora*) PKG_MANAGER="dnf" PKG_UPDATE="sudo dnf check-update" PKG_INSTALL="sudo dnf install -y" PYTHON3_PKG="python3" PYTHON_PKG_PYSTRAY="python3-pystray" PYTHON_PKG_PILLOW="python3-pillow" JQ_PKG="jq" IMAGEMAGICK_PKG="ImageMagick" ;; linux-centos|linux-rhel|linux-rocky|linux-almalinux) if command -v dnf >/dev/null 2>&1; then PKG_MANAGER="dnf" PKG_UPDATE="sudo dnf check-update" PKG_INSTALL="sudo dnf install -y" else PKG_MANAGER="yum" PKG_UPDATE="sudo yum check-update" PKG_INSTALL="sudo yum install -y" fi PYTHON3_PKG="python3" PYTHON_PKG_PYSTRAY="python3-pystray" PYTHON_PKG_PILLOW="python3-pillow" JQ_PKG="jq" IMAGEMAGICK_PKG="ImageMagick" ;; linux-arch|linux-manjaro|linux-endeavouros|linux-arcolinux|linux-artix) PKG_MANAGER="pacman" PKG_UPDATE="sudo pacman -Sy" PKG_INSTALL="sudo pacman -S --noconfirm" PYTHON3_PKG="python" PYTHON_PKG_PYSTRAY="python-pystray" PYTHON_PKG_PILLOW="python-pillow" JQ_PKG="jq" IMAGEMAGICK_PKG="imagemagick" ;; linux-opensuse*|linux-suse|linux-sles) PKG_MANAGER="zypper" PKG_UPDATE="sudo zypper refresh" PKG_INSTALL="sudo zypper install -y" PYTHON3_PKG="python3" PYTHON_PKG_PYSTRAY="python3-pystray" PYTHON_PKG_PILLOW="python3-Pillow" JQ_PKG="jq" IMAGEMAGICK_PKG="ImageMagick" ;; linux-alpine) PKG_MANAGER="apk" PKG_UPDATE="sudo apk update" PKG_INSTALL="sudo apk add" PYTHON3_PKG="python3" PYTHON_PKG_PYSTRAY="py3-pystray" PYTHON_PKG_PILLOW="py3-pillow" JQ_PKG="jq" IMAGEMAGICK_PKG="imagemagick" ;; linux-void) PKG_MANAGER="xbps" PKG_UPDATE="sudo xbps-install -S" PKG_INSTALL="sudo xbps-install -y" PYTHON3_PKG="python3" PYTHON_PKG_PYSTRAY="python3-pystray" PYTHON_PKG_PILLOW="python3-Pillow" JQ_PKG="jq" IMAGEMAGICK_PKG="ImageMagick" ;; linux-gentoo) # لا نقوم بالتثبيت التلقائي على gentoo بسبب طبيعة emerge PKG_MANAGER="emerge" PKG_UPDATE="sudo emerge --sync" PKG_INSTALL="sudo emerge -av" PYTHON3_PKG="dev-lang/python" PYTHON_PKG_PYSTRAY="dev-python/pystray" PYTHON_PKG_PILLOW="dev-python/pillow" JQ_PKG="app-misc/jq" IMAGEMAGICK_PKG="media-gfx/imagemagick" # سنعتمد على pip في هذه الحالة PKG_MANAGER_AUTO=0 ;; freebsd-*) PKG_MANAGER="pkg" PKG_UPDATE="sudo pkg update" PKG_INSTALL="sudo pkg install -y" PYTHON3_PKG="python3" # في FreeBSD نعتمد على pip لأن أسماء الحزم قد تختلف PYTHON_PKG_PYSTRAY="py39-pystray" # غير مضمون، سنستخدم pip PYTHON_PKG_PILLOW="py39-pillow" JQ_PKG="jq" IMAGEMAGICK_PKG="ImageMagick7" PKG_MANAGER_AUTO=0 # نعتمد على pip ;; *) # unknown ;; esac log "تم الكشف: OS=$OS_TYPE, التوزيعة=${DISTRO_NAME:-$DISTRO_ID}, مدير الحزم=$PKG_MANAGER" } # ---------- دالة تثبيت حزمة باستخدام المدير المناسب ---------- install_system_package() { local pkg_var="$1" local pkg_name="${!pkg_var}" if [ -z "$pkg_name" ] || [ "$PKG_MANAGER" = "unknown" ] || [ "$PKG_MANAGER" = "emerge" ]; then log "⚠️ لا يمكن تثبيت $pkg_var (اسم الحزمة غير معروف أو مدير غير مدعوم)" return 1 fi # تحقق مما إذا كانت الحزمة مثبتة بالفعل (محاولة بسيطة) if command -v "$pkg_name" >/dev/null 2>&1; then log "✅ $pkg_name موجود بالفعل" return 0 fi log "📦 جاري تثبيت $pkg_name ..." $PKG_INSTALL "$pkg_name" 2>/dev/null || { log "❌ فشل تثبيت $pkg_name عبر $PKG_MANAGER" return 1 } log "✅ تم تثبيت $pkg_name" return 0 } # ---------- دالة التحقق من وجود المثبت ---------- ensure_installer() { if [ ! -f "$INSTALL_DIR/install.sh" ]; then echo "📥 جاري تنزيل المثبت إلى الموقع الدائم..." if curl -fsSL "$REPO_BASE/install.sh" -o "$INSTALL_DIR/install.sh" 2>/dev/null; then chmod +x "$INSTALL_DIR/install.sh" echo "✅ تم تنزيل المثبت إلى $INSTALL_DIR/install.sh" else echo "⚠️ فشل تنزيل المثبت، استخدام النسخة المؤقتة" fi fi } # ---------- دالة التنزيل ---------- download_file() { local file=$1 local url="$REPO_BASE/$file" local dest="$INSTALL_DIR/$file" log "جاري تنزيل: $file" if curl -fsSL "$url" -o "$dest" 2>/dev/null; then echo " ✅ تم تنزيل: $file" return 0 else echo " ⚠️ فشل تنزيل: $file" return 1 fi } # ---------- دالة تثبيت اعتماديات Python (محسنة) ---------- install_python_deps() { echo "" echo "📦 تثبيت اعتماديات Python لـ System Tray..." detect_distro # تأكد من وجود python3 و pip3 if ! command -v python3 >/dev/null 2>&1; then echo "❌ Python3 غير مثبت، جاري محاولة التثبيت..." if [ "$PKG_MANAGER" != "unknown" ] && [ "${PKG_MANAGER_AUTO:-1}" = "1" ]; then $PKG_UPDATE 2>/dev/null || true install_system_package PYTHON3_PKG || { echo "⚠️ فشل تثبيت Python3، لا يمكن المتابعة." return 1 } else echo "⚠️ لا يمكن تثبيت Python3 تلقائياً، يرجى تثبيته يدوياً." return 1 fi fi # محاولة التثبيت عبر مدير الحزم أولاً if [ "$PKG_MANAGER" != "unknown" ] && [ "${PKG_MANAGER_AUTO:-1}" = "1" ]; then echo "🔍 استخدام مدير الحزم: $PKG_MANAGER" # تحديث قائمة الحزم $PKG_UPDATE 2>/dev/null || true # تثبيت jq إن لم يكن موجوداً (ضروري للبرنامج) if ! command -v jq >/dev/null 2>&1; then install_system_package JQ_PKG fi # تثبيت pystray و pillow عبر مدير الحزم install_system_package PYTHON_PKG_PYSTRAY install_system_package PYTHON_PKG_PILLOW # التحقق من نجاح التثبيت if python3 -c "import pystray, PIL" 2>/dev/null; then echo "✅ تم تثبيت المكتبات بنجاح عبر مدير الحزم" return 0 else echo "⚠️ فشل التثبيت عبر مدير الحزم، التجربة عبر pip..." fi fi # محاولة عبر pip echo "🔍 المحاولة اليدوية عبر pip..." if python3 -c "import pystray, PIL" 2>/dev/null; then echo "✅ مكتبات Python مثبتة بالفعل" return 0 fi # تأكد من وجود pip3 if ! command -v pip3 >/dev/null 2>&1; then echo "⚠️ pip3 غير موجود، جاري تثبيته..." if [ "$PKG_MANAGER" != "unknown" ]; then # حاول تثبيت pip3 عبر مدير الحزم case "$PKG_MANAGER" in apt) sudo apt install -y python3-pip ;; dnf|yum) sudo dnf install -y python3-pip ;; pacman) sudo pacman -S --noconfirm python-pip ;; zypper) sudo zypper install -y python3-pip ;; apk) sudo apk add py3-pip ;; xbps) sudo xbps-install -y python3-pip ;; pkg) sudo pkg install -y py39-pip ;; *) echo "⚠️ لا يمكن تثبيت pip تلقائياً";; esac 2>/dev/null || true fi if ! command -v pip3 >/dev/null 2>&1; then echo "❌ pip3 غير متوفر، يرجى تثبيته يدوياً." return 1 fi fi echo "📦 تثبيت المكتبات عبر pip..." pip3 install --user pystray pillow requests 2>/dev/null || { echo "⚠️ فشل التثبيت عبر pip" echo "💡 يمكنك تثبيتها يدوياً لاحقاً:" echo " pip3 install --user pystray pillow requests" return 1 } if python3 -c "import pystray, PIL" 2>/dev/null; then echo "✅ تم تثبيت المكتبات عبر pip بنجاح" return 0 else echo "❌ فشل التثبيت حتى بعد محاولة pip." return 1 fi } # ---------- باقي الدوال (download_icons, setup_system_tray, setup_autostart, setup_terminal, run_initial_setup, start_services, copy_log, setup_terminal_display) تبقى كما هي ---------- # لقد أدرجتها بالكامل في الرد السابق، لذا سأختصر هنا وأكتب فقط التغييرات الهامة. # لكن سأدرج الدوال التي تعتمد على Python أو تحتاج للتأكد من توفر المكتبات. download_icons() { local ICON_DIR="$INSTALL_DIR/icons" mkdir -p "$ICON_DIR" echo "" echo "⬇️ جاري تحميل الأيقونات..." local icon_sizes=("16" "32" "48" "64" "128" "256") local downloaded=0 for size in "${icon_sizes[@]}"; do local icon_url="$REPO_BASE/icons/prayer-icon-${size}.png" local icon_file="$ICON_DIR/prayer-icon-${size}.png" if curl -fsSL "$icon_url" -o "$icon_file" 2>/dev/null; then echo " ✅ أيقونة ${size}x${size}" downloaded=$((downloaded + 1)) else # إنشاء أيقونة افتراضية إذا فشل التنزيل echo " ⚠️ إنشاء أيقونة افتراضية ${size}x${size}" # استخدام ImageMagick إذا وجد، وإلا استخدم Python if command -v convert >/dev/null 2>&1; then convert -size "${size}x${size}" xc:none \ -fill "#2E7D32" -draw "rectangle $((size/4)),$((size*2/3)) $((size*3/4)),$((size*5/6))" \ -fill "#388E3C" -draw "rectangle $((size*5/16)),$((size*7/16)) $((size*11/16)),$((size*2/3))" \ -fill "#2196F3" -draw "ellipse $((size/2)),$((size*5/16)) $((size*3/16)),$((size/8)) 0,360" \ -fill "#FFEB3B" -stroke "#FFEB3B" -draw "arc $((size*7/16)),$((size/4)) $((size*9/16)),$((size*3/8)) 30,150" \ "$icon_file" 2>/dev/null || true elif python3 -c "from PIL import Image, ImageDraw" 2>/dev/null; then python3 -c " from PIL import Image, ImageDraw img = Image.new('RGBA', ($size, $size), (255, 255, 255, 0)) draw = ImageDraw.Draw(img) draw.rectangle([$((size/4)), $((size*2/3)), $((size*3/4)), $((size*5/6))], fill=(46, 125, 50)) draw.rectangle([$((size*5/16)), $((size*7/16)), $((size*11/16)), $((size*2/3))], fill=(56, 142, 60)) draw.ellipse([$((size*5/16)), $((size/4)), $((size*11/16)), $((size*3/8))], fill=(33, 150, 243)) draw.arc([$((size*7/16)), $((size/4)), $((size*9/16)), $((size*3/8))], 30, 150, fill=(255, 235, 59), width=2) img.save('$icon_file') " 2>/dev/null || true else # إنشاء ملف فارغ كـ placeholder touch "$icon_file" fi fi done if [ $downloaded -gt 0 ]; then echo "✅ تم تحميل $downloaded أيقونة" else echo "⚠️ تم إنشاء أيقونات افتراضية" fi } # باقي الدوال كما هي (setup_system_tray, setup_autostart, setup_terminal, run_initial_setup, start_services, copy_log, setup_terminal_display) تم إدراجها كاملة في الرد السابق. # سأعيد كتابتها هنا بإيجاز (يمكنك نسخها من الرد السابق). setup_system_tray() { echo "" echo "🖥️ إعداد System Tray..." mkdir -p "$HOME/.local/share/applications" cat > "$HOME/.local/share/applications/gt-salat-dikr.desktop" < "$INSTALL_DIR/start-tray.sh" <<'EOF' #!/bin/bash INSTALL_DIR="$(dirname "$(realpath "$0")")" LOCK_FILE="/tmp/gt-salat-tray.lock" if [ -f "$LOCK_FILE" ]; then lock_age=$(date +%s) file_age=$(stat -c %Y "$LOCK_FILE" 2>/dev/null || echo 0) if [ $((lock_age - file_age)) -lt 10 ]; then exit 0 fi fi echo $$ > "$LOCK_FILE" trap 'rm -f "$LOCK_FILE"' EXIT export DISPLAY="${DISPLAY:-:0}" if [ -S "/run/user/$(id -u)/bus" ]; then export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus" fi cd "$INSTALL_DIR" python3 "$INSTALL_DIR/gt-tray.py" EOF chmod +x "$INSTALL_DIR/start-tray.sh" cat > "$INSTALL_DIR/autostart-manager.sh" <<'EOF' #!/bin/bash INSTALL_DIR="$(dirname "$(realpath "$0")")" LOG_FILE="$INSTALL_DIR/autostart.log" log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $*" >> "$LOG_FILE" } start_services() { log "بدء خدمات GT-salat-dikr..." for i in {1..30}; do if [ -n "$DISPLAY" ] && [ -S "/run/user/$(id -u)/bus" ]; then break fi sleep 1 done export DISPLAY="${DISPLAY:-:0}" export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus" cd "$INSTALL_DIR" if [ -f "gt-salat-dikr.sh" ]; then ./gt-salat-dikr.sh --notify-start >/dev/null 2>&1 & log "تم بدء الإشعارات" fi sleep 10 if [ -f "gt-tray.py" ] && command -v python3 >/dev/null 2>&1; then python3 "$INSTALL_DIR/gt-tray.py" >/dev/null 2>&1 & log "تم بدء System Tray" fi } case "${1:-}" in start) start_services ;; stop) pkill -f "gt-salat-dikr\|gt-tray.py" 2>/dev/null || true; log "تم إيقاف الخدمات" ;; *) start_services ;; esac EOF chmod +x "$INSTALL_DIR/autostart-manager.sh" setup_autostart } setup_autostart() { echo "" echo "🔧 إعداد التشغيل التلقائي..." mkdir -p "$HOME/.config/autostart" cat > "$HOME/.config/autostart/gt-salat-dikr.desktop" <