171 lines
5.8 KiB
Bash
Executable File
171 lines
5.8 KiB
Bash
Executable File
#!/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
|