325 lines
10 KiB
Bash
325 lines
10 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 '"'
|
|
}
|
|
|
|
# -------------------------
|
|
# 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() {
|
|
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"
|