schedule.rb 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #!/usr/bin/env ruby
  2. # This process is used to maintain Huginn's upkeep behavior, automatically running scheduled Agents and
  3. # periodically propagating and expiring Events. It's typically run via foreman and the included Procfile.
  4. unless defined?(Rails)
  5. puts
  6. puts "Please run me with rails runner, for example:"
  7. puts " RAILS_ENV=production bundle exec rails runner bin/schedule.rb"
  8. puts
  9. exit 1
  10. end
  11. require 'rufus/scheduler'
  12. class HuginnScheduler
  13. attr_accessor :mutex
  14. def run_schedule(time)
  15. with_mutex do
  16. puts "Queuing schedule for #{time}"
  17. Agent.delay.run_schedule(time)
  18. end
  19. end
  20. def propagate!
  21. with_mutex do
  22. puts "Queuing event propagation"
  23. Agent.delay.receive!
  24. end
  25. end
  26. def cleanup_expired_events!
  27. with_mutex do
  28. puts "Running event cleanup"
  29. Event.delay.cleanup_expired!
  30. end
  31. end
  32. def with_mutex
  33. ActiveRecord::Base.connection_pool.with_connection do
  34. mutex.synchronize do
  35. yield
  36. end
  37. end
  38. end
  39. def run!
  40. self.mutex = Mutex.new
  41. rufus_scheduler = Rufus::Scheduler.new
  42. # Schedule event propagation.
  43. rufus_scheduler.every '1m' do
  44. propagate!
  45. end
  46. # Schedule event cleanup.
  47. rufus_scheduler.cron "0 0 * * * America/Los_Angeles" do
  48. cleanup_expired_events!
  49. end
  50. # Schedule repeating events.
  51. %w[1m 2m 5m 10m 30m 1h 2h 5h 12h 1d 2d 7d].each do |schedule|
  52. rufus_scheduler.every schedule do
  53. run_schedule "every_#{schedule}"
  54. end
  55. end
  56. # Schedule events for specific times.
  57. # Times are assumed to be in PST for now. Can store a user#timezone later.
  58. 24.times do |hour|
  59. rufus_scheduler.cron "0 #{hour} * * * America/Los_Angeles" do
  60. if hour == 0
  61. run_schedule "midnight"
  62. elsif hour < 12
  63. run_schedule "#{hour}am"
  64. elsif hour == 12
  65. run_schedule "noon"
  66. else
  67. run_schedule "#{hour - 12}pm"
  68. end
  69. end
  70. end
  71. rufus_scheduler.join
  72. end
  73. end
  74. scheduler = HuginnScheduler.new
  75. scheduler.run!