#!/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