From a446252c15cdf6b5a8a6be8bf16938b87862ddf1 Mon Sep 17 00:00:00 2001 From: Rick Date: Fri, 6 Jun 2025 23:24:24 +0200 Subject: [PATCH 1/3] Show running services in status --- commands/status.cmd | 51 +++++++++++++++++++++++++++++++++++++------- commands/status.help | 12 ++++++++++- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/commands/status.cmd b/commands/status.cmd index 4e005e2..5e17fc7 100644 --- a/commands/status.cmd +++ b/commands/status.cmd @@ -3,7 +3,7 @@ assertDockerRunning -rollNetworkName=$(cat ${ROLL_DIR}/docker/docker-compose.yml | grep -A3 'networks:' | tail -n1 | sed -e 's/[[:blank:]]*name:[[:blank:]]*//g') +rollNetworkName=$(grep -A3 'networks:' "${ROLL_DIR}/docker/docker-compose.yml" | tail -n1 | sed -e 's/[[:blank:]]*name:[[:blank:]]*//g') rollNetworkId=$(docker network ls -q --filter name="${rollNetworkName}") if [[ -z "${rollNetworkId}" ]]; then @@ -12,10 +12,11 @@ fi OLDIFS="$IFS"; IFS=$'\n' -projectNetworkList=( $(docker network ls --format '{{.Name}}' -q --filter "label=dev.roll.environment.name") ) +mapfile -t projectNetworkList < <(docker network ls --format '{{.Name}}' -q --filter "label=dev.roll.environment.name") IFS="$OLDIFS" messageList=() +lastNetwork="${projectNetworkList[-1]}" for projectNetwork in "${projectNetworkList[@]}"; do [[ -z "${projectNetwork}" || "${projectNetwork}" == "${rollNetworkName}" ]] && continue # Skip empty project network names (if any) @@ -28,19 +29,22 @@ for projectNetwork in "${projectNetworkList[@]}"; do [[ -z "${container}" ]] && continue # Project is not running, skip it projectDir=$(docker container inspect --format '{{ index .Config.Labels "com.docker.compose.project.working_dir"}}' "$container") - projectName=$(cat "${projectDir}/.env.roll" | grep '^ROLL_ENV_NAME=' | sed -e 's/ROLL_ENV_NAME=[[:space:]]*//g' | tr -d '\r') - projectType=$(cat "${projectDir}/.env.roll" | grep '^ROLL_ENV_TYPE=' | sed -e 's/ROLL_ENV_TYPE=[[:space:]]*//g' | tr -d '\r') - traefikDomain=$(cat "${projectDir}/.env.roll" | grep '^TRAEFIK_DOMAIN=' | sed -e 's/TRAEFIK_DOMAIN=[[:space:]]*//g' | tr -d '\r') - traefikSubDomain=$(cat "${projectDir}/.env.roll" | grep '^TRAEFIK_SUBDOMAIN=' | sed -e 's/TRAEFIK_SUBDOMAIN=[[:space:]]*//g' | tr -d '\r') + projectName=$(grep -m1 '^ROLL_ENV_NAME=' "${projectDir}/.env.roll" | cut -d '=' -f2- | tr -d '\r') + projectType=$(grep -m1 '^ROLL_ENV_TYPE=' "${projectDir}/.env.roll" | cut -d '=' -f2- | tr -d '\r') + traefikDomain=$(grep -m1 '^TRAEFIK_DOMAIN=' "${projectDir}/.env.roll" | cut -d '=' -f2- | tr -d '\r') + traefikSubDomain=$(grep -m1 '^TRAEFIK_SUBDOMAIN=' "${projectDir}/.env.roll" | cut -d '=' -f2- | tr -d '\r') + containerCount=$(echo "$projectContainers" | wc -l | tr -d ' ') messageList+=(" \033[1;35m${projectName}\033[0m a \033[36m${projectType}\033[0m project") messageList+=(" Project Directory: \033[33m${projectDir}\033[0m") messageList+=(" Project URL: \033[94mhttps://${traefikSubDomain}.${traefikDomain}\033[0m") + messageList+=(" Docker Network: \033[33m${projectNetwork}\033[0m") + messageList+=(" Containers Running: \033[33m${containerCount}\033[0m") - [[ "$projectNetwork" != "${projectNetworkList[@]: -1:1}" ]] && messageList+=() + [[ "$projectNetwork" != "$lastNetwork" ]] && messageList+=("") done -if [[ "${#messageList[@]}" > 0 ]]; then +if (( ${#messageList[@]} > 0 )); then if [[ -z "${rollNetworkId}" ]]; then echo -e "Found the following \033[32mrunning\033[0m projects; however, \033[31mRollDev core services are currently not running\033[0m:" else @@ -51,4 +55,35 @@ if [[ "${#messageList[@]}" > 0 ]]; then done else echo "No running environments found." +fi + +if [[ -n "${rollNetworkId}" ]]; then + echo + echo -e "RollDev Services (enabled -> running):" + + portainerEnabled=0 + startpageEnabled=1 + if [[ -f "${ROLL_HOME_DIR}/.env" ]]; then + portainerEnabled=$(grep -m1 '^ROLL_SERVICE_PORTAINER=' "${ROLL_HOME_DIR}/.env" | cut -d '=' -f2- | tr -d '\r') + startpageEnabled=$(grep -m1 '^ROLL_SERVICE_STARTPAGE=' "${ROLL_HOME_DIR}/.env" | cut -d '=' -f2- | tr -d '\r') + fi + portainerEnabled=${portainerEnabled:-0} + startpageEnabled=${startpageEnabled:-1} + + services=(traefik dnsmasq mailhog tunnel) + [[ "${portainerEnabled}" == 1 ]] && services+=(portainer) + [[ "${startpageEnabled}" == 1 ]] && services+=(startpage) + + printf ' %-12s %-10s %-20s %s\n' "NAME" "STATE" "STATUS" "PORTS" + for svc in "${services[@]}"; do + name=$(docker ps --filter "name=^${svc}$" --format '{{.Names}}') + state=$(docker ps --filter "name=^${svc}$" --format '{{.State}}') + status=$(docker ps --filter "name=^${svc}$" --format '{{.Status}}') + ports=$(docker ps --filter "name=^${svc}$" --format '{{.Ports}}') + if [[ -z "${name}" ]]; then + printf ' %-12s %-10s %-20s -\n' "${svc}" "stopped" "Exited" + else + printf ' %-12s %-10s %-20s %s\n' "${name}" "${state}" "${status}" "${ports}" + fi + done fi \ No newline at end of file diff --git a/commands/status.help b/commands/status.help index 8a0150d..398a904 100644 --- a/commands/status.help +++ b/commands/status.help @@ -1,4 +1,14 @@ #!/usr/bin/env bash [[ ! ${ROLL_DIR} ]] && >&2 echo -e "\033[31mThis script is not intended to be run directly!\033[0m" && exit 1 -ROLL_USAGE="Provides listing of projects that are currently running that RollDev has been used to start" \ No newline at end of file +ROLL_USAGE=$(cat <<'USAGE' +\033[33mUsage:\033[0m + status Display list of all running RollDev project environments + +The command shows each project's name, directory, primary URL and other +details such as the Docker network and the number of running containers. +When RollDev core services are running, a summary table of enabled services +is also displayed similar to the output of \`docker ps\`. +USAGE +) + From 8b13f22375291c7d279952fe2348c313052491e0 Mon Sep 17 00:00:00 2001 From: Rick Date: Tue, 10 Jun 2025 10:29:52 +0200 Subject: [PATCH 2/3] Fix status command for macOS compatibility --- commands/status.cmd | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/commands/status.cmd b/commands/status.cmd index 5e17fc7..7acab0e 100644 --- a/commands/status.cmd +++ b/commands/status.cmd @@ -10,9 +10,16 @@ if [[ -z "${rollNetworkId}" ]]; then echo -e "[\033[33;1m!!\033[0m] \033[31mRollDev is not currently running.\033[0m Run \033[36mroll svc up\033[0m to start RollDev core services." fi -OLDIFS="$IFS"; +OLDIFS="$IFS" IFS=$'\n' -mapfile -t projectNetworkList < <(docker network ls --format '{{.Name}}' -q --filter "label=dev.roll.environment.name") +if command -v mapfile >/dev/null 2>&1; then + mapfile -t projectNetworkList < <(docker network ls --format '{{.Name}}' -q --filter "label=dev.roll.environment.name") +else + projectNetworkList=() + while IFS= read -r net; do + projectNetworkList+=("$net") + done < <(docker network ls --format '{{.Name}}' -q --filter "label=dev.roll.environment.name") +fi IFS="$OLDIFS" messageList=() @@ -86,4 +93,4 @@ if [[ -n "${rollNetworkId}" ]]; then printf ' %-12s %-10s %-20s %s\n' "${name}" "${state}" "${status}" "${ports}" fi done -fi \ No newline at end of file +fi From b24df268caf632c9b1e1652a6e2da94193274108 Mon Sep 17 00:00:00 2001 From: Rick Date: Tue, 10 Jun 2025 10:33:08 +0200 Subject: [PATCH 3/3] Fix last network lookup in status command --- commands/status.cmd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/commands/status.cmd b/commands/status.cmd index 7acab0e..65de9fd 100644 --- a/commands/status.cmd +++ b/commands/status.cmd @@ -23,7 +23,8 @@ fi IFS="$OLDIFS" messageList=() -lastNetwork="${projectNetworkList[-1]}" +lastIdx=$(( ${#projectNetworkList[@]} - 1 )) +lastNetwork="${projectNetworkList[$lastIdx]}" for projectNetwork in "${projectNetworkList[@]}"; do [[ -z "${projectNetwork}" || "${projectNetwork}" == "${rollNetworkName}" ]] && continue # Skip empty project network names (if any)