From d895dcd829e7207daffb947c212438ff03b7c785 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Borrageiros=20Mourelos?= Date: Tue, 3 Sep 2024 10:36:14 +0200 Subject: [PATCH] First push --- replica_toggle.sh | 170 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100755 replica_toggle.sh diff --git a/replica_toggle.sh b/replica_toggle.sh new file mode 100755 index 0000000..aa2672f --- /dev/null +++ b/replica_toggle.sh @@ -0,0 +1,170 @@ +#!/bin/bash + +# Colores +RED='\033[0;31m' +GREEN='\033[0;32m' +PURPLE='\033[0;35m' +NC='\033[0m' # No Color + +# Función para mostrar el menú de servicios y obtener el número de servicios encontrados +function show_services_menu { + local search_term="$1" + + if [ -z "$search_term" ]; then + echo "" + echo -e "${PURPLE}Mostrando todos los servicios${NC}" + else + echo "" + echo -e "${PURPLE}Mostrando resultados de búsqueda '$search_term'${NC}" + fi + echo "" + + # Obtener la lista de servicios y filtrar si es necesario + if [ -z "$search_term" ]; then + services=$(docker service ls --format '{{.ID}}\t{{.Name}}') + else + services=$(docker service ls --format '{{.ID}}\t{{.Name}}' | grep "$search_term") + fi + + # Comprobar si se encontraron servicios + if [ -z "$services" ]; then + echo -e "${RED}No se encontraron servicios que coincidan con el término de búsqueda: $search_term${NC}" + return 1 + fi + + # Contador para numerar los servicios + count=1 + num_services=0 + services_list=() + + echo -e "ID\tESTADO\t\tPUERTO\t\tNOMBRE" + echo "------------------------------------------------------------------------------------" + while IFS=$'\t' read -r service_id service_name; do + # Obtener el número de réplicas + replicas=$(docker service inspect --format '{{.Spec.Mode.Replicated.Replicas}}' "$service_id" 2>/dev/null) + + # Obtener el puerto expuesto por el servicio + port=$(docker service inspect --format '{{range .Endpoint.Ports}}{{.PublishedPort}} {{end}}' "$service_id" | awk '{print $1}') + + # Solo imprimir el servicio si tiene puerto expuestos + if [ -n "$port" ]; then + # Determinar el estado y el color + if [ "$replicas" -gt 0 ]; then + state="${GREEN}Activado${NC}" + else + state="${RED}Desactivado${NC}" + fi + + # Imprimir el número, estado, nombre del servicio y puerto + echo -e "$count\t$state\t$port\t\t$service_name" + echo "------------------------------------------------------------------------------------" + + # Guardar la información del servicio para selección futura + services_list+=("$service_id $service_name $state $port") + # Incrementar el contador + count=$((count + 1)) + num_services=$((num_services + 1)) + fi + done <<< "$services" + + if [ "$num_services" -eq 0 ]; then + echo -e "${RED}No se encontraron servicios con puerto expuestos.${NC}" + return 1 + fi + + echo "" + echo -e "${PURPLE}$num_services servicios encontrados.${NC}" + + # Mostrar la línea solo si hay más de un servicio + if [ "$num_services" -gt 1 ]; then + echo "" + echo -e "${PURPLE}De qué servicio quieres cambiar el estado?${NC}" + echo "" + fi + + return $num_services +} + +# Función para manejar la elección del usuario +function handle_service_toggle { + local service_id="$1" + local service_name="$2" + + # Obtener el número de réplicas + replicas=$(docker service inspect --format '{{.Spec.Mode.Replicated.Replicas}}' "$service_id" 2>/dev/null) + + if [ -z "$replicas" ]; then + echo "No se pudo obtener el número de réplicas. Puede que el servicio no exista o tengas un problema con Docker." + return 1 + fi + + if [ "$replicas" -eq 1 ]; then + # Cambiar a 0 réplicas + docker service update --replicas 0 "$service_id" + echo "" + echo -e "${RED}Replica desactivada para el servicio:" + echo -e "${service_name}${NC}" + echo "" + elif [ "$replicas" -eq 0 ]; then + # Cambiar a 1 réplica + docker service update --replicas 1 "$service_id" + echo "" + echo -e "${GREEN}Replica activada para el servicio:" + echo -e "${service_name}${NC}" + echo "" + else + echo "El número de réplicas es inesperado: $replicas" + fi +} + +# Comprobar si se han pasado argumentos +if [ "$#" -eq 0 ]; then + # Si no se pasa ningún argumento, ejecutar la función con un parámetro vacío para mostrar todos los servicios + search_term="" + services_list=() + show_services_menu "$search_term" + num_services=$? + + if [ "$num_services" -eq 1 ]; then + # Si solo hay un servicio, cambiar su estado directamente + IFS=' ' read -r service_id service_name state ports <<< "${services_list[0]}" + handle_service_toggle "$service_id" "$service_name" + else + # Leer la opción del usuario si hay más de un servicio + echo "" + read -p "Elige un servicio (o 0 para salir): " option + + if [ "$option" -eq 0 ]; then + exit 0 + fi + + # Manejar la selección del servicio + IFS=' ' read -r service_id service_name state ports <<< "${services_list[$((option - 1))]}" + handle_service_toggle "$service_id" "$service_name" + fi +else + # Si se pasan argumentos, manejar cada uno de ellos + for search_term in "$@"; do + services_list=() + show_services_menu "$search_term" + num_services=$? + + if [ "$num_services" -eq 1 ]; then + # Si solo hay un servicio, cambiar su estado directamente + IFS=' ' read -r service_id service_name state ports <<< "${services_list[0]}" + handle_service_toggle "$service_id" "$service_name" + else + # Leer la opción del usuario si hay más de un servicio + echo "" + read -p "Elige un servicio (o 0 para salir): " option + + if [ "$option" -eq 0 ]; then + exit 0 + fi + + # Manejar la selección del servicio + IFS=' ' read -r service_id service_name state ports <<< "${services_list[$((option - 1))]}" + handle_service_toggle "$service_id" "$service_name" + fi + done +fi