First push

This commit is contained in:
Adrián Borrageiros Mourelos 2024-09-03 10:36:14 +02:00
commit d895dcd829

170
replica_toggle.sh Executable file
View File

@ -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