Advertisement
Guest User

minecraft.sh

a guest
Oct 29th, 2010
8,494
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 10.57 KB | None | 0 0
  1. #!/bin/bash
  2. # original author : Relliktsohg
  3. # Huge thanks to Maine for his incremental backup
  4. # THanks to endofzero for his improved update routine
  5.  
  6. #   Configuration
  7.  
  8. MC_PATH=/home/minecraft
  9. SERVERMOD=0
  10. RUNECRAFT=0
  11. SCREEN_NAME="minecraft"
  12. MEMALOC=512
  13. DISPLAY_ON_LAUNCH=1
  14.  
  15. WORLD_NAME="world"
  16.  
  17. BKUP_PATH=$MC_PATH/backup
  18. BKUP_DAYS_INCR=2
  19. BKUP_DAYS_FULL=5
  20. BACKUP_FULL_LINK=${BKUP_PATH}/${WORLD_NAME}_full.tgz
  21. BACKUP_INCR_LINK=${BKUP_PATH}/${WORLD_NAME}_incr.tgz
  22.  
  23. CARTO_PATH=$MC_PATH/carto
  24. MAPS_PATH=/var/www/minecraftMaps
  25. LOG_TDIR=/var/www/minecraftLogs
  26. LOGS_DAYS=7
  27.  
  28. #   End of configuration
  29.  
  30. if [ $SERVERMOD -eq 1 ]
  31. then
  32.         if [ -e $MC_PATH/logs/*.log.lck ]
  33.         then
  34.                 ONLINE=1
  35.         else
  36.                 ONLINE=0
  37.         fi
  38. else
  39.         if [ -e $MC_PATH/server.log.lck ]
  40.         then
  41.                 #       ps -e | grep java | wc -l
  42.                 ONLINE=1
  43.         else
  44.                 ONLINE=0
  45.         fi
  46. fi
  47.  
  48. display() {
  49.     screen -R $SCREEN_NAME
  50. }
  51.  
  52. server_launch() {
  53.     echo "Launching minecraft server..."
  54.     if [ $SERVERMOD -eq 1 ]
  55.     then
  56.         cd $MC_PATH; screen -m -d -S $SCREEN_NAME java -Xmx${MEMALOC}M -Xms${MEMALOC}M -Djava.net.preferIPv4Stack=true -jar Minecraft_Mod.jar nogui; sleep 1
  57.     else
  58.         cd $MC_PATH; screen -m -d -S $SCREEN_NAME java -Xmx${MEMALOC}M -Xms${MEMALOC}M -Djava.net.preferIPv4Stack=true -jar minecraft_server.jar nogui; sleep 1
  59.     fi     
  60. }
  61.    
  62. server_stop() {
  63.     echo "Stopping minecraft server..."
  64.     screen -S $SCREEN_NAME -p 0 -X stuff "`printf "stop.\r"`"; sleep 5
  65. }
  66.  
  67. if [ $# -gt 0 ]
  68. then
  69.     case $1 in
  70.  
  71.     #################################################################
  72.     "status")
  73.         if [ $ONLINE -eq 1 ]
  74.         then
  75.             echo "Minecraft server seems ONLINE."
  76.         else
  77.             echo "Minecraft server seems OFFLINE."
  78.         fi;;
  79.  
  80.     #################################################################
  81.     "start")
  82.         if [ $ONLINE -eq 1 ]
  83.         then
  84.             echo "Server seems to be already running !"
  85.             case $2 in
  86.             "force")
  87.                 kill `ps -e | grep java | cut -d " " -f 1`
  88.                 rm -fr $MC_PATH/*.log.lck 2> /dev/null/;;
  89.             esac
  90.         else
  91.             server_launch
  92.             if [ $DISPLAY_ON_LAUNCH -eq 1 ]
  93.             then
  94.                 display
  95.             fi 
  96.         fi;;
  97.  
  98.     #################################################################
  99.     "stop")
  100.         if [ $ONLINE -eq 1 ]
  101.         then
  102.             server_stop
  103.         else
  104.             case $2 in
  105.             "force")
  106.                 kill `ps -e | grep java | cut -d " " -f 1`
  107.                 rm -fr $MC_PATH/*.log.lck 2> /dev/null/;;
  108.             *)
  109.                 echo "Server seems to be offline...";;
  110.             esac
  111.         fi;;
  112.  
  113.     #################################################################
  114.     "restart")
  115.         if [ $ONLINE -eq 1 ]
  116.         then
  117.             case $2 in
  118.             "warn")
  119.                 screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say Server will restart in 30s !\r"`"; sleep 20
  120.                 screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say Server will restart in 10s !\r"`"; sleep 10;;
  121.             esac
  122.             server_stop
  123.         fi
  124.         server_launch
  125.         if [ $DISPLAY_ON_LAUNCH -eq 1 ]
  126.         then
  127.             display
  128.         fi;;
  129.        
  130.     #################################################################
  131.     "logs")
  132.         mkdir -p $LOG_TDIR     
  133.         cd $LOG_TDIR
  134.  
  135.         case $2 in
  136.         "clean")
  137.             DATE=$(date +%d-%m --date "$LOGS_DAYS day ago")
  138.             if [ -e logs-$DATE ]
  139.             then
  140.                 mkdir -p $BKUP_PATH/logs
  141.                 mv logs-$DATE $BKUP_PATH/logs/
  142.             fi
  143.         ;;
  144.         esac
  145.        
  146.         DATE=$(date +%d-%m)
  147.         LOG_NEWDIR=logs-$DATE
  148.         if [ -e $LOG_TDIR/$LOG_NEWDIR ]
  149.         then
  150.             rm $LOG_TDIR/$LOG_NEWDIR/*
  151.         else
  152.             mkdir $LOG_TDIR/$LOG_NEWDIR
  153.         fi
  154.            
  155.         DATE=$(date +%d-%m-%Hh%M)
  156.         LOG_TFILE=logs-$DATE.log
  157.        
  158.         if [ $SERVERMOD -eq 1 ]
  159.         then
  160.             if [ $ONLINE -eq 1 ]
  161.             then
  162.                 LOG_LCK=$(basename $MC_PATH/logs/*.log.lck .log.lck)
  163.                 echo "Found a log lock : $LOG_LCK"
  164.             else
  165.                 LOG_LCK=""
  166.             fi
  167.  
  168.             cd $MC_PATH/logs/
  169.             for i in *
  170.             do
  171.                 if [ $i != $LOG_LCK.log.lck ] # skip du fichier lck
  172.                 then
  173.                     cat $i >> $LOG_TDIR/$LOG_NEWDIR/$LOG_TFILE
  174.                     if [ $i != $LOG_LCK.log ]   # On ne supprime pas le fichier log courant, si le serv est en route
  175.                     then
  176.                         rm $i
  177.                     fi
  178.                 fi
  179.             done
  180.         else
  181.             cd $MC_PATH
  182.             cat server.log >> $LOG_TDIR/$LOG_NEWDIR/$LOG_TFILE
  183.         fi
  184.  
  185.         if [ -e $LOG_TDIR/ip-list.log ]
  186.         then
  187.             cat $LOG_TDIR/ip-list.log | sort | uniq > $LOG_TDIR/templist.log
  188.         fi
  189.        
  190.         cat $LOG_TDIR/$LOG_NEWDIR/$LOG_TFILE | egrep '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+.+logged in'  | sed -e 's/.*\[INFO\]\s//g' -e 's/\[\//\t/g' -e 's/:.*//g' >> $LOG_TDIR/templist.log
  191.         cat $LOG_TDIR/templist.log | sort | uniq -w 4 > $LOG_TDIR/ip-list.log
  192.         rm $LOG_TDIR/templist.log
  193.  
  194.         cat $LOG_TDIR/$LOG_NEWDIR/$LOG_TFILE | egrep 'logged in|lost connection' | sed -e 's/.*\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).\[INFO\].\([a-zA-Z0-9_]\{1,\}\).\{1,\}logged in/\1\t\2 : connected/g' -e 's/.*\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).\[INFO\].\([a-zA-Z0-9_]\{1,\}\).lost connection.*/\1\t\2 : disconnected/g' >> $LOG_TDIR/$LOG_NEWDIR/connexions-$DATE.log
  195.  
  196.         cat $LOG_TDIR/$LOG_NEWDIR/$LOG_TFILE | egrep '<[a-zA-Z0-9_]+>|\[CONSOLE\]' | sed -e 's/.*\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).\[INFO\]./\1 /g' >> $LOG_TDIR/$LOG_NEWDIR/chat-$DATE.log
  197.  
  198.         cat $LOG_TDIR/$LOG_NEWDIR/$LOG_TFILE | egrep 'Internal exception|error' | sed -e 's/.*\([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\).\[INFO\]./\1\t/g' >> $LOG_TDIR/$LOG_NEWDIR/errors-$DATE.log
  199.     ;;
  200.  
  201.     #################################################################
  202.     "backup")
  203.  
  204.         mkdir -p $BKUP_PATH
  205.            
  206.         if [ -e $MC_PATH/$WORLD_NAME ]
  207.         then
  208.             if [ $ONLINE -eq 1 ]
  209.             then
  210.                 echo "Server running, warning players : backup in 10s."
  211.                 screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say Backing up the map in 10s\r"`"; sleep 10
  212.                 screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say Now backing up the map...\r"`"
  213.                 echo "Issuing save-all command, wait 5s..."
  214.                 screen -S $SCREEN_NAME -p 0 -X stuff "`printf "save-all\r"`"; sleep 5
  215.                 echo "Issuing save-off command..."
  216.                 screen -S $SCREEN_NAME -p 0 -X stuff "`printf "save-off\r"`"; sleep 1
  217.             fi
  218.            
  219.             cd $BKUP_PATH
  220.  
  221.             DATE=$(date +%Y-%m-%d-%Hh%M)
  222.             FILENAME=$WORLD_NAME-$DATE
  223.             BACKUP_FILES=$BKUP_PATH/list.$DATE
  224.  
  225.             if test `date +%H` -eq 0 -o ! -f $BACKUP_FULL_LINK
  226.             then
  227.                 # Make full backup, and remove old incrementals
  228.                 FILENAME=$FILENAME-full.tgz
  229.  
  230.                 # Remove incrementals older than $BKUP_DAYS_INCR
  231.                 # Remove full archives older than $BKUP_DAYS_FULL
  232.                 find ./$WORLD_NAME-*-incr.tgz -type f -mtime +$BKUP_DAYS_INCR -print > purgelist
  233.                 find ./$WORLD_NAME-*-full.tgz -type f -mtime +$BKUP_DAYS_FULL -print >> purgelist
  234.                 rm -f `cat purgelist`
  235.                 rm -f purgelist
  236.  
  237.                 # Now make our full backup
  238.                 pushd $MC_PATH
  239.                 find $WORLD_NAME -type f -print > $BACKUP_FILES
  240.                 tar -zcvf $BKUP_PATH/$FILENAME --files-from=$BACKUP_FILES
  241.                 popd
  242.  
  243.                 rm -f $BACKUP_FULL_LINK $BACKUP_INCR_LINK
  244.                 ln -s $FILENAME $BACKUP_FULL_LINK
  245.             else
  246.                 # Make incremental backup
  247.                 FILENAME=$FILENAME-incr.tgz
  248.  
  249.                 pushd $MC_PATH
  250.                 find $WORLD_NAME -newer $BACKUP_FULL_LINK -type f -print > $BACKUP_FILES
  251.                 tar -zcvf $BKUP_PATH/$FILENAME --files-from=$BACKUP_FILES
  252.                 popd
  253.  
  254.                 rm -f $BACKUP_INCR_LINK
  255.                 ln -s $FILENAME $BACKUP_INCR_LINK
  256.             fi
  257.  
  258.             rm -f $BACKUP_FILES
  259.            
  260.             if [ $ONLINE -eq 1 ]
  261.             then
  262.                 echo "Issuing save-on command..."
  263.                 screen -S $SCREEN_NAME -p 0 -X stuff "`printf "save-on\r"`"; sleep 1
  264.                 screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say Backup is done, have fun !\r"`"
  265.             fi
  266.             echo "Backup process is over."
  267.         else
  268.             echo "The world \"$WORLD_NAME\" does not exist.";
  269.         fi;;
  270.  
  271.     #################################################################
  272.     "cartography")
  273.  
  274.         if [ -e $CARTO_PATH ]  
  275.         then
  276.             if [ -e $MC_PATH/$WORLD_NAME ]
  277.             then
  278.                 if [ $ONLINE -eq 1 ]
  279.                 then
  280.                     echo "Issuing save-all command, wait 5s...";
  281.                     screen -S $SCREEN_NAME -p 0 -X stuff "`printf "save-all\r"`"; sleep 5
  282.                     echo "Issuing save-off command...";
  283.                     screen -S $SCREEN_NAME -p 0 -X stuff "`printf "save-off\r"`"; sleep 1
  284.                     screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say Map cartography has begun.\r"`"
  285.                 fi
  286.                
  287.                 mkdir -p $MAPS_PATH
  288.                
  289.                 DATE=$(date +%d-%m-%Y-%Hh%M)
  290.                 FILENAME=$WORLD_NAME-map-$DATE
  291.                 cd $CARTO_PATH
  292.                 echo "Cartography in progress..."
  293.                 ./c10t -w $MC_PATH/$WORLD_NAME/ -o $FILENAME.png -q -s
  294.                 mv *.png $MAPS_PATH
  295.                 cd $MC_PATH
  296.                 echo "Cartography is done."
  297.                
  298.                 if [ $ONLINE -eq 1 ]
  299.                 then
  300.                     echo "Issuing save-on command..."
  301.                     screen -S $SCREEN_NAME -p 0 -X stuff "`printf "save-on\r"`"; sleep 1
  302.                     screen -S $SCREEN_NAME -p 0 -X stuff "`printf "say Map cartography is done.\r"`"
  303.                 fi
  304.  
  305.             else
  306.                 echo "The world \"$WORLD_NAME\" does not exist.";
  307.             fi
  308.         else
  309.             echo "The path to cartographier seems to be wrong."
  310.         fi;;
  311.    
  312.     #################################################################
  313.     "update")
  314.    
  315.         if [ $ONLINE -eq 1 ]
  316.         then
  317.             server_stop
  318.         fi
  319.        
  320.         mkdir -p $BKUP_PATH
  321.        
  322.         echo "Backing up current binaries..."
  323.         DATE=$(date +%d-%m-%Y)         
  324.         cd $MC_PATH
  325.         if [ $SERVERMOD -eq 1 ]
  326.         then
  327.             tar -czf minecraft_server-$DATE.tar.gz minecraft_server.jar Minecraft_Mod.jar
  328.             rm Minecraft_Mod.jar
  329.         else
  330.             tar -czf minecraft_server-$DATE.tar.gz minecraft_server.jar
  331.         fi
  332.         mv minecraft_server-$DATE.tar.gz $BKUP_PATH
  333.  
  334.         echo "Downloading new binaries..."
  335.         wget -N http://www.minecraft.net/download/minecraft_server.jar
  336.         if [ $SERVERMOD -eq 1 ]
  337.         then
  338.             "Downloading hey0's serverMod..."
  339.             mkdir -p ModTmp; cd ModTmp/
  340.             wget -O Minecraft_Mod.zip http://hey0.net/get.php?dl=serverbeta
  341.             unzip Minecraft_Mod.zip
  342.             cp bin/Minecraft_Mod.jar $MC_PATH/Minecraft_Mod.jar
  343.             cd $MC_PATH; rm -rf ModTmp    
  344.         fi
  345.         if [ $RUNECRAFT -eq 1 ]
  346.         then
  347.             echo "Downloading Runecraft..."
  348.             mkdir -p ModTmp; cd ModTmp/
  349.             wget http://llama.cerberusstudios.net/runecraft_latest.zip
  350.             unzip runecraft_latest.zip
  351.             jar uvf $MC_PATH/minecraft_server.jar in.class o.class mm.class rm.class rn.class rt.class
  352.             cd $MC_PATH; rm -rf ModTmp
  353.         fi
  354.  
  355.         server_launch
  356.         if [ $DISPLAY_ON_LAUNCH -eq 1 ]
  357.         then
  358.             display
  359.         fi;;
  360.                
  361.     #################################################################
  362.     *)
  363.         echo "Usage : minecraft <status | start [force] | stop | restart [warn] | logs [clean] | backup [clean] | cartography | update>";
  364.     esac
  365.  
  366. else
  367.     if [ $ONLINE -eq 1 ]
  368.     then
  369.         display
  370.     else
  371.         echo "Minecraft server seems to be offline..."
  372.     fi
  373. fi
  374. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement