Advertisement
xXMarcinatorXx

startserverlinux.sh file

Apr 1st, 2019
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 10.26 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #### Minecraft-Forge Server install/launcher script
  4. #### Linux Version
  5. ####
  6. #### Created by: Dijkstra
  7. #### Mascot: Ordinator
  8. ####
  9. #### Originally created for use in "All The Mods" modpacks
  10. #### NO OFFICIAL AFFILIATION WITH MOJANG OR FORGE
  11. ####
  12. #### This script will fetch the appropriate forge installer
  13. #### and run it to install forge AND fetch Minecraft (from Mojang)
  14. #### If Forge and Minecraft are already installed it will skip
  15. #### download/install and launch server directly (with
  16. #### auto-restart-after-crash logic as well)
  17. ####
  18. #### Make sure this is running as BASH
  19. #### You might need to chmod +x before executing
  20. ####
  21. #### IF THERE ARE ANY ISSUES
  22. #### Please make a report on the AllTheMods github:
  23. #### https://github.com/whatthedrunk/allthemods/issues
  24. #### with the contents of [serverstart.log] and [installer.log]
  25. ####
  26. #### or come find us on Discord: https://discord.gg/FdFDVWb
  27. ####
  28.  
  29.  
  30. #For Server Owners
  31.  
  32.    
  33. #
  34. #
  35. #
  36. #
  37. #
  38. #
  39. #
  40. # Internal scripty stuff from here on out
  41. # No lines intended to be edited past here
  42. #
  43. #
  44. #
  45. #
  46. #
  47. # Make sure users aren't trying to run script via sh directly (won't work)
  48.  
  49. unameOut="$(uname -s)"
  50. case "${unameOut}" in
  51.     Linux*)     machine=Linux;;
  52.     Darwin*)    machine=Mac;;
  53.     CYGWIN*)    machine=Cygwin;;
  54.     MINGW*)     machine=MinGw;;
  55.     *)          machine="UNKNOWN:${unameOut}"
  56. esac
  57.  
  58. if [ ! "$BASH_VERSION" ] ; then
  59.     echo "Please do not use sh to run this script ($0). Use bash instead (or execute it directly)" 1>&2
  60.     exit 1
  61. fi
  62.  
  63. # routine to handle Forge/server install
  64. install_server(){
  65.     echo "Starting install of Forge/Minecraft server binaries"
  66.     echo "DEBUG: Starting install of Forge/Minecraft server binaries" >>serverstart.log 2>&1
  67.     if [ -f installer.jar ]; then
  68.         echo "DEBUG: installer.jar found in current directory" >>serverstart.log 2>&1
  69.         export answer="n"
  70.         read -t 8 -p "Installer found. Use it (y) or download again (n)?  " answer
  71.         if [[ "$answer" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  72.             echo "INFO: Skipping download. Using existing installer.jar" >>serverstart.log 2>&1
  73.             echo "Skipping download. Using existing installer.jar"
  74.         fi
  75.     else
  76.         if [ "${FORGEURL}" = "DISABLE" ]; then
  77.             export URL="http://files.minecraftforge.net/maven/net/minecraftforge/forge/${MCVER}-${FORGEVER}/forge-${MCVER}-${FORGEVER}-installer.jar"
  78.         else
  79.             export URL="${FORGEURL}"
  80.         fi
  81.         echo $URL
  82.         which wget >> /dev/null
  83.         if [ $? -eq 0 ]; then
  84.             echo "DEBUG: (wget) Downloading ${URL}" >>serverstart.log 2>&1
  85.             wget -O installer.jar "${URL}" >>serverstart.log 2>&1
  86.         else
  87.             which curl >> /dev/null
  88.             if [ $? -eq 0 ]; then
  89.                 echo "DEBUG: (curl) Downloading ${URL}" >>serverstart.log 2>&1
  90.                 curl -o installer.jar "${URL}" >>serverstart.log 2>&1
  91.             else
  92.                 echo "Neither wget or curl were found on your system. Please install one and try again"
  93.                 echo "ERROR: Neither wget or curl were found" >>serverstart.log 2>&1
  94.             fi
  95.         fi
  96.     fi
  97.  
  98.     if [ ! -f installer.jar ]; then
  99.         echo "Forge installer did not download"
  100.         echo "ERROR: Forge installer did not download" >>serverstart.log 2>&1
  101.         exit 0
  102.     else
  103.         echo "Moving unneeded files/folders to ./DELETEME"
  104.         echo "INFO: Moving unneeded files/folders to ./DELETEME" >>serverstart.log 2>&1
  105.         rm -rf ./DELETEME >>serverstart.log 2>&1
  106.         mv -f ./asm ./DELETEME >>serverstart.log 2>&1
  107.         mv -f ./libraries ./DELETEME >>serverstart.log 2>&1
  108.         mv -f ./llibrary ./DELETEME >>serverstart.log 2>&1
  109.         mv -f ./minecraft_server*.jar ./DELETEME >>serverstart.log 2>&1
  110.         mv -f ./forge*.jar ./DELETEME >>serverstart.log 2>&1
  111.         mv -f ./OpenComputersMod*lua* ./DELETEME >>serverstart.log 2>&1
  112.         echo "Installing Forge Server, please wait..."
  113.         echo "INFO: Installing Forge Server" >>serverstart.log 2>&1
  114.         java -jar installer.jar --installServer >>serverstart.log 2>&1
  115.         echo "Deleting Forge installer (no longer needed)"
  116.         echo "INFO: Deleting installer.jar" >>serverstart.log 2>&1
  117.         rm -rf installer.jar  >>serverstart.log 2>&1
  118.     fi
  119. }
  120.  
  121. # routine to [re]start Forgemodded minecraft server
  122. start_server() {
  123.     echo ""
  124.     echo ""
  125.     echo "Starting server"
  126.     echo "INFO: Starting Server at " $(date -u +%Y-%m-%d_%H:%M:%S) >>serverstart.log 2>&1
  127.     java -Xmx${MAX_RAM} ${JAVA_ARGS} -jar forge-${MCVER}-${FORGEVER}-universal.jar nogui
  128. }
  129.  
  130. # routine for basic directory checks
  131. check_dir(){
  132.     echo "DEBUG: Current directory is " $(pwd) >>serverstart.log 2>&1
  133.     if [ "$(pwd)" = "/tmp" ] || [ "$(pwd)" = "/var/tmp" ]; then
  134.         echo "Current directory appears to be TMP"
  135.         echo "WARN: Current DIR is TEMP"  >>serverstart.log 2>&1
  136.         if [ ${RUN_FROM_BAD_FOLDER} -eq 0 ]; then
  137.             echo "ERROR: Stopping due to bad folder (TMP)" >>serverstart.log 2>&1
  138.             echo "RUN_FROM_BAD_FOLDER setting is off, exiting script"
  139.             exit 0
  140.         else
  141.             echo "WARN: Bad folder (TMP) but continuing anyway" >>serverstart.log 2>&1
  142.             echo "Bypassing cd=temp halt per script settings"
  143.         fi
  144.     fi
  145.  
  146.     if [ ! -r . ] || [ ! -w . ]; then
  147.     echo "WARN: Not full R/W access on current directory"
  148.     echo "You do not have full R/W access to current directory"
  149.         if [ ${RUN_FROM_BAD_FOLDER} -eq 0 ]; then
  150.         echo "ERROR: Stopping due to bad folder (R/W access)" >>serverstart.log 2>&1
  151.         echo "RUN_FROM_BAD_FOLDER setting is off, exiting script"
  152.         exit 0
  153.         else
  154.         echo "WARN: Bad folder (R/W) cut continuing anyway" >>serverstart.log 2>&1
  155.         echo "Bypassing no R/W halt (per script settings)"
  156.         fi
  157.     fi
  158. }
  159.  
  160. # routine for ping inet connectivity
  161. check_connection(){
  162.     if [ ${IGNORE_OFFLINE} -eq 1 ]; then
  163.         echo "WARN: Internet connectivity checking is disabled" >>serverstart.log 2>&1
  164.         echo "Skipping internet connectivity check"
  165.     else
  166.         if ping -c 1 8.8.8.8 >> /dev/null 2>&1; then
  167.             echo "INFO: Ping to Google DNS successfull" >>serverstart.log 2>&1
  168.             echo "Ping to Google DNS successfull"
  169.         else
  170.             echo "ERROR: Ping to Google DNS failed. No internet access?" >>serverstart.log 2>&1
  171.             echo "Ping to Google DNS failed. No internet access?"
  172.         fi
  173.  
  174.         if ping -c 1 4.2.2.1 >> /dev/null 2>&1; then
  175.             echo "INFO: Ping to L4 successfull" >>serverstart.log 2>&1
  176.             echo "Ping to L4 successfull"
  177.         else
  178.             echo "ERROR: Ping to L4 failed. No internet access?"  >>serverstart.log 2>&1
  179.             echo "Ping to L4 failed. No internet access?"
  180.             exit 0
  181.         fi
  182.     fi
  183. }
  184.  
  185. # routine to make sure necessary binaries are found
  186. check_binaries(){
  187.     if [ ! -f ${FORGE_JAR} ] ; then
  188.         echo "WARN: ${FORGE_JAR} not found"  >>serverstart.log 2>&1
  189.         echo "Required files not found, need to install Forge"
  190.         install_server
  191.     fi
  192.     if [ ! -f ./minecraft_server.${MCVER}.jar ] ; then
  193.         echo "WARN: minecraft_server.${MCVER}.jar not found" >>serverstart.log 2>&1
  194.         echo "Required files not found, need to install Forge"
  195.         install_server
  196.     fi
  197.     if [ ! -d ./libraries ] ; then
  198.         echo "WARN: library directory not found" >>serverstart.log 2>&1
  199.         echo "Required files not found, need to install Forge"
  200.         install_server
  201.     fi
  202. }
  203.  
  204. read_config(){
  205.     while read -r line || [[ -n "$line" ]] ; do
  206.         if echo $line | grep -F = &>/dev/null; then
  207.             if [[ ${str:0:1} != "#" ]] ; then
  208.                 name=$(echo "$line" | cut -d '=' -f 1)
  209.                 val=$(echo "${line}" | cut -d '=' -f 2-)
  210.                 eval "export ${name}='${val%?}'"
  211.             fi
  212.         fi
  213.     done < settings.cfg
  214.  
  215. }
  216.  
  217. eula(){
  218.     if [ ! -f eula.txt ]; then
  219.         echo "Could not find eula.txt starting server to generate it"
  220.         start_server
  221.         echo ""
  222.         echo "Closing to give user a change to accept the eula"
  223.         exit 0
  224.     else
  225.         if grep -Fxq "eula=false" eula.txt; then
  226.             echo "Could not find 'eula=true' in 'eula.txt'"
  227.             echo "Closing to give user a change to accept the eula"
  228.             exit 0
  229.         fi
  230.     fi
  231. }
  232.  
  233. read_config
  234.  
  235. # Script/batch starts here...
  236.  
  237. # init log file and dump basic info
  238. echo "INFO: Starting script at" $(date -u +%Y-%m-%d_%H:%M:%S) >serverstart.log 2>&1
  239. echo "DEBUG: Dumping starting variables: " >>serverstart.log 2>&1
  240. echo "DEBUG: MAX_RAM=$MAX_RAM" >>serverstart.log 2>&1
  241. echo "DEBUG: JAVA_ARGS=$JAVA_ARGS" >>serverstart.log 2>&1
  242. echo "DEBUG: CRASH_COUNT=$CRASH_COUNT" >>serverstart.log 2>&1
  243. echo "DEBUG: RUN_FROM_BAD_FOLDER=$RUN_FROM_BAD_FOLDER" >>serverstart.log 2>&1
  244. echo "DEBUG: IGNORE_OFFLINE=$IGNORE_OFFLINE" >>serverstart.log 2>&1
  245. echo "DEBUG: MCVER=$MCVER" >>serverstart.log 2>&1
  246. echo "DEBUG: FORGEVER=$FORGEVER" >>serverstart.log 2>&1
  247. echo "DEBUG: FORGEURL=$FORGEURL" >>serverstart.log 2>&1
  248. echo "DEBUG: Basic System Info: " $(uname -a) >>serverstart.log 2>&1
  249. if [ "$machine" = "Mac" ]
  250. then
  251.   echo "DEBUG: Total RAM estimate: " $(sysctl hw.memsize | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024 / 1024" MB"}') >>serverstart.log 2>&1
  252. else
  253.   echo "DEBUG: Total RAM estimate: " $(getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024 / 1024" MB"}') >>serverstart.log 2>&1
  254. fi
  255. echo "DEBUG: Java Version info: " $(java -version) >>serverstart.log 2>&1
  256. echo "DEBUG: Dumping current directory listing " >>serverstart.log 2>&1
  257. ls -s1h >>serverstart.log 2>&1
  258.  
  259. export answer="n"
  260. echo ""
  261. read -t 6 -p "About to start server. Force re-install (y/n)?  " answer
  262. if [[ "$answer" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
  263.     echo "INFO: User chose to manually re-install server files"  >>serverstart.log 2>&1
  264.     echo "User chose to manually re-install server files"
  265.     install_server
  266. fi
  267.  
  268. check_dir
  269. check_connection
  270. check_binaries
  271. eula
  272.  
  273. # loop to restart server and check crash frequency
  274. a=0
  275. last_crash=$((SECONDS))
  276. while true ; do
  277.     start_server
  278.     b=$?
  279.     if [ "$b" -eq "0" ]; then
  280.         a=0
  281.     else
  282.         now=$((SECONDS))
  283.         diff=$(($now-$last_crash))
  284.         if [ "$diff" -gt "3600" ]; then
  285.             a=1
  286.             else
  287.             a=$((a+1))
  288.         fi
  289.         last_crash=$((SECONDS))
  290.     fi
  291.     if [ "$a" -eq ${CRASH_COUNT} ]; then
  292.         echo "The server has crashed to many times"
  293.         echo "ERROR: Server has failed too start too many times in a row." >>serverstart.log 2>&1
  294.         exit 0
  295.     fi
  296.  
  297.     export answer="y"
  298.     echo "Server will restart in ~10 seconds. No input needed..."
  299.     read -t 12 -p "Restart now (y) or exit to shell (n)?  " answer
  300.     if [[ "$answer" =~ ^([nN][oO]|[nN])+$ ]]; then
  301.         echo "INFO: User cancelled restart; exiting to shell" >>serverstart.log 2>&1
  302.         exit 0
  303.     fi
  304.  
  305.     #re-validate stuff each server restart
  306.     check_dir
  307.     check_connection
  308.     check_binaries
  309.     eula
  310.     echo "INFO: Server-auto-restart commencing"  >>serverstart.log 2>&1
  311.     echo "Rebooting now!"
  312. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement