159 lines
6.1 KiB
Bash
159 lines
6.1 KiB
Bash
#!/bin/bash
|
|
# -----------------------------------------------------------------------------------------------
|
|
# --------------------------------- Docker Network Connect -------------------------------------
|
|
# -----------------------------------------------------------------------------------------------
|
|
# Connects specified Docker containers to extra networks on array start.
|
|
# Useful when containers need to communicate across networks they were not
|
|
# originally configured with — e.g. memcached needing access to nextcloud-aio network.
|
|
#
|
|
# Every container in NETWORK_CONNECT_CONTAINERS is connected to every network
|
|
# in NETWORK_CONNECT_NETWORKS. Already-connected containers are skipped cleanly.
|
|
#
|
|
# Run once at array start via User Scripts plugin.
|
|
# All configuration in Master.conf under Docker Network Connect section.
|
|
# Supports --dry-run to preview connections without making them.
|
|
# -----------------------------------------------------------------------------------------------
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
|
|
source "$SCRIPT_DIR/../Master.conf"
|
|
source "$SCRIPT_DIR/../common.sh"
|
|
|
|
parse_args "$@"
|
|
|
|
# -----------------------------------------------------------------------------------------------
|
|
# ━━━ $ICON_GEAR Setup ━━━
|
|
# -----------------------------------------------------------------------------------------------
|
|
echo ""
|
|
echo "━━━ $ICON_GEAR Setup ━━━"
|
|
|
|
if [[ "$EUID" -ne 0 ]]; then
|
|
error "Must be run as root"
|
|
exit 1
|
|
fi
|
|
|
|
success "Running as root"
|
|
|
|
if ! command -v docker &>/dev/null; then
|
|
error "Docker not found"
|
|
exit 1
|
|
fi
|
|
|
|
success "Docker found"
|
|
|
|
# -----------------------------------------------------------------------------------------------
|
|
# ━━━ $ICON_SUMMARY Status ━━━
|
|
# -----------------------------------------------------------------------------------------------
|
|
if [[ "$SHOW_STATUS" == true ]]; then
|
|
echo ""
|
|
echo "━━━━━ $ICON_SUMMARY STATUS ━━━━━"
|
|
echo "$ICON_CONTAINERS Containers: ${NETWORK_CONNECT_CONTAINERS[*]}"
|
|
echo "$ICON_DOCKER_NET Networks: ${NETWORK_CONNECT_NETWORKS[*]}"
|
|
echo "$ICON_GEAR Dry Run: $DRY_RUN"
|
|
echo ""
|
|
echo "━━━ Current Connections ━━━"
|
|
for container in "${NETWORK_CONNECT_CONTAINERS[@]}"; do
|
|
[[ -z "$container" ]] && continue
|
|
echo "$ICON_CONTAINERS $container:"
|
|
docker inspect "$container" \
|
|
--format '{{range $k, $v := .NetworkSettings.Networks}} {{$k}}{{"\n"}}{{end}}' \
|
|
2>/dev/null || echo " not found"
|
|
done
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━"
|
|
exit 0
|
|
fi
|
|
|
|
[[ "$DRY_RUN" == true ]] && warn "DRY RUN — no network connections will be made"
|
|
|
|
# -----------------------------------------------------------------------------------------------
|
|
# ━━━ $ICON_DOCKER_NET Network Connect ━━━
|
|
# -----------------------------------------------------------------------------------------------
|
|
echo ""
|
|
echo "━━━ $ICON_DOCKER_NET Network Connect — $(date '+%Y-%m-%d %H:%M:%S') ━━━"
|
|
echo "$ICON_CONTAINERS Containers: ${NETWORK_CONNECT_CONTAINERS[*]}"
|
|
echo "$ICON_DOCKER_NET Networks: ${NETWORK_CONNECT_NETWORKS[*]}"
|
|
echo ""
|
|
|
|
START=$(date +%s)
|
|
CONNECTED=()
|
|
SKIPPED=()
|
|
FAILED=()
|
|
|
|
for container in "${NETWORK_CONNECT_CONTAINERS[@]}"; do
|
|
[[ -z "$container" ]] && continue
|
|
|
|
echo "━━━ $ICON_CONTAINERS $container ━━━"
|
|
|
|
# Verify container exists
|
|
if ! docker inspect "$container" &>/dev/null; then
|
|
warn "$container not found — skipping"
|
|
continue
|
|
echo ""
|
|
continue
|
|
fi
|
|
|
|
for network in "${NETWORK_CONNECT_NETWORKS[@]}"; do
|
|
[[ -z "$network" ]] && continue
|
|
|
|
# Verify network exists
|
|
if ! docker network inspect "$network" &>/dev/null; then
|
|
warn "Network $network not found — skipping"
|
|
continue
|
|
continue
|
|
fi
|
|
|
|
# Check if already connected
|
|
if docker network inspect "$network" \
|
|
--format '{{range .Containers}}{{.Name}} {{end}}' 2>/dev/null \
|
|
| grep -qw "$container"; then
|
|
info "$ICON_DOCKER_NET $container already connected to $network — skipping"
|
|
SKIPPED+=("$container→$network")
|
|
continue
|
|
fi
|
|
|
|
# Connect
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|
warn "DRY RUN — would connect $container to $network"
|
|
continue
|
|
fi
|
|
|
|
info "$ICON_DOCKER_NET Connecting $container to $network..."
|
|
if docker network connect "$network" "$container" 2>/dev/null; then
|
|
success "$ICON_DOCKER_NET $container connected to $network"
|
|
CONNECTED+=("$container→$network")
|
|
else
|
|
error "Failed to connect $container to $network"
|
|
FAILED+=("$container:$network")
|
|
fi
|
|
done
|
|
|
|
echo ""
|
|
done
|
|
|
|
END=$(date +%s)
|
|
|
|
# -----------------------------------------------------------------------------------------------
|
|
# ━━━ $ICON_SUMMARY Summary ━━━
|
|
# -----------------------------------------------------------------------------------------------
|
|
echo "━━━━━ $ICON_SUMMARY NETWORK CONNECT SUMMARY ━━━━━"
|
|
echo "$ICON_TIME Duration: $(format_duration $((END - START)))"
|
|
[[ ${#CONNECTED[@]} -gt 0 ]] && echo "$ICON_DOCKER_NET Connected: ${CONNECTED[*]}"
|
|
[[ ${#SKIPPED[@]} -gt 0 ]] && echo "$ICON_RUNNING Skipped: ${SKIPPED[*]}"
|
|
[[ ${#FAILED[@]} -gt 0 ]] && echo "$ICON_ERROR Failed: ${FAILED[*]}"
|
|
echo ""
|
|
|
|
if [[ "$DRY_RUN" == true ]]; then
|
|
echo "$ICON_WARN Status: DRY RUN — no changes made"
|
|
elif [[ ${#FAILED[@]} -gt 0 ]]; then
|
|
echo "$ICON_ERROR Status: $ICON_ERROR SOME CONNECTIONS FAILED"
|
|
notify "Docker network connect failed on $(hostname) — ${FAILED[*]}" "Network Connect" "warning"
|
|
else
|
|
echo "$ICON_DONE Status: $ICON_SUCCESS DONE"
|
|
if [[ ${#CONNECTED[@]} -gt 0 ]]; then
|
|
notify "Docker networks connected on $(hostname) — ${CONNECTED[*]}" "Network Connect" "normal"
|
|
fi
|
|
fi
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
|
|
[[ ${#FAILED[@]} -gt 0 ]] && exit 1
|
|
exit 0 |