Advertisement
AlexandraTs

Automatic and manual backups for a minecraft server (ruby- 2.6.0)

Aug 10th, 2023 (edited)
588
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 4.92 KB | None | 0 0
  1. require "open3"
  2. require "fileutils"
  3. require 'thread'
  4. $continue = true
  5. File.open('LOG1.txt','w'){ |file| file.puts("started logging")}
  6. $save = "name"
  7. $loadName = "name"
  8. $save_next = false
  9. $load_next = false
  10. $short_autosave = 300
  11. $long_autosave = 1200
  12.  
  13. def mdir(var)
  14.     unless File.directory?(var)
  15.         FileUtils.mkdir_p "./"+var
  16.     end
  17. end
  18.  
  19. mdir("Save")
  20.  
  21. def cldir(var)
  22.     Dir[var+"/*"].each {|s| FileUtils.rm_r(s)}
  23. end
  24.  
  25. def log(data)
  26.     File.open('LOG1.txt','a'){ |file| file.puts data}
  27. end
  28.  
  29. def includes(data,str)
  30.     return data.index(str)!=nil
  31. end
  32.  
  33. $backup_timer = Time.now.to_i + $short_autosave
  34. $long_backup_timer = Time.now.to_i + $long_autosave
  35. $mutex = Mutex.new
  36. def backup(data, stdin)
  37.     name = data.partition("> backup ").last
  38.     $mutex.lock
  39.     if ($save_next) then
  40.         stdin.puts('say server back-up "'+$save+'" refused, backup already ongoing at "'+$save+'"')
  41.         $mutex.unlock
  42.         return nil
  43.     end
  44.     $save_next=true
  45.     $mutex.unlock
  46.     $save= name
  47.     stdin.puts('say Backing up server at "'+$save+'"')
  48.     stdin.puts("save-all")
  49.     log($save+ " is the chosen save file(bk1)")
  50. end
  51.  
  52. def backup_2(stdin)
  53.     direct = "Save/"+$save
  54.     log($save+ " is the chosen save file(bk2)")
  55.     mdir(direct)
  56.     cldir(direct)
  57.     FileUtils.cp_r "./world/." , direct
  58.     $save_next=false
  59.     stdin.puts('say Backup complete at "'+$save+'"')
  60. end
  61.  
  62. def load(data, stdin)
  63.     $loadName= data.partition("> load ").last
  64.     log($loadName+ " is the chosen load file(ld1)")
  65.     stdin.puts("stop")
  66.     $load_next= true
  67. end
  68.  
  69. def load_2()
  70.     log($loadName+ " is the chosen load file(ld2)")
  71.     direct = "Save/"+$loadName
  72.     cldir("world")
  73.     FileUtils.cp_r direct+"/." , "./world"
  74.     $load_next = false
  75. end
  76.  
  77. $shortSaveNumber = 1
  78. $longSaveNumber = 1
  79. file_data = []
  80. if (File.exist?("autosaveData.txt"))
  81.     file_data = File.read("autosaveData.txt").split
  82. end
  83. if(file_data.length >= 1) then
  84.     $shortSaveNumber = file_data[0].to_i
  85. end
  86. if(file_data.length >= 2) then
  87.     $longSaveNumber = file_data[1].to_i
  88. end
  89.  
  90. $running=false
  91. $stdin = nil
  92. $timers = Mutex.new
  93. Thread.new do
  94.     while($continue) do
  95.         sleep($backup_timer-Time.now.to_i)
  96.         saveName = "> backup autosave_"
  97.         $timers.lock
  98.         currTime = Time.now.to_i
  99.        
  100.         if($backup_timer > currTime) then
  101.             $timers.unlock
  102.             next
  103.         end
  104.        
  105.         if(!$running) then
  106.             $backup_timer = currTime + $short_autosave
  107.             $long_backup_timer = currTime + $long_autosave
  108.             $timers.unlock
  109.             next
  110.         end
  111.        
  112.         if($long_backup_timer <= currTime) then
  113.             $backup_timer = currTime + $short_autosave
  114.             $long_backup_timer = currTime + $long_autosave
  115.             saveName = saveName + "long_#{$longSaveNumber}"
  116.             $longSaveNumber = $longSaveNumber%3 + 1
  117.         end
  118.        
  119.         if($backup_timer <= currTime) then
  120.             $backup_timer = currTime + $short_autosave
  121.             saveName = saveName + "short_#{$shortSaveNumber}"
  122.             $shortSaveNumber = $shortSaveNumber%3 + 1
  123.         end
  124.        
  125.         $timers.unlock
  126.         backup(saveName,$stdin)
  127.     end
  128. end
  129.  
  130.  
  131. def compute(stdin, data)
  132.     if(includes(data,"[INFO] Saved the world"))then
  133.         if($save_next)then
  134.             backup_2(stdin);
  135.         end
  136.     end
  137.     if( includes( data, "> stop")) then
  138.         $continue = false
  139.         stdin.puts( "stop")
  140.         log("stop")
  141.     end
  142.     if( includes(data, "> backup")) then
  143.         log("backup")
  144.         $timers.lock
  145.         $backup_timer = Time.now.to_i + $short_autosave
  146.         $long_backup_timer = Time.now.to_i + $long_autosave
  147.         $timers.unlock
  148.         backup( data, stdin)
  149.     end
  150.     if(includes(data, "> load")) then
  151.         log("load")
  152.         load(data,stdin)
  153.     end
  154.     if(includes(data, "> files")) then
  155.         log("files")
  156.         sortedDir = Dir["Save/*"].sort_by { |file_name| File.stat(file_name).mtime }
  157.         sortedDir.each {|s| stdin.puts("say '"+s.partition("Save/").last+"' : #{File.stat(s).mtime}")}
  158.     end
  159.     if(includes(data, "> quicksave")) then
  160.         backup("> backup quicksave",stdin)
  161.     end
  162.     if(includes(data,"> quickload")) then
  163.         sortedDir = Dir["Save/*"].sort_by { |file_name| File.stat(file_name).mtime }
  164.         load("> load "+sortedDir[-1].partition("Save/").last, stdin)
  165.     end
  166.     if(includes(data,"> help")) then
  167.         log("help")
  168.         stdin.puts("say Commands are:")
  169.         stdin.puts("say -help")
  170.         stdin.puts("say -stop")
  171.         stdin.puts("say -backup <name>")
  172.         stdin.puts("say -load <name>")
  173.         stdin.puts("say -files")
  174.         stdin.puts("say -quicksave")
  175.         stdin.puts("say -quickload")
  176.     end
  177. end
  178.  
  179.  
  180. while($continue) do
  181.     $stdin, stdout, wait_thr = Open3.popen2e("server.bat")
  182.     $running=true
  183.    
  184.     $timers.lock
  185.     $backup_timer = Time.now.to_i + $short_autosave
  186.     $long_backup_timer = Time.now.to_i + $long_autosave
  187.     $timers.unlock
  188.    
  189.     $mutex.lock
  190.     $save_next = false;
  191.     $mutex.unlock
  192.    
  193.     while($running) do
  194.         data = stdout.readline.chomp
  195.         File.open('LOG1.txt','a'){ |file| file.puts data+"\n"}
  196.         compute($stdin,data)
  197.         if(includes(data,"[INFO] Stopping server")) then
  198.             $running=false
  199.             break
  200.         end
  201.     end
  202.    
  203.     $stdin.close
  204.     stdout.close
  205.     wait_thr.value
  206.     if($load_next) then
  207.         load_2()
  208.     end
  209. end
  210.  
  211. File.open("autosaveData.txt", "w") { |f|
  212.     f.write "#{$shortSaveNumber}\n"
  213.     f.write "#{$longSaveNumber}\n"
  214. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement