RetroPie-Setup/scriptmodules/admin/setup.sh

766 lines
29 KiB
Bash

#!/usr/bin/env bash
# This file is part of The RetroPie Project
#
# The RetroPie Project is the legal property of its developers, whose names are
# too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source.
#
# See the LICENSE.md file at the top-level directory of this distribution and
# at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md
#
rp_module_id="setup"
rp_module_desc="GUI based setup for RetroPie"
rp_module_section=""
function _setup_gzip_log() {
setsid tee >(setsid gzip --stdout >"$1")
}
function rps_logInit() {
if [[ ! -d "$__logdir" ]]; then
if mkdir -p "$__logdir"; then
chown "$__user":"$__group" "$__logdir"
else
fatalError "Couldn't make directory $__logdir"
fi
fi
# remove all but the last 20 logs
find "$__logdir" -type f | sort | head -n -20 | xargs -d '\n' --no-run-if-empty rm
local now=$(date +'%Y-%m-%d_%H%M%S')
logfilename="$__logdir/rps_$now.log.gz"
touch "$logfilename"
chown "$__user":"$__group" "$logfilename"
time_start=$(date +"%s")
}
function rps_logStart() {
echo -e "Log started at: $(date -d @$time_start)\n"
echo "RetroPie-Setup version: $__version ($(sudo -u "$__user" git -C "$scriptdir" log -1 --pretty=format:%h))"
echo "System: $__platform ($__platform_arch) - $__os_desc - $(uname -a)"
}
function rps_logEnd() {
time_end=$(date +"%s")
echo
echo "Log ended at: $(date -d @$time_end)"
date_total=$((time_end-time_start))
local hours=$((date_total / 60 / 60 % 24))
local mins=$((date_total / 60 % 60))
local secs=$((date_total % 60))
echo "Total running time: $hours hours, $mins mins, $secs secs"
}
function rps_printInfo() {
local log="$1"
reset
if [[ ${#__ERRMSGS[@]} -gt 0 ]]; then
printMsgs "dialog" "${__ERRMSGS[@]}"
[[ -n "$log" ]] && printMsgs "dialog" "Please see $log for more in depth information regarding the errors."
fi
if [[ ${#__INFMSGS[@]} -gt 0 ]]; then
printMsgs "dialog" "${__INFMSGS[@]}"
fi
__ERRMSGS=()
__INFMSGS=()
}
function depends_setup() {
# check for VERSION file - if it doesn't exist we will run the post_update script as it won't be triggered
# on first upgrade to 4.x
if [[ ! -f "$rootdir/VERSION" ]]; then
joy2keyStop
exec "$scriptdir/retropie_packages.sh" setup post_update gui_setup
fi
if [[ "$__os_debian_ver" -le 10 ]] && isPlatform "rpi" && isPlatform "mesa" && ! isPlatform "rpi4"; then
printMsgs "dialog" "WARNING: You have the experimental desktop GL driver enabled. This is NOT supported by RetroPie, and Emulation Station as well as emulators may fail to launch.\n\nPlease disable the experimental desktop GL driver from the raspi-config 'Advanced Options' menu."
fi
if isPlatform "rpi" && isPlatform "64bit"; then
printMsgs "dialog" "WARNING: 64bit support on the Raspberry Pi is not yet officially supported, although the main emulator package selection should work ok."
fi
if [[ "$__os_debian_ver" -eq 8 ]]; then
printMsgs "dialog" "Raspbian/Debian Jessie and versions of Ubuntu below 18.04 are no longer supported.\n\nPlease install RetroPie from a fresh image (or if running Ubuntu, upgrade your OS)."
fi
if [[ "$__os_debian_ver" -eq 9 ]] && [[ "$__os_id" == "Raspbian" ]]; then
printMsgs "dialog" "Your version of RetroPie which is based on Raspbian Stretch is no longer supported.\n\nWe recommend you install the latest RetroPie image.\n\nPre-built binaries are now disabled for your system. You can still update packages from source, but due to the age of Raspbian Stretch we can't guarantee all software included will work."
fi
# make sure user has the correct group permissions
if ! isPlatform "x11"; then
local group
for group in input video; do
if ! hasFlag "$(groups $__user)" "$group"; then
dialog --yesno "Your user '$__user' is not a member of the system group '$group'.\n\nThis is needed for RetroPie to function correctly. May I add '$__user' to group '$group'?\n\nYou will need to restart for these changes to take effect." 22 76 2>&1 >/dev/tty && usermod -a -G "$group" "$__user"
fi
done
fi
# set a global __setup to 1 which is used to adjust package function behaviour if called from the setup gui
__setup=1
# print any pending msgs - eg during module scanning which wouldn't be seen otherwise
rps_printInfo
}
function updatescript_setup()
{
clear
chown -R "$__user":"$__group" "$scriptdir"
printHeading "Fetching latest version of the RetroPie Setup Script."
pushd "$scriptdir" >/dev/null
if [[ ! -d ".git" ]]; then
printMsgs "dialog" "Cannot find directory '.git'. Please clone the RetroPie Setup script via 'git clone https://github.com/RetroPie/RetroPie-Setup.git'"
popd >/dev/null
return 1
fi
local error
if ! error=$(sudo -u "$__user" git pull --ff-only 2>&1 >/dev/null); then
printMsgs "dialog" "Update failed:\n\n$error"
popd >/dev/null
return 1
fi
popd >/dev/null
printMsgs "dialog" "Fetched the latest version of the RetroPie Setup script."
return 0
}
function post_update_setup() {
local return_func=("$@")
joy2keyStart
echo "$__version" >"$rootdir/VERSION"
clear
local logfilename
rps_logInit
{
rps_logStart
# run _update_hook_id functions - eg to fix up modules for retropie-setup 4.x install detection
printHeading "Running post update hooks"
rp_updateHooks
rps_logEnd
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
printMsgs "dialog" "NOTICE: The RetroPie-Setup script and pre-made RetroPie SD card images are available to download for free from https://retropie.org.uk.\n\nThe pre-built RetroPie image includes software that has non commercial licences. Selling RetroPie images or including RetroPie with your commercial product is not allowed.\n\nNo copyrighted games are included with RetroPie.\n\nIf you have been sold this software, you can let us know about it by emailing retropieproject@gmail.com."
# return to set return function
"${return_func[@]}"
}
function package_setup() {
local id="$1"
local default=""
if ! rp_isEnabled "$id"; then
printMsgs "dialog" "Sorry but package '$id' is not available for your system ($__platform)\n\nPackage flags: ${__mod_info[$id/flags]}\n\nYour $__platform flags: ${__platform_flags[*]}"
return 1
fi
# associative array so we can pull out the messages later for the confirmation requester
declare -A option_msgs=(
["U"]=""
["B"]="Install from pre-compiled binary"
["S"]="Install from source"
)
while true; do
local options=()
local status
local has_binary=0
local has_net=0
isConnected && has_net=1
# for modules with nonet flag that don't need to download data, we force has_net to 1, so we get install options
hasFlag "${__mod_info[$id/flags]}" "nonet" && has_net=1
if [[ "$has_net" -eq 1 ]]; then
dialog --backtitle "$__backtitle" --infobox "Checking for updates for $id ..." 3 60 >/dev/tty
rp_hasBinary "$id"
local ret="$?"
[[ "$ret" -eq 0 ]] && has_binary=1
[[ "$ret" -eq 2 ]] && has_net=0
fi
local is_installed=0
local pkg_origin=""
local pkg_date=""
if ! rp_isInstalled "$id"; then
status="Not installed"
else
is_installed=1
rp_loadPackageInfo "$id"
pkg_origin="${__mod_info[$id/pkg_origin]}"
pkg_date="${__mod_info[$id/pkg_date]}"
[[ -n "$pkg_date" ]] && pkg_date="$(date -u -d "$pkg_date" 2>/dev/null)"
status="Installed - via $pkg_origin"
[[ -n "$pkg_date" ]] && status+=" (built: $pkg_date)"
if [[ "$has_net" -eq 1 ]]; then
rp_hasNewerModule "$id" "$pkg_origin"
local has_newer="$?"
case "$has_newer" in
0)
status+="\nUpdate is available."
option_msgs["U"]="Update (from $pkg_origin)"
;;
1)
status+="\nYou are running the latest $pkg_origin."
option_msgs["U"]="Re-install (from $pkg_origin)"
;;
2)
if [[ "$pkg_origin" == "unknown" ]]; then
if [[ "$has_binary" -eq 1 ]]; then
pkg_origin="binary"
else
pkg_origin="source"
fi
fi
option_msgs["U"]="Update (from $pkg_origin)"
status+="\nUpdate may be available (Unable to check for this package)."
;;
3)
has_net=0
;;
esac
fi
fi
if [[ "$has_net" -eq 1 ]]; then
if [[ "$is_installed" -eq 1 ]]; then
options+=(U "${option_msgs["U"]}")
fi
if [[ "$pkg_origin" != "binary" && "$has_binary" -eq 1 ]]; then
options+=(B "${option_msgs["B"]}")
fi
if [[ "$pkg_origin" != "source" ]] && fnExists "sources_${id}"; then
options+=(S "${option_msgs[S]}")
fi
else
status+="\nInstall options disabled:\n$__NET_ERRMSG"
fi
if [[ "$is_installed" -eq 1 ]]; then
if fnExists "gui_${id}"; then
options+=(C "Configuration / Options")
fi
options+=(X "Remove")
fi
if [[ -d "$__builddir/$id" ]]; then
options+=(Z "Clean source folder")
fi
local help="${__mod_info[$id/desc]}\n\n${__mod_info[$id/help]}"
if [[ -n "$help" ]]; then
options+=(H "Package help")
fi
if [[ "$is_installed" -eq 1 ]]; then
options+=(V "Package version information")
fi
cmd=(dialog --backtitle "$__backtitle" --cancel-label "Back" --default-item "$default" --menu "Choose an option for $id\n$status" 22 76 16)
choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
default="$choice"
local logfilename
case "$choice" in
U|B|S)
dialog --defaultno --yesno "Are you sure you want to ${option_msgs[$choice]}?" 22 76 2>&1 >/dev/tty || continue
local mode
case "$choice" in
U) mode="_auto_" ;;
B) mode="_binary_" ;;
S) mode="_source_" ;;
esac
clear
rps_logInit
{
rps_logStart
rp_installModule "$id" "$mode"
rps_logEnd
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
;;
C)
rps_logInit
{
rps_logStart
rp_callModule "$id" gui
rps_logEnd
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
;;
X)
local text="Are you sure you want to remove $id?"
case "${__mod_info[$id/section]}" in
core)
text+="\n\nWARNING - core packages are needed for RetroPie to function!"
;;
depends)
text+="\n\nWARNING - this package is required by other RetroPie packages - removing may cause other packages to fail."
text+="\n\nNOTE: This will be reinstalled if missing when updating packages that require it."
;;
esac
dialog --defaultno --yesno "$text" 22 76 2>&1 >/dev/tty || continue
rps_logInit
{
rps_logStart
clear
rp_callModule "$id" remove
rps_logEnd
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
;;
H)
printMsgs "dialog" "$help"
;;
V)
local info
rp_loadPackageInfo "$id"
read -r -d '' info << _EOF_
Package Origin: ${__mod_info[$id/pkg_origin]}
Build Date: ${__mod_info[$id/pkg_date]}
Built from source via:
Type: ${__mod_info[$id/pkg_repo_type]}
URL: ${__mod_info[$id/pkg_repo_url]}
Branch: ${__mod_info[$id/pkg_repo_branch]}
Commit: ${__mod_info[$id/pkg_repo_commit]}
Date: ${__mod_info[$id/pkg_repo_date]}
_EOF_
printMsgs "dialog" "$info"
;;
Z)
rp_callModule "$id" clean
printMsgs "dialog" "$__builddir/$id has been removed."
;;
*)
break
;;
esac
done
}
function section_gui_setup() {
local section="$1"
local ids=()
case "$section" in
all|inst)
name="packages"
local id
for id in "${__mod_id[@]}"; do
# if we are showing installed packaged, skip those that are not installed
[[ "$section" == "inst" ]] && ! rp_isInstalled "$id" && continue
# don't show packages from depends or modules with no section (admin)
! [[ "${__mod_info[$id/section]}" =~ ^(depends|config|)$ ]] && ids+=("$id")
done
;;
*)
name="${__sections[$section]} packages"
ids=($(rp_getSectionIds $section))
;;
esac
local default=""
local status=""
local has_net=1
while true; do
local options=()
local pkgs=()
status="Please choose a package from below"
if ! isConnected; then
status+="\nInstall options disabled ($__NET_ERRMSG)"
has_net=0
fi
local id
local num_pkgs=0
local info
local type
local last_type=""
for id in "${ids[@]}"; do
local type="${__mod_info[$id/vendor]} - ${__mod_info[$id/type]}"
# do a heading for each origin and module type
if [[ "$last_type" != "$type" ]]; then
info="$type"
pkgs+=("----" "\Z4$info ----" "Packages from $info")
last_type="$type"
fi
if ! rp_isEnabled "$id"; then
info="\Z1$id\Zn"
else
if rp_isInstalled "$id"; then
rp_loadPackageInfo "$id" "pkg_origin"
local pkg_origin="${__mod_info[$id/pkg_origin]}"
info="$id (Installed - via $pkg_origin)"
((num_pkgs++))
else
info="$id"
fi
fi
pkgs+=("${__mod_idx[$id]}" "$info" "$id - ${__mod_info[$id/desc]}"$'\n\n'"${__mod_info[$id/help]}")
done
if [[ "$has_net" -eq 1 && "$num_pkgs" -gt 0 ]]; then
options+=(
U "Update all installed $name" "This will update any installed $name. The packages will be updated by the method used previously."
)
fi
# allow installing an entire section except for drivers and dependencies - as it's probably a bad idea
if [[ "$has_net" -eq 1 && "$section" != "driver" && "$section" != "depends" ]]; then
# don't show "Install all packages" when we are showing only installed packages
if [[ "$section" != "inst" ]]; then
options+=(I "Install all $name" "This will install all $name. If a package is not installed, and a pre-compiled binary is available it will be used. If a package is already installed, it will be updated by the method used previously.")
fi
options+=(X "Remove all installed $name" "X This will remove all installed $name.")
fi
options+=("${pkgs[@]}")
local cmd=(dialog --colors --backtitle "$__backtitle" --cancel-label "Back" --item-help --help-button --default-item "$default" --menu "$status" 22 76 16)
local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
[[ -z "$choice" ]] && break
if [[ "${choice[@]:0:4}" == "HELP" ]]; then
# remove HELP
choice="${choice[@]:5}"
# get id of menu item
default="${choice/%\ */}"
# remove id
choice="${choice#* }"
printMsgs "dialog" "$choice"
continue
fi
default="$choice"
local logfilename
case "$choice" in
U|I)
local mode="update"
[[ "$choice" == "I" ]] && mode="install"
dialog --defaultno --yesno "Are you sure you want to $mode all installed $name?" 22 76 2>&1 >/dev/tty || continue
rps_logInit
{
rps_logStart
for id in "${ids[@]}"; do
! rp_isEnabled "$id" && continue
# if we are updating, skip packages that are not installed
if [[ "$mode" == "update" ]]; then
if rp_isInstalled "$id"; then
rp_installModule "$id" "_update_"
fi
else
rp_installModule "$id" "_auto_"
fi
done
rps_logEnd
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
;;
X)
local text="Are you sure you want to remove all installed $name?"
[[ "$section" == "core" ]] && text+="\n\nWARNING - core packages are needed for RetroPie to function!"
dialog --defaultno --yesno "$text" 22 76 2>&1 >/dev/tty || continue
rps_logInit
{
rps_logStart
for id in "${ids[@]}"; do
rp_isInstalled "$id" && rp_callModule "$id" remove
done
rps_logEnd
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
;;
----)
;;
*)
package_setup "${__mod_id[$choice]}"
;;
esac
done
}
function config_gui_setup() {
local default
while true; do
local options=()
local id
for id in "${__mod_id[@]}"; do
# show all configuration modules and any installed packages with a gui function
if [[ "${__mod_info[$id/section]}" == "config" ]] || rp_isInstalled "$id" && rp_isEnabled "$id" && fnExists "gui_$id"; then
options+=("${__mod_idx[$id]}" "$id - ${__mod_info[$id/desc]}" "${__mod_idx[$id]} ${__mod_info[$id/desc]}")
fi
done
local cmd=(dialog --backtitle "$__backtitle" --cancel-label "Back" --item-help --help-button --default-item "$default" --menu "Choose an option" 22 76 16)
local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
[[ -z "$choice" ]] && break
if [[ "${choice[@]:0:4}" == "HELP" ]]; then
choice="${choice[@]:5}"
default="${choice/%\ */}"
choice="${choice#* }"
printMsgs "dialog" "$choice"
continue
fi
[[ -z "$choice" ]] && break
default="$choice"
id="${__mod_id[$choice]}"
local logfilename
rps_logInit
{
rps_logStart
if fnExists "gui_$id"; then
rp_callModule "$id" depends
rp_callModule "$id" gui
else
rp_callModule "$id" clean
rp_callModule "$id"
fi
rps_logEnd
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
done
}
function update_packages_setup() {
clear
local id
for id in ${__mod_id[@]}; do
if rp_isInstalled "$id" && [[ "${__mod_info[$id/section]}" != "depends" ]]; then
rp_installModule "$id" "_update_"
fi
done
}
function check_connection_gui_setup() {
local ip="$(getIPAddress)"
if [[ -z "$ip" ]]; then
printMsgs "dialog" "Sorry, you don't seem to be connected to the internet, so installing/updating is not available."
return 1
fi
return 0
}
function update_packages_gui_setup() {
local update="$1"
if [[ "$update" != "update" ]]; then
! check_connection_gui_setup && return 1
dialog --defaultno --yesno "Are you sure you want to update installed packages?" 22 76 2>&1 >/dev/tty || return 1
updatescript_setup || return 1
# restart at post_update and then call "update_packages_gui_setup update" afterwards
joy2keyStop
exec "$scriptdir/retropie_packages.sh" setup post_update update_packages_gui_setup update
fi
local update_os=0
dialog --yesno "Would you like to update the underlying OS packages (eg kernel etc) ?" 22 76 2>&1 >/dev/tty && update_os=1
clear
local logfilename
rps_logInit
{
rps_logStart
if [[ "$update_os" -eq 1 ]]; then
if rp_isEnabled "raspbiantools"; then
rp_callModule raspbiantools apt_upgrade
else
aptUpdate
apt-get -y dist-upgrade
fi
fi
update_packages_setup
rps_logEnd
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
printMsgs "dialog" "Installed packages have been updated."
gui_setup
}
function basic_install_setup() {
local id
for id in $(rp_getSectionIds core) $(rp_getSectionIds main); do
rp_installModule "$id"
done
return 0
}
function packages_gui_setup() {
local section
local default
local options=()
for section in core main opt driver exp depends; do
options+=("$section" "Manage ${__sections[$section]} packages" "$section Choose to install/update/configure packages from the ${__sections[$section]}")
done
options+=("----" "" "")
options+=("inst" "Manage all installed packages" "Install/update/remove currently installed packages")
options+=("all" "Manage all packages" "Install/update/remove packages from full list")
local cmd
while true; do
cmd=(dialog --backtitle "$__backtitle" --cancel-label "Back" --item-help --help-button --default-item "$default" --menu "Choose an option" 22 76 16)
local choice
choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
[[ -z "$choice" ]] && break
if [[ "${choice[@]:0:4}" == "HELP" ]]; then
choice="${choice[@]:5}"
default="${choice/%\ */}"
choice="${choice#* }"
printMsgs "dialog" "$choice"
continue
fi
[[ "$choice" != "----" ]] && section_gui_setup "$choice"
default="$choice"
done
}
function uninstall_setup()
{
dialog --defaultno --yesno "Are you sure you want to uninstall RetroPie?" 22 76 2>&1 >/dev/tty || return 0
dialog --defaultno --colors --yesno "Are you \ZbREALLY\Zn sure you want to uninstall RetroPie?\n\nThe \Z4\Zb$rootdir\Zn folder will be removed - this includes configuration files for all RetroPie components. If you wish to keep any config files of the emulators/ports that RetroPie used, then choose \ZrNo\Zn now and save it first." 22 76 2>&1 >/dev/tty || return 0
clear
printHeading "Uninstalling RetroPie"
for id in "${__mod_id[@]}"; do
rp_isInstalled "$id" && rp_callModule $id remove
done
rm -rfv "$rootdir"
dialog --defaultno --yesno "Do you want to remove all the files from $datadir - this includes all your installed ROMs, BIOS files and custom splashscreens." 22 76 2>&1 >/dev/tty && rm -rfv "$datadir"
if dialog --defaultno --yesno "Do you want to remove all the system packages that RetroPie depends on? \n\nWARNING: this will remove packages like SDL even if they were installed before you installed RetroPie - it will also remove any package configurations - such as those in /etc/samba for Samba.\n\nIf unsure choose No (selected by default)." 22 76 2>&1 >/dev/tty; then
clear
# remove all dependencies
for id in "${__mod_id[@]}"; do
rp_isInstalled "$id" && rp_callModule "$id" depends remove
done
fi
printMsgs "dialog" "RetroPie has been uninstalled."
}
function reboot_setup()
{
clear
reboot
}
# retropie-setup main menu
function gui_setup() {
joy2keyStart
depends_setup
local default
while true; do
local commit=$(sudo -u "$__user" git -C "$scriptdir" log -1 --pretty=format:"%cr (%h)")
cmd=(dialog --backtitle "$__backtitle" --title "RetroPie-Setup Script" --cancel-label "Exit" --item-help --help-button --default-item "$default" --menu "Version: $__version - Last Commit: $commit\nSystem: $__platform ($__platform_arch) - running on $__os_desc" 22 76 16)
options=(
I "Basic install" "I This will install all packages from Core and Main which gives a basic RetroPie install. Further packages can then be installed later from the Optional and Experimental sections. If binaries are available they will be used, alternatively packages will be built from source - which will take longer."
U "Update" "U Updates RetroPie-Setup and all currently installed packages. Will also allow to update OS packages. If binaries are available they will be used, otherwise packages will be built from source."
P "Manage packages"
"P Install/Remove and Configure the various components of RetroPie, including emulators, ports, and controller drivers."
C "Configuration / tools"
"C Configuration and Tools. Any packages you have installed that have additional configuration options will also appear here."
S "Update RetroPie-Setup script"
"S Update this RetroPie-Setup script. This will update this main management script only, but will not update any software packages. To update packages use the 'Update' option from the main menu, which will also update the RetroPie-Setup script."
X "Uninstall RetroPie"
"X Uninstall RetroPie completely."
R "Perform reboot"
"R Reboot your machine."
)
choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
[[ -z "$choice" ]] && break
if [[ "${choice[@]:0:4}" == "HELP" ]]; then
choice="${choice[@]:5}"
default="${choice/%\ */}"
choice="${choice#* }"
printMsgs "dialog" "$choice"
continue
fi
default="$choice"
case "$choice" in
I)
! check_connection_gui_setup && continue
dialog --defaultno --yesno "Are you sure you want to do a basic install?\n\nThis will install all packages from the 'Core' and 'Main' package sections." 22 76 2>&1 >/dev/tty || continue
clear
local logfilename
rps_logInit
{
rps_logStart
basic_install_setup
rps_logEnd
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
;;
U)
update_packages_gui_setup
;;
P)
packages_gui_setup
;;
C)
config_gui_setup
;;
S)
! check_connection_gui_setup && continue
dialog --defaultno --yesno "Are you sure you want to update the RetroPie-Setup script ?" 22 76 2>&1 >/dev/tty || continue
if updatescript_setup; then
joy2keyStop
exec "$scriptdir/retropie_packages.sh" setup post_update gui_setup
fi
;;
X)
local logfilename
rps_logInit
{
uninstall_setup
} &> >(_setup_gzip_log "$logfilename")
rps_printInfo "$logfilename"
;;
R)
dialog --defaultno --yesno "Are you sure you want to reboot?\n\nNote that if you reboot when Emulation Station is running, you will lose any metadata changes." 22 76 2>&1 >/dev/tty || continue
reboot_setup
;;
esac
done
joy2keyStop
clear
}