163 lines
3.3 KiB
Bash
Executable File
163 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
LAB_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
REPO_ROOT="$(cd "$LAB_DIR/../.." && pwd)"
|
|
|
|
source "$SCRIPT_DIR/config.sh"
|
|
source "$REPO_ROOT/shared/minicorp/lib/minicorp.sh"
|
|
source "$REPO_ROOT/shared/minicorp/topologies/client-router-server.sh"
|
|
|
|
printf '\n'
|
|
mc_log "Setting up $LAB_NAME"
|
|
|
|
#
|
|
# Configuration
|
|
#
|
|
|
|
if [[ "$LAB_TOPOLOGY" != "client-router-server" ]]; then
|
|
mc_error "Unsupported topology: $LAB_TOPOLOGY"
|
|
exit 1
|
|
fi
|
|
|
|
#
|
|
# Required tools
|
|
#
|
|
|
|
for command_name in \
|
|
ip \
|
|
sysctl \
|
|
openssl \
|
|
python3 \
|
|
ss
|
|
do
|
|
mc_require_command "$command_name"
|
|
done
|
|
|
|
#
|
|
# Persistent state
|
|
#
|
|
|
|
mc_log "Initializing MiniCorp lab state"
|
|
|
|
"$SCRIPT_DIR/init_state.sh"
|
|
|
|
source "$LAB_IDENTITY_FILE"
|
|
|
|
#
|
|
# Runtime service identities
|
|
#
|
|
|
|
LAB_WEB_SERVICE_ID="web-$(
|
|
python3 "$SCRIPT_DIR/identity.py" \
|
|
unpack "${LAB_WEB_SERVICE_TOKEN#web-}"
|
|
)"
|
|
|
|
LAB_API_SERVICE_ID="api-$(
|
|
python3 "$SCRIPT_DIR/identity.py" \
|
|
unpack "${LAB_API_SERVICE_TOKEN#api-}"
|
|
)"
|
|
|
|
LAB_ADMIN_SERVICE_ID="adm-$(
|
|
python3 "$SCRIPT_DIR/identity.py" \
|
|
unpack "${LAB_ADMIN_SERVICE_TOKEN#adm-}"
|
|
)"
|
|
|
|
#
|
|
# Clean stale runtime
|
|
#
|
|
|
|
mc_log "Clearing stale MiniCorp runtime"
|
|
|
|
mc_topology_client_router_server_down \
|
|
>/dev/null 2>&1 || true
|
|
|
|
rm -f \
|
|
"$LAB_WEB_STDOUT" \
|
|
"$LAB_STATUS_STDOUT" \
|
|
"$LAB_ADMIN_STDOUT"
|
|
|
|
#
|
|
# Build network
|
|
#
|
|
|
|
mc_log "Building MiniCorp virtual network"
|
|
|
|
mc_topology_client_router_server_up \
|
|
>/dev/null
|
|
|
|
if ! mc_topology_client_router_server_check \
|
|
>/dev/null
|
|
then
|
|
mc_error "MiniCorp topology validation failed."
|
|
exit 1
|
|
fi
|
|
|
|
#
|
|
# Start services
|
|
#
|
|
|
|
mc_log "Starting MiniCorp services"
|
|
|
|
sudo ip netns exec "$MC_SERVER_NS" env \
|
|
MINICORP_SERVICE_HOST="$MC_SERVER_ADDR" \
|
|
MINICORP_SERVICE_PORT="$LAB_WEB_PORT" \
|
|
MINICORP_SERVICE_ID="$LAB_WEB_SERVICE_ID" \
|
|
MINICORP_SERVICE_TOKEN="$LAB_WEB_SERVICE_TOKEN" \
|
|
MINICORP_EVIDENCE_LOG="$LAB_EVIDENCE_LOG" \
|
|
python3 -u "$SCRIPT_DIR/web_service.py" \
|
|
>"$LAB_WEB_STDOUT" 2>&1 &
|
|
|
|
sudo ip netns exec "$MC_SERVER_NS" env \
|
|
MINICORP_SERVICE_HOST="$MC_SERVER_ADDR" \
|
|
MINICORP_SERVICE_PORT="$LAB_STATUS_PORT" \
|
|
MINICORP_SERVICE_ID="$LAB_API_SERVICE_ID" \
|
|
MINICORP_SERVICE_TOKEN="$LAB_API_SERVICE_TOKEN" \
|
|
MINICORP_EVIDENCE_LOG="$LAB_EVIDENCE_LOG" \
|
|
python3 -u "$SCRIPT_DIR/status_service.py" \
|
|
>"$LAB_STATUS_STDOUT" 2>&1 &
|
|
|
|
sudo ip netns exec "$MC_SERVER_NS" env \
|
|
MINICORP_SERVICE_HOST="$MC_SERVER_ADDR" \
|
|
MINICORP_SERVICE_PORT="$LAB_ADMIN_PORT" \
|
|
MINICORP_SERVICE_ID="$LAB_ADMIN_SERVICE_ID" \
|
|
MINICORP_SERVICE_TOKEN="$LAB_ADMIN_SERVICE_TOKEN" \
|
|
MINICORP_EVIDENCE_LOG="$LAB_EVIDENCE_LOG" \
|
|
python3 -u "$SCRIPT_DIR/admin_service.py" \
|
|
>"$LAB_ADMIN_STDOUT" 2>&1 &
|
|
|
|
#
|
|
# Verify listeners
|
|
#
|
|
|
|
for port in \
|
|
"$LAB_WEB_PORT" \
|
|
"$LAB_STATUS_PORT" \
|
|
"$LAB_ADMIN_PORT"
|
|
do
|
|
ready=0
|
|
|
|
for attempt in {1..20}; do
|
|
if mc_exec "$MC_SERVER_NS" ss -ltn |
|
|
grep -F "$MC_SERVER_ADDR:$port" \
|
|
>/dev/null
|
|
then
|
|
ready=1
|
|
break
|
|
fi
|
|
|
|
sleep 0.1
|
|
done
|
|
|
|
if [[ "$ready" -ne 1 ]]; then
|
|
mc_error \
|
|
"A required MiniCorp service failed to start."
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
printf '\n'
|
|
mc_log "$LAB_NAME is ready."
|