aboutsummaryrefslogtreecommitdiff
path: root/lib/mauve/timer.rb
blob: 35e7aa84a7f4f3c6b197b80826ddfbbe81a23e3d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
# encoding: UTF-8
require 'mauve/alert'
require 'mauve/notifier'
require 'mauve/mauve_thread'
require 'thread'
require 'log4r'

module Mauve

  class Timer < MauveThread

    include Singleton

    attr_accessor :sleep_interval, :last_run_at

    def initialize
      @logger = Log4r::Logger.new self.class.to_s
      @logger.info("Timer singleton created.")
      @initial_sleep = 300
      @initial_sleep_threshold = 300
    end

    def main_loop
      #
      # Get the next alert.
      #
      next_alert = Alert.find_next_with_event

      #
      # If we didn't find an alert, or the alert we found is due in the future,
      # look for the next alert_changed object.
      #
      if next_alert.nil? or next_alert.due_at > MauveTime.now
        @logger.debug("Next alert was #{next_alert} due at #{next_alert.due_at}") unless next_alert.nil?
        next_alert_changed = AlertChanged.find_next_with_event
      end

      if next_alert_changed.nil? and next_alert.nil?
        next_to_notify = nil

      elsif next_alert.nil? or next_alert_changed.nil?
        next_to_notify = (next_alert || next_alert_changed)

      else
        next_to_notify = ( next_alert.due_at < next_alert_changed.due_at ? next_alert : next_alert_changed )

      end

      #
      # Nothing to notify?
      #
      if next_to_notify.nil? 
        #
        # Sleep indefinitely
        #
        @logger.debug("Nothing to notify about -- snoozing indefinitely.")
      else
        #
        # La la la nothing to do.
        #
        @logger.debug("Next to notify: #{next_to_notify} -- snoozing until #{next_to_notify.due_at}")
      end

      #
      # Ah-ha! Sleep with a break clause.
      #
      while next_to_notify.nil? or MauveTime.now <= next_to_notify.due_at
        #
        # Start again if the situation has changed.
        #
        break if self.should_stop?
        #
        # This is a rate-limiting step for alerts.
        #
        Kernel.sleep 0.1
      end

      return if self.should_stop? or next_to_notify.nil?

      next_to_notify.poll
    end

  end

end