mirror of
https://github.com/winapps-org/winapps.git
synced 2025-06-02 13:17:19 +02:00
413 lines
14 KiB
Bash
Executable File
413 lines
14 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
if ! command -v bc &> /dev/null
|
|
then
|
|
echo "You need bc!"
|
|
exit
|
|
fi
|
|
|
|
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
|
|
|
|
MAKEDEMO=0
|
|
USEDEMO=0
|
|
|
|
# shellcheck disable=SC1094
|
|
. "$DIR/install/inquirer.sh"
|
|
|
|
INSTALLED_EXES=()
|
|
|
|
function waUsage() {
|
|
echo "Usage:
|
|
./installer.sh --user # Install everything in $HOME
|
|
./installer.sh --system # Install everything in /usr"
|
|
exit
|
|
}
|
|
|
|
function waNoSudo() {
|
|
echo "You are attempting to switch from a --system install to a --user install.
|
|
Please run \"./installer.sh --system --uninstall\" first."
|
|
exit
|
|
}
|
|
|
|
function waInstall() {
|
|
$SUDO mkdir -p "$SYS_PATH/apps"
|
|
. "$DIR/bin/winapps" install
|
|
}
|
|
|
|
function waFindInstalled() {
|
|
echo -n " Checking for installed apps in RDP machine (this may take a while)..."
|
|
if [ $USEDEMO != 1 ]; then
|
|
rm -f "$HOME/.local/share/winapps/installed.bat"
|
|
rm -f "$HOME/.local/share/winapps/installed.tmp"
|
|
rm -f "$HOME/.local/share/winapps/installed"
|
|
rm -f "$HOME/.local/share/winapps/detected"
|
|
cp "$DIR/install/ExtractPrograms.ps1" "$HOME/.local/share/winapps/ExtractPrograms.ps1"
|
|
for F in "$DIR"/apps/*; do
|
|
[[ -e "$F" ]] || break
|
|
# shellcheck disable=SC1090,SC1091
|
|
. "$DIR/apps/$F/info"
|
|
printf "IF EXIST \"%s\" ECHO %s >> %s\n" "$WIN_EXECUTABLE" "$F" '\\tsclient\home\.local\share\winapps\installed.tmp' >> "$HOME/.local/share/winapps/installed.bat"
|
|
done
|
|
printf "%s\n" 'powershell.exe -ExecutionPolicy Bypass -File \\tsclient\home\.local\share\\winapps\ExtractPrograms.ps1 > \\tsclient\home\.local\share\winapps\detected' >> "$HOME/.local/share/winapps/installed.bat"
|
|
printf "%s\n" 'RENAME \\tsclient\home\.local\share\winapps\installed.tmp installed' >> "$HOME/.local/share/winapps/installed.bat"
|
|
# shellcheck disable=SC2140
|
|
$FREERDP_COMMAND /d:"$RDP_DOMAIN" /u:"$RDP_USER" /p:"$RDP_PASS" +auto-reconnect +home-drive -wallpaper +span /app:program:"C:\Windows\System32\cmd.exe",cmd:"$(printf '/C %s' '\\tsclient\home\.local\share\winapps\installed.bat')" /v:"$RDP_IP" 1>/dev/null 2>&1 &
|
|
COUNT=0
|
|
while [ ! -f "$HOME/.local/share/winapps/installed" ]; do
|
|
sleep 5
|
|
COUNT=$((COUNT + 1))
|
|
if ((COUNT == 15)); then
|
|
echo " Finished."
|
|
echo ""
|
|
echo "The RDP connection failed to connect or run. Please confirm FreeRDP can connect with:"
|
|
echo " bin/winapps check"
|
|
echo ""
|
|
echo "If it cannot connect, this is most likely due to:"
|
|
echo " - You need to accept the security cert the first time you connect (with 'check')"
|
|
echo " - Not enabling RDP in the Windows VM"
|
|
echo " - Not being able to connect to the IP of the VM"
|
|
echo " - Incorrect user credentials in winapps.conf"
|
|
echo " - Not merging install/RDPApps.reg into the VM"
|
|
exit
|
|
fi
|
|
done
|
|
if [ $MAKEDEMO = 1 ]; then
|
|
rm -rf /tmp/winapps_demo
|
|
cp -a "$HOME/.local/share/winapps" /tmp/winapps_demo
|
|
exit
|
|
fi
|
|
else
|
|
rm -rf "$HOME/.local/share/winapps"
|
|
cp -a /tmp/winapps_demo "$HOME/.local/share/winapps"
|
|
#sleep 3
|
|
fi
|
|
echo " Finished."
|
|
}
|
|
|
|
function waConfigureApp() {
|
|
if [[ -z $1 ]]; then
|
|
return 1
|
|
fi
|
|
if [ -z "$ICON" ]; then
|
|
ICON=$SYS_PATH/apps/$1/icon.$2
|
|
fi
|
|
# shellcheck disable=SC1090
|
|
. "$SYS_PATH/apps/$1/info"
|
|
echo -n " Configuring $NAME..."
|
|
if [ $USEDEMO != 1 ]; then
|
|
$SUDO rm -f "$APP_PATH/$1.desktop"
|
|
echo "[Desktop Entry]
|
|
Name=$NAME
|
|
Exec=$BIN_PATH/winapps $1 %F
|
|
Terminal=false
|
|
Type=Application
|
|
Icon=$ICON
|
|
StartupWMClass=$FULL_NAME
|
|
Comment=$FULL_NAME
|
|
Categories=$CATEGORIES
|
|
MimeType=$MIME_TYPES
|
|
" | $SUDO tee "$APP_PATH/$1.desktop" >/dev/null
|
|
$SUDO rm -f "$BIN_PATH/$1"
|
|
echo "#!/usr/bin/env bash $BIN_PATH/winapps $1 $*
|
|
" | $SUDO tee "$BIN_PATH/$1" >/dev/null
|
|
$SUDO chmod a+x "$BIN_PATH/$1"
|
|
fi
|
|
echo " Finished."
|
|
|
|
ICON=""
|
|
}
|
|
|
|
function waConfigureApps() {
|
|
APPS=()
|
|
while IFS= read -r F; do
|
|
[[ -n $F ]] || continue
|
|
F=$(echo "$F" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')
|
|
echo \""$F"\" >> test
|
|
# shellcheck disable=SC1090
|
|
. "$DIR/apps/$F/info"
|
|
APPS+=("$FULL_NAME ($F)")
|
|
INSTALLED_EXES+=("$(echo "${WIN_EXECUTABLE##*\\}" | tr '[:upper:]' '[:lower:]')")
|
|
done < <(sed 's/\r/\n/g' < "$HOME/.local/share/winapps/installed")
|
|
IFS=$'\n'
|
|
# FIXME
|
|
# shellcheck disable=SC2207
|
|
APPS=($(sort <<<"${APPS[*]}"))
|
|
unset IFS
|
|
OPTIONS=("Set up all detected pre-configured applications" "Select which pre-configured applications to set up" "Do not set up any pre-configured applications")
|
|
|
|
if [ "$INSTALL_TYPE" != 'User' ]; then
|
|
menuFromArr APP_INSTALL "How would you like to handle WinApps pre-configured applications?" "${OPTIONS[@]}"
|
|
else "grep -l -d skip"
|
|
menuFromArr APP_INSTALL "How would you like to handle WinApps pre-configured applications? If any web browser is set-up, may be configured as default browser." "${OPTIONS[@]}"
|
|
fi
|
|
if [ "$APP_INSTALL" = "Select which pre-configured applications to set up" ]; then
|
|
checkbox_input "Which pre-configured apps would you like to set up?" APPS SELECTED_APPS
|
|
echo "" >"$HOME/.local/share/winapps/installed"
|
|
for F in "${SELECTED_APPS[@]}"; do
|
|
APP="${F##*(}"
|
|
APP="${APP%%)}"
|
|
echo "${APP}" >>"$HOME/.local/share/winapps/installed"
|
|
done
|
|
fi
|
|
$SUDO cp "$DIR/bin/winapps" "$BIN_PATH/winapps"
|
|
COUNT=0
|
|
if [ "$APP_INSTALL" != "Do not set up any pre-configured applications" ]; then
|
|
while IFS= read -r F; do
|
|
COUNT=$((COUNT + 1))
|
|
$SUDO cp -r "apps/$F" "$SYS_PATH/apps"
|
|
waConfigureApp "$F" svg
|
|
done < <(sed 's/\r/\n/g' < "$HOME/.local/share/winapps/installed")
|
|
fi
|
|
rm -f "$HOME/.local/share/winapps/installed"
|
|
rm -f "$HOME/.local/share/winapps/installed.bat"
|
|
if ((COUNT == 0)); then
|
|
echo " No configured applications."
|
|
fi
|
|
}
|
|
|
|
function waConfigureAppsAllOfficiallySupported(){
|
|
$SUDO cp "$DIR/bin/winapps" "$BIN_PATH/winapps"
|
|
COUNT=0
|
|
while IFS= read -r F; do
|
|
COUNT=$((COUNT + 1))
|
|
$SUDO cp -r "apps/$F" "$SYS_PATH/apps"
|
|
waConfigureApp "$F" svg
|
|
done < <(sed 's/\r/\n/g' < "$HOME/.local/share/winapps/installed")
|
|
rm -f "$HOME/.local/share/winapps/installed"
|
|
rm -f "$HOME/.local/share/winapps/installed.bat"
|
|
if ((COUNT == 0)); then
|
|
echo " No configured applications."
|
|
fi
|
|
}
|
|
|
|
function waConfigureDetectedApps() {
|
|
if [ -f "$HOME/.local/share/winapps/detected" ]; then
|
|
sed -i 's/\r//g' "$HOME/.local/share/winapps/detected"
|
|
# shellcheck disable=SC1091
|
|
. "$HOME/.local/share/winapps/detected"
|
|
APPS=()
|
|
# shellcheck disable=SC2153
|
|
for I in "${!NAMES[@]}"; do
|
|
EXE=${EXES[$I]##*\\}
|
|
EXE_LOWER=$(echo "$EXE" | tr '[:upper:]' '[:lower:]')
|
|
if (
|
|
dlm=$'\x1F'
|
|
IFS="$dlm"
|
|
[[ "$dlm${INSTALLED_EXES[*]}$dlm" != *"$dlm$EXE_LOWER$dlm"* ]]
|
|
); then
|
|
APPS+=("${NAMES[$I]} ($EXE)")
|
|
fi
|
|
done
|
|
IFS=$'\n' APPS=("$(sort <<<"${APPS[*]}")")
|
|
unset IFS
|
|
OPTIONS=("Set up all detected applications" "Select which applications to set up" "Do not set up any applications")
|
|
menuFromArr APP_INSTALL "How would you like to handle other detected applications?" "${OPTIONS[@]}"
|
|
if [ "$APP_INSTALL" = "Select which applications to set up" ]; then
|
|
checkbox_input "Which other apps would you like to set up?" APPS SELECTED_APPS
|
|
echo "" >"$HOME/.local/share/winapps/installed"
|
|
for F in "${SELECTED_APPS[@]}"; do
|
|
EXE="${F##*(}"
|
|
EXE="${EXE%%)}"
|
|
APP="${F% (*}"
|
|
echo "$EXE|${APP}" >>"$HOME/.local/share/winapps/installed"
|
|
done
|
|
elif [ "$APP_INSTALL" = "Set up all detected applications" ]; then
|
|
for I in "${!EXES[@]}"; do
|
|
EXE=${EXES[$I]##*\\}
|
|
echo "$EXE|${NAMES[$I]}" >>"$HOME/.local/share/winapps/installed"
|
|
done
|
|
fi
|
|
COUNT=0
|
|
if [ -f "$HOME/.local/share/winapps/installed" ]; then
|
|
while read -r LINE; do
|
|
EXE="${LINE%|*}"
|
|
NAME="${LINE#*|}"
|
|
for I in "${!NAMES[@]}"; do
|
|
if [ "$NAME" = "${NAMES[$I]}" ] && [[ "${EXES[$I]}" == *"\\$EXE" ]]; then
|
|
EXE=$(echo "$EXE" | tr '[:upper:]' '[:lower:]')
|
|
$SUDO mkdir -p "$SYS_PATH/apps/$EXE"
|
|
echo "# GNOME shortcut name
|
|
NAME=\"$NAME\"
|
|
|
|
# Used for descriptions and window class
|
|
FULL_NAME=\"$NAME\"
|
|
|
|
# The executable inside windows
|
|
WIN_EXECUTABLE=\"${EXES[$I]}\"
|
|
|
|
# GNOME categories
|
|
CATEGORIES=\"WinApps\"
|
|
|
|
# GNOME mimetypes
|
|
MIME_TYPES=\"\"
|
|
" | sudo tee "$SYS_PATH/apps/$EXE/info" >/dev/null
|
|
# shellcheck disable=SC2153
|
|
echo "${ICONS[$I]}" | base64 -d | sudo tee "$SYS_PATH/apps/$EXE/icon.ico" >/dev/null
|
|
waConfigureApp "$EXE" ico
|
|
COUNT=$((COUNT + 1))
|
|
fi
|
|
done
|
|
done <"$HOME/.local/share/winapps/installed"
|
|
rm -f "$HOME/.local/share/winapps/installed"
|
|
fi
|
|
rm -f "$HOME/.local/share/winapps/installed.bat"
|
|
if ((COUNT == 0)); then
|
|
echo " No configured applications."
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function waConfigureWindows() {
|
|
echo -n " Configuring Windows..."
|
|
if [ $USEDEMO != 1 ]; then
|
|
$SUDO rm -f "$APP_PATH/windows.desktop"
|
|
$SUDO mkdir -p "$SYS_PATH/icons"
|
|
$SUDO cp "$DIR/icons/windows.svg" "$SYS_PATH/icons/windows.svg"
|
|
echo "[Desktop Entry]
|
|
Name=Windows
|
|
Exec=$BIN_PATH/winapps windows %F
|
|
Terminal=false
|
|
Type=Application
|
|
Icon=$SYS_PATH/icons/windows.svg
|
|
StartupWMClass=Microsoft Windows
|
|
Comment=Microsoft Windows
|
|
" | $SUDO tee "$APP_PATH/windows.desktop" >/dev/null
|
|
$SUDO rm -f "$BIN_PATH/windows"
|
|
echo "#!/usr/bin/env bash
|
|
$BIN_PATH/winapps windows
|
|
" | $SUDO tee "/$BIN_PATH/windows" >/dev/null
|
|
$SUDO chmod a+x "$BIN_PATH/windows"
|
|
fi
|
|
echo " Finished."
|
|
}
|
|
|
|
function waUninstallUser() {
|
|
rm -f "$HOME/.local/bin/winapps"
|
|
rm -rf "$HOME/.local/share/winapps"
|
|
grep -l -d skip "bin/winapps" "$HOME/.local/share/applications/"* -s | while IFS= read -r F
|
|
do
|
|
echo -n " Removing $F..."
|
|
$SUDO rm "$F"
|
|
echo " Finished."
|
|
done
|
|
grep -l -d skip "bin/winapps" "$HOME/.local/bin/"* -s | while IFS= read -r F
|
|
do
|
|
echo -n " Removing $F..."
|
|
$SUDO rm "$F"
|
|
echo " Finished."
|
|
done
|
|
}
|
|
|
|
function waUninstallSystem() {
|
|
$SUDO rm -f "/usr/local/bin/winapps"
|
|
$SUDO rm -rf "/usr/local/share/winapps"
|
|
grep -l -d skip "bin/winapps" "/usr/share/applications/"* -s | while IFS= read -r F
|
|
do
|
|
if [ -z "$SUDO" ]; then
|
|
waNoSudo
|
|
fi
|
|
echo -n " Removing $F..."
|
|
$SUDO rm "$F"
|
|
echo " Finished."
|
|
done
|
|
grep -l -d skip "bin/winapps" "/usr/local/bin/"* -s | while IFS= read -r F
|
|
do
|
|
if [ -z "$SUDO" ]; then
|
|
waNoSudo
|
|
fi
|
|
echo -n " Removing $F..."
|
|
$SUDO rm "$F"
|
|
echo " Finished."
|
|
done
|
|
}
|
|
|
|
if [ -z "$1" ]; then
|
|
OPTIONS=(User System)
|
|
menuFromArr INSTALL_TYPE "Would you like to install for the current user or the whole system?" "${OPTIONS[@]}"
|
|
elif [ "$1" = '--user' ]; then
|
|
INSTALL_TYPE='User'
|
|
elif [ "$1" = '--system' ]; then
|
|
INSTALL_TYPE='System'
|
|
else
|
|
waUsage
|
|
fi
|
|
|
|
if [ "$INSTALL_TYPE" = 'User' ]; then
|
|
SUDO=""
|
|
BIN_PATH="$HOME/.local/bin"
|
|
APP_PATH="$HOME/.local/share/applications"
|
|
SYS_PATH="$HOME/.local/share/winapps"
|
|
mkdir -p "$BIN_PATH"
|
|
mkdir -p "$APP_PATH"
|
|
mkdir -p "$SYS_PATH"
|
|
if [ -n "$2" ]; then
|
|
if [ "$2" = '--uninstall' ]; then
|
|
# Uninstall
|
|
echo "Uninstalling..."
|
|
waUninstallUser
|
|
exit
|
|
elif [ "$2" = '--setupAllOfficiallySupportedApps' ]; then
|
|
echo "Setting up All Officially Supported Apps "
|
|
echo "Removing any old configurations..."
|
|
waUninstallUser
|
|
waUninstallSystem
|
|
waInstall
|
|
waFindInstalled
|
|
waConfigureWindows
|
|
waConfigureAppsAllOfficiallySupported
|
|
exit
|
|
else
|
|
usage
|
|
fi
|
|
fi
|
|
elif [ "$INSTALL_TYPE" = 'System' ]; then
|
|
SUDO="sudo"
|
|
sudo ls >/dev/null
|
|
BIN_PATH="/usr/local/bin"
|
|
APP_PATH="/usr/share/applications"
|
|
SYS_PATH="/usr/local/share/winapps"
|
|
if [ -n "$2" ]; then
|
|
if [ "$2" = '--uninstall' ]; then
|
|
# Uninstall
|
|
echo "Uninstalling..."
|
|
waUninstallSystem
|
|
exit
|
|
elif [ "$2" = '--setupAllOfficiallySupportedApps' ]; then
|
|
echo "Setting up All Officially Supported Apps "
|
|
echo "Removing any old configurations..."
|
|
waUninstallUser
|
|
waUninstallSystem
|
|
|
|
echo "Installing..."
|
|
waInstall
|
|
waFindInstalled
|
|
waConfigureWindows
|
|
waConfigureAppsAllOfficiallySupported
|
|
exit
|
|
else
|
|
usage
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
echo "Removing any old configurations..."
|
|
waUninstallUser
|
|
waUninstallSystem
|
|
|
|
echo "Installing..."
|
|
|
|
# Inititialize
|
|
waInstall
|
|
|
|
# Check for installed apps
|
|
waFindInstalled
|
|
|
|
# Install windows
|
|
waConfigureWindows
|
|
|
|
# Configure apps
|
|
waConfigureApps
|
|
waConfigureDetectedApps
|
|
|
|
echo "Installation complete."
|