diff --git a/lib/ColorUtils.sh b/lib/ColorUtils.sh new file mode 100755 index 0000000..c87df81 --- /dev/null +++ b/lib/ColorUtils.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +SandboxUtilsVersion="1.0" + +################################# < Shell Color Codes > ################################ +readonly CRed="\e[1;31m" +readonly CGrn="\e[1;32m" +readonly CYel="\e[1;33m" +readonly CBlu="\e[1;34m" +readonly CPrp="\e[5;35m" +readonly CCyn="\e[5;36m" +readonly CGry="\e[0;37m" +readonly CWht="\e[1;37m" +readonly CClr="\e[0m" + +# FLUXSCRIPT END diff --git a/lib/installer/InstallerUtils.sh b/lib/installer/InstallerUtils.sh new file mode 100644 index 0000000..7764b54 --- /dev/null +++ b/lib/installer/InstallerUtils.sh @@ -0,0 +1,208 @@ +#!/bin/bash + +if [ "$InstallerUtilsVersion" ]; then return 0; fi +readonly InstallerUtilsVersion="1.0" + +InstallerUtilsWorkspacePath="/tmp/verspace" + +InstallerUtilsOutputDevice="/dev/stdout" + +InstallerUtilsNoticeMark="*" + +function installer_utils_run_spinner() { + local pid=$1 + local delay=0.15 + local spinstr='|/-\' + + tput civis + while [ "`ps a | awk '{print $1}' | grep $pid`" ]; do + local temp=${spinstr#?} + printf " [%c] " "$spinstr" + local spinstr=$temp${spinstr%"$temp"} + sleep $delay + printf "\b\b\b\b\b\b" + done + + printf " \b\b\b\b" + tput cnorm +} + +# Pamaters: $1 - url $2 - regex +function installer_utils_check_version() { + if [ ! "$1" ]; then return 1; fi + + # Attempt to retrieve versioning information from repository script. + local __installer_utils_check_version__online=("`timeout -s SIGTERM 20 curl "$1" 2>/dev/null | egrep "$2"`") + + if [ "${__installer_utils_check_version__online[@]}" ] + then echo -e "${__installer_utils_check_version__online[@]}" > "$InstallerUtilsWorkspacePath/latest_version" + fi +} + +# Pamaters: $1 - update url $2 - update regex $3 - local version $4 - local revision +function installer_utils_check_update() { + local versionDialog="Online Version" + local versionDialogOffset=$(($(tput cols) / 2 + ((${#versionDialog} / 2) - 4))) + printf "%${versionDialogOffset}s" "$versionDialog" + + installer_utils_check_version "${@:1:2}" & + installer_utils_run_spinner "$!" + + local __installer_utils_check_update__localVersion=$3 + local __installer_utils_check_update__localRevision=$4 + local __installer_utils_check_update__version="?" + local __installer_utils_check_update__revision="?" + + if [ -f "$InstallerUtilsWorkspacePath/latest_version" -a \ + -s "$InstallerUtilsWorkspacePath/latest_version" ]; then + mapfile __installer_utils_check_update__vInfo < "$InstallerUtilsWorkspacePath/latest_version" + __installer_utils_check_update__version=$(echo "${__installer_utils_check_update__vInfo[@]}" | awk -F= 'tolower($1)~/version/{print $2}') + __installer_utils_check_update__revision=$(echo "${__installer_utils_check_update__vInfo[@]}" | awk -F= 'tolower($1)~/revision/{print $2}') + fi + + echo -e "$CClr [$__installer_utils_check_update__version.$__installer_utils_check_update__revision$CClr]" + + echo + + if [ "$__installer_utils_check_update__version" != "?" -a "$__installer_utils_check_update__revision" != "?" ]; then + if [ "$__installer_utils_check_update__version" -gt "$__installer_utils_check_update__localVersion" -o \ + "$__installer_utils_check_update__version" -eq "$__installer_utils_check_update__localRevision" -a \ + "$__installer_utils_check_update__revision" -gt "$__installer_utils_check_update__localRevision" ]; then + format_center_literals "${CRed}A newer version has been found!$CClr" + return 0 + fi + fi + + return 1 # Failure +} + +# Parameters: $1 - Update source (zip) $2 - Backup file name $3 - Update output +function installer_utils_run_update() { + if [ ${#@} -ne 2 ]; then return 1; fi + + local __installer_utils_run_update__source="$1" + local __installer_utils_run_update__backup="$2" + local __installer_utils_run_update__output="$3" + + format_center_literals "${CYel}[ Press Y or enter to update, anything else to skip ]$CClr" + + tput civis + local __installer_utils_run_update__option + read -N1 __installer_utils_run_update__option + tput cnorm + + __installer_utils_run_update__option=${__installer_utils_run_update__option:-Y} + + # If the user doesn't want to upgrade, stop this procedure. + if [ "$__installer_utils_run_update__option" != "Y" -a \ + "$__installer_utils_run_update__option" != "y" ] + then return 1 + fi + + local __installer_utils_run_update__backupFile="$__installer_utils_run_update__backup-`date +%F_%T`" + local __installer_utils_run_update__backupPath="`dirname $__installer_utils_run_update__output`/$__installer_utils_run_update__backupFile.7z" + + # If a file with the backup name already exists, abort. + if [ -f "$__installer_utils_run_update__backupPath" ] + then return 2 + fi + + format_center_literals "${CClr}[ ~ Creating Backup ~ ]$CClr"; echo + # This could use a progress indicator, but I'm a bit tired. + 7zr a "$__installer_utils_run_update__backupPath" "$__installer_utils_run_update__output" &> $InstallerUtilsOutputDevice + + + format_center_literals "${CClr}[ ~ Downloading Update ~ ]$CClr"; echo + if ! curl -L "$__installer_utils_run_update__source" -o "$InstallerUtilsWorkspacePath/update.zip"; then + format_center_literals "${CRed}[ ~ Download Failed ~ ]$CClr" + sleep 3 + return 3 + fi + + format_center_literals "${CClr}[ ~ Verifying Download ~ ]$CClr"; echo + if ! unzip -t "$InstallerUtilsWorkspacePath/update.zip"; then + format_center_literals "${CRed}[ ~ Download Appears Corrupted ~ ]$CClr" + sleep 3 + return 4 + fi + + format_center_literals "${CClr}[ ~ Extracting Files ~ ]$CClr"; echo + mkdir "$InstallerUtilsWorkspacePath/update_contents" + unzip "$InstallerUtilsWorkspacePath/update.zip" -d "$InstallerUtilsWorkspacePath/update_contents" + + + if [ ! -d "$__installer_utils_run_update__output" ]; then + if ! mkdir -p "$__installer_utils_run_update__output"; then + format_center_literals "${CRed}[ ~ Failed To Create Destination Directory ~ ]$CClr"; echo + fi + fi + + format_center_literals "${CClr}[ ~ Moving Files ~ ]$CClr"; echo + mv "$InstallerUtilsWorkspacePath"/update_contents/* "$__installer_utils_run_update__output" + + format_center_literals "${CGrn}[ ~ Update Completed ~ ]$CClr"; echo + sleep 3 +} + +# Parameters: $1 - CLI Tools required array $2 - CLI Tools missing array (will be populated) +function installer_utils_check_dependencies() { + if [ ${#@} -ne 2 ]; then return 1; fi + + local __installer_utils_run_dependencies__CLITools=("${!1}") + local __installer_utils_run_dependencies__CLIToolsMissing=("${!2}") + + local __installer_utils_run_dependencies__CLITool + for __installer_utils_run_dependencies__CLITool in "${__installer_utils_run_dependencies__CLITools[@]}"; do + local __installer_utils_run_dependencies__identifier="`printf "%-44s" "$__installer_utils_run_dependencies__CLITool"`" + local __installer_utils_run_dependencies__state=".....$CGrn OK.$CClr" + + if ! hash "$__installer_utils_run_dependencies__CLITool" 2>/dev/null; then + __installer_utils_run_dependencies__state="$CRed Missing!$CClr" + __installer_utils_run_dependencies__CLIToolsMissing+=("$__installer_utils_run_dependencies__CLITool") + fi + + format_center_literals "$InstallerUtilsNoticeMark ${__installer_utils_run_dependencies__identifier// /.}$__installer_utils_run_dependencies__state" + echo -e "$FormatCenterLiterals" + done + + if [ ${#__installer_utils_run_dependencies__CLIToolsMissing[@]} -gt 0 ]; then return 2; fi +} + +# Parameters: $1 - CLI Tools missing array (will be installed) $2 - substitutes array +function installer_utils_run_dependencies() { + if [ "${#@}" -ne 2 ]; then return 1; fi + + # The array below holds all the packages that will be installed. + local __installer_utils_run_dependencies__packages=("${!1}") + # The array below holds packages and their substitution. + local __installer_utils_run_dependencies__substitutes=("${!2}") + + local __installer_utils_run_dependencies__managers=(lib/installer/managers/*) + + local __installer_utils_run_dependencies__manager + for __installer_utils_run_dependencies__manager in "${__installer_utils_run_dependencies__managers[@]}"; do + source "$__installer_utils_run_dependencies__manager" + if [ "$PackageManagerCLT" ]; then break; fi + done + + if [ ! "$PackageManagerCLT" ]; then + format_center_literals "${CRed}[ ~ No Suitable Package Manager Found ~ ]$CClr"; echo + sleep 3 + return 2 + fi + + prep_package_manager + + for __installer_utils_run_dependencies__package in "${__installer_utils_run_dependencies__packages[@]}"; do + clear + local __installer_utils_run_dependencies__target=$__installer_utils_run_dependencies__package + if [ "${__installer_utils_run_dependencies__substitutes[$__installer_utils_run_dependencies__package]}" + then __installer_utils_run_dependencies__target=${__installer_utils_run_dependencies__substitutes[$__installer_utils_run_dependencies__package]} + fi + $PackageManagerCLT $PackageManagerCLTInstallOptions $__installer_utils_run_dependencies__target + done + + unprep_package_manager +} + +# FLUXSCRIPT END diff --git a/lib/installer/managers/apt-get.sh b/lib/installer/managers/apt-get.sh new file mode 100644 index 0000000..2c5ebda --- /dev/null +++ b/lib/installer/managers/apt-get.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +if [ -f "/etc/debian_version" ] + PackageManagerCLT="apt-get" + PackageManagerCLTInstallOptions="install -y" + PackageManagerCLTRemoveOptions="remove -y" + + PackageManagerOutputDevice="/dev/stdout" + + function unprep_package_manager() { + echo "$(cat /etc/apt/sources.list | grep -v 'deb http://http.kali.org/kali kali-rolling main contrib non-free # Installed By FLUXION')" > /etc/apt/sources.list + } + + function prep_package_manager() { + if [ ! "`(cat /etc/apt/sources.list | grep 'deb http://http.kali.org/kali kali-rolling main contrib non-free'`" ]; then + gpg --keyserver hkp://keys.gnupg.net --recv-key 7D8D0BF6 + apt-key adv --keyserver pgp.mit.edu --recv-keys ED444FF07D8D0BF6 + echo "deb http://http.kali.org/kali kali-rolling main contrib non-free # Installed By FLUXION" >> /etc/apt/sources.list + fi + + # Cleanup package manager + sudo apt-get install -f -y | tee -a $PackageManagerOutputDevice + sudo apt-get autoremove -y | tee -a $PackageManagerOutputDevice + sudo apt-get autoclean -y | tee -a $PackageManagerOutputDevice + sudo apt-get clean -y | tee -a $PackageManagerOutputDevice + sudo apt-get update | tee -a $PackageManagerOutputDevice + } +fi + +# FLUXSCRIPT END diff --git a/lib/installer/managers/emerge.sh b/lib/installer/managers/emerge.sh new file mode 100644 index 0000000..59533df --- /dev/null +++ b/lib/installer/managers/emerge.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +if [ -f "/etc/gentoo-release" ] + PackageManagerCLT="emerge" + PackageManagerCLTInstallOptions="-s" + PackageManagerCLTRemoveOptions="" + + PackageManagerOutputDevice="/dev/stdout" + + function unprep_package_manager() { + echo "Nothing to unprepare." > $PackageManagerOutputDevice + } + + function prep_package_manager() { + echo "Nothing to prepare." > $PackageManagerOutputDevice + } +fi + +# FLUXSCRIPT END diff --git a/lib/installer/managers/pacman.sh b/lib/installer/managers/pacman.sh new file mode 100644 index 0000000..4465535 --- /dev/null +++ b/lib/installer/managers/pacman.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +if [ -f "/etc/arch-release" ] + PackageManagerCLT="pacman" + PackageManagerCLTInstallOptions="-S -y" + PackageManagerCLTRemoveOptions="-Rs" + + PackageManagerOutputDevice="/dev/stdout" + + function unprep_package_manager() { + echo "Nothing to unprepare." > $PackageManagerOutputDevice + } + + function prep_package_manager() { + echo "Nothing to prepare." > $PackageManagerOutputDevice + } +fi + +# FLUXSCRIPT END diff --git a/lib/installer/managers/yum.sh b/lib/installer/managers/yum.sh new file mode 100644 index 0000000..46a1f7b --- /dev/null +++ b/lib/installer/managers/yum.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +if [ -f "/etc/redhat-release" ] + PackageManagerCLT="yum" + PackageManagerCLTInstallOptions="-y install" + PackageManagerCLTRemoveOptions="remove" + + PackageManagerOutputDevice="/dev/stdout" + + function unprep_package_manager() { + echo "Nothing to unprepare." > $PackageManagerOutputDevice + } + + function prep_package_manager() { + echo "Nothing to prepare." > $PackageManagerOutputDevice + } +fi + +# FLUXSCRIPT END diff --git a/lib/installer/managers/zypp.sh b/lib/installer/managers/zypp.sh new file mode 100644 index 0000000..2d26121 --- /dev/null +++ b/lib/installer/managers/zypp.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +if [ -f "/etc/SuSE-release" ] + PackageManagerCLT="zypp" + PackageManagerCLTInstallOptions="install" + PackageManagerCLTRemoveOptions="remove" + + PackageManagerOutputDevice="/dev/stdout" + + function unprep_package_manager() { + echo "Nothing to unprepare." > $PackageManagerOutputDevice + } + + function prep_package_manager() { + echo "Nothing to prepare." > $PackageManagerOutputDevice + } +fi + +# FLUXSCRIPT END