Class: BackupRestore::Restorer

Inherits:
Object
  • Object
show all
Defined in:
lib/backup_restore/restorer.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user_id:, filename:, factory:, disable_emails: true, location: nil) ⇒ Restorer

Returns a new instance of Restorer.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/backup_restore/restorer.rb', line 12

def initialize(user_id:, filename:, factory:, disable_emails: true, location: nil)
  @user_id = user_id
  @filename = filename
  @factory = factory
  @logger = factory.logger
  @disable_emails = disable_emails

  ensure_restore_is_enabled
  ensure_we_have_a_user
  ensure_we_have_a_filename

  @success = false
  @current_db = RailsMultisite::ConnectionManagement.current_db

  @system = factory.create_system_interface
  @backup_file_handler = factory.create_backup_file_handler(@filename, @current_db, location)
  @database_restorer = factory.create_database_restorer(@current_db)
  @uploads_restorer = factory.create_uploads_restorer
end

Instance Attribute Details

#successObject (readonly)

Returns the value of attribute success.



10
11
12
# File 'lib/backup_restore/restorer.rb', line 10

def success
  @success
end

Instance Method Details

#runObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/backup_restore/restorer.rb', line 32

def run
  log "[STARTED]"
  log "'#{@user_info[:username]}' has started the restore!"

  # FIXME not atomic!
  ensure_no_operation_is_running
  @system.mark_restore_as_running

  @system.listen_for_shutdown_signal

  @tmp_directory, db_dump_path = @backup_file_handler.decompress
  

  @system.enable_readonly_mode
  @system.pause_sidekiq("restore")
  @system.wait_for_sidekiq
  @system.flush_redis
  @system.clear_sidekiq_queues

  @database_restorer.restore(db_dump_path)

  reload_site_settings

  @system.disable_readonly_mode

  clear_category_cache
  clear_stats
  reload_translations

  @uploads_restorer.restore(@tmp_directory)

  clear_emoji_cache
  clear_theme_cache

  after_restore_hook
rescue Compression::Strategy::ExtractFailed
  log "ERROR: The uncompressed file is too big. Consider increasing the hidden " \
        '"decompressed_backup_max_file_size_mb" setting.'
  @database_restorer.rollback
rescue SystemExit
  log "Restore process was cancelled!"
  @database_restorer.rollback
rescue => ex
  log "EXCEPTION: " + ex.message
  log ex.backtrace.join("\n")
  @database_restorer.rollback
else
  @success = true
ensure
  clean_up
  notify_user
  log "Finished!"

  @success ? log("[SUCCESS]") : log("[FAILED]")
end