mirror of
https://github.com/winapps-org/winapps.git
synced 2025-06-03 21:57:18 +02:00
388 lines
12 KiB
Bash
Executable File
388 lines
12 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
|
|
|
|
. "${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 $(ls "${DIR}/apps"); do
|
|
. "${DIR}/apps/${F}/info"
|
|
echo "IF EXIST \"${WIN_EXECUTABLE}\" ECHO ${F} >> \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp" >>${HOME}/.local/share/winapps/installed.bat
|
|
done
|
|
echo "powershell.exe -ExecutionPolicy Bypass -File \\\\tsclient\\home\\.local\\share\\winapps\\ExtractPrograms.ps1 > \\\\tsclient\home\\.local\\share\\winapps\\detected" >>${HOME}/.local/share/winapps/installed.bat
|
|
echo "RENAME \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp installed" >>${HOME}/.local/share/winapps/installed.bat
|
|
$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:"/C \\\\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() {
|
|
. "${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=${SYS_PATH}/apps/${1}/icon.${2}
|
|
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."
|
|
}
|
|
|
|
function waConfigureApps() {
|
|
APPS=()
|
|
for F in $(cat "${HOME}/.local/share/winapps/installed" | sed 's/\r/\n/g'); do
|
|
. "${DIR}/apps/${F}/info"
|
|
APPS+=("${FULL_NAME} (${F})")
|
|
INSTALLED_EXES+=("$(echo "${WIN_EXECUTABLE##*\\}" | tr '[:upper:]' '[:lower:]')")
|
|
done
|
|
IFS=$'\n' 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
|
|
for F in $(cat "${HOME}/.local/share/winapps/installed" | sed 's/\r/\n/g'); do
|
|
COUNT=$((COUNT + 1))
|
|
${SUDO} cp -r "apps/${F}" "${SYS_PATH}/apps"
|
|
waConfigureApp "${F}" svg
|
|
done
|
|
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
|
|
for F in $(cat "${HOME}/.local/share/winapps/installed" | sed 's/\r/\n/g'); do
|
|
COUNT=$((COUNT + 1))
|
|
${SUDO} cp -r "apps/${F}" "${SYS_PATH}/apps"
|
|
waConfigureApp "${F}" svg
|
|
done
|
|
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"
|
|
. "${HOME}/.local/share/winapps/detected"
|
|
APPS=()
|
|
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 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
|
|
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
|
|
Categories=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"
|
|
for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/share/applications/"* -s); do
|
|
echo -n " Removing ${F}..."
|
|
${SUDO} rm ${F}
|
|
echo " Finished."
|
|
done
|
|
for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/bin/"* -s); 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"
|
|
for F in $(grep -l -d skip "bin/winapps" "/usr/share/applications/"* -s); do
|
|
if [ -z "${SUDO}" ]; then
|
|
waNoSudo
|
|
fi
|
|
echo -n " Removing ${F}..."
|
|
${SUDO} rm ${F}
|
|
echo " Finished."
|
|
done
|
|
for F in $(grep -l -d skip "bin/winapps" "/usr/local/bin/"* -s); 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."
|