adamchilcott icon

install.sh

adamchilcott | PRO | 03/10/19 03:03:41 AM UTC | 0 ⭐ | 1109 👁️ | Never ⏰ | []
Bash |

9.59 KB

|

None

|

0 👍

/

0 👎

#!/bin/bash
 
unset IFS
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH"
 
# Prompt user until they type Y/y or N/n
# Calling:
# prompt_yesno
prompt_yesno() {
    local input=""
 
    while true; do
        printf "%s" "(Y/n): "
        read input
 
        if [ "$input" = "" ] || [ "$input" = "Y" ] || [ "$input" = "y" ]; then
            return 0
        fi
 
        if [ "$input" = "N" ] || [ "$input" = "n" ]; then
            return 1
        fi
    done
}
 
if [ "$BASH_VERSION" = "" ]; then
    echo Required bash scripting environment not detected. You are likely running with /bin/sh. Rerun with /bin/bash?
    if prompt_yesno; then /bin/bash "$0"; fi
    exit 0
fi
 
if [ $UID -ne 0 ]; then
    # Clear out any existing credentials so the user always gets a prompt
    sudo -K
    echo "Type your password below to give ScreenConnect permission to install: "
    echo "(You can also Ctrl-C to exit and re-run the script as root)"
    sudo "$0"
    exit 0
fi
 
INSTALL_SCRIPT_PATH="$(dirname "$0")"
INSTALL_DIRECTORY="$INSTALL_SCRIPT_PATH/Installer"
SCREENCONNECT_DIRECTORY="$INSTALL_SCRIPT_PATH/ScreenConnect"
MIN_UPGRADE_VERSION="5.3"
 
source "$INSTALL_DIRECTORY/functions.sh"
 
echo ""
echo "Welcome to the ScreenConnect Installer"
echo ""
echo "The installer will do these things:"
echo "1) Prompt you for installation options"
echo "2) Display a list of actions to be taken"
echo "3) Prompt you for execution of the actions"
echo "4) Execute the actions"
 
find "$INSTALL_DIRECTORY/Distributions" -name "*.sh" -not -name ".*" | sort > /tmp/distros
 
while read distroFile; do
    source "$distroFile"
 
    if is_distro_valid; then
        break;
    fi
done < /tmp/distros
 
rm /tmp/distros
 
demand_system_compatible
 
# This is filled by the base dependencies function (or whatever a script adds in dependency_check()
# It consists of dependencies that need to be addressed in the form dependency:reason
problematic_dependencies=()
# These actions are used by the build_install_actions script
installer_actions=()
installer_action_descriptions=()
 
# Execute the actual dependency check, this will fill problematic_dependencies
dependency_check
 
# Loop through the missing dependencies and build the installer action and description arrays
for i in ${!problematic_dependencies[*]}
do
    # Each element is dependency:reason
    dependency_parts=($(echo "${problematic_dependencies[$i]}"))
    build_dependency_action "${dependency_parts[0]}"
 
    if [ $? == 1 ]; then
        # Return value of 1 means a build action was added, so remove the element from the array
        unset problematic_dependencies[$i]
    fi
done
 
if [ ${#problematic_dependencies[*]} -gt 0 ]; then
    echo ""
    echo "We were unable to resolve these dependencies:"
 
    is_a_dependency_critical=0
 
    for i in ${!problematic_dependencies[*]}
    do
        echo ${problematic_dependencies[$i]}
        (echo ${problematic_dependencies[$i]} | grep "(critical)" > /dev/null) && is_a_dependency_critical=1
    done
 
    if [ $is_a_dependency_critical -eq 1 ]; then
        echo ""
        echo "One or more critical dependencies could not be resolved. Installation cannot continue."
        exit 1
    fi
 
    echo ""
    echo "None of these are required. Would you like to continue?"
 
    if ! prompt_yesno; then
        echo "Exiting due to unresolved dependencies..."
        exit 1
    fi
fi
 
# Prompt user for options
installation_directory="/opt/ScreenConnect"
 
# Let's use the new lower case one unless the old one exists
# OS X's filesystem is case-insensitive, so a simple test -d $installation_directory won't distinguish between /opt/ScreenConnect and /opt/screenconnect
# However, if you make bash do filename expansion, it will distinguish between them
# Surrounding every non-slash character following a slash with [] will result in /opt/ScreenConnect if it does exist and /[o]pt/[S]creenConnect if it doesn't
# The right-hand expression in the test must be unquoted for this wildcard expansion to happen
if [ $installation_directory != $(echo "$installation_directory" | sed 's,/\([^/]\),/[\1],g') ]; then installation_directory="/opt/screenconnect"; fi
 
while true; do
    echo ""
    echo "Where would you like to install ScreenConnect?"
    printf "%s" "[$installation_directory] "
    read input
 
    if [ "$input" == "" ]; then
        break;
    elif [[ "$input" == "/"* ]]; then
        installation_directory=$input
        break;
    else
        echo ""
        echo "Invalid location"
    fi
done
 
installer="`cd "$(dirname $0)"; pwd`/$(basename $0)" # installer full path
if [[ $installer == $installation_directory/* ]]; then
    echo "The ScreenConnect installation directory cannot contain the installer ('$installer'). Please move the installer or choose a different location to install ScreenConnect and rerun this script."
    exit 1
fi
 
is_upgrade=0
 
if test -d "$installation_directory"; then is_upgrade=1; fi
 
if [ $is_upgrade -eq 1 ]; then
    old_version=$(get_product_version "$installation_directory")
 
    if ! is_version_a_gte_version_b "$old_version" "$MIN_UPGRADE_VERSION"; then
        echo ""
        echo "This package only supports upgrading from ScreenConnect $MIN_UPGRADE_VERSION or higher. Your version was detected as ${old_version}. Please upgrade and rerun this package."
        exit 1
    fi
 
    new_version=$(get_product_version "$SCREENCONNECT_DIRECTORY")
 
    if ! is_version_a_gte_version_b "$new_version" "$old_version"; then
        echo ""
        echo "Detected existing installation at version $old_version. Cannot downgrade to $new_version."
        exit 1
    fi
 
    echo ""
    echo "It appears that there is already an installation at $installation_directory ($old_version)"
    echo "Would you like to upgrade?"
 
    if ! prompt_yesno; then
        echo "Installation directory already exists, and you chose not to upgrade it. Please erase the existing installation to perform a fresh install in $installation_directory or rerun this script and choose to upgrade"
        exit 1
    fi
fi
 
# Setup environment because we have to call mono
export PATH=$installation_directory/App_Runtime/bin:$PATH
export MONO_PATH=$installation_directory/App_Runtime/lib
export MONO_CFG_DIR=$installation_directory/App_Runtime/etc
 
# Find init.d or whatever is appropriate for this distro
initialize_startup_directory_information
 
service_name=""
 
# Stop any running services and remove any existing service startup scripts
# (That point to the install folder) if upgrading
# This also gets the service name
if [ $is_upgrade -eq 1 ]; then
    service_names=()
    get_existing_service_names
 
    if [ ${#service_names[*]} -gt 0 ]; then
        for cur_service_name in ${service_names[*]}
        do
            build_stop_and_remove_service_action "$cur_service_name"
        done
 
        service_name=${service_names[0]}
    fi
fi
 
if [ "$service_name" == "" ]; then
    service_name=$(basename "$installation_directory" | tr "[A-Z]" "[a-z]")
fi
 
# Determining name of init.d script / service name
while true; do
    echo ""
    echo "What would you like as the service name for this ScreenConnect installation?"
    printf "%s" "[$service_name] "
    read input
 
    if ! [[ "$input" =~ ^[a-zA-Z0-9_\-]*$ ]]; then
        echo ""
        echo "Service name can only contain letters, numbers, underscores, and hyphens"
    elif [ "$input" != "" ]; then
        service_name=$input
        break
    else
        break
    fi
done
 
backup_mtime_unprefixed_reference_file_name=Core.dll
backup_mtime_leeway_seconds=60
 
# Build up a list of what we need to do
# Back up files if upgrading
if [ $is_upgrade -eq 1 ]; then
    installer_actions[${#installer_actions[*]}]="make_backup"
    installer_action_descriptions[${#installer_action_descriptions[*]}]="Back up the existing configuration"
fi
 
# Run distribution-specific function to add the build actions to do startup scripts
build_startup_actions
 
mono_executable_file_path=$(get_mono_executable_file_path "$INSTALL_DIRECTORY")
 
if [ "$mono_executable_file_path" = "" ]; then
    echo ""
    echo "Could not find a suitable version of runtime executable for your system. This could be due to an unsupported instruction set. This could also be due to wiping of the execute bits during extraction of the tarball when /tmp is mounted with noexec."
    exit 1
fi
 
# Copy installation files
installer_actions[${#installer_actions[*]}]="copy_installation_files"
installer_action_descriptions[${#installer_action_descriptions[*]}]="Copy files into $installation_directory"
 
# Determine configuration for xsl transform
configuration="Release"
if ls "$SCREENCONNECT_DIRECTORY"/Bin/*.mdb &>/dev/null; then
    configuration="Debug"
fi
 
# Restore backed up files if upgrading
if [ $is_upgrade -eq 1 ]; then
    installer_actions[${#installer_actions[*]}]="restore_backup"
    installer_action_descriptions[${#installer_action_descriptions[*]}]="Restore backed up configuration"
fi
 
# Do the transforms
installer_actions[${#installer_actions[*]}]="transform_configuration_files"
installer_action_descriptions[${#installer_action_descriptions[*]}]="Transform configuration files"
 
# Start screenconnect
build_start_service_action
 
# Confirm the what we're going to do
echo ""
echo "The installation will perform the following actions:"
 
for i in ${!installer_action_descriptions[*]}
do
    echo "- ${installer_action_descriptions[i]}"
done
 
echo ""
echo "Do you want to install ScreenConnect?"
 
if prompt_yesno; then
    echo ""
 
    # Do the install
    for i in ${!installer_actions[*]}
    do
        echo "Running '${installer_action_descriptions[i]}'..."
        eval ${installer_actions[i]}
    done
 
    echo ""
    echo "Installation complete!"
    echo ""
    echo "Trying to figure out the best URL for you to use..."
    echo ""
 
    launch_web_page "$(mono "$installation_directory/Bin/ScreenConnect.Service.exe" launch host)"
 
    echo ""
    exit 0
else
    echo "You chose not to install, your system has not been modified."
fi

Comments