feat: simplify installation process

This commit is contained in:
Oskar Manhart 2024-08-28 16:03:17 +02:00
parent 796aeac892
commit 75c20ec26c
2 changed files with 128 additions and 51 deletions

View File

@ -284,33 +284,25 @@ The following guides are available:
If you already have a Windows VM or server you wish to use with WinApps, you will need to merge `install/RDPApps.reg` into the Windows Registry manually. If you already have a Windows VM or server you wish to use with WinApps, you will need to merge `install/RDPApps.reg` into the Windows Registry manually.
### Step 2: Clone WinApps Repository and Dependencies ### Step 2: Install Dependencies
1. Clone the WinApps GitHub repository. Install the required dependencies.
```bash - Debian/Ubuntu:
git clone --recurse-submodules --remote-submodules https://github.com/winapps-org/winapps.git && cd winapps ```bash
``` sudo apt install -y dialog freerdp3-x11 iproute2 libnotify-bin netcat
```
2. Install the required dependencies. - Fedora/RHEL:
- Debian/Ubuntu: ```bash
```bash sudo dnf install -y dialog freerdp iproute libnotify nmap-ncat
sudo apt install -y dialog freerdp3-x11 iproute2 libnotify-bin netcat ```
``` - Arch Linux:
- Fedora/RHEL: ```bash
```bash sudo pacman -Syu --needed -y dialog freerdp iproute2 libnotify
sudo dnf install -y dialog freerdp iproute libnotify nmap-ncat gnu-netcat
``` ```
- Arch Linux: - Gentoo Linux:
```bash ```bash
sudo pacman -Syu --needed -y dialog freerdp iproute2 libnotify gnu-netcat sudo emerge --ask=n sys-libs/dialog net-misc/freerdp:3 net-misc/iproute2 x11-libs/libnotify net-analyzer/netcat
``` ```
- Gentoo Linux:
```bash
sudo emerge --ask=n sys-libs/dialog net-misc/freerdp:3 net-misc/iproute2 x11-libs/libnotify net-analyzer/netcat
```
- `Docker Engine`: https://docs.docker.com/engine/install/
- `Podman`: https://podman.io/docs/installation
- `podman-compose`: https://github.com/containers/podman-compose
> [!NOTE] > [!NOTE]
> WinApps requires `FreeRDP` version 3 or later. If not available for your distribution through your package manager, you can install the [Flatpak](https://flathub.org/apps/com.freerdp.FreeRDP). > WinApps requires `FreeRDP` version 3 or later. If not available for your distribution through your package manager, you can install the [Flatpak](https://flathub.org/apps/com.freerdp.FreeRDP).
@ -443,7 +435,7 @@ FREERDP_COMMAND=""
### Step 4: Run the WinApps Installer ### Step 4: Run the WinApps Installer
Run the WinApps installer. Run the WinApps installer.
```bash ```bash
./setup.sh bash <(curl https://raw.githubusercontent.com/winapps-org/winapps/main/setup.sh)
``` ```
A list of supported additional arguments can be accessed by running `./setup.sh --help`. A list of supported additional arguments can be accessed by running `./setup.sh --help`.
@ -461,15 +453,15 @@ Adding your own applications with custom icons and MIME types to the installer i
WinApps offers a manual mode for running applications that were not configured by the WinApps installer. This is completed with the `manual` flag. Executables that are in the Windows PATH do not require full path definition. WinApps offers a manual mode for running applications that were not configured by the WinApps installer. This is completed with the `manual` flag. Executables that are in the Windows PATH do not require full path definition.
```bash ```bash
./bin/winapps manual "C:\my\directory\executableNotInPath.exe" winapps manual "C:\my\directory\executableNotInPath.exe"
./bin/winapps manual executableInPath.exe winapps manual executableInPath.exe
``` ```
## Updating WinApps ## Updating WinApps
The installer can be run multiple times. To update your installation of WinApps: The installer can be run multiple times. To update your installation of WinApps:
1. Run the WinApps installer to remove WinApps from your system. 1. Run the WinApps installer to remove WinApps from your system.
2. Pull the latest changes from the WinApps GitHub repository. 2. Pull the latest changes from the WinApps GitHub repository.
3. Re-install WinApps using the WinApps installer. 3. Re-install WinApps using the WinApps installer by running `winapps-setup`.
## Star History ## Star History
<a href="https://star-history.com/#winapps-org/winapps&Date"> <a href="https://star-history.com/#winapps-org/winapps&Date">

125
setup.sh
View File

@ -37,6 +37,9 @@ readonly EC_INVALID_FLAVOR="16" # Backend specified is not 'libvirt', 'docker'
readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' directory for a '--system' WinApps installation. readonly SYS_BIN_PATH="/usr/local/bin" # UNIX path to 'bin' directory for a '--system' WinApps installation.
readonly USER_BIN_PATH="${HOME}/.local/bin" # UNIX path to 'bin' directory for a '--user' WinApps installation. readonly USER_BIN_PATH="${HOME}/.local/bin" # UNIX path to 'bin' directory for a '--user' WinApps installation.
readonly USER_BIN_PATH_WIN='\\tsclient\home\.local\bin' # WINDOWS path to 'bin' directory for a '--user' WinApps installation. readonly USER_BIN_PATH_WIN='\\tsclient\home\.local\bin' # WINDOWS path to 'bin' directory for a '--user' WinApps installation.
# 'SOURCE'
readonly SYS_SOURCE_PATH="${SYS_BIN_PATH}/winapps" # UNIX path to WinApps source directory for a '--system' WinApps installation.
readonly USER_SOURCE_PATH="${USER_BIN_PATH}/winapps" # UNIX path to WinApps source directory for a '--system' WinApps installation.
# 'APP' # 'APP'
readonly SYS_APP_PATH="/usr/share/applications" # UNIX path to 'applications' directory for a '--system' WinApps installation. readonly SYS_APP_PATH="/usr/share/applications" # UNIX path to 'applications' directory for a '--system' WinApps installation.
readonly USER_APP_PATH="${HOME}/.local/share/applications" # UNIX path to 'applications' directory for a '--user' WinApps installation. readonly USER_APP_PATH="${HOME}/.local/share/applications" # UNIX path to 'applications' directory for a '--user' WinApps installation.
@ -98,6 +101,7 @@ SUDO="" # Set to "sudo" if the user specifies '--system', or "" if the u
BIN_PATH="" # Set to $SYS_BIN_PATH if the user specifies '--system', or $USER_BIN_PATH if the user specifies '--user'. BIN_PATH="" # Set to $SYS_BIN_PATH if the user specifies '--system', or $USER_BIN_PATH if the user specifies '--user'.
APP_PATH="" # Set to $SYS_APP_PATH if the user specifies '--system', or $USER_APP_PATH if the user specifies '--user'. APP_PATH="" # Set to $SYS_APP_PATH if the user specifies '--system', or $USER_APP_PATH if the user specifies '--user'.
APPDATA_PATH="" # Set to $SYS_APPDATA_PATH if the user specifies '--system', or $USER_APPDATA_PATH if the user specifies '--user'. APPDATA_PATH="" # Set to $SYS_APPDATA_PATH if the user specifies '--system', or $USER_APPDATA_PATH if the user specifies '--user'.
SOURCE_PATH="" # Set to $SYS_SOURCE_PATH if the user specifies '--system', or $USER_SOURCE_PATH if the user specifies '--user'.
# INSTALLATION PROCESS # INSTALLATION PROCESS
INSTALLED_EXES=() # List of executable file names of officially supported applications that have already been configured during the current installation process. INSTALLED_EXES=() # List of executable file names of officially supported applications that have already been configured during the current installation process.
@ -134,29 +138,40 @@ function waUsage() {
${COMMAND_TEXT}./setup.sh --help${CLEAR_TEXT} # Display this usage message." ${COMMAND_TEXT}./setup.sh --help${CLEAR_TEXT} # Display this usage message."
} }
# Name: 'waSetWorkingDirectory' # Name: 'waGetSourceCode'
# Role: Changes the working directory to the directory containing the script. # Role: Grab the WinApps source code using Git.
function waSetWorkingDirectory() { function waGetSourceCode() {
# Declare variables. # Declare variables.
local SCRIPT_DIR_PATH="" # Stores the absolute path of the directory containing the script. local SCRIPT_DIR_PATH="" # Stores the absolute path of the directory containing the script.
# Determine the absolute path to the directory containing the script. # Determine the absolute path to the directory containing the script.
SCRIPT_DIR_PATH=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")") SCRIPT_DIR_PATH=$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")
# Check if winapps is currently installed on $SOURCE_PATH
if [[ -f "$SCRIPT_DIR_PATH/winapps" && "$SCRIPT_DIR_PATH" -ne "$SOURCE_PATH" ]]; then
# Display a warning.
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You are running a WinApps installation located outside of default location '${SOURCE_PATH}'. A new installation will be created."
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You might want to remove your old installation on '${SCRIPT_DIR_PATH}'."
fi
if [[ ! -d "$SOURCE_PATH" ]]; then
$SUDO git clone --recurse-submodules --remote-submodules https://github.com/winapps-org/winapps.git "$SOURCE_PATH"
fi
# Silently change the working directory. # Silently change the working directory.
if ! cd "$SCRIPT_DIR_PATH" &>/dev/null; then if ! cd "$SOURCE_PATH" &>/dev/null; then
# Display the error type. # Display the error type.
echo -e "${ERROR_TEXT}ERROR:${CLEAR_TEXT} ${BOLD_TEXT}DIRECTORY CHANGE FAILURE.${CLEAR_TEXT}" echo -e "${ERROR_TEXT}ERROR:${CLEAR_TEXT} ${BOLD_TEXT}DIRECTORY CHANGE FAILURE.${CLEAR_TEXT}"
# Display error details. # Display error details.
echo -e "${INFO_TEXT}Failed to change the working directory to ${CLEAR_TEXT}${COMMAND_TEXT}${SCRIPT_DIR_PATH}${CLEAR_TEXT}${INFO_TEXT}.${CLEAR_TEXT}" echo -e "${INFO_TEXT}Failed to change the working directory to ${CLEAR_TEXT}${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT}${INFO_TEXT}.${CLEAR_TEXT}"
# Display the suggested action(s). # Display the suggested action(s).
echo "--------------------------------------------------------------------------------" echo "--------------------------------------------------------------------------------"
echo "Ensure:" echo "Ensure:"
echo -e " - ${COMMAND_TEXT}${SCRIPT_DIR_PATH}${CLEAR_TEXT} exists." echo -e " - ${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT} exists."
echo -e " - ${COMMAND_TEXT}${SCRIPT_DIR_PATH}${CLEAR_TEXT} is valid and does not contain syntax errors." echo -e " - ${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT} has been cloned and checked out properly."
echo -e " - The current user has sufficient permissions to access ${COMMAND_TEXT}${SCRIPT_DIR_PATH}${CLEAR_TEXT}." echo -e " - The current user has sufficient permissions to access and write to ${COMMAND_TEXT}${SOURCE_PATH}${CLEAR_TEXT}."
echo "--------------------------------------------------------------------------------" echo "--------------------------------------------------------------------------------"
# Terminate the script. # Terminate the script.
@ -301,11 +316,13 @@ function waCheckInput() {
function waConfigurePathsAndPermissions() { function waConfigurePathsAndPermissions() {
if [ "$OPT_USER" -eq 1 ]; then if [ "$OPT_USER" -eq 1 ]; then
SUDO="" SUDO=""
SOURCE_PATH="$USER_SOURCE_PATH"
BIN_PATH="$USER_BIN_PATH" BIN_PATH="$USER_BIN_PATH"
APP_PATH="$USER_APP_PATH" APP_PATH="$USER_APP_PATH"
APPDATA_PATH="$USER_APPDATA_PATH" APPDATA_PATH="$USER_APPDATA_PATH"
elif [ "$OPT_SYSTEM" -eq 1 ]; then elif [ "$OPT_SYSTEM" -eq 1 ]; then
SUDO="sudo" SUDO="sudo"
SOURCE_PATH="$SYS_SOURCE_PATH"
BIN_PATH="$SYS_BIN_PATH" BIN_PATH="$SYS_BIN_PATH"
APP_PATH="$SYS_APP_PATH" APP_PATH="$SYS_APP_PATH"
APPDATA_PATH="$SYS_APPDATA_PATH" APPDATA_PATH="$SYS_APPDATA_PATH"
@ -337,7 +354,7 @@ function waCheckExistingInstall() {
echo -n "Checking for existing conflicting WinApps installations... " echo -n "Checking for existing conflicting WinApps installations... "
# Check for an existing 'user' installation. # Check for an existing 'user' installation.
if [ -f "${USER_BIN_PATH}/winapps" ]; then if [[ -f "${USER_BIN_PATH}/winapps" || -d "${USER_SOURCE_PATH}/winapps" ]]; then
# Complete the previous line. # Complete the previous line.
echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n" echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n"
@ -357,7 +374,7 @@ function waCheckExistingInstall() {
fi fi
# Check for an existing 'system' installation. # Check for an existing 'system' installation.
if [ -f "${SYS_BIN_PATH}/winapps" ]; then if [[ -f "${SYS_BIN_PATH}/winapps" || -d "${USER_SOURCE_PATH}/winapps" ]]; then
# Complete the previous line. # Complete the previous line.
echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n" echo -e "${FAIL_TEXT}Failed!${CLEAR_TEXT}\n"
@ -450,6 +467,54 @@ function waLoadConfig() {
# Name: 'waCheckScriptDependencies' # Name: 'waCheckScriptDependencies'
# Role: Terminate script if dependencies are missing. # Role: Terminate script if dependencies are missing.
function waCheckScriptDependencies() { function waCheckScriptDependencies() {
# 'Git'
if ! command -v git &>/dev/null; then
# Display the error type.
echo -e "${ERROR_TEXT}ERROR:${CLEAR_TEXT} ${BOLD_TEXT}MISSING DEPENDENCIES.${CLEAR_TEXT}"
# Display the error details.
echo -e "${INFO_TEXT}Please install 'git' to proceed.${CLEAR_TEXT}"
# Display the suggested action(s).
echo "--------------------------------------------------------------------------------"
echo "Debian/Ubuntu-based systems:"
echo -e " ${COMMAND_TEXT}sudo apt install git${CLEAR_TEXT}"
echo "Red Hat/Fedora-based systems:"
echo -e " ${COMMAND_TEXT}sudo dnf install git${CLEAR_TEXT}"
echo "Arch Linux systems:"
echo -e " ${COMMAND_TEXT}sudo pacman -S git${CLEAR_TEXT}"
echo "Gentoo Linux systems:"
echo -e " ${COMMAND_TEXT}sudo emerge --ask dev-vcs/git${CLEAR_TEXT}"
echo "--------------------------------------------------------------------------------"
# Terminate the script.
return "$EC_MISSING_DEPS"
fi
# 'curl'
if ! command -v curl &>/dev/null; then
# Display the error type.
echo -e "${ERROR_TEXT}ERROR:${CLEAR_TEXT} ${BOLD_TEXT}MISSING DEPENDENCIES.${CLEAR_TEXT}"
# Display the error details.
echo -e "${INFO_TEXT}Please install 'curl' to proceed.${CLEAR_TEXT}"
# Display the suggested action(s).
echo "--------------------------------------------------------------------------------"
echo "Debian/Ubuntu-based systems:"
echo -e " ${COMMAND_TEXT}sudo apt install curl${CLEAR_TEXT}"
echo "Red Hat/Fedora-based systems:"
echo -e " ${COMMAND_TEXT}sudo dnf install curl${CLEAR_TEXT}"
echo "Arch Linux systems:"
echo -e " ${COMMAND_TEXT}sudo pacman -S curl${CLEAR_TEXT}"
echo "Gentoo Linux systems:"
echo -e " ${COMMAND_TEXT}sudo emerge --ask net-misc/curl${CLEAR_TEXT}"
echo "--------------------------------------------------------------------------------"
# Terminate the script.
return "$EC_MISSING_DEPS"
fi
# 'Dialog'. # 'Dialog'.
if ! command -v dialog &>/dev/null; then if ! command -v dialog &>/dev/null; then
# Display the error type. # Display the error type.
@ -852,7 +917,7 @@ function waCheckContainerRunning() {
# Display the suggested action(s). # Display the suggested action(s).
echo "--------------------------------------------------------------------------------" echo "--------------------------------------------------------------------------------"
echo "Please ensure Windows is powered on:" echo "Please ensure Windows is powered on:"
echo -e "${COMMAND_TEXT}${COMPOSE_COMMAND} --file ~/.config/winapps/winapps.conf start${CLEAR_TEXT}" echo -e "${COMMAND_TEXT}${COMPOSE_COMMAND} --file ~/.config/winapps/compose.yaml start${CLEAR_TEXT}"
echo "--------------------------------------------------------------------------------" echo "--------------------------------------------------------------------------------"
# Terminate the script. # Terminate the script.
@ -1469,6 +1534,9 @@ function waInstall() {
# Check for missing dependencies. # Check for missing dependencies.
waCheckInstallDependencies waCheckInstallDependencies
# Get the source code
waGetSourceCode
# Update $MULTI_FLAG. # Update $MULTI_FLAG.
if [[ $MULTIMON == "true" ]]; then if [[ $MULTIMON == "true" ]]; then
MULTI_FLAG="/multimon" MULTI_FLAG="/multimon"
@ -1536,8 +1604,9 @@ function waInstall() {
# Check for installed applications. # Check for installed applications.
waFindInstalled waFindInstalled
# Install the WinApps bash script. # Install the WinApps bash scripts.
$SUDO cp "./bin/winapps" "${BIN_PATH}/winapps" $SUDO ln -s "./bin/winapps" "${BIN_PATH}/winapps"
$SUDO ln -s "./setup.sh" "${BIN_PATH}/winapps-setup"
# Configure the Windows RDP session application launcher. # Configure the Windows RDP session application launcher.
waConfigureWindows waConfigureWindows
@ -1553,10 +1622,27 @@ function waInstall() {
waConfigureDetectedApps waConfigureDetectedApps
fi fi
# Ensure BIN_PATH is on PATH
waEnsureOnPath
# Print feedback. # Print feedback.
echo -e "${SUCCESS_TEXT}INSTALLATION COMPLETE.${CLEAR_TEXT}" echo -e "${SUCCESS_TEXT}INSTALLATION COMPLETE.${CLEAR_TEXT}"
} }
# Name: 'waEnsureOnPath'
# Role: Ensures that $BIN_PATH is on $PATH.
function waEnsureOnPath() {
if [[ ":$PATH:" == *":$BIN_PATH:"* ]]; then
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} It seems like '${BIN_PATH}' is not on PATH."
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} You can add it by running:"
# shellcheck disable=SC2086
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For Bash: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.bashrc${CLEAR_TEXT}"
# shellcheck disable=SC2086
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} - For ZSH: ${COMMAND_TEXT}echo 'export PATH="${BIN_PATH}:\$PATH"' >> ~/.zshrc${CLEAR_TEXT}"
echo -e "${WARNING_TEXT}[WARNING]${CLEAR_TEXT} Make sure to restart your Terminal afterwards.\n"
fi
}
# Name: 'waUninstall' # Name: 'waUninstall'
# Role: Uninstalls WinApps. # Role: Uninstalls WinApps.
function waUninstall() { function waUninstall() {
@ -1570,8 +1656,9 @@ function waUninstall() {
local DESKTOP_FILE_NAME="" # Stores the name of the '.desktop' file for the application. local DESKTOP_FILE_NAME="" # Stores the name of the '.desktop' file for the application.
local BASH_SCRIPT_NAME="" # Stores the name of the application. local BASH_SCRIPT_NAME="" # Stores the name of the application.
# Remove the 'WinApps' bash script. # Remove the 'WinApps' bash scripts.
$SUDO rm -f "${BIN_PATH}/winapps" $SUDO rm -f "${BIN_PATH}/winapps"
$SUDO rm -f "${BIN_PATH}/winapps-setup"
# Remove WinApps configuration data, temporary files and logs. # Remove WinApps configuration data, temporary files and logs.
rm -rf "$USER_APPDATA_PATH" rm -rf "$USER_APPDATA_PATH"
@ -1622,9 +1709,10 @@ function waUninstall() {
done done
# Print caveats. # Print caveats.
echo -e "\n${INFO_TEXT}Please note your WinApps configuration folder was not removed.${CLEAR_TEXT}" echo -e "\n${INFO_TEXT}Please note that your WinApps configuration and the WinApps source code were not removed.${CLEAR_TEXT}"
echo -e "${INFO_TEXT}You can remove this manually by running:${CLEAR_TEXT}" echo -e "${INFO_TEXT}You can remove these manually by running:${CLEAR_TEXT}"
echo -e "${COMMAND_TEXT}rm -r $(dirname "$CONFIG_PATH")${CLEAR_TEXT}\n" echo -e "${COMMAND_TEXT}rm -r $(dirname "$CONFIG_PATH")${CLEAR_TEXT}"
echo -e "${COMMAND_TEXT}rm -r ${SOURCE_PATH}${CLEAR_TEXT}\n"
# Print feedback. # Print feedback.
echo -e "${SUCCESS_TEXT}UNINSTALLATION COMPLETE.${CLEAR_TEXT}" echo -e "${SUCCESS_TEXT}UNINSTALLATION COMPLETE.${CLEAR_TEXT}"
@ -1647,9 +1735,6 @@ waCheckScriptDependencies
# shellcheck source=/dev/null # Exclude this file from being checked by ShellCheck. # shellcheck source=/dev/null # Exclude this file from being checked by ShellCheck.
source "$INQUIRER_PATH" source "$INQUIRER_PATH"
# Set the working directory.
waSetWorkingDirectory
# Sanitise and parse the user input. # Sanitise and parse the user input.
waCheckInput "$@" waCheckInput "$@"