blob: 02951b7cd6c3247b435565adbd2bfc3d1977f377 (
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
def initialize
super
@poll_every = 0
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 > Time.now
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.info("Nothing to notify about -- snoozing for a while.")
sleep_loops = 600
else
#
# La la la nothing to do.
#
logger.info("Next to notify: #{next_to_notify} #{next_to_notify.is_a?(AlertChanged) ? "(reminder)" : "(heartbeat)"} -- snoozing until #{next_to_notify.due_at.iso8601}")
sleep_loops = ((next_to_notify.due_at - Time.now).to_f / 0.1).round.to_i
end
sleep_loops = 1 if sleep_loops.nil? or sleep_loops < 1
#
# Ah-ha! Sleep with a break clause.
#
sleep_loops.times do
#
# 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
|