summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Raghavan <ford_prefect@gentoo.org>2008-12-21 14:00:55 +0530
committerArun Raghavan <ford_prefect@gentoo.org>2008-12-21 14:00:55 +0530
commitc1d73107c7a492f261c6b3786427546387e25507 (patch)
tree276e945eb4f17db8f501417d3cb10605e3a1894a
parentInitial version (diff)
downloadgard-c1d73107c7a492f261c6b3786427546387e25507.tar.gz
gard-c1d73107c7a492f261c6b3786427546387e25507.tar.bz2
gard-c1d73107c7a492f261c6b3786427546387e25507.zip
Factor out distfiles/releases checking code. Portage checker en route.
-rw-r--r--check.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/check.py b/check.py
new file mode 100644
index 0000000..1540627
--- /dev/null
+++ b/check.py
@@ -0,0 +1,90 @@
+#!/usr/bin/python
+
+import os
+import urllib2
+import time
+import rfc822
+
+class GardCheck:
+ # Base class which provides some helper functions
+ def __init__(self, url):
+ self.url = url
+
+ # Overridde in child classes
+ def check(self):
+ return True
+
+ def humanize_time(self, secs):
+ mins, secs = divmod(secs, 60)
+ hours, mins = divmod(mins, 60)
+ days, hours = divmod(hours, 24)
+ return '%02d d %02dh %02d m %02d s' % (days, hours, mins, secs)
+
+ def timestamp_to_secs(self, ts):
+ return rfc822.mktime_tz(rfc822.parsedate_tz(ts))
+
+class DistCheck(GardCheck):
+ # can only be used from Python 2.6 onwards
+ HTTP_TIMEOUT = 30
+
+ # Takes the URL to a timestamp.{chk|x} file and returns the
+ # corresponding time stamp in seconds
+ def _get_timestamp_from_url(self, url):
+ try:
+ f = urllib2.urlopen(url)
+ date = f.read()
+ f.close()
+ if date is None or len(date) == 0:
+ raise ValueError
+ try:
+ # timestamp.chk format
+ ts = self.timestamp_to_secs(date)
+ except:
+ # timestamp.x format?
+ ts = float(date.split(' ')[0])
+ except:
+ print 'ERROR: Could not get timestamp from ' + url
+ return None
+
+ return ts
+
+ def _check_file_exists(self, url):
+ ret = True
+ try:
+ f = urllib2.urlopen(url)
+ if len(f.read()) == 0:
+ raise IOError
+ except:
+ ret = False
+
+ return ret
+
+ def check(self, maxdlag, maxrlag, verbose=False):
+ # XXX: Replace 'verbose' with a logger object
+ ret = True
+
+ # Verify that distfiles aren't lagging
+ now = time.mktime(time.gmtime())
+ ts = self._get_timestamp_from_url(self.url+'/distfiles/timestamp.chk')
+ if ts is not None and ((now - ts) > maxdlag or (now - ts) < 0):
+ if verbose is True:
+ print 'ERROR: distfiles at %s is lagging by %s' \
+ % (self.url, self.humanize_time(now - ts))
+ ret = False
+
+ # Verify that releases aren't lagging
+ ts = self._get_timestamp_from_url(self.url+'/releases/.test/timestamp.x')
+ if ts is not None and ((now - ts) > maxrlag or (now - ts) < 0):
+ if verbose is True:
+ print 'ERROR: releases at %s is lagging by %s seconds' \
+ % (self.url, self.humanize_time(now - ts))
+ ret = False
+
+ # Verify that releases/.test/THIS-FILE-SHOULD-NOT-BE-PUBLIC.txt
+ # is not world readable
+ if self._check_file_exists(self.url+'releases/.test/THIS-FILE-SHOULD-NOT-BE-PUBLIC.txt'):
+ if verbose is True:
+ print 'ERROR: THIS-FILE-SHOULD-NOT-BE-PUBLIC.txt is visible to the outside world'
+ ret = False
+
+ return ret