#!/bin/bash # Advertencia: El script podría no estar preparado para producción, si este es su caso, siéntase libre de editar el script según sus requisitos. # Advertencia: No se recomienda ejecutar este script como root. # Assembled by: Makaren0 echo -e "╔═════════════════════╗" echo -e "║ EntryPoint.sh ║" echo -e "╚═════════════════════╝\n" # VARIABLES DE CONFIGURACION # #1.Configuración cuentas steam # steamcmd esta alojado en el directorio principal del usuario que ejecuta el script STEAM_ACCOUNT="anonymous" # For security reasons, it is recommended that you create a new Steam account just for your dedicated servers. STEAM_PSW="" # Leave it blank to disable STEAM_GUARD="" # Steam guard code for first login GSLT_TOKEN="E28A6DFBF5961B7C6DCB439E420728A1" # Necesario para mostrar el server en la lista publica Note:Valve sais cs2 generate automatically #2.Configuración del juego SERVER_IP="" # Sobreescribe las configuraciones desde Pterodactyl SERVER_PORT="" # Sobreescribe las configuraciones desde Pterodactyl MAX_PLAYERS="20" DEFAULT_START_MAP="de_nuke" # Deshabilitado si se usan mapas de la workshop WORKSHOP_START_MAP="" # https://steamcommunity.com/sharedfiles/filedetails/?id=125488374 UPDATE_ON_BOOT="1" # Actualiza el servidor mediante steamcmd ANTES de descargar cualquier otro externo. Usa 1 para activarlo, cualquier otra cosa para desactivarlo VAC="1" # Habilita el uso de VAC en el servidor. Usa 1 para activarlo, cualquier otra cosa para desactivarlo SRCDS_DEBUG="0" # Habilita -debug en los argumentos de srcds METAMOD="0" LAUNCH_ARGS="-dedicated +ip ${SERVER_IP} -port ${SERVER_PORT} -maxplayers ${MAX_PLAYERS}" EXTRA_ARGS="" # API_AUTHORIZATION_KEY="" #https://steamcommunity.com/dev/apikey # WORKSHOP_COLLECTION_ID="" #https://steamcommunity.com/sharedfiles/filedetails/?id=125499818 # Workshop maps. More info: https://developer.valvesoftware.com/wiki/CSGO_Workshop_For_Server_Operators # CSGO OLD - EXTRAPARAMS="-nohltv +sv_pure 0 +game_type 0 +game_mode 0" # Puedes usar -autoupdate en los argumentos para actualizar automaticamente el servidor # CSGO OLD - LAUNCH_ARGS="-nobreakpad -game csgo -console -usercon -secure -maxplayers_override ${MAX_PLAYERS} -tickrate ${TICKRATE} +sv_setsteamaccount ${GSLT_TOKEN} -net_port_try 1 +net_public_adr ${IP} +hostport ${PORT} ${EXTRAPARAMS}" # AUTO_UPDATE="1" # Se refiere a la comprobación que hace el juego MIENTRAS esta corriendo para actualizar el servidor automaticamente. Usa 1 para activarlo, cualquier otra cosa para desactivarlo # TICKRATE="64" # # # # # # # # # SCRIPT INIT # # # # # # # # # APP_ID="730" SCREEN_NAME="CS2-SERVER-PRACTICE" RUNSCRIPT_USER=$USER # Se puede usar cualquier usuario sin privilegios de administrador. En este caso al estar utilizando un servicio de Linux directamente obtendremos la variable de entorno $USER SERVER_DIR=$PWD SRCDS_RUN="$SERVER_DIR/game/bin/linuxsteamrt64/cs2" # Define la ubicación del archivo de registro de screen # Define alojamiento de backups LOG_FILE="$SERVER_DIR/screen-log-gameserver.log" BACKUP="1" # Backups sobre la configuracion y plugins de Source Mods BACKUP_DIR="$SERVER_DIR/backups" # Directorio de las backups de plugins y configuraciones de SourceMod MAX_BACKUPS="10" # Comprobar parametros desde Pterodactyl if [[ ! -z $P_STEAM_ACCOUNT ]]; then STEAM_ACCOUNT=$P_STEAM_ACCOUNT fi if [[ ! -z $P_STEAM_ACCOUNT ]]; then STEAM_ACCOUNT=$P_STEAM_ACCOUNT fi if [[ ! -z $P_STEAM_GUARD ]]; then STEAM_GUARD=$P_STEAM_GUARD fi if [[ ! -z $P_STEAM_PSW ]]; then STEAM_PSW=$P_STEAM_PSW fi if [[ ! -z $P_MAX_PLAYERS ]]; then MAX_PLAYERS=$P_MAX_PLAYERS fi if [[ ! -z $P_GSLT_TOKEN ]]; then GSLT_TOKEN=$P_GSLT_TOKEN fi if [[ ! -z $P_VAC ]]; then VAC=$P_VAC fi if [[ ! -z $P_UPDATE_ON_BOOT ]]; then UPDATE_ON_BOOT=$P_UPDATE_ON_BOOT fi if [[ ! -z $P_SRCDS_DEBUG ]]; then SRCDS_DEBUG=$P_SRCDS_DEBUG fi if [[ ! -z $P_EXTRA_ARGS ]]; then EXTRA_ARGS=$P_EXTRA_ARGS fi if [[ ! -z $P_SERVER_IP ]]; then SERVER_IP=$P_SERVER_IP fi if [[ ! -z $P_SERVER_PORT ]]; then SERVER_PORT=$P_SERVER_PORT fi if [[ ! -z $P_METAMOD ]]; then METAMOD=$P_METAMOD fi if [[ ! -z $P_WORKSHOP_START_MAP ]]; then WORKSHOP_START_MAP=$P_WORKSHOP_START_MAP fi # Componer el nuevo argumento de lanzamiento combinado desde Pterodactyl, para que de alguna manera puedan interpretarse a la vez, tanto desde este script como Pterodactyl if [[ ! -z $STARTUP ]]; then LAUNCH_ARGS="$STARTUP +ip ${SERVER_IP} -port ${SERVER_PORT} -maxplayers ${MAX_PLAYERS}" fi # Añadir los parametros de lanzamiento extra if [[ ! -z $EXTRA_ARGS ]]; then LAUNCH_ARGS=$LAUNCH_ARGS $EXTRA_ARGS fi # Comprobar si existe un directorio home adecuado if [ ! -d "$HOME" ]; then echo "No se puede encontrar o no se tienen permisos en la carpeta principal home del usuario: $USER" exit 1 else if [ ! -w "$HOME" ] || [ ! -r "$HOME" ]; then echo "No se tienen permisos de lectura o escritura dentro del directorio home del usuario: $USER" exit 1 fi fi # Comprobar si existe el directorio principal donde se ejecuta el juego y alcanzarlo if [ ! -d "$SERVER_DIR" ]; then # Si el directorio no existe, crearlo mkdir -p "$GAME_DIR" echo "Se ha creado el directorio $GAME_DIR" fi cd $SERVER_DIR # SteamCMD Descarga e instala steamcmd si no existe. STEAMCMD_DIR="$HOME/steamcmd" if [ ! -d "$STEAMCMD_DIR" ]; then echo "|> NO SE HA ENCONTRADO STEAMCMD. Descargando e instalando steamcmd..." mkdir -p "$STEAMCMD_DIR" cd "$STEAMCMD_DIR" wget -O "steamcmd_linux.tar.gz" "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" tar -xvzf steamcmd_linux.tar.gz rm steamcmd_linux.tar.gz fi # Crear un script de actualizacion automatica para el servidor # STEAM_RUNSCRIPT="$STEAMCMD_DIR/server_autoupdate_script_${SCREEN_NAME}.txt" # touch "$STEAM_RUNSCRIPT" # echo "force_install_dir $SERVER_DIR" > "$STEAM_RUNSCRIPT" # if [ -z "$STEAM_PSW" ]; then # echo "login anonymous" >> "$STEAM_RUNSCRIPT" # else # echo "login $STEAM_ACCOUNT $STEAM_PSW" >> "$STEAM_RUNSCRIPT" # fi # echo "app_update $APP_ID" >> "$STEAM_RUNSCRIPT" # echo "quit" >> "$STEAM_RUNSCRIPT" # chown ${USER} "$STEAM_RUNSCRIPT" # chmod 666 "$STEAM_RUNSCRIPT" # Lanzar steamcmd para comprobar actualizaciones del cliente $STEAMCMD_DIR/steamcmd.sh +quit # Crear enlaces simbolicos para conectar con steamcmdclient desde el usuario mkdir -p ~/.steam/sdk32/ mkdir -p ~/.steam/sdk64/ rm "$HOME/.steam/sdk32/steamclient.so" ln -s $STEAMCMD_DIR/linux32/steamclient.so ~/.steam/sdk32/steamclient.so # Enlazar los ejecutables de steam al directorio del usuario para actualizar automaticamente (AUTO_UPDATE variable) ln -s $STEAMCMD_DIR/linux64/steamclient.so ~/.steam/sdk64/steamclient.so #ln -s "$STEAMCMD_DIR/linux32/steamcmd" "$STEAMCMD_DIR/linux32/steam" # Esto se hace debido a que Volvo esta completamente loco. #ln -s "$STEAMCMD_DIR/steamcmd.sh" "$STEAMCMD_DIR/steam.sh" # Esto se hace debido a que Volvo esta completamente loco. echo "|> steamcmd completamente instalado" # # Establecer la actualizacion automatica propia de CS2 # if [ "$AUTO_UPDATE" = "1" ]; then # LAUNCH_ARGS="${LAUNCH_ARGS} -autoupdate -steam_dir $STEAMCMD_DIR -steamcmd_script server_autoupdate_script_${SCREEN_NAME}.txt" # echo "|> ACTIVADA Actualizacion propia del juego mediante argumentos" # fi # Verificar si se utilizan mapas de la workshop if [ -n "$WORKSHOP_START_MAP" ]; then LAUNCH_ARGS="${LAUNCH_ARGS} +map $DEFAULT_START_MAP +host_workshop_map ${WORKSHOP_START_MAP}" else LAUNCH_ARGS="${LAUNCH_ARGS} +map $DEFAULT_START_MAP" echo "|> No se han definido mapas de la workshop o API. Continuando con ${DEFAULT_START_MAP}..." fi # Uso de Valve-Anticheat if [ "$VAC" != "1" ]; then LAUNCH_ARGS="${LAUNCH_ARGS} -insecure" echo "|> VAC Anticheat desativado desde configuracion" fi # Hacer el uso de debug if [ "$SRCDS_DEBUG" = "1" ]; then LAUNCH_ARGS="${LAUNCH_ARGS} -debug" fi # Actualiza el servidor de CSGO echo "|> UPDATE on boot server... running steamcmd" cd "$STEAMCMD_DIR" if [ "$UPDATE_ON_BOOT" = "1" ]; then if [ -z "$STEAM_PSW" ]; then ./steamcmd.sh +force_install_dir "$SERVER_DIR" +login anonymous +app_update $APP_ID +quit else ./steamcmd.sh +force_install_dir "$SERVER_DIR" +login "$STEAM_ACCOUNT" "$STEAM_PSW" "$STEAM_GUARD" +app_update $APP_ID +quit fi fi # Instalar o actualizar MetaMod echo "4.Actualizando MetaMod" MM_VERSION_FILE="$SERVER_DIR/MM_installed_version.txt" METAMOD_VERSION_URL="https://mms.alliedmods.net/mmsdrop/2.0/mmsource-latest-linux" METAMOD_VERSION_URL=$(wget -qO- "$METAMOD_VERSION_URL") if [ "$METAMOD" = "1" ]; then if [ ! -d $MM_VERSION_FILE ]; then touch $MM_VERSION_FILE chown ${USER} "$MM_VERSION_FILE" chmod 600 "$MM_VERSION_FILE" fi if [ ! "$METAMOD_VERSION_URL" = "$(cat $MM_VERSION_FILE)" ]; then echo "Se ha encontrado una última versión distinta a la ya instalada" echo "Actual MM version: $(cat $MM_VERSION_FILE) | New MM version: $METAMOD_VERSION_URL" echo "$METAMOD_VERSION_URL" > $MM_VERSION_FILE METAMOD_DOWNLOAD_BY_VERSION_URL="https://mms.alliedmods.net/mmsdrop/2.0/$METAMOD_VERSION_URL" DROP_MM_DIR="${SERVER_DIR}/game/csgo" # For download the binaries METAMOD_DIR="${SERVER_DIR}/game/csgo/addons/metamod" # Fixes news installations if [ ! -d "$METAMOD_DIR" ]; then echo "Instalando MetaMod..." mkdir -p "$METAMOD_DIR" else echo "Actualizando MetaMod..." fi if wget -qO- "$METAMOD_DOWNLOAD_BY_VERSION_URL" | tar -xz -C "$DROP_MM_DIR"; then echo "El archivo se descargó y descomprimió correctamente." echo "MetaMod instalado/actualizado con éxito." else echo "Error: No se pudo descargar o descomprimir el archivo." exit 1 fi # Comprobar y activar el mecanismo de carga de plugins hacia Source2 # ya ves else echo "La ultima version de MM es la misma que la actualmente instalada." fi fi # Instalar o actualizar SourceMod # echo "5.Actualizando SourceMod" # SM_VERSION_FILE="$SERVER_DIR/SM_installed_version.txt" # SOURCEMOD_VERSION_URL="https://sm.alliedmods.net/smdrop/1.11/sourcemod-latest-linux" # SOURCEMOD_VERSION_URL=$(wget -qO- "$SOURCEMOD_VERSION_URL") # if [ ! -d $SM_VERSION_FILE ]; then # touch $SM_VERSION_FILE # chown ${USER} "$SM_VERSION_FILE" # chmod 600 "$SM_VERSION_FILE" # fi # if [ ! "$SOURCEMOD_VERSION_URL" = "$(cat $SM_VERSION_FILE)" ]; then # echo "Se ha encontrado una última versión distinta a la ya instalada" # echo "Actual SM version: $(cat $SM_VERSION_FILE) | New SM version: $SOURCEMOD_VERSION_URL" # echo "$SOURCEMOD_VERSION_URL" > $SM_VERSION_FILE # SOURCEMOD_VERSION_URL="https://sm.alliedmods.net/smdrop/1.11/$SOURCEMOD_VERSION_URL" # SOURCEMOD_DIR="$SERVER_DIR/csgo/addons/sourcemod" # if [ ! -d "$SOURCEMOD_DIR" ]; then # echo "Instalando SourceMod desde cero..." # mkdir -p "$SOURCEMOD_DIR" # wget -qO- "$SOURCEMOD_VERSION_URL" | tar -xz -C "$SERVER_DIR/csgo" # echo "SourceMod instalado con éxito." # else # if [ "$BACKUP_SM_CFG" = "1" ]; then # TIMESTAMP=$(date +%Y%m%d_%H%M%S) # if [ ! -d "$BACKUP_DIR" ]; then # echo "El directorio de backups no existe: BACKUP_DIR" # mkdir -p "$BACKUP_DIR" # echo "Directorio creado: $BACKUP_DIR" # fi # tar -czf "$BACKUP_DIR/addons_backup_$TIMESTAMP.tar.gz" -C "$SERVER_DIR/csgo/addons" . # FILES_COUNT=$(ls -1 $directorio | wc -l) # if [ $FILES_COUNT -gt $MAX_BACKUPS ]; then # # Obtener la lista de archivos ordenados por fecha de modificación (el más antiguo al final) # OLD_FILES=$(ls -1t $BACKUP_DIR | tail -n $(expr $FILES_COUNT - $MAX_BACKUPS)) # # Eliminar los archivos más antiguos # rm $BACKUP_DIR/$OLD_FILES # fi # echo "Copia de seguridad finalizada" # fi # echo "Actualizando SourceMod sin perder la configuración existente..." # TEMP_DIR="$(mktemp -d)" # wget -qO- "$SOURCEMOD_VERSION_URL" | tar -xz -C "$TEMP_DIR" # rm -rf "$TEMP_DIR/cfg" "$TEMP_DIR/addons/sourcemod/configs" "$TEMP_DIR/addons/sourcemod/data" # cp -R "$TEMP_DIR/addons" "$SERVER_DIR/csgo" # echo "SourceMod instalado/actualizado con éxito." # rm -rf "$TEMP_DIR" # fi # else # echo "La ultima version de SM es la misma que la actualmente instalada." # fi #Iniciar servidor de CS:GO cd "$SERVER_DIR/game/bin/linuxsteamrt64/" echo "Lanzando servidor >> $SRCDS_RUN $LAUNCH_ARGS" $SRCDS_RUN $LAUNCH_ARGS # if [[ -n $INVOCATION_ID ]]; then # Comprobar si el script esta lanzando un servicio o desde el # echo "El script se está ejecutando desde un archivo .service." # echo -c "####################\nArgumentos de lanzamiento: ${LAUNCH_ARGS}\n ####################" # echo "Lanzando servidor el $SCREEN_NAME en 5 segundos..." # sleep 5 # $SRCDS_RUN $LAUNCH_ARGS # else # # Lanza el servidor usando screen # echo -c "####################\nArgumentos de lanzamiento: ${LAUNCH_ARGS}\n ####################" # echo "Lanzando servidor el $SCREEN_NAME en 5 segundos..." # echo "El script se está ejecutando manualmente por un usuario." # sleep 5 # rm -f screenlog.* # screen -L -AdmS $SCREEN_NAME $SRCDS_RUN $LAUNCH_ARGS # # Espera un momento para que la pantalla tenga tiempo de iniciar # sleep 1 # # Redirige la salida estándar y la salida de error a un archivo de registro # screen -S $SCREEN_NAME -X logfile $LOG_FILE # screen -S $SCREEN_NAME -X log on # echo "La salida se está guardando en $LOG_FILE" # echo ".Servidor de CSGO lanzado en la pantalla '$SCREEN_NAME'. Para adjuntar, ejecute: screen -r $SCREEN_NAME" # exit 0 # fi