diff --git a/01_bash/actualizar.sh b/01_bash/actualizar.sh new file mode 100755 index 0000000..80d88fd --- /dev/null +++ b/01_bash/actualizar.sh @@ -0,0 +1,110 @@ +#!/bin/bash + +# Script: actualizar.sh +# Descripción: Este script de bash tiene como objetivo actualizar y limpiar un +# sistema Linux. Utiliza colores para mensajes y maneja la salida +# de forma controlada con Ctrl + C. Presenta títulos para cada +# sección, como la limpieza de paquetes innecesarios, la +# actualización de repositorios y la actualización de paquetes +# snap. Además, solicita confirmación antes de realizar ciertas +# operaciones, como la actualización de paquetes. La última sección +# agradece al usuario por mantener su sistema actualizado. +# Author: Manuel Vergara +# Web: https://vergaracarmona.es +# + +# Colores +COLOR_RED='\e[31m' +COLOR_BLUE='\e[34m' +COLOR_RESET='\e[0m' + +# Control de salida con Ctrl + C +function ctrl_c() { + echo -e "${COLOR_RED}\n\n[!] Saliendo... \n${COLOR_RESET}" + tput cnorm + log_message "El script se ha detenido debido a una interrupción del usuario." + exit 1 +} + +# Ctrl+C +trap ctrl_c SIGINT + +# Títulos +function print_title { + local title="$1" + local title_length=${#title} + local total_length=22 + + # Calcular el tamaño del margen izquierdo y derecho + local margin_length=$(((total_length - title_length - 4) / 2)) + + # Asegurarse de que el número total de almohadillas sea siempre 22 + local left_padding=$((margin_length)) + local right_padding=$((margin_length + (title_length % 2))) + + echo -e "${COLOR_BLUE}\n$(printf '#%.0s' $(seq 1 $left_padding))#### $title ####$(printf '#%.0s' $(seq 1 $right_padding))\n${COLOR_RESET}" +} + +# Verificar permisos de superusuario +if [ "$EUID" -ne 0 ]; then + echo "Este script debe ejecutarse con privilegios de superusuario." + log_message "Error: Este script debe ejecutarse con privilegios de superusuario." + exit 1 +fi + +# Logging +LOG_FILE="/var/log/linux_update_script.log" + +function log_message() { + local message="$1" + echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >>"$LOG_FILE" +} + +log_message "Iniciando el script de actualización y limpieza." + +print_title "ANEM A ACTUALITZAR" + +print_title "AUTOREMOVE" + +sudo apt-get autoremove -y + +print_title "AUTOCLEAN" + +sudo apt-get autoclean + +print_title "UPDATE REPOS" + +sudo apt-get update + +upgradable=$(apt-get -s dist-upgrade | grep "^Inst") + +if [[ -n "$upgradable" ]]; then + echo -e "\nS'han trobat actualitzacions disponibles: " + apt list --upgradable + read -p "¿Vols actualitzar els paquets? (s/n) " confirm + if [[ "$confirm" == "s" ]]; then + sudo apt-get upgrade -y + echo -e "\nActualitzacions fetes" + fi +else + echo "No hi ha actualitzacions disponibles amb el gestor de paquets \"apt\"." +fi + +print_title "ACTUALITZEM SNAPs" + +refresh_list=$(sudo snap refresh --list) + +if [[ -n "$refresh_list" ]]; then + echo -e "\nS'han trobat actualitzacions disponibles:" + echo "$refresh_list" + read -p "¿Vols actualitzar els paquets? (s/n) " confirm + if [[ "$confirm" == "s" ]]; then + sudo snap refresh + fi +else + echo "No hi ha actualitzacions disponibles amb el gestor de paquets \"snap\"." +fi + +log_message "El script se ha ejecutado correctamente." + +print_title "GRACIES PER ACTUALITZAR EL SISTEMA" diff --git a/01_bash/calculadora.sh b/01_bash/calculadora.sh new file mode 100755 index 0000000..8ecd615 --- /dev/null +++ b/01_bash/calculadora.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +# Script: calculadora.sh +# Descripción: Este script realiza operaciones matemáticas básicas +# (suma, resta, multiplicación, división) con dos valores ingresados por el usuario. +# Author: Manuel Vergara +# Web: https://vergaracarmona.es +# + +COLOR_RED='\033[0;31m' +COLOR_RESET='\033[0m' + +# Control de salida con Ctrl + C +function ctrl_c() { + echo -e "${COLOR_RED}\n\n[!] Saliendo... \n${COLOR_RESET}" + tput cnorm; exit 1 +} + +# Ctrl+C +trap ctrl_c SIGINT + +# Función para limpiar la pantalla +limpiar_pantalla() { + clear +} + +# Función para mostrar el mensaje inicial +mensaje_inicial() { + echo "Soy GNU/cal" + sleep 1 + echo "Tú me dices lo que quieres calcular y yo te doy el resultado" + sleep 1 +} + +# Función para solicitar un valor al usuario +solicitar_valor() { + echo -e "\nIntroduce $1 valor" + read -r "$2" +} + +# Función para solicitar el operador al usuario +solicitar_operador() { + echo -e "\nIntroduce el operador. Puedes escoger entre: + - / *" + read -r operador +} + +# Función para realizar el cálculo y mostrar el resultado +calcular_resultado() { + echo -e "\nEl resultado es: " + sleep 1 + resultado="$1 $2 $3" + echo -e "$((resultado)) \n" + sleep 0.5 +} + +# Función para mostrar el agradecimiento +mensaje_final() { + echo "Gracias por su tiempo" +} + +# Main + +limpiar_pantalla +mensaje_inicial + +solicitar_valor "el primer" valor1 +solicitar_operador +solicitar_valor "el segundo" valor2 + +calcular_resultado "$valor1" "$operador" "$valor2" +mensaje_final diff --git a/01_bash/clean-snap.sh b/01_bash/clean-snap.sh new file mode 100755 index 0000000..597cdef --- /dev/null +++ b/01_bash/clean-snap.sh @@ -0,0 +1,8 @@ +#!/bin/bash +# Removes old revisions of snaps +# CLOSE ALL SNAPS BEFORE RUNNING THIS +set -eu +snap list --all | awk '/disabled/{print $1, $3}' | + while read snapname revision; do + snap remove "$snapname" --revision="$revision" + done diff --git a/01_bash/create-kind-ingress--2workers.sh b/01_bash/create-kind-ingress--2workers.sh new file mode 100755 index 0000000..86a090e --- /dev/null +++ b/01_bash/create-kind-ingress--2workers.sh @@ -0,0 +1,92 @@ +#!/bin/sh +set -o errexit + +# Script: create_kind_cluster.sh +# Descripción: Este script automatiza la creación de un clúster de Kubernetes utilizando Kind (Kubernetes en Docker). +# También configura un registro Docker local y lo conecta al clúster para permitir el uso de un registro local +# para las imágenes de contenedor. Además, instala el controlador Ingress NGINX en el clúster para manejar recursos de ingreso. +# Author: Manuel Vergara +# Web: https://vergaracarmona.es +# + + +COLOR_RED='\033[0;31m' +COLOR_RESET='\033[0m' + +# Control de salida con Ctrl + C +function ctrl_c() { + echo -e "${COLOR_RED}\n\n[!] Saliendo... \n${COLOR_RESET}" + tput cnorm; exit 1 +} + +# Ctrl+C +trap ctrl_c SIGINT + + +# Función para configurar el registro Docker local +configurar_registro_local() { + reg_name='kind-registry' + reg_port='5001' + + if [ "$(docker inspect -f '{{.State.Running}}' "${reg_name}" 2>/dev/null || true)" != 'true' ]; then + docker run -d --restart=always -p "127.0.0.1:${reg_port}:5000" --name "${reg_name}" registry:2 + fi + + if [ "$(docker inspect -f='{{json .NetworkSettings.Networks.kind}}' "${reg_name}")" = 'null' ]; then + docker network connect "kind" "${reg_name}" + fi +} + +# Función para documentar el registro local +documentar_registro_local() { + reg_port='5001' + echo "\nConfigurando el registro local...\n" + cat </dev/null 2>&1 + local exit_code=$? + if [ $exit_code -eq 0 ]; then + echo -e "\e[32mInstalación exitosa: $program $version\e[0m" + else + echo -e "\e[31mError al instalar $program $version\e[0m" + fi + else + if ! echo "$installed_versions" | grep -q "$version"; then + echo -e "\e[33mNo está instalada la versión $version de $program y se procede a hacerlo\e[0m" + asdf install "$program" "$version" >/dev/null 2>&1 + local exit_code=$? + if [ $exit_code -eq 0 ]; then + echo -e "\e[32mInstalación exitosa: $program $version\e[0m" + else + echo -e "\e[31mError al instalar $program $version\e[0m" + fi + else + echo -e "\e[32m$program ya está instalado con la versión $version\e[0m" + fi + fi +} + +# Función para configurar globalmente una versión de un programa con asdf si no está configurada +configure_asdf_global() { + local program="$1" + local version="$2" + local current_version=$(asdf current "$program" | awk '{print $2}') + if [ "$current_version" != "$version" ]; then + asdf global "$program" "$version" + echo -e "\e[32mConfiguración global exitosa de $program $version\e[0m" + fi +} + +# Función para imprimir un salto de línea +print_newline() { + echo "" +} + +# Recorre el archivo de entrada +while IFS= read -r program; do + add_asdf_plugin "$program" + latest_version=$(asdf latest "$program" 2>&1) + if [ $? -eq 0 ]; then + install_asdf_version "$program" "$latest_version" + configure_asdf_global "$program" "$latest_version" + else + echo -e "\e[31mError al obtener la última versión de $program: $latest_version\e[0m" + fi + print_newline +done < "$input_file" + +# Listar las instalaciones actuales +echo -e "\nListado de instalaciones actuales:" +list_asdf_current + diff --git a/01_bash/line_color.sh b/01_bash/line_color.sh new file mode 100755 index 0000000..63c96bd --- /dev/null +++ b/01_bash/line_color.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +BLACK="\033[30m" +RED="\033[31m" +GREEN="\033[32m" +YELLOW="\033[33m" +BLUE="\033[34m" +PINK="\033[35m" +CYAN="\033[36m" +WHITE="\033[37m" +NORMAL="\033[39m" + +echo -e $(cat </dev/null 2>&1 || { echo >&2 "${COLOR_RED}$cmd no está instalado. Instálalo con 'sudo apt-get install $cmd'${COLOR_RESET}"; exit 1; } + done +} + +# Función para obtener la IP del router +get_router_ip() { + local interface=$1 + ip route show dev "$interface" | grep default | awk '{print $3}' +} + +# Inicializar el array para almacenar información de red +network_info=() + +# Comprobar conexión +check_connection() { + print_title "COMPROBAR CONEXIÓN" + if ping -c 1 -W 2 8.8.8.8 > /dev/null 2>&1; then + echo -e "\t${COLOR_GREEN}Conexión exitosa con 8.8.8.8${COLOR_RESET}" + else + echo -e "\t${COLOR_RED}Error de conexión con 8.8.8.8${COLOR_RESET}" + + # Obtener la interfaz predeterminada + default_interface=$(ip route show default | awk '/default/ {print $5}') + + # Probar la conexión con el router + router_ip=$(get_router_ip "$default_interface") + if ping -c 1 -W 2 "$router_ip" > /dev/null 2>&1; then + echo -e "\t${COLOR_GREEN}Conexión exitosa con el router ($router_ip)${COLOR_RESET}" + else + echo -e "\t${COLOR_RED}Error de conexión con el router ($router_ip)${COLOR_RESET}" + exit 1ç + fi + fi +} + +# Comprobar estado de sitios web +check_websites() { + # Lista de sitios web a comprobar + websites=("vergaracarmona.es" "gitea.vergaracarmona.es" "diariosenderista.es" "marialuisasefardi.es" "prefapp.es") + + # Verificar el estado de sitios web + print_title "VERIFICANDO ESTADO DE WEBS" + check_website_status() { + local website=$1 + local timeout=5 + local http_code=$(curl -o /dev/null -L -s -w "%{http_code}" --max-time "$timeout" "$website") + + if [ "$http_code" -eq 200 ]; then + echo -e "\t${COLOR_GREEN}$website está levantado. ${COLOR_RESET}" + else + echo -e "\t${COLOR_RED}$website está caído (Código $http_code)${COLOR_RESET}" + fi + } + + # Iterar sobre la lista de sitios web + for site in "${websites[@]}"; do + check_website_status "$site" + done +} + + +# Obtener las interfaces de red +get_interfaces() { + print_title "TARJETAS DE RED" + while read -r interface; do + network_info+=("$(print_network_info "$interface")") + done < <(ip -o link show | awk -F': ' '{print $2}') + + print_network_table +} + +# Obtener IP pública +get_public_ip_info() { + print_title "INFO IP WAN" + curl -s https://ipinfo.io | jq -r 'to_entries[] | "\u001b[34m\(.key):\u001b[0m \u001b[32m\(.value)\u001b[0m"' +} + +# Estado de nordvpn +nordvpn_status() { + print_title "ESTADO NORDVPN" + nordvpn status | grep -v "New feature" +} + +# Nueva conexión nordvpn +nordvpn_connect() { + print_title "CONECTANDO NORDVPN" + nordvpn connect Spain Barcelona +} + +# Test de velocidad +speed_test() { + print_title "TEST DE VELOCIDAD" + speedtest +} + +# Realizar traceroute +traceroute(){ + print_title "TRACEROUTE" + mtr -c 3 -n -r 8.8.8.8 +} + +# Menú principal +main_menu() { + while true; do + print_title "Menú" + echo "1 - Comprobar conexión" + echo "2 - Verificar estado de webs" + echo "3 - Ver tarjetas de red" + echo "4 - Información de IP pública" + echo "5 - Estado de NordVPN" + echo "6 - Conectar Nordvpn" + echo "7 - Test de velocidad" + echo "8 - Traceroute" + echo "9 - Salir" + + read -p "Ingrese el número de la opción deseada: " choice + case $choice in + 1) check_connection ;; + 2) check_websites ;; + 3) get_interfaces ;; + 4) get_public_ip_info ;; + 5) nordvpn_status ;; + 6) nordvpn_connect ;; + 7) speed_test ;; + 8) traceroute ;; + 9) echo -e "${COLOR_RED}\nSaliendo...\n${COLOR_RESET}"; tput cnorm; exit 0 ;; + *) echo -e "${COLOR_RED}\nOpción inválida. Inténtelo de nuevo.${COLOR_RESET}" ;; + esac + done +} + +# Función principal +main() { + check_connection + check_websites + get_interfaces + get_public_ip_info + nordvpn_status + main_menu +} + +main diff --git a/01_bash/random_color.sh b/01_bash/random_color.sh new file mode 100755 index 0000000..3b245a6 --- /dev/null +++ b/01_bash/random_color.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +TXT='Voy a escribir un texto mucho más largo para que tenga mucho más que coger. The quick brown fox jumped over the lazy dog.' + +WORDS=( $TXT ) + +for WORD in "${WORDS[@]}"; do + let "i=$RANDOM % 256" + echo -en "\e[38;5;${i}m$WORD \e[0m"; +done; + +echo + diff --git a/01_bash/repeat_random_color.sh b/01_bash/repeat_random_color.sh new file mode 100755 index 0000000..f820869 --- /dev/null +++ b/01_bash/repeat_random_color.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +TXT='Vendo opel corsa de color platino en muy buen estado' + +WORDS=( $TXT ) + +for i in {0..50}; do + clear + for WORD in "${WORDS[@]}"; do + let "i=$RANDOM % 256" + echo -en "\e[38;5;${i}m$WORD \e[0m"; + done; + sleep 1 +done + +echo + diff --git a/01_bash/repetir_random_color.sh b/01_bash/repetir_random_color.sh new file mode 100755 index 0000000..4b7444b --- /dev/null +++ b/01_bash/repetir_random_color.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +for i in `seq 1 10`; do bash random_color.sh; done diff --git a/01_bash/speed_web.sh b/01_bash/speed_web.sh new file mode 100755 index 0000000..6770298 --- /dev/null +++ b/01_bash/speed_web.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +# Este es un script de Bash para comprobar el código de estado de una lista de URLs +# y utilizando el comando \time mide el tiempo de respuesta de cada solicitud. +# +# Uso: +# chmod +x speed_web.sh +# ./speed_web.sh http://ejemplo.com https://google.com http://otroejemplo.com +# + +COLOR_RED='\033[0;31m' +COLOR_BLUE='\033[0;34m' +COLOR_MAGENTA='\033[0;35m' +COLOR_CYAN='\033[0;36m' +COLOR_GRAY='\033[0;37m' +COLOR_RESET='\033[0m' + +# Control de salida con Ctrl + C +function ctrl_c() { + echo -e "${COLOR_RED}\n\n[!] Saliendo... \n${COLOR_RESET}" + tput cnorm + exit 1 +} + +# Ctrl+C +trap ctrl_c SIGINT + +check_url() { + url="$1" + echo -e "\n${COLOR_MAGENTA}[+] Comprobación URL:${COLOR_RESET}${COLOR_BLUE} $url${COLOR_RESET}" + # Captura la salida de \time y curl por separado + time_output=$({ /usr/bin/time -f "User mode: %U\nKernel mode: %S\nCPU: %P" curl -o /dev/null -L -s -w "\nCódigo de respuesta: %{http_code}\nTamaño del contenido: %{size_download} bytes\nTipo de contenido: %{content_type}\nDirección IP del servidor: %{remote_ip}\nTiempo de resolución DNS: %{time_namelookup} segundos\n" "$url"; } 2>&1) + if [[ $? -eq 0 ]]; then + echo -e "${COLOR_CYAN}$time_output${COLOR_RESET}" + else + echo -e "${COLOR_RED}\n\n[!] Error: No se pudo acceder a la URL${COLOR_RESET}" + fi + echo -e "${COLOR_CYAN}\n------------------------------------------${COLOR_RESET}" +} + +if [ $# -eq 0 ]; then + echo -e "${COLOR_RED}\n\n[!] Error: Introduce argumentos.${COLOR_RESET}" + echo -e "${COLOR_BLUE}\n\tUso: $0 [URL1] [URL2] ...\n${COLOR_RESET}" + exit 1 +fi + +for url in "$@"; do + check_url "$url" +done