WUT_Computer_Science/run_anomaly_detection.sh

234 lines
7.1 KiB
Bash
Executable File

#!/bin/bash
# Colors for output
GREEN='\033[0;32m'
BLUE='\033[0;34m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color
PROJECT_ROOT=$(pwd)
TOPICS=("transactions" "alerts")
function check_prerequisites {
echo -e "${BLUE}Checking prerequisites...${NC}"
# Check for Java
if ! command -v java &> /dev/null; then
echo -e "${RED}Java is not installed. Please install JDK 11 or higher.${NC}"
exit 1
fi
# Check for Maven
if ! command -v mvn &> /dev/null; then
echo -e "${RED}Maven is not installed. Please install Maven.${NC}"
exit 1
fi
# Check for Docker
if ! command -v docker &> /dev/null; then
echo -e "${RED}Docker is not installed. Please install Docker.${NC}"
exit 1
fi
# Check for docker-compose
if ! command -v docker-compose &> /dev/null; then
echo -e "${RED}Docker Compose is not installed. Please install Docker Compose.${NC}"
exit 1
fi
echo -e "${GREEN}All prerequisites are met.${NC}"
}
function build_projects {
echo -e "${BLUE}Building all projects...${NC}"
# Build each project
for project in "transaction-simulator" "kafka-consumer-visualizer" "anomaly-detector" "alarm-visualizer"; do
echo -e "${YELLOW}Building $project...${NC}"
cd "$PROJECT_ROOT/$project"
mvn clean package -DskipTests
if [ $? -ne 0 ]; then
echo -e "${RED}Failed to build $project.${NC}"
exit 1
fi
done
cd "$PROJECT_ROOT"
echo -e "${GREEN}All projects built successfully.${NC}"
}
function start_infrastructure {
echo -e "${BLUE}Starting Kafka and Flink containers...${NC}"
docker-compose up -d
# Wait for Kafka to be ready
echo -e "${YELLOW}Waiting for Kafka to be ready...${NC}"
sleep 10
# Create Kafka topics
for topic in "${TOPICS[@]}"; do
echo -e "${YELLOW}Creating Kafka topic: $topic${NC}"
docker-compose exec kafka kafka-topics --create \
--topic "$topic" \
--bootstrap-server localhost:9092 \
--partitions 3 \
--replication-factor 1 \
--if-not-exists
done
echo -e "${GREEN}Infrastructure is up and running.${NC}"
}
function start_applications {
echo -e "${BLUE}Starting applications...${NC}"
# Start anomaly detector (Flink app)
echo -e "${YELLOW}Starting Anomaly Detector (Flink App)...${NC}"
cd "$PROJECT_ROOT/anomaly-detector"
java -jar target/anomaly-detector-1.0-SNAPSHOT.jar > "$PROJECT_ROOT/logs/anomaly-detector.log" 2>&1 &
ANOMALY_DETECTOR_PID=$!
echo $ANOMALY_DETECTOR_PID > "$PROJECT_ROOT/logs/anomaly-detector.pid"
sleep 5
# Start alarm visualizer
echo -e "${YELLOW}Starting Alarm Visualizer...${NC}"
cd "$PROJECT_ROOT/alarm-visualizer"
java -jar target/alarm-visualizer-1.0-SNAPSHOT.jar > "$PROJECT_ROOT/logs/alarm-visualizer.log" 2>&1 &
ALARM_VISUALIZER_PID=$!
echo $ALARM_VISUALIZER_PID > "$PROJECT_ROOT/logs/alarm-visualizer.pid"
# Start test consumer/visualizer
echo -e "${YELLOW}Starting Test Consumer Visualizer...${NC}"
cd "$PROJECT_ROOT/kafka-consumer-visualizer"
java -jar target/kafka-consumer-visualizer-1.0-SNAPSHOT.jar > "$PROJECT_ROOT/logs/consumer-visualizer.log" 2>&1 &
CONSUMER_PID=$!
echo $CONSUMER_PID > "$PROJECT_ROOT/logs/consumer-visualizer.pid"
sleep 5
# Start transaction simulator
echo -e "${YELLOW}Starting Transaction Simulator...${NC}"
cd "$PROJECT_ROOT/transaction-simulator"
java -jar target/transaction-simulator-1.0-SNAPSHOT.jar > "$PROJECT_ROOT/logs/transaction-simulator.log" 2>&1 &
SIMULATOR_PID=$!
echo $SIMULATOR_PID > "$PROJECT_ROOT/logs/transaction-simulator.pid"
cd "$PROJECT_ROOT"
echo -e "${GREEN}All applications are running.${NC}"
echo -e "${GREEN}Log files are available in the logs directory.${NC}"
}
function stop_applications {
echo -e "${BLUE}Stopping applications...${NC}"
# Stop all Java applications
if [ -f "$PROJECT_ROOT/logs/transaction-simulator.pid" ]; then
kill $(cat "$PROJECT_ROOT/logs/transaction-simulator.pid") 2>/dev/null
rm "$PROJECT_ROOT/logs/transaction-simulator.pid"
fi
if [ -f "$PROJECT_ROOT/logs/consumer-visualizer.pid" ]; then
kill $(cat "$PROJECT_ROOT/logs/consumer-visualizer.pid") 2>/dev/null
rm "$PROJECT_ROOT/logs/consumer-visualizer.pid"
fi
if [ -f "$PROJECT_ROOT/logs/anomaly-detector.pid" ]; then
kill $(cat "$PROJECT_ROOT/logs/anomaly-detector.pid") 2>/dev/null
rm "$PROJECT_ROOT/logs/anomaly-detector.pid"
fi
if [ -f "$PROJECT_ROOT/logs/alarm-visualizer.pid" ]; then
kill $(cat "$PROJECT_ROOT/logs/alarm-visualizer.pid") 2>/dev/null
rm "$PROJECT_ROOT/logs/alarm-visualizer.pid"
fi
echo -e "${GREEN}All applications stopped.${NC}"
}
function stop_infrastructure {
echo -e "${BLUE}Stopping infrastructure...${NC}"
docker-compose down
echo -e "${GREEN}Infrastructure stopped.${NC}"
}
function show_logs {
echo -e "${BLUE}Available logs:${NC}"
ls -l "$PROJECT_ROOT/logs"
echo -e "${YELLOW}Use 'tail -f logs/[filename]' to view a specific log.${NC}"
}
function print_usage {
echo -e "${BLUE}Credit Card Transaction Anomaly Detection System${NC}"
echo -e "Usage: $0 [options]"
echo -e "Options:"
echo -e " ${GREEN}start${NC} Build and start the entire system"
echo -e " ${GREEN}stop${NC} Stop all components"
echo -e " ${GREEN}restart${NC} Restart the entire system"
echo -e " ${GREEN}status${NC} Check if components are running"
echo -e " ${GREEN}logs${NC} Show log files"
}
function check_status {
echo -e "${BLUE}Checking system status...${NC}"
# Check Docker containers
echo -e "${YELLOW}Docker containers:${NC}"
docker-compose ps
# Check Java processes
echo -e "\n${YELLOW}Java applications:${NC}"
for app in "transaction-simulator" "consumer-visualizer" "anomaly-detector" "alarm-visualizer"; do
if [ -f "$PROJECT_ROOT/logs/$app.pid" ]; then
pid=$(cat "$PROJECT_ROOT/logs/$app.pid")
if ps -p $pid > /dev/null; then
echo -e "${GREEN}$app is running (PID: $pid)${NC}"
else
echo -e "${RED}$app is not running (stale PID file)${NC}"
fi
else
echo -e "${RED}$app is not running${NC}"
fi
done
}
# Create logs directory
mkdir -p "$PROJECT_ROOT/logs"
# Parse command-line arguments
case "$1" in
start)
check_prerequisites
build_projects
start_infrastructure
start_applications
;;
stop)
stop_applications
stop_infrastructure
;;
restart)
stop_applications
stop_infrastructure
sleep 5
start_infrastructure
sleep 5
start_applications
;;
status)
check_status
;;
logs)
show_logs
;;
*)
print_usage
;;
esac