Skip to content

Instantly share code, notes, and snippets.

@BakirGracic
Last active April 9, 2025 19:23
Show Gist options
  • Save BakirGracic/5b91d0178ff207c28507bb0332fef837 to your computer and use it in GitHub Desktop.
Save BakirGracic/5b91d0178ff207c28507bb0332fef837 to your computer and use it in GitHub Desktop.
CS2 Server Sustainability Script
#!/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