Last active
April 9, 2025 19:23
-
-
Save BakirGracic/5b91d0178ff207c28507bb0332fef837 to your computer and use it in GitHub Desktop.
CS2 Server Sustainability Script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Path to config file and logs directory | |
CONFIG_FILE="./config.cfg" | |
LOG_DIR="./logs" | |
# Create logs directory if it doesn't exist | |
mkdir -p "$LOG_DIR" | |
# Ensure tmux is installed | |
if ! command -v tmux &>/dev/null; then | |
echo "tmux not found. Installing..." | |
sudo apt update && sudo apt install -y tmux | |
fi | |
# Default values | |
DEFAULT_CRON_TIME="5" | |
DEFAULT_MAXPLAYERS="10" | |
DEFAULT_PORT="27015" | |
DEFAULT_TICKRATE="128" | |
DEFAULT_HOSTNAME="CS2 DEDICATED SERVER" | |
DEFAULT_MAP="de_dust2" | |
DEFAULT_GAME_TYPE="0" | |
DEFAULT_GAME_MODE="1" | |
DEFAULT_TOKEN="" | |
# Function to validate and set value or fallback to default | |
get_validated_input() { | |
local input="$1" | |
local default="$2" | |
local type="$3" | |
if [[ -z "$input" ]]; then | |
echo "$default" | |
elif [[ "$type" == "int" && "$input" =~ ^[0-9]+$ ]]; then | |
echo "$input" | |
elif [[ "$type" == "string" ]]; then | |
echo "$input" | |
else | |
echo "$default" | |
fi | |
} | |
# Function to write config file | |
write_config() { | |
cat > "$CONFIG_FILE" <<EOL | |
CRON_TIME=${CRON_TIME:-$DEFAULT_CRON_TIME} | |
MAXPLAYERS=${MAXPLAYERS:-$DEFAULT_MAXPLAYERS} | |
PORT=${PORT:-$DEFAULT_PORT} | |
TICKRATE=${TICKRATE:-$DEFAULT_TICKRATE} | |
HOSTNAME="${HOSTNAME:-$DEFAULT_HOSTNAME}" | |
MAP=${MAP:-$DEFAULT_MAP} | |
GAME_TYPE=${GAME_TYPE:-$DEFAULT_GAME_TYPE} | |
GAME_MODE=${GAME_MODE:-$DEFAULT_GAME_MODE} | |
TOKEN=${TOKEN:-$DEFAULT_TOKEN} | |
SERVER_IP=$(curl -s http://checkip.amazonaws.com) | |
EOL | |
} | |
# Function to set up server settings | |
setup() { | |
echo "Setting up the CS2 server configuration..." | |
# Prompt for configuration values with defaults and validation | |
read -p "Enter cron time for update (default $DEFAULT_CRON_TIME): " CRON_TIME_INPUT | |
read -p "Enter max players (default $DEFAULT_MAXPLAYERS): " MAXPLAYERS_INPUT | |
read -p "Enter server port (default $DEFAULT_PORT): " PORT_INPUT | |
read -p "Enter tickrate (default $DEFAULT_TICKRATE): " TICKRATE_INPUT | |
read -p "Enter server hostname (default \"$DEFAULT_HOSTNAME\"): " HOSTNAME_INPUT | |
read -p "Enter map (default $DEFAULT_MAP): " MAP_INPUT | |
read -p "Enter game type (default $DEFAULT_GAME_TYPE): " GAME_TYPE_INPUT | |
read -p "Enter game mode (default $DEFAULT_GAME_MODE): " GAME_MODE_INPUT | |
read -p "Enter token (default empty): " TOKEN_INPUT | |
# Validate and assign values | |
CRON_TIME=$(get_validated_input "$CRON_TIME_INPUT" "$DEFAULT_CRON_TIME" "int") | |
MAXPLAYERS=$(get_validated_input "$MAXPLAYERS_INPUT" "$DEFAULT_MAXPLAYERS" "int") | |
PORT=$(get_validated_input "$PORT_INPUT" "$DEFAULT_PORT" "int") | |
TICKRATE=$(get_validated_input "$TICKRATE_INPUT" "$DEFAULT_TICKRATE" "int") | |
HOSTNAME=$(get_validated_input "$HOSTNAME_INPUT" "$DEFAULT_HOSTNAME" "string") | |
MAP=$(get_validated_input "$MAP_INPUT" "$DEFAULT_MAP" "string") | |
GAME_TYPE=$(get_validated_input "$GAME_TYPE_INPUT" "$DEFAULT_GAME_TYPE" "int") | |
GAME_MODE=$(get_validated_input "$GAME_MODE_INPUT" "$DEFAULT_GAME_MODE" "int") | |
TOKEN=$(get_validated_input "$TOKEN_INPUT" "$DEFAULT_TOKEN" "string") | |
# Write settings to config file | |
write_config | |
echo "Configuration saved to $CONFIG_FILE" | tee "$LOG_DIR/setup.log" | |
# Set up the cron job | |
(crontab -l 2>/dev/null; echo "0 $CRON_TIME * * * $(pwd)/cs_server stop && $(pwd)/cs_server update && $(pwd)/cs_server start") | crontab - | |
echo "Cron job set up to update and restart the server at $CRON_TIME h daily." | tee -a "$LOG_DIR/setup.log" | |
} | |
# Function to start the server | |
start() { | |
source "$CONFIG_FILE" | |
# Start server in a detached tmux session | |
tmux new-session -d -s cs2server "cd ~/.steam/steam/steamapps/common/Counter-Strike\ Global\ Offensive/game/bin/linuxsteamrt64 && ./cs2 -dedicated -ip $SERVER_IP -maxplayers $MAXPLAYERS -port $PORT -tickrate $TICKRATE +hostname \"$HOSTNAME\" +map $MAP +sv_logfile 1 +sv_lan 0 +game_type $GAME_TYPE +game_mode $GAME_MODE +sv_setsteamaccount \"$TOKEN\"" | |
echo "CS2 server started in tmux session 'cs2server'." | tee "$LOG_DIR/start.log" | |
} | |
# Function to open the server console | |
console() { | |
if tmux has-session -t cs2server 2>/dev/null; then | |
tmux attach -t cs2server | |
else | |
echo "Server is not running. Use './script start' to start the server." | |
fi | |
} | |
# Function to update the server | |
update() { | |
steamcmd +login anonymous +app_update 730 validate +quit | tee "$LOG_DIR/update.log" | |
echo "Server updated successfully." | tee -a "$LOG_DIR/update.log" | |
} | |
# Function to stop the server | |
stop() { | |
if tmux has-session -t cs2server 2>/dev/null; then | |
tmux send-keys -t cs2server C-c # Send Ctrl+C to stop the server | |
tmux kill-session -t cs2server | |
echo "CS2 server stopped." | tee "$LOG_DIR/stop.log" | |
else | |
echo "Server is not running." | |
fi | |
} | |
# Main script logic to handle arguments | |
case "$1" in | |
setup) | |
setup | |
;; | |
start) | |
start | |
;; | |
console) | |
console | |
;; | |
update) | |
update | |
;; | |
stop) | |
stop | |
;; | |
*) | |
echo "Usage: $0 {setup|start|console|update|stop}" | |
;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment