-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathreal_startup.sh
More file actions
executable file
·135 lines (108 loc) · 3.66 KB
/
real_startup.sh
File metadata and controls
executable file
·135 lines (108 loc) · 3.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash
# Configuration
VENV_PATH="/store/droptracker/disc/venv/bin/activate"
APP_DIR="/store/droptracker/disc"
MAIN_APP="main.py"
UPDATE_APP="player_total_update.py"
API_APP="new_api.py"
HOF_APP="bots/hall_of_fame.py"
WEBHOOK_APP="webhook_bot.py"
LOOTBOARDS_APP="_board_generator.py"
MAIN_PORT=8080
UPDATE_PORT=21474
MAIN_SCREEN="DTcore"
UPDATE_SCREEN="DT-pu"
WEBHOOK_SCREEN="DT-webhooks"
LOOTBOARDS_SCREEN="DT-lootboards"
HEARTBEAT_SCREEN="DT-heartbeat"
HEARTBEAT_APP="heartbeat.py"
API_SCREEN="DT-api"
HOF_SCREEN="DT-hof"
USER="droptracker" # The user that should own the screens
# Check if running as root and re-execute as the correct user if needed
if [ "$(id -u)" = "0" ]; then
echo "This script should not be run as root. Re-executing as user '$USER'..."
exec su - $USER -c "cd $(pwd) && bash $(basename $0)"
exit $?
fi
# Activate virtual environment
source $VENV_PATH
# Function to check if a screen session exists (case insensitive)
screen_exists() {
screen -list | grep -i "$1" > /dev/null
return $?
}
# Function to check if a port is in use
port_in_use() {
ss -tuln | grep -q ":$1 "
return $?
}
# Function to kill process using a specific port
kill_port_process() {
local port=$1
local pid=$(lsof -t -i:$port)
if [ ! -z "$pid" ]; then
echo "Killing process using port $port (PID: $pid)"
kill -9 $pid 2>/dev/null || sudo kill -9 $pid
sleep 2
fi
}
# Function to start an application in a screen
start_app_in_screen() {
local screen_name=$1
local app_name=$2
local port=$3
# Check if screen already exists (case insensitive)
if screen_exists "$screen_name"; then
echo "Screen matching '$screen_name' is already running. Skipping..."
return 0
fi
# Check if port is in use and kill the process if needed
if port_in_use $port; then
echo "Port $port is already in use. Attempting to kill the process..."
kill_port_process $port
fi
# Create a new detached screen session and run the application
echo "Starting $app_name in screen '$screen_name'..."
screen -dmS "$screen_name" bash -c "cd $APP_DIR && source $VENV_PATH && python3 $app_name; exec bash"
# Wait a moment to let the application start
sleep 3
# Verify the screen is running
if screen_exists "$screen_name"; then
echo "Successfully started $app_name in screen '$screen_name'"
else
echo "Failed to start screen '$screen_name'"
return 1
fi
return 0
}
# Main function
main() {
echo "=== DropTracker System Startup ==="
echo "Running as user: $(whoami)"
echo "Checking for existing screens and starting applications if needed..."
# Display current screens
echo "Current screens:"
screen -list
# Start main application
start_app_in_screen "$MAIN_SCREEN" "$MAIN_APP" $MAIN_PORT
# Start player update application
start_app_in_screen "$UPDATE_SCREEN" "$UPDATE_APP" $UPDATE_PORT
# Start webhook bot
start_app_in_screen "$WEBHOOK_SCREEN" "$WEBHOOK_APP" $WEBHOOK_PORT
# Start lootboard updater
start_app_in_screen "$LOOTBOARDS_SCREEN" "$LOOTBOARDS_APP" $LOOTBOARDS_PORT
# Start API app
start_app_in_screen "$API_SCREEN" "$API_APP" $API_PORT
# Start heartbeat bot
start_app_in_screen "$HEARTBEAT_SCREEN" "$HEARTBEAT_APP" $HEARTBEAT_PORT
# Start Hall of Fame bot
screen -dmS "$HOF_SCREEN" bash -c "cd $APP_DIR && source $VENV_PATH && python3 -m bots.hall_of_fame; exec bash"
echo "=== Startup Complete ==="
# List all running screens
echo "Running screens:"
screen -list
}
# Run the main function
main
exit 0