From: Stephen Soltesz Date: Tue, 15 Sep 2009 00:43:36 +0000 (+0000) Subject: fix a bug with pause_penalty. X-Git-Tag: Monitor-3.0-21~8 X-Git-Url: http://git.onelab.eu/?p=monitor.git;a=commitdiff_plain;h=4bf13ed6dd1e71c3f065b7a1957cd3d76c121217 fix a bug with pause_penalty. - bug caused a paused site to never unpause - now after 30 days ticket is closed, and a new ticket is created, thus resetting the penalty escalation --- diff --git a/monitor/common.py b/monitor/common.py index c3ece6f..05a4ec2 100644 --- a/monitor/common.py +++ b/monitor/common.py @@ -240,6 +240,9 @@ def changed_lessthan(last_changed, days): return False def changed_greaterthan(last_changed, days): + if last_changed is None: + return False + if datetime.now() - last_changed > timedelta(days): #print "last changed more than %s" % timedelta(days) return True diff --git a/monitor/database/info/history.py b/monitor/database/info/history.py index 0abdebc..22c8d7b 100644 --- a/monitor/database/info/history.py +++ b/monitor/database/info/history.py @@ -66,10 +66,14 @@ class HistorySiteRecord(Entity): message_status = Field(String, default=None) message_queue = Field(String, default=None) message_created = Field(DateTime, default=None) + #message_last_reply = Field(DateTime, default=None) penalty_level = Field(Int, default=0) penalty_applied = Field(Boolean, default=False) - acts_as_versioned(ignore=['last_changed', 'last_checked', 'message_status']) + penalty_pause = Field(Boolean, default=False) + penalty_pause_time = Field(DateTime, default=None) + + acts_as_versioned(ignore=['last_changed', 'last_checked', 'message_status', 'penalty_pause_time']) @classmethod def by_loginbase(cls, loginbase): diff --git a/monitor/database/info/interface.py b/monitor/database/info/interface.py index 06c83a0..8e3b1fb 100644 --- a/monitor/database/info/interface.py +++ b/monitor/database/info/interface.py @@ -62,7 +62,9 @@ class SiteInterface(HistorySiteRecord): return - def pausePenalty(self): + def setPenaltyPause(self): + self.db.penalty_pause = True + self.db.penalty_pause_time = datetime.now() act = ActionRecord(loginbase=self.db.loginbase, action='penalty', action_type='pause_penalty',) @@ -71,6 +73,11 @@ class SiteInterface(HistorySiteRecord): #act = ActionRecord(loginbase=self.db.loginbase, action='penalty', action_type='clear_penalty',) self.db.penalty_level = 0 self.db.penalty_applied = False + self.clearPenaltyPause() + + def clearPenaltyPause(self): + self.db.penalty_pause = False + self.db.penalty_pause_time = None def getTicketStatus(self): if self.db.message_id != 0: @@ -78,6 +85,7 @@ class SiteInterface(HistorySiteRecord): self.db.message_status = rtstatus['Status'] self.db.message_queue = rtstatus['Queue'] self.db.message_created = datetime.fromtimestamp(rtstatus['Created']) + #self.db.message_last_reply = datetime.fromtimestamp(rtstatus['Told']) def setTicketStatus(self, status): print 'SETTING status %s' % status diff --git a/monitor/wrapper/mailer.py b/monitor/wrapper/mailer.py index cd04f3a..abf0352 100755 --- a/monitor/wrapper/mailer.py +++ b/monitor/wrapper/mailer.py @@ -52,7 +52,7 @@ def getTicketStatus(ticket_id): if ticket_id == None or ticket_id == "": return {} - cmd = "rt show -t ticket -f id,subject,status,queue,created %s" % (ticket_id) + cmd = "rt show -t ticket -f id,subject,status,queue,created,told %s" % (ticket_id) print cmd (f_in, f_out, f_err) = os.popen3(cmd) value = f_out.read() @@ -66,6 +66,7 @@ def getTicketStatus(ticket_id): r_values[key] = r_values[key].strip() r_values['Created'] = calendar.timegm(time.strptime(r_values['Created'])) + r_values['Told'] = calendar.timegm(time.strptime(r_values['Told'])) return r_values def setAdminCCViaRT(ticket_id, to): diff --git a/policy.py b/policy.py index 54ac80e..cdd311c 100755 --- a/policy.py +++ b/policy.py @@ -191,40 +191,46 @@ def main(hostnames, sitenames): print "%s %s %s" % (i, sitehist.db.loginbase, sitehist.db.status) - # determine if there are penalties within the last 30 days? - # if so, add a 'pause_penalty' action. - if sitehist.db.message_id != 0 and sitehist.db.message_status == 'open' and \ - sitehist.db.penalty_level > 0 and not found_within(recent_actions, 'pause_penalty', 30): - # pause escalation - print "Pausing penalties for %s" % site - sitehist.pausePenalty() - else: - - if sitehist.db.status == 'down': - if not found_within(recent_actions, 'pause_penalty', 30) and \ - not found_within(recent_actions, 'increase_penalty', 7) and \ - changed_greaterthan(sitehist.db.last_changed, 7): - - # TODO: catch errors - sitehist.increasePenalty() - sitehist.applyPenalty() - sitehist.sendMessage('increase_penalty') - - print "send message for site %s penalty increase" % site - - if sitehist.db.status == 'good': - # clear penalty - # NOTE: because 'all clear' should have an indefinite status, we - # have a boolean value rather than a 'recent action' - if sitehist.db.penalty_applied: - # send message that penalties are cleared. - - sitehist.clearPenalty() - sitehist.applyPenalty() - sitehist.sendMessage('clear_penalty') - sitehist.closeTicket() - - print "send message for site %s penalty cleared" % site + if sitehist.db.status == 'down': + if sitehist.db.penalty_pause and \ + changed_greaterthan(sitehist.db.penalty_pause_time, 30): + + email_exception("", "clear pause penalty for site: %s" % sitehist.db.loginbase) + sitehist.closeTicket() + # NOTE: but preserve the penalty status. + sitehist.clearPenaltyPause() + + if sitehist.db.message_id != 0 and \ + sitehist.db.message_status == 'open' and \ + not sitehist.db.penalty_pause: + + email_exception("", "pause penalty for site: %s" % sitehist.db.loginbase) + sitehist.setPenaltyPause() + + if not sitehist.db.penalty_pause and \ + not found_within(recent_actions, 'increase_penalty', 7) and \ + changed_greaterthan(sitehist.db.last_changed, 7): + + # TODO: catch errors + sitehist.increasePenalty() + sitehist.applyPenalty() + sitehist.sendMessage('increase_penalty') + + print "send message for site %s penalty increase" % site + + if sitehist.db.status == 'good': + # clear penalty + # NOTE: because 'all clear' should have an indefinite status, we + # have a boolean value rather than a 'recent action' + if sitehist.db.penalty_applied or sitehist.db.penalty_pause: + # send message that penalties are cleared. + + sitehist.clearPenalty() + sitehist.applyPenalty() + sitehist.sendMessage('clear_penalty') + sitehist.closeTicket() + + print "send message for site %s penalty cleared" % site site_count = site_count + 1