All checks were successful
Prevents package manager errors when running install script in Git Bash by detecting Windows environment and only checking for essential tools.
365 lines
11 KiB
Bash
365 lines
11 KiB
Bash
#!/bin/bash
|
|
# shellcheck source=/dev/null
|
|
# hyperterm installer
|
|
# shellcheck disable=SC1117
|
|
|
|
# Languages
|
|
# ---------
|
|
function msg() {
|
|
case ${LANG/_*/} in
|
|
es)
|
|
echo -e "$1"
|
|
;;
|
|
*)
|
|
echo -e "$2"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
function msg_err() {
|
|
case ${LANG/_*/} in
|
|
es)
|
|
echo -e "$1" >&2
|
|
;;
|
|
*)
|
|
echo -e "$2" >&2
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# ----------
|
|
# Get OS ID
|
|
# ----------
|
|
function get_os_id() {
|
|
cat /etc/*release 2>/dev/null |
|
|
tr '[:upper:]' '[:lower:]' |
|
|
grep "^id=" | head -n1 | cut -d= -f2 | tr -d '"'
|
|
}
|
|
|
|
# -------------------------
|
|
# Detect Git Bash/Windows
|
|
# -------------------------
|
|
function is_git_bash_windows() {
|
|
# Check if running in Git Bash on Windows
|
|
if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]] || [[ -n "$MSYSTEM" ]]; then
|
|
return 0 # true
|
|
fi
|
|
# Additional check for Windows environment
|
|
if [[ -n "$WINDIR" ]] || [[ -n "$SYSTEMROOT" ]]; then
|
|
return 0 # true
|
|
fi
|
|
return 1 # false
|
|
}
|
|
|
|
# -------------------------
|
|
# Map programs to packages
|
|
# -------------------------
|
|
function map_program_to_package() {
|
|
local program="$1"
|
|
local os="$2"
|
|
|
|
case "$program" in
|
|
ls) echo "coreutils" ;;
|
|
iproute2)
|
|
case "$os" in
|
|
fedora|rhel|centos|amzn|rocky|almalinux) echo "iproute" ;;
|
|
*) echo "iproute2" ;;
|
|
esac
|
|
;;
|
|
*) echo "$program" ;;
|
|
esac
|
|
}
|
|
|
|
# ---------------------
|
|
# Check Requirements
|
|
# -------------------
|
|
function install_package() {
|
|
local pkg="$1"
|
|
local os="$2"
|
|
local sudo_cmd=""
|
|
|
|
case "$(id -u)" in
|
|
0) sudo_cmd="" ;;
|
|
*)
|
|
if command -v doas &>/dev/null; then
|
|
sudo_cmd="doas"
|
|
else
|
|
sudo_cmd="sudo"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
case "$os" in
|
|
arch|manjaro|endeavouros|hyperbola|artix)
|
|
$sudo_cmd pacman -Sy --noconfirm "$pkg"
|
|
;;
|
|
debian|ubuntu|linuxmint|pop|pop_os)
|
|
$sudo_cmd apt update
|
|
$sudo_cmd apt install -y "$pkg"
|
|
;;
|
|
fedora|rhel|centos|amzn|rocky|almalinux)
|
|
$sudo_cmd dnf install -y "$pkg"
|
|
;;
|
|
opensuse*|suse)
|
|
$sudo_cmd zypper --non-interactive install "$pkg"
|
|
;;
|
|
void)
|
|
$sudo_cmd xbps-install -Sy "$pkg"
|
|
;;
|
|
gentoo)
|
|
$sudo_cmd emerge "app-arch/$pkg"
|
|
;;
|
|
alpine)
|
|
$sudo_cmd apk add --no-cache "$pkg"
|
|
;;
|
|
*)
|
|
msg_err "Sistema operativo no soportado: $os" "Unsupported OS: $os"
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# ---------------------------
|
|
# Check and install programs
|
|
# ---------------------------
|
|
function check_and_install_programs() {
|
|
# Skip package installation if running in Git Bash on Windows
|
|
if is_git_bash_windows; then
|
|
msg "Detectado Git Bash en Windows - omitiendo instalación de paquetes del sistema" \
|
|
"Detected Git Bash on Windows - skipping system package installation"
|
|
|
|
# Check if essential programs are available
|
|
local missing_programs=()
|
|
local programs=("curl" "unzip")
|
|
|
|
for prog in "${programs[@]}"; do
|
|
if ! command -v "$prog" &>/dev/null; then
|
|
missing_programs+=("$prog")
|
|
fi
|
|
done
|
|
|
|
if [[ ${#missing_programs[@]} -gt 0 ]]; then
|
|
msg_err "Programas requeridos no encontrados: ${missing_programs[*]}" \
|
|
"Required programs not found: ${missing_programs[*]}"
|
|
msg_err "Por favor instala Git for Windows completo que incluye estos programas." \
|
|
"Please install complete Git for Windows which includes these programs."
|
|
exit 1
|
|
fi
|
|
return 0
|
|
fi
|
|
|
|
local os_id
|
|
os_id=$(get_os_id)
|
|
local programs=("curl" "less" "ls" "iproute2" "unzip")
|
|
|
|
for prog in "${programs[@]}"; do
|
|
if ! command -v "$prog" &>/dev/null; then
|
|
local pkg
|
|
pkg=$(map_program_to_package "$prog" "$os_id")
|
|
msg "Instalando dependencia: $pkg" "Installing dependency: $pkg"
|
|
install_package "$pkg" "$os_id"
|
|
fi
|
|
done
|
|
}
|
|
# ---------------------
|
|
# Install dependencies
|
|
# ---------------------
|
|
check_and_install_programs "$@"
|
|
|
|
# ------------------------
|
|
# Check URLs availability
|
|
# ------------------------
|
|
function _url_exists() {
|
|
curl --output /dev/null --silent --head --write-out "%{http_code}" "$1"
|
|
}
|
|
|
|
function _urls() {
|
|
URL_1="https://git.fridu.us/heckyel/hyperterm/archive/master.zip"
|
|
URL_2="https://c.fridu.us/software/hyperterm.git/snapshot/hyperterm-master.zip"
|
|
case "$(_url_exists "$URL_1")" in
|
|
200) URL="$URL_1" ;;
|
|
*)
|
|
case "$(_url_exists "$URL_2")" in
|
|
200) URL="$URL_2" ;;
|
|
*)
|
|
msg_err "No se pudo acceder a las URLs de HyperTerm." \
|
|
"Could not access HyperTerm URLs."
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# -----------
|
|
# Show usage
|
|
# -----------
|
|
function show_usage() {
|
|
msg "\n$0: Instalar HyperTerm" \
|
|
"\n$0: Install HyperTerm"
|
|
msg "Comando:\n$0 [argumentos] \n" \
|
|
"Usage:\n$0 [arguments] \n"
|
|
msg "Argumentos:" \
|
|
"Arguments:"
|
|
msg "--help (-h): Muestra mensaje de ayuda" \
|
|
"--help (-h): Display this help message"
|
|
msg "--silent (-s): Instala sin pedir interacción" \
|
|
"--silent (-s): Install silently"
|
|
msg "--no-modify-config (-n): No modifica archivo config" \
|
|
"--no-modify-config (-n): Do not modify config file"
|
|
exit 0
|
|
}
|
|
|
|
# --------------------------
|
|
# Download and unzip archive
|
|
# --------------------------
|
|
function download_and_unzip() {
|
|
_urls
|
|
|
|
msg "\e[1;32m==>\e[0m\033[1m Descargando HyperTerm... \e[m" \
|
|
"\e[1;32m==>\e[0m\033[1m Downloading HyperTerm... \e[m"
|
|
|
|
TMP_DIR=$(mktemp -d /tmp/hyperterm.XXXXXX)
|
|
ZIP_FILE="$TMP_DIR/hyperterm.zip"
|
|
|
|
curl -L -o "$ZIP_FILE" "$URL"
|
|
|
|
msg "\e[1;32m==>\e[0m\033[1m Descomprimiendo HyperTerm... \e[m" \
|
|
"\e[1;32m==>\e[0m\033[1m Unzipping HyperTerm... \e[m"
|
|
|
|
unzip -q "$ZIP_FILE" -d "$TMP_DIR"
|
|
# The unzip folder will be something like hyperterm-master or hyperterm-master.zip contents
|
|
|
|
# Move extracted files to ~/.hyperterm
|
|
mkdir -p "$HOME/.hyperterm"
|
|
# Find extracted dir
|
|
EXTRACTED_DIR=$(find "$TMP_DIR" -mindepth 1 -maxdepth 1 -type d | head -n 1)
|
|
|
|
cp -r "$EXTRACTED_DIR/hyperterm"/* "$HOME/.hyperterm/"
|
|
|
|
# Copy .bash_profile and template files if exist
|
|
if [[ -f "$EXTRACTED_DIR/.bash_profile" ]]; then
|
|
cp "$EXTRACTED_DIR/.bash_profile" "$HOME/"
|
|
fi
|
|
|
|
mkdir -p "$HOME/.hyperterm/template"
|
|
if [[ -f "$EXTRACTED_DIR/template/bash_profile.template.bash" ]]; then
|
|
cp "$EXTRACTED_DIR/template/bash_profile.template.bash" "$HOME/.hyperterm/template/"
|
|
fi
|
|
|
|
# Clean temp
|
|
rm -rf "$TMP_DIR"
|
|
}
|
|
|
|
# -------------------
|
|
# Backup and install
|
|
# -------------------
|
|
function backup_and_install() {
|
|
download_and_unzip
|
|
|
|
test -w "$HOME/$CONFIG_FILE" && cp -aL "$HOME/$CONFIG_FILE" "$HOME/$CONFIG_FILE.bak" &&
|
|
msg "\033[0;36mTu archivo original $CONFIG_FILE ha sido respaldado a $CONFIG_FILE.bak \033[0m" \
|
|
"\033[0;36mYour original $CONFIG_FILE has been backed up to $CONFIG_FILE.bak \033[0m"
|
|
|
|
sed "s|{{HYPER_BASH}}|$HYPER_BASH|" "$HOME/.hyperterm/template/bash_profile.template.bash" > "$HOME/$CONFIG_FILE"
|
|
|
|
msg "\033[0;36mPlantilla copiada a ~/$CONFIG_FILE \033[0m" \
|
|
"\033[0;36mTemplate copied to ~/$CONFIG_FILE \033[0m"
|
|
}
|
|
|
|
# -----------
|
|
# Parse args
|
|
# -----------
|
|
for param in "$@"; do
|
|
shift
|
|
case "$param" in
|
|
"--help") set -- "$@" "-h" ;;
|
|
"--silent") set -- "$@" "-s" ;;
|
|
"--no-modify-config") set -- "$@" "-n" ;;
|
|
*) set -- "$@" "$param" ;;
|
|
esac
|
|
done
|
|
|
|
OPTIND=1
|
|
while getopts "hsn" opt; do
|
|
case "$opt" in
|
|
h) show_usage ;;
|
|
s) silent=true ;;
|
|
n) no_modify_config=true ;;
|
|
?) show_usage >&2 ;;
|
|
esac
|
|
done
|
|
shift $((OPTIND - 1))
|
|
|
|
# ------------------------------
|
|
# Setup config file based on OS
|
|
# ------------------------------
|
|
case "$OSTYPE" in
|
|
darwin*) CONFIG_FILE=".bash_profile" ;;
|
|
*) CONFIG_FILE=".bashrc" ;;
|
|
esac
|
|
|
|
HYPER_BASH="$(cd "$(dirname "$0")" && pwd)"
|
|
|
|
msg "Instalando HyperTerm" "Installing HyperTerm"
|
|
|
|
if ! [[ "$silent" ]] && ! [[ "$no_modify_config" ]]; then
|
|
if [[ -e "$HOME/$CONFIG_FILE.bak" ]]; then
|
|
msg_err "\033[0;36mArchivo de respaldo ya existe. Haz backup antes de instalar.\033[0m" \
|
|
"\033[0;36mBackup file already exists. Please backup before installing.\033[0m"
|
|
while true; do
|
|
read -e -n 1 -r -p "$(msg "¿Sobrescribir backup? [s/N] " "Overwrite backup? [y/N] ") " RESP
|
|
case "$RESP" in
|
|
[yYsS]) break ;;
|
|
[nN]|"") msg "Instalación abortada." "Installation aborted."; exit 1 ;;
|
|
*) msg "Elige sí o no." "Choose y or n." ;;
|
|
esac
|
|
done
|
|
fi
|
|
|
|
while true; do
|
|
read -e -n 1 -r -p "$(msg "¿Conservar $CONFIG_FILE y añadir plantilla HyperTerm al final? [s/N] " "Keep $CONFIG_FILE and append HyperTerm template? [y/N] ") " choice
|
|
case "$choice" in
|
|
[yYsS])
|
|
download_and_unzip "$@"
|
|
test -w "$HOME/$CONFIG_FILE" && cp -aL "$HOME/$CONFIG_FILE" "$HOME/$CONFIG_FILE.bak" &&
|
|
msg "\033[0;36mRespaldo creado en $CONFIG_FILE.bak \033[0m" "\033[0;36mBackup created at $CONFIG_FILE.bak \033[0m"
|
|
(sed "s|{{HYPER_BASH}}|$HYPER_BASH|" "$HOME/.hyperterm/template/bash_profile.template.bash" | tail -n +2) >> "$HOME/$CONFIG_FILE"
|
|
msg "\033[0;36mPlantilla HyperTerm añadida a $CONFIG_FILE\033[0m" "\033[0;36mHyperTerm template added to $CONFIG_FILE\033[0m"
|
|
break
|
|
;;
|
|
[nN]|"")
|
|
backup_and_install "$@"
|
|
break
|
|
;;
|
|
*)
|
|
msg "Elige sí o no." "Choose y or n."
|
|
;;
|
|
esac
|
|
done
|
|
elif [[ "$silent" ]] && ! [[ "$no_modify_config" ]]; then
|
|
backup_and_install "$@"
|
|
fi
|
|
|
|
echo ""
|
|
msg "\e[1;32m==>\e[0m\033[1m Instalación finalizada con éxito! Disfruta HyperTerm! \e[m" \
|
|
"\e[1;32m==>\e[0m\033[1m Installation finished successfully! Enjoy HyperTerm! \e[m"
|
|
|
|
msg "\033[0;36mPara empezar, abre una nueva pestaña o haz 'source $HOME/$CONFIG_FILE'.\033[0m" \
|
|
"\033[0;36mTo start, open a new tab or 'source $HOME/$CONFIG_FILE'.\033[0m"
|
|
|
|
echo ""
|
|
msg "¡Gracias por instalar!" "Thank you for installing!"
|
|
echo -e '\033[0;36m __ __ ______ '
|
|
echo -e '\033[0;36m / / / /_ ______ ___ ____/_ __/__ _________ ___ '
|
|
echo -e '\033[0;36m / /_/ / / / / __ \/ _ \/ ___// / / _ \/ ___/ __ `__ \ '
|
|
echo -e '\033[0;36m / __ / /_/ / /_/ / __/ / / / / __/ / / / / / / / '
|
|
echo -e '\033[0;36m /_/ /_/\__, / .___/\___/_/ /_/ \___/_/ /_/ /_/ /_/ '
|
|
echo -e '\033[0;36m /____/_/ '
|
|
echo -e '\033[m'
|
|
|
|
msg "Para evitar problemas, activa solo las funciones que uses en $HOME/.hyperterm/_custom.sh" \
|
|
"To avoid issues, enable only the features you want from $HOME/.hyperterm/_custom.sh"
|
|
msg "Puedes reportar errores en \033[0;36mhttps://todo.sr.ht/~heckyel/hyperterm \033[0m" \
|
|
"You can report issues at \033[0;36mhttps://todo.sr.ht/~heckyel/hyperterm \033[0m"
|