PublicFiles/Artian-Apps/etc/runonce-entries

375 lines
13 KiB
Bash

#!/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