backup_nexus 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +7 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +82 -0
  5. data/Rakefile +10 -0
  6. data/app/controllers/backup_nexus/application_controller.rb +31 -0
  7. data/app/controllers/backup_nexus/backup_controller.rb +119 -0
  8. data/app/helpers/backup_nexus/application_helper.rb +51 -0
  9. data/app/jobs/backup_nexus/backup_job.rb +18 -0
  10. data/app/models/backup_nexus/backup.rb +107 -0
  11. data/app/models/backup_nexus/backup_config.rb +189 -0
  12. data/app/services/backup_nexus/backup_runner.rb +62 -0
  13. data/app/services/backup_nexus/backup_service.rb +817 -0
  14. data/app/views/backup_nexus/backup/_form.html.erb +334 -0
  15. data/app/views/backup_nexus/backup/config_history.html.erb +67 -0
  16. data/app/views/backup_nexus/backup/edit.html.erb +15 -0
  17. data/app/views/backup_nexus/backup/history.html.erb +75 -0
  18. data/app/views/backup_nexus/backup/index.html.erb +112 -0
  19. data/app/views/backup_nexus/backup/new.html.erb +15 -0
  20. data/backup_nexus.gemspec +30 -0
  21. data/config/routes.rb +15 -0
  22. data/db/seeds/backup_configs_safe.rb +61 -0
  23. data/lib/backup_nexus/base_record.rb +7 -0
  24. data/lib/backup_nexus/configuration.rb +19 -0
  25. data/lib/backup_nexus/engine.rb +51 -0
  26. data/lib/backup_nexus/version.rb +3 -0
  27. data/lib/backup_nexus.rb +26 -0
  28. data/lib/generators/backup_nexus/backup_generator.rb +70 -0
  29. data/lib/generators/backup_nexus/install_generator.rb +27 -0
  30. data/lib/generators/backup_nexus/templates/backup/backup/backup_helper.sh +152 -0
  31. data/lib/generators/backup_nexus/templates/backup/backup/config.rb +27 -0
  32. data/lib/generators/backup_nexus/templates/backup/backup/models/daily_backup.rb +24 -0
  33. data/lib/generators/backup_nexus/templates/backup/backup/models/full_backup.rb +35 -0
  34. data/lib/generators/backup_nexus/templates/backup/backup/models/sync_backup.rb +43 -0
  35. data/lib/generators/backup_nexus/templates/backup/backup/mysql-config/db_config.cnf +15 -0
  36. data/lib/generators/backup_nexus/templates/backup/backup/schedule.rb +28 -0
  37. data/lib/generators/backup_nexus/templates/migration.rb +105 -0
  38. data/lib/tasks/backup_nexus.rake +81 -0
  39. metadata +138 -0
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BackupNexus
4
+ class BackupRunner
5
+ # Run a specific backup config by name
6
+ def self.run(name)
7
+ config = BackupNexus::BackupConfig.find_by!(name: name)
8
+ BackupNexus::BackupService.run(config)
9
+ rescue ActiveRecord::RecordNotFound
10
+ { success: false, error: "Backup config '#{name}' not found" }
11
+ end
12
+
13
+ # Run all enabled backup configs
14
+ def self.run_all
15
+ results = []
16
+ BackupNexus::BackupConfig.enabled.find_each do |config|
17
+ results << BackupNexus::BackupService.run(config)
18
+ end
19
+ results
20
+ end
21
+
22
+ # Run backups matching a cron schedule
23
+ def self.run_scheduled
24
+ now = Time.current
25
+ results = []
26
+
27
+ BackupNexus::BackupConfig.enabled.where.not(schedule_cron: [nil, ""]).find_each do |config|
28
+ if matches_cron?(config.schedule_cron, now)
29
+ results << BackupNexus::BackupService.run(config)
30
+ end
31
+ end
32
+
33
+ results
34
+ end
35
+
36
+ # Check if a cron expression matches the current time
37
+ def self.matches_cron?(cron_expression, time)
38
+ return false if cron_expression.blank?
39
+
40
+ parts = cron_expression.strip.split(/\s+/)
41
+ return false unless parts.size == 5
42
+
43
+ minute, hour, day, month, wday = parts
44
+
45
+ match_field(minute, time.min) &&
46
+ match_field(hour, time.hour) &&
47
+ match_field(day, time.day) &&
48
+ match_field(month, time.mon) &&
49
+ match_field(wday, time.wday)
50
+ end
51
+
52
+ def self.match_field(pattern, value)
53
+ return true if pattern == "*"
54
+ return true if pattern.include?(",") && pattern.split(",").map(&:strip).include?(value.to_s)
55
+ return true if pattern.include?("-")
56
+ return true if pattern.include?("/")
57
+
58
+ pattern.to_i == value
59
+ end
60
+ private_class_method :match_field
61
+ end
62
+ end