#!/bin/bash #This script contains various dirty fixes to keep Pi-Apps running smoothly as it matures. #It repairs mistakes that some apps have made, as well as fixing other system issues. Some apps have been removed or renamed. #This script is executed by the updater script as well as the main Pi-Apps installation script. #This script uses the 'runonce' function - it avoids running any of these fixes more than once. #If a runonce entry is modified, then it will be run once more. #Set DIRECTORY variable if necessary if [ -z "$DIRECTORY" ];then DIRECTORY="$(readlink -f "$(dirname "$(dirname "$0")")")" fi #Get pi-apps api functions if necessary if ! command -v runonce >/dev/null ;then set -a #make all functions in the api available to subprocesses source "${DIRECTORY}/api" fi #add ~/Desktop /opt /usr/local/bin and /usr/local/share/applications if not present runonce <<"EOF" if [ -f "$HOME/Desktop" ]; then rm -f "$HOME/Desktop" mkdir -p "$HOME/Desktop" elif [ ! -d "$HOME/Desktop" ]; then mkdir -p "$HOME/Desktop" fi if [ ! -d /opt ]; then sudo_popup mkdir /opt fi if [ ! -d /usr/local/bin ]; then sudo_popup mkdir -p /usr/local/bin fi if [ ! -d /usr/local/share/applications ]; then sudo_popup mkdir -p /usr/local/share/applications fi #Pi-Apps tries to avoid unnecessary reboots at all cost. desktop launchers can be installed to /usr/local/share/applications, which is often not searched by default if /usr/local/share did not exist on boot. #This path is added to $XDG_DATA_DIRS on the next reboot, but we don't want to wait for that! #If XDG_DATA_DIRS is missing /usr/local/share, then bind-mount /usr/local/share/applications to /usr/share/applications if [[ "$XDG_DATA_DIRS" != */usr/local/share* ]] && [ -z "$(ls /usr/share/applications/usr-local-temporary)" ];then sudo_popup mkdir -p /usr/share/applications/usr-local-temporary sudo_popup mount --bind /usr/local/share/applications /usr/share/applications/usr-local-temporary fi EOF #generate settings runonce <<"EOF" if [ "$(ls "$DIRECTORY/data/settings" 2>/dev/null | wc -l)" -le 2 ];then "${DIRECTORY}/settings" refresh fi EOF #regenerate package-app status for one-time migration runonce <<"EOF" IFS=$'\n' for app in $(list_apps package) ;do rm -f "${DIRECTORY}/data/status/${app}" || exit 1 done refresh_all_pkgapp_status EOF # remove deprecated apps (only when running in a visible terminal) case $(ps -o stat= -p $$) in *+*) # Running in foreground runonce <<"EOF" #remove deprecated apps remove_deprecated_app "FreeCAD (precompiled)" remove_deprecated_app "Chromium Media Edition" remove_deprecated_app "Cordless" remove_deprecated_app "Retropie" remove_deprecated_app "Raspi2png" remove_deprecated_app "Falkon" remove_deprecated_app "FreeCAD" remove_deprecated_app "LinuxCNC" remove_deprecated_app "Steam" "32" remove_deprecated_app "Cawbird" remove_deprecated_app "Email Checker" remove_deprecated_app "Pi-Apps Terminal Plugin (python)" remove_deprecated_app "Sysmon" remove_deprecated_app "BlockPi" remove_deprecated_app "TBOPlayer" EOF ;; esac #remove old apps and migrate chromium downgrading apps to the new "Downgrade Chromium" app runonce <<"EOF" #rework chromium downgrading apps to one single new app: 'Downgrade Chromium' rm -rf "${DIRECTORY}/apps/Back to Chromium v86" rm -rf "${DIRECTORY}/apps/Back to Chromium v78" if [ "$(cat "${DIRECTORY}/data/status/Back to Chromium v78" 2>/dev/null)" == installed ] || [ "$(cat "${DIRECTORY}/data/status/Back to Chromium v86" 2>/dev/null)" == installed ];then echo "installed" > "${DIRECTORY}/data/status/Downgrade Chromium" fi #rename 'Turbo Scratch' app to 'Turbowarp' rm -rf "${DIRECTORY}/apps/Turbo Scratch" mv -f "${DIRECTORY}/data/status/Turbo Scratch" "${DIRECTORY}/data/status/Turbowarp" 2>/dev/null #rename 'Pi-Apps Terminal Plugin' app to 'Pi-Apps Terminal Plugin (python)' rm -rf "${DIRECTORY}/apps/Pi-Apps Terminal Plugin" mv -f "${DIRECTORY}/data/status/Pi-Apps Terminal Plugin" "${DIRECTORY}/data/status/Pi-Apps Terminal Plugin (python)" 2>/dev/null #rename 'Whatsapp' app to 'WhatsApp' rm -rf "${DIRECTORY}/apps/Whatsapp" mv -f "${DIRECTORY}/data/status/Whatsapp" "${DIRECTORY}/data/status/WhatsApp" 2>/dev/null #rename 'Sonic Pi 3.2' to 'Sonic Pi' rm -rf "${DIRECTORY}/apps/Sonic Pi 3.2" mv -f "${DIRECTORY}/data/status/Sonic Pi 3.2" "${DIRECTORY}/data/status/Sonic Pi" 2>/dev/null #rename 'Min Browser' to 'Min' rm -rf "${DIRECTORY}/apps/Min Browser" mv -f "${DIRECTORY}/data/status/Min Browser" "${DIRECTORY}/data/status/Min" 2>/dev/null #rename 'Pale Moon Browser' to 'Pale Moon' rm -rf "${DIRECTORY}/apps/Pale Moon Browser" mv -f "${DIRECTORY}/data/status/Pale Moon Browser" "${DIRECTORY}/data/status/Pale Moon" 2>/dev/null #rename 'Puffin Browser Demo' to 'Puffin' rm -rf "${DIRECTORY}/apps/Puffin Browser Demo" mv -f "${DIRECTORY}/data/status/Puffin Browser Demo" "${DIRECTORY}/data/status/Puffin" 2>/dev/null #rename 'Quartz Browser' to 'Quartz' rm -rf "${DIRECTORY}/apps/Quartz Browser" mv -f "${DIRECTORY}/data/status/Quartz Browser" "${DIRECTORY}/data/status/Quartz" 2>/dev/null #rename 'Tor Browser' to 'Tor' rm -rf "${DIRECTORY}/apps/Tor Browser" mv -f "${DIRECTORY}/data/status/Tor Browser" "${DIRECTORY}/data/status/Tor" 2>/dev/null #rename 'KeePassX' to 'KeePassXC' rm -rf "${DIRECTORY}/apps/KeePassX" mv -f "${DIRECTORY}/data/status/KeePassX" "${DIRECTORY}/data/status/KeePassXC" 2>/dev/null #rename 'TeamViewer Host' to 'TeamViewer' if [ -f "${DIRECTORY}/data/status/TeamViewer Host" ] && [ $(cat "${DIRECTORY}/data/status/TeamViewer Host") == "installed" ]; then # installed rm -rf "${DIRECTORY}/apps/TeamViewer Host" "${DIRECTORY}/apps/TeamViewer" mv -f "${DIRECTORY}/data/status/TeamViewer Host" "${DIRECTORY}/data/status/TeamViewer" else # not installed rm -rf "${DIRECTORY}/apps/TeamViewer Host" fi #rename 'Minecraft Java' to 'Minecraft Java Lunar' if [ -f "${DIRECTORY}/data/status/Minecraft Java" ] && [ $(cat "${DIRECTORY}/data/status/Minecraft Java") == "installed" ]; then # installed mv -f "${DIRECTORY}/data/status/Minecraft Java" "${DIRECTORY}/data/status/Minecraft Java Lunar" rm -rf "${DIRECTORY}/apps/Minecraft Java Lunar" mv -f "${DIRECTORY}/apps/Minecraft Java" "${DIRECTORY}/apps/Minecraft Java Lunar" else # not installed rm -rf "${DIRECTORY}/apps/Minecraft Java" fi #rename 'Brave Browser' to 'Brave' rm -rf "${DIRECTORY}/apps/Brave Browser" mv -f "${DIRECTORY}/data/status/Brave Browser" "${DIRECTORY}/data/status/Brave" 2>/dev/null #rename 'Discord' to 'Webcord' rm -rf "${DIRECTORY}/apps/Discord" mv -f "${DIRECTORY}/data/status/Discord" "${DIRECTORY}/data/status/Webcord" 2>/dev/null #rename 'Geekbench' to 'Geekbench 5' if [ -f "${DIRECTORY}/data/status/Geekbench" ] && [ $(cat "${DIRECTORY}/data/status/Geekbench") == "installed" ]; then # installed mv -f "${DIRECTORY}/data/status/Geekbench" "${DIRECTORY}/data/status/Geekbench 5" rm -rf "${DIRECTORY}/apps/Geekbench 5" mv -f "${DIRECTORY}/apps/Geekbench" "${DIRECTORY}/apps/Geekbench 5" else # not installed rm -rf "${DIRECTORY}/apps/Geekbench" fi true EOF #rename xlunch setting to xlunch-dark runonce <<"EOF" if [ "$(cat "${DIRECTORY}/data/settings/App List Style")" == xlunch ];then echo 'xlunch-dark' > "${DIRECTORY}/data/settings/App List Style" fi EOF #transition from box86-no-binfmt-restart package to box86 runonce <<"EOF" if dpkg -l box86-no-binfmt-restart &>/dev/null ;then sudo_popup bash -c 'dpkg --remove box86-no-binfmt-restart' rm -f "${DIRECTORY}/data/status/Box86" "${DIRECTORY}/manage" uninstall Box86 "${DIRECTORY}/manage" install Box86 fi #if box86 is supposedly installed, but box86 command not found, reinstall box86 if [ "$(app_status Box86)" == 'installed' ] && ! command -v box86 >/dev/null;then rm -f "${DIRECTORY}/data/status/Box86" "${DIRECTORY}/manage" uninstall Box86 "${DIRECTORY}/manage" install Box86 fi true EOF #remove files from pi-apps folder that are no longer used runonce <<"EOF" rm -f "${DIRECTORY}/etc/bitlylink" rm -rf "${DIRECTORY}/data/categories" EOF #change settings icon runonce <<"EOF" [ -a "$HOME/.local/share/applications/pi-apps-settings.desktop" ] && sed -i "s/logo.png/settings.png/g" "$HOME/.local/share/applications/pi-apps-settings.desktop" || true EOF #Raspbian Buster systems have a bug where XDG_DATA_DIRS is overwritten as the Raspberry Pi desktop is loaded. #This fixes it, as PiOS maintainers are unwilling to. #See: https://github.com/Botspot/pi-apps/issues/1833 runonce <<"EOF" if [ -f /usr/bin/startlxde-pi ] && grep -q '/var/lib/menu-xdg"' /usr/bin/startlxde-pi ;then sudo_popup sed -i 's;/var/lib/menu-xdg";/var/lib/menu-xdg${XDG_DATA_DIRS:+:$XDG_DATA_DIRS}";g' /usr/bin/startlxde-pi fi EOF #Doom3 app by techcoder20 installed problematic SDL packages. (sdl2-image sdl2-mixer sdl2-ttf) #Nothing else uses them, and they just cause problems with many other games, so remove them runonce <<"EOF" if package_installed sdl2-image ;then list+='sdl2-image ' fi if package_installed sdl2-mixer ;then list+='sdl2-mixer ' fi if package_installed sdl2-ttf ;then list+='sdl2-ttf ' fi if [ ! -z "$list" ]; then sudo_popup apt -y purge $list || exit 1 fi true EOF #Fix PiKiss-GUI messing up folder permissions runonce <<"EOF" if [ -d ~/.local/bin ] && [ "$(stat -c "%U %G" ~/.local/bin)" != "$USER $USER" ]; then sudo_popup chown $USER:$USER ~/.local/bin fi EOF #generate settings runonce <<"EOF" if [ "$(ls "$DIRECTORY/data/settings" 2>/dev/null | wc -l)" -le 2 ];then echo "Generating default settings..." fi "${DIRECTORY}/settings" refresh EOF #remove old mcpi repositories runonce <<"EOF" if [ -f /etc/apt/sources.list.d/Alvarito050506_mcpi-devs.list ];then sudo_popup rm -f /etc/apt/sources.list.d/Alvarito050506_mcpi-devs.list fi if [ -f /etc/apt/sources.list.d/mcpi-revival.list ];then sudo_popup rm -f /etc/apt/sources.list.d/mcpi-revival.list sudo_popup rm -f /etc/apt/trusted.gpg.d/mcpi-revival.gpg fi EOF #remove EOL Raspbian Addons repository runonce <<"EOF" if [ -f /etc/apt/sources.list.d/rpirepo.list ];then sudo_popup rm -f /etc/apt/sources.list.d/rpirepo.list sudo_popup rm -f /usr/share/keyrings/raspbian-addons-archive-keyring.gpg fi EOF #remove old vivaldi repository runonce <<"EOF" if [ -f /etc/apt/sources.list.d/vivaldi-archive.list ];then sudo_popup rm -f /etc/apt/sources.list.d/vivaldi-archive.list sudo_popup rm -f /usr/share/keyrings/vivaldi-browser.gpg fi EOF #update pi-apps .desktop icons runonce <<"EOF" #menu button echo "Updating menu button..." mkdir -p ~/.local/share/applications if [ -f /etc/xdg/menus/lxde-pi-applications.menu ];then echo "[Desktop Entry] Name=Pi-Apps Comment=Raspberry Pi App Store for open source projects Exec=${DIRECTORY}/gui Icon=${DIRECTORY}/icons/logo.png Terminal=false StartupWMClass=Pi-Apps Type=Application Categories=Utility StartupNotify=true" > ~/.local/share/applications/pi-apps.desktop else echo "[Desktop Entry] Name=Pi-Apps Comment=Raspberry Pi App Store for open source projects Exec=${DIRECTORY}/gui Icon=${DIRECTORY}/icons/logo.png Terminal=false StartupWMClass=Pi-Apps Type=Application Categories=Utility;System;PackageManager; StartupNotify=true" > ~/.local/share/applications/pi-apps.desktop fi chmod 755 ~/.local/share/applications/pi-apps.desktop gio set ~/.local/share/applications/pi-apps.desktop "metadata::trusted" yes #copy menu button to Desktop mkdir -p ~/Desktop cp -f ~/.local/share/applications/pi-apps.desktop ~/Desktop/ chmod 755 ~/Desktop/pi-apps.desktop gio set ~/Desktop/pi-apps.desktop "metadata::trusted" yes #settings menu button echo "Updating Settings menu button..." echo "[Desktop Entry] Name=Pi-Apps Settings Comment=Configure Pi-Apps or create an App Exec=${DIRECTORY}/settings Icon=${DIRECTORY}/icons/settings.png Terminal=false StartupWMClass=Pi-Apps-Settings Type=Application Categories=Settings; StartupNotify=true" > ~/.local/share/applications/pi-apps-settings.desktop echo "Updating autostarted updater..." mkdir -p ~/.config/autostart echo "[Desktop Entry] Name=Pi-Apps Updater Exec=${DIRECTORY}/updater onboot Icon=${DIRECTORY}/icons/logo.png Terminal=false StartupWMClass=Pi-Apps Type=Application X-GNOME-Autostart-enabled=true Hidden=false NoDisplay=false" > ~/.config/autostart/pi-apps-updater.desktop EOF #Fix mimeapps containing only boxy svg mimeapp entry without [Added associations] appearing first runonce <<"EOF" if [ "$(head -n1 ~/.config/mimeapps.list)" == 'image/svg+xml;application/illustrator=boxy-svg.desktop;' ];then #remove first line from mimeapps.list sed -i 1d ~/.config/mimeapps.list #Add it back correctly echo "[Added Associations] image/svg+xml;application/illustrator=boxy-svg.desktop;" >> ~/.config/mimeapps.list fi EOF #correct home ownership of gnupg repo runonce <<"EOF" if [ -d ~/.gnupg ] && stat -c "%U %G" ~/.gnupg/* | grep -q "root"; then sudo_popup chown -R $USER:$USER ~/.gnupg fi EOF true